From a8728a02f6f2e8ef917d3902902a54f793bfaec5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Jul 2022 14:37:46 +0100 Subject: [PATCH] BlockStateDictionary: extract a more generic helper method for decoding block palette files --- build/generate-block-serializer-consts.php | 9 ++------- .../mcpe/convert/BlockStateDictionary.php | 20 ++++++++++++++----- tools/generate-block-palette-spec.php | 10 ++-------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/build/generate-block-serializer-consts.php b/build/generate-block-serializer-consts.php index 4c3e156ab..9fd944157 100644 --- a/build/generate-block-serializer-consts.php +++ b/build/generate-block-serializer-consts.php @@ -29,11 +29,9 @@ use pocketmine\data\bedrock\block\BlockStateStringValues; use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\NbtException; -use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; -use function array_map; use function array_values; use function asort; use function count; @@ -183,10 +181,7 @@ if($paletteRaw === false){ } try{ - $states = array_map( - fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), - (new NetworkNbtSerializer())->readMultiple($paletteRaw) - ); + $states = BlockStateDictionary::loadPaletteFromString($paletteRaw); }catch(NbtException){ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index 584b7db62..6322f5255 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; use pocketmine\data\bedrock\block\BlockStateData; +use pocketmine\nbt\NbtDataException; use pocketmine\nbt\TreeRoot; use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; use function array_map; @@ -107,6 +108,19 @@ final class BlockStateDictionary{ */ public function getStates() : array{ return $this->states; } + /** + * @return BlockStateData[] + * @phpstan-return list + * + * @throws NbtDataException + */ + public static function loadPaletteFromString(string $blockPaletteContents) : array{ + return array_map( + fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), + (new NetworkNbtSerializer())->readMultiple($blockPaletteContents) + ); + } + public static function loadFromString(string $blockPaletteContents, string $metaMapContents) : self{ $metaMap = json_decode($metaMapContents, flags: JSON_THROW_ON_ERROR); if(!is_array($metaMap)){ @@ -114,12 +128,8 @@ final class BlockStateDictionary{ } $entries = []; - $states = array_map( - fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), - (new NetworkNbtSerializer())->readMultiple($blockPaletteContents) - ); - foreach($states as $i => $state){ + foreach(self::loadPaletteFromString($blockPaletteContents) as $i => $state){ $meta = $metaMap[$i] ?? null; if($meta === null){ throw new \InvalidArgumentException("Missing associated meta value for state $i (" . $state->toNbt() . ")"); diff --git a/tools/generate-block-palette-spec.php b/tools/generate-block-palette-spec.php index 376359ffc..b41c1334a 100644 --- a/tools/generate-block-palette-spec.php +++ b/tools/generate-block-palette-spec.php @@ -23,17 +23,14 @@ declare(strict_types=1); namespace pocketmine\tools\generate_block_palette_spec; -use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\errorhandler\ErrorToExceptionHandler; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; -use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\network\mcpe\convert\BlockStateDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Utils; -use function array_map; use function array_values; use function count; use function dirname; @@ -54,10 +51,7 @@ if(count($argv) !== 3){ [, $inputFile, $outputFile] = $argv; try{ - $states = array_map( - fn(TreeRoot $root) => BlockStateData::fromNbt($root->mustGetCompoundTag()), - (new NetworkNbtSerializer())->readMultiple(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))) - ); + $states = BlockStateDictionary::loadPaletteFromString(ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents($inputFile))); }catch(NbtException){ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1);