From 75410a541211dc4819f786fcbb4891bf3f7c1394 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 28 Apr 2023 19:31:00 +0100 Subject: [PATCH] BlockStateUpgradeSchemaUtils: sort data before emitting JSON this makes it easier to see what's changing, as well as making the order stable across multiple regenerations. --- .../upgrade/BlockStateUpgradeSchemaUtils.php | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php index b7576b2ef..3b247be37 100644 --- a/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/block/upgrade/BlockStateUpgradeSchemaUtils.php @@ -31,6 +31,7 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\Filesystem; use pocketmine\utils\Utils; use Symfony\Component\Filesystem\Path; @@ -42,7 +43,9 @@ use function gettype; use function implode; use function is_object; use function json_decode; +use function json_encode; use function ksort; +use function sort; use function str_pad; use function strval; use const JSON_THROW_ON_ERROR; @@ -170,7 +173,10 @@ final class BlockStateUpgradeSchemaUtils{ $dedupTableMap = []; $counter = 0; - foreach(Utils::stringifyKeys($schema->remappedPropertyValues) as $blockName => $remaps){ + $orderedRemappedValues = $schema->remappedPropertyValues; + ksort($orderedRemappedValues); + foreach(Utils::stringifyKeys($orderedRemappedValues) as $blockName => $remaps){ + ksort($remaps); foreach(Utils::stringifyKeys($remaps) as $propertyName => $remappedValues){ $remappedValuesMap = []; foreach($remappedValues as $oldNew){ @@ -215,6 +221,12 @@ final class BlockStateUpgradeSchemaUtils{ ); } } + ksort($modelTable); + ksort($dedupMapping); + foreach(Utils::stringifyKeys($dedupMapping) as $blockName => $properties){ + ksort($properties); + $dedupMapping[$blockName] = $properties; + } $model->remappedPropertyValuesIndex = $modelTable; $model->remappedPropertyValues = $dedupMapping; @@ -226,26 +238,58 @@ final class BlockStateUpgradeSchemaUtils{ $result->maxVersionMinor = $schema->maxVersionMinor; $result->maxVersionPatch = $schema->maxVersionPatch; $result->maxVersionRevision = $schema->maxVersionRevision; + $result->renamedIds = $schema->renamedIds; + ksort($result->renamedIds); + $result->renamedProperties = $schema->renamedProperties; + ksort($result->renamedProperties); + foreach(Utils::stringifyKeys($result->renamedProperties) as $blockName => $properties){ + ksort($properties); + $result->renamedProperties[$blockName] = $properties; + } + $result->removedProperties = $schema->removedProperties; + ksort($result->removedProperties); + foreach(Utils::stringifyKeys($result->removedProperties) as $blockName => $properties){ + sort($properties); //yes, this is intended to sort(), not ksort() + $result->removedProperties[$blockName] = $properties; + } foreach(Utils::stringifyKeys($schema->addedProperties) as $blockName => $properties){ + $addedProperties = []; foreach(Utils::stringifyKeys($properties) as $propertyName => $propertyValue){ - $result->addedProperties[$blockName][$propertyName] = self::tagToJsonModel($propertyValue); + $addedProperties[$propertyName] = self::tagToJsonModel($propertyValue); } + ksort($addedProperties); + $result->addedProperties[$blockName] = $addedProperties; + } + if(isset($result->addedProperties)){ + ksort($result->addedProperties); } self::buildRemappedValuesIndex($schema, $result); foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ + $keyedRemaps = []; foreach($remaps as $remap){ - $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaModelBlockRemap( + $modelRemap = new BlockStateUpgradeSchemaModelBlockRemap( array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), $remap->newName, array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), ); + $key = json_encode($modelRemap); + if(isset($keyedRemaps[$key])){ + continue; + throw new AssumptionFailedError("Duplicate remap: $key"); + } + $keyedRemaps[$key] = $modelRemap; } + ksort($keyedRemaps); + $result->remappedStates[$oldBlockName] = array_values($keyedRemaps); + } + if(isset($result->remappedStates)){ + ksort($result->remappedStates); } return $result;