> $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); } public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap) : 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] = BlockStateData::fromNbt($state); } return new self($mappingTable, $idMap); } }