> $mappingTable */ public function __construct( private array $mappingTable, private LegacyBlockIdToStringIdMap $legacyNumericIdMap ){} public function fromStringIdMeta(string $id, int $meta) : ?BlockStateData{ return $this->mappingTable[$id][$meta] ?? $this->mappingTable[$id][0] ?? null; } public function fromIntIdMeta(int $id, int $meta) : ?BlockStateData{ $stringId = $this->legacyNumericIdMap->legacyToString($id); if($stringId === null){ return null; } return $this->fromStringIdMeta($stringId, $meta); } /** * Adds a mapping of legacy block ID and meta to modern blockstate data. This may be needed for upgrading data from * stored custom blocks from older versions of PocketMine-MP. */ public function addMapping(string $stringId, int $intId, int $meta, BlockStateData $stateData) : void{ if(isset($this->mappingTable[$stringId][$meta])){ throw new \InvalidArgumentException("A mapping for $stringId:$meta already exists"); } $this->mappingTable[$stringId][$meta] = $stateData; $this->legacyNumericIdMap->add($stringId, $intId); } public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap, BlockStateUpgrader $blockStateUpgrader) : self{ $mappingTable = []; $legacyStateMapReader = new BinaryStream($data); $nbtReader = new NetworkNbtSerializer(); while(!$legacyStateMapReader->feof()){ $id = $legacyStateMapReader->get($legacyStateMapReader->getUnsignedVarInt()); $meta = $legacyStateMapReader->getLShort(); $offset = $legacyStateMapReader->getOffset(); $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); $legacyStateMapReader->setOffset($offset); $mappingTable[$id][$meta] = $blockStateUpgrader->upgrade(BlockStateData::fromNbt($state)); } return new self($mappingTable, $idMap); } }