Separate block legacy data upgrading from block deserialization

this commit provides a central place where all block data can go to be upgraded to the latest version (currently 1.19), irrespective of how old it is.

Previously I had issues during debugging, because it wasn't possible to just upgrade a block without deserializing it into a Block object, which isn't currently supported for many blocks.
This commit solves that problem by separating the upgrading from the deserialization.
This commit is contained in:
Dylan K. Taylor
2022-06-23 16:45:02 +01:00
parent 301b0aba82
commit 1533fcf8f6
6 changed files with 38 additions and 96 deletions

View File

@@ -65,12 +65,9 @@ class FallingBlock extends Entity{
public static function parseBlockNBT(BlockFactory $factory, CompoundTag $nbt) : Block{
//TODO: 1.8+ save format
$blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader();
if(($fallingBlockTag = $nbt->getCompoundTag(self::TAG_FALLING_BLOCK)) !== null){
try{
$blockStateData = GlobalBlockStateHandlers::nbtToBlockStateData($fallingBlockTag);
}catch(BlockStateDeserializeException $e){
throw new SavedDataLoadingException($e->getMessage(), 0, $e);
}
$blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($fallingBlockTag);
}else{
if(($tileIdTag = $nbt->getTag("TileID")) instanceof IntTag){
$blockId = $tileIdTag->getValue();
@@ -81,10 +78,10 @@ class FallingBlock extends Entity{
}
$damage = $nbt->getByte("Data", 0);
$blockStateData = GlobalBlockStateHandlers::getLegacyBlockStateMapper()->fromIntIdMeta($blockId, $damage);
if($blockStateData === null){
throw new SavedDataLoadingException("Invalid legacy falling block");
}
$blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $damage);
}
if($blockStateData === null){
throw new SavedDataLoadingException("Invalid legacy falling block");
}
try{