diff --git a/composer.lock b/composer.lock index 55c86608e..83a6d6ca0 100644 --- a/composer.lock +++ b/composer.lock @@ -254,12 +254,12 @@ "source": { "type": "git", "url": "https://github.com/pmmp/BedrockBlockUpgradeSchema.git", - "reference": "63f5f5e02e952ffa196a4c0671d7fcf8b8cdd9a4" + "reference": "b0cc441e029cf5a6de5b05dd0f5657208855232b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/63f5f5e02e952ffa196a4c0671d7fcf8b8cdd9a4", - "reference": "63f5f5e02e952ffa196a4c0671d7fcf8b8cdd9a4", + "url": "https://api.github.com/repos/pmmp/BedrockBlockUpgradeSchema/zipball/b0cc441e029cf5a6de5b05dd0f5657208855232b", + "reference": "b0cc441e029cf5a6de5b05dd0f5657208855232b", "shasum": "" }, "default-branch": true, @@ -273,7 +273,7 @@ "issues": "https://github.com/pmmp/BedrockBlockUpgradeSchema/issues", "source": "https://github.com/pmmp/BedrockBlockUpgradeSchema/tree/master" }, - "time": "2022-08-07T19:29:31+00:00" + "time": "2023-02-01T21:11:39+00:00" }, { "name": "pocketmine/bedrock-data", diff --git a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php index ef8267295..972362b86 100644 --- a/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php +++ b/src/data/bedrock/block/upgrade/BlockIdMetaUpgrader.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\block\upgrade; use pocketmine\data\bedrock\block\BlockStateData; -use pocketmine\network\mcpe\protocol\serializer\NetworkNbtSerializer; +use pocketmine\nbt\LittleEndianNbtSerializer; +use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; /** @@ -75,15 +76,24 @@ final class BlockIdMetaUpgrader{ $mappingTable = []; $legacyStateMapReader = new BinaryStream($data); - $nbtReader = new NetworkNbtSerializer(); - while(!$legacyStateMapReader->feof()){ - $id = $legacyStateMapReader->get($legacyStateMapReader->getUnsignedVarInt()); - $meta = $legacyStateMapReader->getLShort(); + $nbtReader = new LittleEndianNbtSerializer(); - $offset = $legacyStateMapReader->getOffset(); - $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); - $legacyStateMapReader->setOffset($offset); - $mappingTable[$id][$meta] = $blockStateUpgrader->upgrade(BlockStateData::fromNbt($state)); + $idCount = $legacyStateMapReader->getUnsignedVarInt(); + for($idIndex = 0; $idIndex < $idCount; $idIndex++){ + $id = $legacyStateMapReader->get($legacyStateMapReader->getUnsignedVarInt()); + + $metaCount = $legacyStateMapReader->getUnsignedVarInt(); + for($metaIndex = 0; $metaIndex < $metaCount; $metaIndex++){ + $meta = $legacyStateMapReader->getUnsignedVarInt(); + + $offset = $legacyStateMapReader->getOffset(); + $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); + $legacyStateMapReader->setOffset($offset); + $mappingTable[$id][$meta] = $blockStateUpgrader->upgrade(BlockStateData::fromNbt($state)); + } + } + if(!$legacyStateMapReader->feof()){ + throw new BinaryDataException("Unexpected trailing data in legacy state map data"); } return new self($mappingTable, $idMap);