diff --git a/tools/generate-blockstate-upgrade-schema.php b/tools/generate-blockstate-upgrade-schema.php index 70591fa28..691f608fa 100644 --- a/tools/generate-blockstate-upgrade-schema.php +++ b/tools/generate-blockstate-upgrade-schema.php @@ -280,13 +280,15 @@ function processStateGroup(string $oldName, array $upgradeTable, BlockStateUpgra * This significantly reduces the output size during flattening when the flattened block has many permutations * (e.g. walls). * - * @param BlockStateMapping[] $upgradeTable + * @param BlockStateUpgradeSchemaBlockRemap[] $stateRemaps + * @param BlockStateMapping[] $upgradeTable + * @phpstan-param list $stateRemaps * @phpstan-param array $upgradeTable * * @return BlockStateUpgradeSchemaBlockRemap[] * @phpstan-return list */ -function processRemappedStates(array $upgradeTable) : array{ +function compressRemappedStates(array $upgradeTable, array $stateRemaps) : array{ $unchangedStatesByNewName = []; foreach($upgradeTable as $pair){ @@ -329,26 +331,21 @@ function processRemappedStates(array $upgradeTable) : array{ $compressedRemaps = []; - foreach($upgradeTable as $remap){ - $oldState = $remap->old->getStates(); - $newState = $remap->new->getStates(); + foreach($stateRemaps as $remap){ + $oldState = $remap->oldState; + $newState = $remap->newState; - if(count($oldState) === 0 || count($newState) === 0){ - //all states have changed in some way - compression not possible - assert(!isset($unchangedStatesByNewName[$remap->new->getName()])); - $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( - $oldState, - $remap->new->getName(), - $newState, - [] - ); + if($oldState === null || $newState === null){ + //no unchanged states - no compression possible + assert(!isset($unchangedStatesByNewName[$remap->newName])); + $compressedRemaps[$remap->newName][] = $remap; continue; } $cleanedOldState = $oldState; $cleanedNewState = $newState; - foreach($unchangedStatesByNewName[$remap->new->getName()] as $propertyName){ + foreach($unchangedStatesByNewName[$remap->newName] as $propertyName){ unset($cleanedOldState[$propertyName]); unset($cleanedNewState[$propertyName]); } @@ -356,8 +353,10 @@ function processRemappedStates(array $upgradeTable) : array{ ksort($cleanedNewState); $duplicate = false; - $compressedRemaps[$remap->new->getName()] ??= []; - foreach($compressedRemaps[$remap->new->getName()] as $k => $compressedRemap){ + $compressedRemaps[$remap->newName] ??= []; + foreach($compressedRemaps[$remap->newName] as $k => $compressedRemap){ + assert($compressedRemap->oldState !== null && $compressedRemap->newState !== null); + if( count($compressedRemap->oldState) !== count($cleanedOldState) || count($compressedRemap->newState) !== count($cleanedNewState) @@ -380,11 +379,11 @@ function processRemappedStates(array $upgradeTable) : array{ break; } if(!$duplicate){ - $compressedRemaps[$remap->new->getName()][] = new BlockStateUpgradeSchemaBlockRemap( + $compressedRemaps[$remap->newName][] = new BlockStateUpgradeSchemaBlockRemap( $cleanedOldState, - $remap->new->getName(), + $remap->newName, $cleanedNewState, - $unchangedStatesByNewName[$remap->new->getName()] + $unchangedStatesByNewName[$remap->newName] ); } } @@ -456,9 +455,21 @@ function generateBlockStateUpgradeSchema(array $upgradeTable) : BlockStateUpgrad } } //block mapped to multiple different new IDs; we can't guess these, so we just do a plain old remap - $result->remappedStates[$oldName] = processRemappedStates($blockStateMappings); + foreach($blockStateMappings as $mapping){ + if(!$mapping->old->equals($mapping->new)){ + $result->remappedStates[$mapping->old->getName()][] = new BlockStateUpgradeSchemaBlockRemap( + $mapping->old->getStates(), + $mapping->new->getName(), + $mapping->new->getStates(), + [] + ); + } + } } } + foreach(Utils::stringifyKeys($result->remappedStates) as $oldName => $remap){ + $result->remappedStates[$oldName] = compressRemappedStates($upgradeTable[$oldName], $remap); + } return $result; }