From 9a67e3d66009ea3d902e4366a895b5b44b0a755c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 7 Jun 2023 21:08:41 +0100 Subject: [PATCH] PM5-specific changes for 1.20.0.23 beta --- build/generate-block-serializer-consts.php | 5 +- src/data/bedrock/block/BlockStateNames.php | 2 + .../bedrock/block/BlockStateStringValues.php | 5 ++ src/data/bedrock/block/BlockTypeNames.php | 32 +++++++++- .../convert/BlockObjectToStateSerializer.php | 57 +++++++++++++----- .../block/convert/BlockStateReader.php | 14 +++++ .../convert/BlockStateSerializerHelper.php | 4 +- .../BlockStateToObjectDeserializer.php | 59 +++++++++++++++---- .../block/convert/BlockStateWriter.php | 14 +++++ src/world/format/io/data/BedrockWorldData.php | 8 +-- 10 files changed, 160 insertions(+), 40 deletions(-) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index 279ffc788..4cc8cfcb6 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -44,6 +44,7 @@ use function fwrite; use function is_string; use function ksort; use function mb_strtoupper; +use function preg_replace; use function sort; use function strrpos; use function strtoupper; @@ -138,7 +139,7 @@ function generateBlockStateNames(BlockPaletteReport $data) : void{ fwrite($output, generateClassHeader(BlockStateNames::class)); foreach(Utils::stringifyKeys($data->seenStateValues) as $state => $values){ - $constName = mb_strtoupper($state, 'US-ASCII'); + $constName = mb_strtoupper(preg_replace("/^minecraft:/", "", $state) ?? throw new AssumptionFailedError("This regex is not invalid"), 'US-ASCII'); fwrite($output, "\tpublic const $constName = \"$state\";\n"); } @@ -158,7 +159,7 @@ function generateBlockStringValues(BlockPaletteReport $data) : void{ continue; } $anyWritten = true; - $constName = mb_strtoupper($stateName . "_" . $value, 'US-ASCII'); + $constName = mb_strtoupper(preg_replace("/^minecraft:/", "", $stateName) . "_" . $value, 'US-ASCII'); fwrite($output, "\tpublic const $constName = \"$value\";\n"); } if($anyWritten){ diff --git a/src/data/bedrock/block/BlockStateNames.php b/src/data/bedrock/block/BlockStateNames.php index e241380a0..fe38ff073 100644 --- a/src/data/bedrock/block/BlockStateNames.php +++ b/src/data/bedrock/block/BlockStateNames.php @@ -98,6 +98,7 @@ final class BlockStateNames{ public const LEVER_DIRECTION = "lever_direction"; public const LIQUID_DEPTH = "liquid_depth"; public const LIT = "lit"; + public const CARDINAL_DIRECTION = "minecraft:cardinal_direction"; public const MOISTURIZED_AMOUNT = "moisturized_amount"; public const MONSTER_EGG_STONE_TYPE = "monster_egg_stone_type"; public const MULTI_FACE_DIRECTION_BITS = "multi_face_direction_bits"; @@ -122,6 +123,7 @@ final class BlockStateNames{ public const SAND_STONE_TYPE = "sand_stone_type"; public const SAND_TYPE = "sand_type"; public const SAPLING_TYPE = "sapling_type"; + public const SCULK_SENSOR_PHASE = "sculk_sensor_phase"; public const SEA_GRASS_TYPE = "sea_grass_type"; public const SPONGE_TYPE = "sponge_type"; public const STABILITY = "stability"; diff --git a/src/data/bedrock/block/BlockStateStringValues.php b/src/data/bedrock/block/BlockStateStringValues.php index ba77cd387..ca3ef73ba 100644 --- a/src/data/bedrock/block/BlockStateStringValues.php +++ b/src/data/bedrock/block/BlockStateStringValues.php @@ -131,6 +131,11 @@ final class BlockStateStringValues{ public const LEVER_DIRECTION_UP_NORTH_SOUTH = "up_north_south"; public const LEVER_DIRECTION_WEST = "west"; + public const CARDINAL_DIRECTION_EAST = "east"; + public const CARDINAL_DIRECTION_NORTH = "north"; + public const CARDINAL_DIRECTION_SOUTH = "south"; + public const CARDINAL_DIRECTION_WEST = "west"; + public const MONSTER_EGG_STONE_TYPE_CHISELED_STONE_BRICK = "chiseled_stone_brick"; public const MONSTER_EGG_STONE_TYPE_COBBLESTONE = "cobblestone"; public const MONSTER_EGG_STONE_TYPE_CRACKED_STONE_BRICK = "cracked_stone_brick"; diff --git a/src/data/bedrock/block/BlockTypeNames.php b/src/data/bedrock/block/BlockTypeNames.php index f94b72176..d8f6884af 100644 --- a/src/data/bedrock/block/BlockTypeNames.php +++ b/src/data/bedrock/block/BlockTypeNames.php @@ -97,6 +97,7 @@ final class BlockTypeNames{ public const BIRCH_WALL_SIGN = "minecraft:birch_wall_sign"; public const BLACK_CANDLE = "minecraft:black_candle"; public const BLACK_CANDLE_CAKE = "minecraft:black_candle_cake"; + public const BLACK_CARPET = "minecraft:black_carpet"; public const BLACK_GLAZED_TERRACOTTA = "minecraft:black_glazed_terracotta"; public const BLACK_WOOL = "minecraft:black_wool"; public const BLACKSTONE = "minecraft:blackstone"; @@ -107,22 +108,26 @@ final class BlockTypeNames{ public const BLAST_FURNACE = "minecraft:blast_furnace"; public const BLUE_CANDLE = "minecraft:blue_candle"; public const BLUE_CANDLE_CAKE = "minecraft:blue_candle_cake"; + public const BLUE_CARPET = "minecraft:blue_carpet"; public const BLUE_GLAZED_TERRACOTTA = "minecraft:blue_glazed_terracotta"; public const BLUE_ICE = "minecraft:blue_ice"; public const BLUE_WOOL = "minecraft:blue_wool"; public const BONE_BLOCK = "minecraft:bone_block"; public const BOOKSHELF = "minecraft:bookshelf"; public const BORDER_BLOCK = "minecraft:border_block"; + public const BRAIN_CORAL = "minecraft:brain_coral"; public const BREWING_STAND = "minecraft:brewing_stand"; public const BRICK_BLOCK = "minecraft:brick_block"; public const BRICK_STAIRS = "minecraft:brick_stairs"; public const BROWN_CANDLE = "minecraft:brown_candle"; public const BROWN_CANDLE_CAKE = "minecraft:brown_candle_cake"; + public const BROWN_CARPET = "minecraft:brown_carpet"; public const BROWN_GLAZED_TERRACOTTA = "minecraft:brown_glazed_terracotta"; public const BROWN_MUSHROOM = "minecraft:brown_mushroom"; public const BROWN_MUSHROOM_BLOCK = "minecraft:brown_mushroom_block"; public const BROWN_WOOL = "minecraft:brown_wool"; public const BUBBLE_COLUMN = "minecraft:bubble_column"; + public const BUBBLE_CORAL = "minecraft:bubble_coral"; public const BUDDING_AMETHYST = "minecraft:budding_amethyst"; public const CACTUS = "minecraft:cactus"; public const CAKE = "minecraft:cake"; @@ -132,7 +137,6 @@ final class BlockTypeNames{ public const CAMPFIRE = "minecraft:campfire"; public const CANDLE = "minecraft:candle"; public const CANDLE_CAKE = "minecraft:candle_cake"; - public const CARPET = "minecraft:carpet"; public const CARROTS = "minecraft:carrots"; public const CARTOGRAPHY_TABLE = "minecraft:cartography_table"; public const CARVED_PUMPKIN = "minecraft:carved_pumpkin"; @@ -189,7 +193,6 @@ final class BlockTypeNames{ public const CONDUIT = "minecraft:conduit"; public const COPPER_BLOCK = "minecraft:copper_block"; public const COPPER_ORE = "minecraft:copper_ore"; - public const CORAL = "minecraft:coral"; public const CORAL_BLOCK = "minecraft:coral_block"; public const CORAL_FAN = "minecraft:coral_fan"; public const CORAL_FAN_DEAD = "minecraft:coral_fan_dead"; @@ -225,6 +228,7 @@ final class BlockTypeNames{ public const CUT_COPPER_STAIRS = "minecraft:cut_copper_stairs"; public const CYAN_CANDLE = "minecraft:cyan_candle"; public const CYAN_CANDLE_CAKE = "minecraft:cyan_candle_cake"; + public const CYAN_CARPET = "minecraft:cyan_carpet"; public const CYAN_GLAZED_TERRACOTTA = "minecraft:cyan_glazed_terracotta"; public const CYAN_WOOL = "minecraft:cyan_wool"; public const DARK_OAK_BUTTON = "minecraft:dark_oak_button"; @@ -241,6 +245,11 @@ final class BlockTypeNames{ public const DARKOAK_WALL_SIGN = "minecraft:darkoak_wall_sign"; public const DAYLIGHT_DETECTOR = "minecraft:daylight_detector"; public const DAYLIGHT_DETECTOR_INVERTED = "minecraft:daylight_detector_inverted"; + public const DEAD_BRAIN_CORAL = "minecraft:dead_brain_coral"; + public const DEAD_BUBBLE_CORAL = "minecraft:dead_bubble_coral"; + public const DEAD_FIRE_CORAL = "minecraft:dead_fire_coral"; + public const DEAD_HORN_CORAL = "minecraft:dead_horn_coral"; + public const DEAD_TUBE_CORAL = "minecraft:dead_tube_coral"; public const DEADBUSH = "minecraft:deadbush"; public const DECORATED_POT = "minecraft:decorated_pot"; public const DEEPSLATE = "minecraft:deepslate"; @@ -419,6 +428,7 @@ final class BlockTypeNames{ public const FARMLAND = "minecraft:farmland"; public const FENCE_GATE = "minecraft:fence_gate"; public const FIRE = "minecraft:fire"; + public const FIRE_CORAL = "minecraft:fire_coral"; public const FLETCHING_TABLE = "minecraft:fletching_table"; public const FLOWER_POT = "minecraft:flower_pot"; public const FLOWERING_AZALEA = "minecraft:flowering_azalea"; @@ -444,10 +454,12 @@ final class BlockTypeNames{ public const GRAVEL = "minecraft:gravel"; public const GRAY_CANDLE = "minecraft:gray_candle"; public const GRAY_CANDLE_CAKE = "minecraft:gray_candle_cake"; + public const GRAY_CARPET = "minecraft:gray_carpet"; public const GRAY_GLAZED_TERRACOTTA = "minecraft:gray_glazed_terracotta"; public const GRAY_WOOL = "minecraft:gray_wool"; public const GREEN_CANDLE = "minecraft:green_candle"; public const GREEN_CANDLE_CAKE = "minecraft:green_candle_cake"; + public const GREEN_CARPET = "minecraft:green_carpet"; public const GREEN_GLAZED_TERRACOTTA = "minecraft:green_glazed_terracotta"; public const GREEN_WOOL = "minecraft:green_wool"; public const GRINDSTONE = "minecraft:grindstone"; @@ -462,6 +474,7 @@ final class BlockTypeNames{ public const HONEY_BLOCK = "minecraft:honey_block"; public const HONEYCOMB_BLOCK = "minecraft:honeycomb_block"; public const HOPPER = "minecraft:hopper"; + public const HORN_CORAL = "minecraft:horn_coral"; public const ICE = "minecraft:ice"; public const INFESTED_DEEPSLATE = "minecraft:infested_deepslate"; public const INFO_UPDATE = "minecraft:info_update"; @@ -492,7 +505,6 @@ final class BlockTypeNames{ public const LAPIS_ORE = "minecraft:lapis_ore"; public const LARGE_AMETHYST_BUD = "minecraft:large_amethyst_bud"; public const LAVA = "minecraft:lava"; - public const LAVA_CAULDRON = "minecraft:lava_cauldron"; public const LEAVES = "minecraft:leaves"; public const LEAVES2 = "minecraft:leaves2"; public const LECTERN = "minecraft:lectern"; @@ -500,15 +512,18 @@ final class BlockTypeNames{ public const LIGHT_BLOCK = "minecraft:light_block"; public const LIGHT_BLUE_CANDLE = "minecraft:light_blue_candle"; public const LIGHT_BLUE_CANDLE_CAKE = "minecraft:light_blue_candle_cake"; + public const LIGHT_BLUE_CARPET = "minecraft:light_blue_carpet"; public const LIGHT_BLUE_GLAZED_TERRACOTTA = "minecraft:light_blue_glazed_terracotta"; public const LIGHT_BLUE_WOOL = "minecraft:light_blue_wool"; public const LIGHT_GRAY_CANDLE = "minecraft:light_gray_candle"; public const LIGHT_GRAY_CANDLE_CAKE = "minecraft:light_gray_candle_cake"; + public const LIGHT_GRAY_CARPET = "minecraft:light_gray_carpet"; public const LIGHT_GRAY_WOOL = "minecraft:light_gray_wool"; public const LIGHT_WEIGHTED_PRESSURE_PLATE = "minecraft:light_weighted_pressure_plate"; public const LIGHTNING_ROD = "minecraft:lightning_rod"; public const LIME_CANDLE = "minecraft:lime_candle"; public const LIME_CANDLE_CAKE = "minecraft:lime_candle_cake"; + public const LIME_CARPET = "minecraft:lime_carpet"; public const LIME_GLAZED_TERRACOTTA = "minecraft:lime_glazed_terracotta"; public const LIME_WOOL = "minecraft:lime_wool"; public const LIT_BLAST_FURNACE = "minecraft:lit_blast_furnace"; @@ -522,6 +537,7 @@ final class BlockTypeNames{ public const LOOM = "minecraft:loom"; public const MAGENTA_CANDLE = "minecraft:magenta_candle"; public const MAGENTA_CANDLE_CAKE = "minecraft:magenta_candle_cake"; + public const MAGENTA_CARPET = "minecraft:magenta_carpet"; public const MAGENTA_GLAZED_TERRACOTTA = "minecraft:magenta_glazed_terracotta"; public const MAGENTA_WOOL = "minecraft:magenta_wool"; public const MAGMA = "minecraft:magma"; @@ -583,6 +599,7 @@ final class BlockTypeNames{ public const OCHRE_FROGLIGHT = "minecraft:ochre_froglight"; public const ORANGE_CANDLE = "minecraft:orange_candle"; public const ORANGE_CANDLE_CAKE = "minecraft:orange_candle_cake"; + public const ORANGE_CARPET = "minecraft:orange_carpet"; public const ORANGE_GLAZED_TERRACOTTA = "minecraft:orange_glazed_terracotta"; public const ORANGE_WOOL = "minecraft:orange_wool"; public const OXIDIZED_COPPER = "minecraft:oxidized_copper"; @@ -595,11 +612,14 @@ final class BlockTypeNames{ public const PEARLESCENT_FROGLIGHT = "minecraft:pearlescent_froglight"; public const PINK_CANDLE = "minecraft:pink_candle"; public const PINK_CANDLE_CAKE = "minecraft:pink_candle_cake"; + public const PINK_CARPET = "minecraft:pink_carpet"; public const PINK_GLAZED_TERRACOTTA = "minecraft:pink_glazed_terracotta"; public const PINK_PETALS = "minecraft:pink_petals"; public const PINK_WOOL = "minecraft:pink_wool"; public const PISTON = "minecraft:piston"; public const PISTON_ARM_COLLISION = "minecraft:piston_arm_collision"; + public const PITCHER_CROP = "minecraft:pitcher_crop"; + public const PITCHER_PLANT = "minecraft:pitcher_plant"; public const PLANKS = "minecraft:planks"; public const PODZOL = "minecraft:podzol"; public const POINTED_DRIPSTONE = "minecraft:pointed_dripstone"; @@ -636,6 +656,7 @@ final class BlockTypeNames{ public const PUMPKIN_STEM = "minecraft:pumpkin_stem"; public const PURPLE_CANDLE = "minecraft:purple_candle"; public const PURPLE_CANDLE_CAKE = "minecraft:purple_candle_cake"; + public const PURPLE_CARPET = "minecraft:purple_carpet"; public const PURPLE_GLAZED_TERRACOTTA = "minecraft:purple_glazed_terracotta"; public const PURPLE_WOOL = "minecraft:purple_wool"; public const PURPUR_BLOCK = "minecraft:purpur_block"; @@ -650,6 +671,7 @@ final class BlockTypeNames{ public const RAW_IRON_BLOCK = "minecraft:raw_iron_block"; public const RED_CANDLE = "minecraft:red_candle"; public const RED_CANDLE_CAKE = "minecraft:red_candle_cake"; + public const RED_CARPET = "minecraft:red_carpet"; public const RED_FLOWER = "minecraft:red_flower"; public const RED_GLAZED_TERRACOTTA = "minecraft:red_glazed_terracotta"; public const RED_MUSHROOM = "minecraft:red_mushroom"; @@ -696,6 +718,7 @@ final class BlockTypeNames{ public const SMOOTH_RED_SANDSTONE_STAIRS = "minecraft:smooth_red_sandstone_stairs"; public const SMOOTH_SANDSTONE_STAIRS = "minecraft:smooth_sandstone_stairs"; public const SMOOTH_STONE = "minecraft:smooth_stone"; + public const SNIFFER_EGG = "minecraft:sniffer_egg"; public const SNOW = "minecraft:snow"; public const SNOW_LAYER = "minecraft:snow_layer"; public const SOUL_CAMPFIRE = "minecraft:soul_campfire"; @@ -767,6 +790,7 @@ final class BlockTypeNames{ public const TRAPPED_CHEST = "minecraft:trapped_chest"; public const TRIP_WIRE = "minecraft:trip_wire"; public const TRIPWIRE_HOOK = "minecraft:tripwire_hook"; + public const TUBE_CORAL = "minecraft:tube_coral"; public const TUFF = "minecraft:tuff"; public const TURTLE_EGG = "minecraft:turtle_egg"; public const TWISTING_VINES = "minecraft:twisting_vines"; @@ -831,6 +855,7 @@ final class BlockTypeNames{ public const WHEAT = "minecraft:wheat"; public const WHITE_CANDLE = "minecraft:white_candle"; public const WHITE_CANDLE_CAKE = "minecraft:white_candle_cake"; + public const WHITE_CARPET = "minecraft:white_carpet"; public const WHITE_GLAZED_TERRACOTTA = "minecraft:white_glazed_terracotta"; public const WHITE_WOOL = "minecraft:white_wool"; public const WITHER_ROSE = "minecraft:wither_rose"; @@ -841,6 +866,7 @@ final class BlockTypeNames{ public const WOODEN_SLAB = "minecraft:wooden_slab"; public const YELLOW_CANDLE = "minecraft:yellow_candle"; public const YELLOW_CANDLE_CAKE = "minecraft:yellow_candle_cake"; + public const YELLOW_CARPET = "minecraft:yellow_carpet"; public const YELLOW_FLOWER = "minecraft:yellow_flower"; public const YELLOW_GLAZED_TERRACOTTA = "minecraft:yellow_glazed_terracotta"; public const YELLOW_WOOL = "minecraft:yellow_wool"; diff --git a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php index 9809eb958..50f4569a5 100644 --- a/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php +++ b/src/data/bedrock/block/convert/BlockObjectToStateSerializer.php @@ -190,6 +190,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ public function __construct(){ $this->registerCandleSerializers(); $this->registerFlatColorBlockSerializers(); + $this->registerFlatCoralSerializers(); $this->registerCauldronSerializers(); $this->registerWoodBlockSerializers(); $this->registerSimpleSerializers(); @@ -346,14 +347,47 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ DyeColor::YELLOW() => Ids::YELLOW_WOOL, default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) })); + + $this->map(Blocks::CARPET(), fn(Carpet $block) => Writer::create(match($color = $block->getColor()){ + DyeColor::BLACK() => Ids::BLACK_CARPET, + DyeColor::BLUE() => Ids::BLUE_CARPET, + DyeColor::BROWN() => Ids::BROWN_CARPET, + DyeColor::CYAN() => Ids::CYAN_CARPET, + DyeColor::GRAY() => Ids::GRAY_CARPET, + DyeColor::GREEN() => Ids::GREEN_CARPET, + DyeColor::LIGHT_BLUE() => Ids::LIGHT_BLUE_CARPET, + DyeColor::LIGHT_GRAY() => Ids::LIGHT_GRAY_CARPET, + DyeColor::LIME() => Ids::LIME_CARPET, + DyeColor::MAGENTA() => Ids::MAGENTA_CARPET, + DyeColor::ORANGE() => Ids::ORANGE_CARPET, + DyeColor::PINK() => Ids::PINK_CARPET, + DyeColor::PURPLE() => Ids::PURPLE_CARPET, + DyeColor::RED() => Ids::RED_CARPET, + DyeColor::WHITE() => Ids::WHITE_CARPET, + DyeColor::YELLOW() => Ids::YELLOW_CARPET, + default => throw new AssumptionFailedError("Unhandled dye colour " . $color->name()) + })); + } + + private function registerFlatCoralSerializers() : void{ + $this->map(Blocks::CORAL(), fn(Coral $block) => Writer::create( + match($coralType = $block->getCoralType()){ + CoralType::BRAIN() => $block->isDead() ? Ids::DEAD_BRAIN_CORAL : Ids::BRAIN_CORAL, + CoralType::BUBBLE() => $block->isDead() ? Ids::DEAD_BUBBLE_CORAL : Ids::BUBBLE_CORAL, + CoralType::FIRE() => $block->isDead() ? Ids::DEAD_FIRE_CORAL : Ids::FIRE_CORAL, + CoralType::HORN() => $block->isDead() ? Ids::DEAD_HORN_CORAL : Ids::HORN_CORAL, + CoralType::TUBE() => $block->isDead() ? Ids::DEAD_TUBE_CORAL : Ids::TUBE_CORAL, + default => throw new AssumptionFailedError("Unhandled coral type " . $coralType->name()) + } + )); } private function registerCauldronSerializers() : void{ - $this->map(Blocks::CAULDRON(), fn() => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, 0, new Writer(Ids::CAULDRON))); - $this->map(Blocks::LAVA_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_LAVA, $b->getFillLevel(), new Writer(Ids::LAVA_CAULDRON))); + $this->map(Blocks::CAULDRON(), fn() => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, 0)); + $this->map(Blocks::LAVA_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_LAVA, $b->getFillLevel())); //potion cauldrons store their real information in the block actor data - $this->map(Blocks::POTION_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, $b->getFillLevel(), new Writer(Ids::CAULDRON))); - $this->map(Blocks::WATER_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, $b->getFillLevel(), new Writer(Ids::CAULDRON))); + $this->map(Blocks::POTION_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, $b->getFillLevel())); + $this->map(Blocks::WATER_CAULDRON(), fn(FillableCauldron $b) => Helper::encodeCauldron(StringValues::CAULDRON_LIQUID_WATER, $b->getFillLevel())); } private function registerWoodBlockSerializers() : void{ @@ -758,14 +792,10 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CAKE) ->writeInt(StateNames::BITE_COUNTER, $block->getBites()); }); - $this->map(Blocks::CARPET(), function(Carpet $block) : Writer{ - return Writer::create(Ids::CARPET) - ->writeColor($block->getColor()); - }); $this->map(Blocks::CARROTS(), fn(Carrot $block) => Helper::encodeCrops($block, new Writer(Ids::CARROTS))); $this->map(Blocks::CARVED_PUMPKIN(), function(CarvedPumpkin $block) : Writer{ return Writer::create(Ids::CARVED_PUMPKIN) - ->writeLegacyHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::CAVE_VINES(), function(CaveVines $block) : Writer{ //I have no idea why this only has 3 IDs - there are 4 in Java and 4 visually distinct states in Bedrock @@ -888,11 +918,6 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ return Writer::create(Ids::CONCRETE_POWDER) ->writeColor($block->getColor()); }); - $this->map(Blocks::CORAL(), function(Coral $block) : Writer{ - return Writer::create(Ids::CORAL) - ->writeBool(StateNames::DEAD_BIT, $block->isDead()) - ->writeCoralType($block->getCoralType()); - }); $this->map(Blocks::CORAL_BLOCK(), function(CoralBlock $block) : Writer{ return Writer::create(Ids::CORAL_BLOCK) ->writeBool(StateNames::DEAD_BIT, $block->isDead()) @@ -1118,7 +1143,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::LILY_OF_THE_VALLEY(), fn() => Helper::encodeRedFlower(StringValues::FLOWER_TYPE_LILY_OF_THE_VALLEY)); $this->map(Blocks::LIT_PUMPKIN(), function(LitPumpkin $block) : Writer{ return Writer::create(Ids::LIT_PUMPKIN) - ->writeLegacyHorizontalFacing($block->getFacing()); + ->writeCardinalHorizontalFacing($block->getFacing()); }); $this->map(Blocks::LOOM(), function(Loom $block) : Writer{ return Writer::create(Ids::LOOM) @@ -1241,7 +1266,7 @@ final class BlockObjectToStateSerializer implements BlockStateSerializer{ $this->map(Blocks::PRISMARINE_WALL(), fn(Wall $block) => Helper::encodeLegacyWall($block, StringValues::WALL_BLOCK_TYPE_PRISMARINE)); $this->map(Blocks::PUMPKIN(), function() : Writer{ return Writer::create(Ids::PUMPKIN) - ->writeLegacyHorizontalFacing(Facing::SOUTH); //no longer used + ->writeCardinalHorizontalFacing(Facing::SOUTH); //no longer used }); $this->map(Blocks::PUMPKIN_STEM(), fn(PumpkinStem $block) => Helper::encodeStem($block, new Writer(Ids::PUMPKIN_STEM))); $this->map(Blocks::PURPLE_TORCH(), fn(Torch $block) => Helper::encodeColoredTorch($block, true, Writer::create(Ids::COLORED_TORCH_BP))); diff --git a/src/data/bedrock/block/convert/BlockStateReader.php b/src/data/bedrock/block/convert/BlockStateReader.php index 67da60088..89011cb73 100644 --- a/src/data/bedrock/block/convert/BlockStateReader.php +++ b/src/data/bedrock/block/convert/BlockStateReader.php @@ -185,6 +185,20 @@ final class BlockStateReader{ ]); } + /** + * Used by pumpkins as of 1.20.0.23 beta + * @throws BlockStateDeserializeException + */ + public function readCardinalHorizontalFacing() : int{ + return match($raw = $this->readString(BlockStateNames::CARDINAL_DIRECTION)){ + StringValues::CARDINAL_DIRECTION_NORTH => Facing::NORTH, + StringValues::CARDINAL_DIRECTION_SOUTH => Facing::SOUTH, + StringValues::CARDINAL_DIRECTION_WEST => Facing::WEST, + StringValues::CARDINAL_DIRECTION_EAST => Facing::EAST, + default => throw $this->badValueException(BlockStateNames::CARDINAL_DIRECTION, $raw) + }; + } + /** @throws BlockStateDeserializeException */ public function readColor() : DyeColor{ // * color (StringTag) = black, blue, brown, cyan, gray, green, light_blue, lime, magenta, orange, pink, purple, red, silver, white, yellow diff --git a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php index 93e840343..7fc15fce6 100644 --- a/src/data/bedrock/block/convert/BlockStateSerializerHelper.php +++ b/src/data/bedrock/block/convert/BlockStateSerializerHelper.php @@ -93,8 +93,8 @@ final class BlockStateSerializerHelper{ ->writeTorchFacing($block->getFacing()); } - public static function encodeCauldron(string $liquid, int $fillLevel, BlockStateWriter $out) : BlockStateWriter{ - return $out + public static function encodeCauldron(string $liquid, int $fillLevel) : BlockStateWriter{ + return Writer::create(Ids::CAULDRON) ->writeString(BlockStateNames::CAULDRON_LIQUID, $liquid) ->writeInt(BlockStateNames::FILL_LEVEL, $fillLevel); } diff --git a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php index 2d1fd6090..fe6aabdda 100644 --- a/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToObjectDeserializer.php @@ -73,6 +73,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ public function __construct(){ $this->registerCandleDeserializers(); $this->registerFlatColorBlockDeserializers(); + $this->registerFlatCoralDeserializers(); $this->registerCauldronDeserializers(); $this->registerWoodBlockDeserializers(); $this->registerSimpleDeserializers(); @@ -220,6 +221,48 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ ] as $id => $color){ $this->mapSimple($id, fn() => Blocks::WOOL()->setColor($color)); } + + foreach([ + Ids::BLACK_CARPET => DyeColor::BLACK(), + Ids::BLUE_CARPET => DyeColor::BLUE(), + Ids::BROWN_CARPET => DyeColor::BROWN(), + Ids::CYAN_CARPET => DyeColor::CYAN(), + Ids::GRAY_CARPET => DyeColor::GRAY(), + Ids::GREEN_CARPET => DyeColor::GREEN(), + Ids::LIGHT_BLUE_CARPET => DyeColor::LIGHT_BLUE(), + Ids::LIGHT_GRAY_CARPET => DyeColor::LIGHT_GRAY(), + Ids::LIME_CARPET => DyeColor::LIME(), + Ids::MAGENTA_CARPET => DyeColor::MAGENTA(), + Ids::ORANGE_CARPET => DyeColor::ORANGE(), + Ids::PINK_CARPET => DyeColor::PINK(), + Ids::PURPLE_CARPET => DyeColor::PURPLE(), + Ids::RED_CARPET => DyeColor::RED(), + Ids::WHITE_CARPET => DyeColor::WHITE(), + Ids::YELLOW_CARPET => DyeColor::YELLOW(), + ] as $id => $color){ + $this->mapSimple($id, fn() => Blocks::CARPET()->setColor($color)); + } + } + + private function registerFlatCoralDeserializers() : void{ + foreach([ + Ids::BRAIN_CORAL => CoralType::BRAIN(), + Ids::BUBBLE_CORAL => CoralType::BUBBLE(), + Ids::FIRE_CORAL => CoralType::FIRE(), + Ids::HORN_CORAL => CoralType::HORN(), + Ids::TUBE_CORAL => CoralType::TUBE(), + ] as $id => $coralType){ + $this->mapSimple($id, fn() => Blocks::CORAL()->setCoralType($coralType)->setDead(false)); + } + foreach([ + Ids::DEAD_BRAIN_CORAL => CoralType::BRAIN(), + Ids::DEAD_BUBBLE_CORAL => CoralType::BUBBLE(), + Ids::DEAD_FIRE_CORAL => CoralType::FIRE(), + Ids::DEAD_HORN_CORAL => CoralType::HORN(), + Ids::DEAD_TUBE_CORAL => CoralType::TUBE(), + ] as $id => $coralType){ + $this->mapSimple($id, fn() => Blocks::CORAL()->setCoralType($coralType)->setDead(true)); + } } private function registerCauldronDeserializers() : void{ @@ -238,7 +281,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ })->setFillLevel($level); }; $this->map(Ids::CAULDRON, $deserializer); - $this->map(Ids::LAVA_CAULDRON, $deserializer); } private function registerWoodBlockDeserializers() : void{ @@ -621,14 +663,10 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ return Blocks::CAKE() ->setBites($in->readBoundedInt(StateNames::BITE_COUNTER, 0, 6)); }); - $this->map(Ids::CARPET, function(Reader $in) : Block{ - return Blocks::CARPET() - ->setColor($in->readColor()); - }); $this->map(Ids::CARROTS, fn(Reader $in) => Helper::decodeCrops(Blocks::CARROTS(), $in)); $this->map(Ids::CARVED_PUMPKIN, function(Reader $in) : Block{ return Blocks::CARVED_PUMPKIN() - ->setFacing($in->readLegacyHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::CAVE_VINES, function(Reader $in) : CaveVines{ return Blocks::CAVE_VINES() @@ -700,11 +738,6 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->map(Ids::CUT_COPPER, fn() => Helper::decodeCopper(Blocks::CUT_COPPER(), CopperOxidation::NONE())); $this->mapSlab(Ids::CUT_COPPER_SLAB, Ids::DOUBLE_CUT_COPPER_SLAB, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_SLAB(), CopperOxidation::NONE())); $this->mapStairs(Ids::CUT_COPPER_STAIRS, fn() => Helper::decodeCopper(Blocks::CUT_COPPER_STAIRS(), CopperOxidation::NONE())); - $this->map(Ids::CORAL, function(Reader $in) : Block{ - return Blocks::CORAL() - ->setCoralType($in->readCoralType()) - ->setDead($in->readBool(StateNames::DEAD_BIT)); - }); $this->map(Ids::CORAL_BLOCK, function(Reader $in) : Block{ return Blocks::CORAL_BLOCK() ->setCoralType($in->readCoralType()) @@ -925,7 +958,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ }); $this->map(Ids::LIT_PUMPKIN, function(Reader $in) : Block{ return Blocks::LIT_PUMPKIN() - ->setFacing($in->readLegacyHorizontalFacing()); + ->setFacing($in->readCardinalHorizontalFacing()); }); $this->map(Ids::LIT_REDSTONE_LAMP, function() : Block{ return Blocks::REDSTONE_LAMP() @@ -1046,7 +1079,7 @@ final class BlockStateToObjectDeserializer implements BlockStateDeserializer{ $this->mapStairs(Ids::PRISMARINE_BRICKS_STAIRS, fn() => Blocks::PRISMARINE_BRICKS_STAIRS()); $this->mapStairs(Ids::PRISMARINE_STAIRS, fn() => Blocks::PRISMARINE_STAIRS()); $this->map(Ids::PUMPKIN, function(Reader $in) : Block{ - $in->ignored(StateNames::DIRECTION); //obsolete + $in->ignored(StateNames::CARDINAL_DIRECTION); //obsolete return Blocks::PUMPKIN(); }); $this->map(Ids::PUMPKIN_STEM, fn(Reader $in) => Helper::decodeStem(Blocks::PUMPKIN_STEM(), $in)); diff --git a/src/data/bedrock/block/convert/BlockStateWriter.php b/src/data/bedrock/block/convert/BlockStateWriter.php index eefd2ec69..64558fef8 100644 --- a/src/data/bedrock/block/convert/BlockStateWriter.php +++ b/src/data/bedrock/block/convert/BlockStateWriter.php @@ -141,6 +141,20 @@ final class BlockStateWriter{ }); } + /** + * Used by pumpkins as of 1.20.0.23 beta + * @return $this + */ + public function writeCardinalHorizontalFacing(int $value) : self{ + return $this->writeString(BlockStateNames::CARDINAL_DIRECTION, match($value){ + Facing::SOUTH => StringValues::CARDINAL_DIRECTION_SOUTH, + Facing::WEST => StringValues::CARDINAL_DIRECTION_WEST, + Facing::NORTH => StringValues::CARDINAL_DIRECTION_NORTH, + Facing::EAST => StringValues::CARDINAL_DIRECTION_EAST, + default => throw new BlockStateSerializeException("Invalid horizontal facing $value") + }); + } + /** @return $this */ public function writeColor(DyeColor $color) : self{ $this->writeString(BlockStateNames::COLOR, match($color->id()){ diff --git a/src/world/format/io/data/BedrockWorldData.php b/src/world/format/io/data/BedrockWorldData.php index faef3ab21..3a24e9a11 100644 --- a/src/world/format/io/data/BedrockWorldData.php +++ b/src/world/format/io/data/BedrockWorldData.php @@ -50,12 +50,12 @@ use function time; class BedrockWorldData extends BaseNbtWorldData{ public const CURRENT_STORAGE_VERSION = 10; - public const CURRENT_STORAGE_NETWORK_VERSION = 582; + public const CURRENT_STORAGE_NETWORK_VERSION = 589; public const CURRENT_CLIENT_VERSION_TARGET = [ 1, //major - 19, //minor - 80, //patch - 0, //revision + 20, //minor + 0, //patch + 1, //revision 0 //is beta ];