*/ private array $networkIdCache = []; /** Used when a blockstate can't be correctly serialized (e.g. because it's unknown) */ private BlockStateData $fallbackStateData; private function __construct(){ $contents = Utils::assumeNotFalse(file_get_contents(Path::join(\pocketmine\BEDROCK_DATA_PATH, "canonical_block_states.nbt")), "Missing required resource file"); $this->blockStateDictionary = BlockStateDictionary::loadFromString($contents); $this->blockStateSerializer = new BlockStateSerializer(); $this->fallbackStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); } public function toRuntimeId(int $internalStateId) : int{ if(isset($this->networkIdCache[$internalStateId])){ return $this->networkIdCache[$internalStateId]; } //TODO: singleton usage not ideal $block = BlockFactory::getInstance()->fromFullBlock($internalStateId); if($block instanceof UnknownBlock){ $blockStateData = $this->fallbackStateData; }else{ try{ $blockStateData = $this->blockStateSerializer->serialize($block); }catch(BlockStateSerializeException $e){ throw new AssumptionFailedError("Invalid serializer for block $block", 0, $e); } } $networkId = $this->blockStateDictionary->lookupStateIdFromData($blockStateData); if($networkId === null){ throw new AssumptionFailedError("Unmapped blockstate returned by blockstate serializer: " . $blockStateData->toNbt()); } return $this->networkIdCache[$internalStateId] = $networkId; } public function getBlockStateDictionary() : BlockStateDictionary{ return $this->blockStateDictionary; } public function getFallbackStateData() : BlockStateData{ return $this->fallbackStateData; } }