mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-23 03:16:35 +00:00
Fixed usages of BlockDataUpgrader which weren't accounting for thrown exceptions
This commit is contained in:
parent
4d0cecbac2
commit
6beb80b8fe
@ -52,7 +52,11 @@ class FlowerPot extends Spawnable{
|
|||||||
|
|
||||||
$blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader();
|
$blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader();
|
||||||
if(($itemIdTag = $nbt->getTag(self::TAG_ITEM)) instanceof ShortTag && ($itemMetaTag = $nbt->getTag(self::TAG_ITEM_DATA)) instanceof IntTag){
|
if(($itemIdTag = $nbt->getTag(self::TAG_ITEM)) instanceof ShortTag && ($itemMetaTag = $nbt->getTag(self::TAG_ITEM_DATA)) instanceof IntTag){
|
||||||
$blockStateData = $blockDataUpgrader->upgradeIntIdMeta($itemIdTag->getValue(), $itemMetaTag->getValue());
|
try{
|
||||||
|
$blockStateData = $blockDataUpgrader->upgradeIntIdMeta($itemIdTag->getValue(), $itemMetaTag->getValue());
|
||||||
|
}catch(BlockStateDeserializeException $e){
|
||||||
|
throw new SavedDataLoadingException("Error loading legacy flower pot item data: " . $e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
}elseif(($plantBlockTag = $nbt->getCompoundTag(self::TAG_PLANT_BLOCK)) !== null){
|
}elseif(($plantBlockTag = $nbt->getCompoundTag(self::TAG_PLANT_BLOCK)) !== null){
|
||||||
try{
|
try{
|
||||||
$blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($plantBlockTag);
|
$blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($plantBlockTag);
|
||||||
|
@ -23,6 +23,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace pocketmine\data\bedrock\item\upgrade;
|
namespace pocketmine\data\bedrock\item\upgrade;
|
||||||
|
|
||||||
|
use pocketmine\data\bedrock\block\BlockStateDeserializeException;
|
||||||
use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader;
|
use pocketmine\data\bedrock\block\upgrade\BlockDataUpgrader;
|
||||||
use pocketmine\data\bedrock\item\SavedItemData;
|
use pocketmine\data\bedrock\item\SavedItemData;
|
||||||
use pocketmine\data\bedrock\item\SavedItemStackData;
|
use pocketmine\data\bedrock\item\SavedItemStackData;
|
||||||
@ -57,7 +58,11 @@ final class ItemDataUpgrader{
|
|||||||
*/
|
*/
|
||||||
public function upgradeItemTypeDataString(string $rawNameId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{
|
public function upgradeItemTypeDataString(string $rawNameId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{
|
||||||
if(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){
|
if(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){
|
||||||
$blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta);
|
try{
|
||||||
|
$blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta);
|
||||||
|
}catch(BlockStateDeserializeException $e){
|
||||||
|
throw new SavedDataLoadingException("Failed to deserialize blockstate for legacy blockitem: " . $e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
//probably a standard item
|
//probably a standard item
|
||||||
$blockStateData = null;
|
$blockStateData = null;
|
||||||
@ -124,12 +129,17 @@ final class ItemDataUpgrader{
|
|||||||
|
|
||||||
$blockStateNbt = $tag->getCompoundTag(SavedItemData::TAG_BLOCK);
|
$blockStateNbt = $tag->getCompoundTag(SavedItemData::TAG_BLOCK);
|
||||||
if($blockStateNbt !== null){
|
if($blockStateNbt !== null){
|
||||||
$blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt);
|
try{
|
||||||
|
$blockStateData = $this->blockDataUpgrader->upgradeBlockStateNbt($blockStateNbt);
|
||||||
|
}catch(BlockStateDeserializeException $e){
|
||||||
|
throw new SavedDataLoadingException("Failed to deserialize blockstate for blockitem: " . $e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
}elseif(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){
|
}elseif(($r12BlockId = $this->r12ItemIdToBlockIdMap->itemIdToBlockId($rawNameId)) !== null){
|
||||||
//this is a legacy blockitem represented by ID + meta
|
//this is a legacy blockitem represented by ID + meta
|
||||||
$blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta);
|
try{
|
||||||
if($blockStateData === null){
|
$blockStateData = $this->blockDataUpgrader->upgradeStringIdMeta($r12BlockId, $meta);
|
||||||
throw new SavedDataLoadingException("Expected a blockstate to be associated with this block");
|
}catch(BlockStateDeserializeException $e){
|
||||||
|
throw new SavedDataLoadingException("Failed to deserialize blockstate for legacy blockitem: " . $e->getMessage(), 0, $e);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
//probably a standard item
|
//probably a standard item
|
||||||
|
@ -75,7 +75,11 @@ class FallingBlock extends Entity{
|
|||||||
//TODO: 1.8+ save format
|
//TODO: 1.8+ save format
|
||||||
$blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader();
|
$blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader();
|
||||||
if(($fallingBlockTag = $nbt->getCompoundTag(self::TAG_FALLING_BLOCK)) !== null){
|
if(($fallingBlockTag = $nbt->getCompoundTag(self::TAG_FALLING_BLOCK)) !== null){
|
||||||
$blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($fallingBlockTag);
|
try{
|
||||||
|
$blockStateData = $blockDataUpgrader->upgradeBlockStateNbt($fallingBlockTag);
|
||||||
|
}catch(BlockStateDeserializeException $e){
|
||||||
|
throw new SavedDataLoadingException("Invalid falling block blockstate: " . $e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
if(($tileIdTag = $nbt->getTag(self::TAG_TILE_ID)) instanceof IntTag){
|
if(($tileIdTag = $nbt->getTag(self::TAG_TILE_ID)) instanceof IntTag){
|
||||||
$blockId = $tileIdTag->getValue();
|
$blockId = $tileIdTag->getValue();
|
||||||
@ -86,10 +90,11 @@ class FallingBlock extends Entity{
|
|||||||
}
|
}
|
||||||
$damage = $nbt->getByte(self::TAG_DATA, 0);
|
$damage = $nbt->getByte(self::TAG_DATA, 0);
|
||||||
|
|
||||||
$blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $damage);
|
try{
|
||||||
}
|
$blockStateData = $blockDataUpgrader->upgradeIntIdMeta($blockId, $damage);
|
||||||
if($blockStateData === null){
|
}catch(BlockStateDeserializeException $e){
|
||||||
throw new SavedDataLoadingException("Invalid legacy falling block");
|
throw new SavedDataLoadingException("Invalid legacy falling block data: " . $e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
|
@ -37,6 +37,7 @@ use pocketmine\block\UnknownBlock;
|
|||||||
use pocketmine\block\VanillaBlocks;
|
use pocketmine\block\VanillaBlocks;
|
||||||
use pocketmine\data\bedrock\BiomeIds;
|
use pocketmine\data\bedrock\BiomeIds;
|
||||||
use pocketmine\data\bedrock\block\BlockStateData;
|
use pocketmine\data\bedrock\block\BlockStateData;
|
||||||
|
use pocketmine\data\bedrock\block\BlockStateDeserializeException;
|
||||||
use pocketmine\data\SavedDataLoadingException;
|
use pocketmine\data\SavedDataLoadingException;
|
||||||
use pocketmine\entity\Entity;
|
use pocketmine\entity\Entity;
|
||||||
use pocketmine\entity\EntityFactory;
|
use pocketmine\entity\EntityFactory;
|
||||||
@ -526,9 +527,10 @@ class World implements ChunkManager{
|
|||||||
if($item !== null){
|
if($item !== null){
|
||||||
$block = $item->getBlock();
|
$block = $item->getBlock();
|
||||||
}elseif(preg_match("/^-?\d+$/", $name) === 1){
|
}elseif(preg_match("/^-?\d+$/", $name) === 1){
|
||||||
//TODO: this may throw if the ID/meta was invalid
|
//TODO: this is a really sketchy hack - remove this as soon as possible
|
||||||
$blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta((int) $name, 0);
|
try{
|
||||||
if($blockStateData === null){
|
$blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta((int) $name, 0);
|
||||||
|
}catch(BlockStateDeserializeException){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$block = RuntimeBlockStateRegistry::getInstance()->fromStateId(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData));
|
$block = RuntimeBlockStateRegistry::getInstance()->fromStateId(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData));
|
||||||
|
@ -67,9 +67,10 @@ abstract class BaseWorldProvider implements WorldProvider{
|
|||||||
|
|
||||||
$newPalette = [];
|
$newPalette = [];
|
||||||
foreach($palette as $k => $legacyIdMeta){
|
foreach($palette as $k => $legacyIdMeta){
|
||||||
$newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf);
|
//TODO: remember data for unknown states so we can implement them later
|
||||||
if($newStateData === null){
|
try{
|
||||||
//TODO: remember data for unknown states so we can implement them later
|
$newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf);
|
||||||
|
}catch(BlockStateDeserializeException $e){
|
||||||
$newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData();
|
$newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user