From ab5a7b0d044614a8f366c2538cfa2725b98db2f9 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 31 Jan 2022 01:18:56 +0000 Subject: [PATCH] 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 000000000..878c8ebfb --- /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 000000000..c73b4f7a5 --- /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 450cd0cde..000000000 --- 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 1e27b1731..08279ded1 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 ebbaf0f6c..21537e452 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 000000000..96eb1d539 --- /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 d51c39291..689f22be4 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 000000000..b3a477f53 --- /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 000000000..54536c0da --- /dev/null +++ b/src/data/bedrock/blockstate/BlockTypeNames.php @@ -0,0 +1,739 @@ +