diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php index b47c9f1fe..024b0d4b3 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchema.php @@ -57,6 +57,12 @@ final class BlockStateUpgradeSchema{ */ public array $remappedPropertyValues = []; + /** + * @var BlockStateUpgradeSchemaBlockRemap[][] + * @phpstan-var array> + */ + public array $remappedStates = []; + public function __construct( public int $maxVersionMajor, public int $maxVersionMinor, diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php index 425fe0545..d3f9304e1 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgradeSchemaUtils.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\data\bedrock\blockstate\upgrade; use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModel; +use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelBlockRemap; use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelTag; use pocketmine\data\bedrock\blockstate\upgrade\model\BlockStateUpgradeSchemaModelValueRemap; use pocketmine\errorhandler\ErrorToExceptionHandler; @@ -33,6 +34,7 @@ use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\Tag; use pocketmine\utils\Utils; use Webmozart\PathUtil\Path; +use function array_map; use function file_get_contents; use function get_class; use function implode; @@ -142,6 +144,16 @@ final class BlockStateUpgradeSchemaUtils{ } } + foreach(Utils::stringifyKeys($model->remappedStates ?? []) as $oldBlockName => $remaps){ + foreach($remaps as $remap){ + $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaBlockRemap( + array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->oldState), + $remap->newName, + array_map(fn(BlockStateUpgradeSchemaModelTag $tag) => self::jsonModelToTag($tag), $remap->newState), + ); + } + } + return $result; } @@ -172,6 +184,16 @@ final class BlockStateUpgradeSchemaUtils{ } } + foreach(Utils::stringifyKeys($schema->remappedStates) as $oldBlockName => $remaps){ + foreach($remaps as $remap){ + $result->remappedStates[$oldBlockName][] = new BlockStateUpgradeSchemaModelBlockRemap( + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->oldState), + $remap->newName, + array_map(fn(Tag $tag) => self::tagToJsonModel($tag), $remap->newState), + ); + } + } + return $result; } diff --git a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php index b24489fcf..9f3ec33cb 100644 --- a/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php +++ b/src/data/bedrock/blockstate/upgrade/BlockStateUpgrader.php @@ -54,8 +54,6 @@ final class BlockStateUpgrader{ } public function upgrade(BlockStateData $blockStateData) : BlockStateData{ - $oldName = $blockStateData->getName(); - $version = $blockStateData->getVersion(); foreach($this->upgradeSchemas as $resultVersion => $schemas){ if($version > $resultVersion){ @@ -64,6 +62,15 @@ final class BlockStateUpgrader{ continue; } foreach($schemas as $schema){ + $oldName = $blockStateData->getName(); + if(isset($schema->remappedStates[$oldName])){ + foreach($schema->remappedStates[$oldName] as $remap){ + if($blockStateData->getStates()->equals($remap->oldState)){ + $blockStateData = new BlockStateData($remap->newName, clone $remap->newState, $resultVersion); + continue 2; + } + } + } $newName = $schema->renamedIds[$oldName] ?? null; $stateChanges = 0; diff --git a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php index 4827082c9..54357bd8d 100644 --- a/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php +++ b/src/data/bedrock/blockstate/upgrade/model/BlockStateUpgradeSchemaModel.php @@ -69,6 +69,12 @@ final class BlockStateUpgradeSchemaModel implements \JsonSerializable{ */ public array $remappedPropertyValues; + /** + * @var BlockStateUpgradeSchemaModelBlockRemap[][] + * @phpstan-var array> + */ + public array $remappedStates; + /** * @return mixed[] */