42 private array $mappingTable,
50 return $this->mappingTable[$id][$meta] ??
51 $this->mappingTable[$id][0] ??
59 $stringId = $this->legacyNumericIdMap->legacyToString($id);
60 if($stringId ===
null){
63 return $this->fromStringIdMeta($stringId, $meta);
71 $this->legacyNumericIdMap->add($stringId, $intId);
79 if(isset($this->mappingTable[$stringId][$meta])){
80 throw new \InvalidArgumentException(
"A mapping for $stringId:$meta already exists");
82 $this->mappingTable[$stringId][$meta] = $stateData;
85 public static function loadFromString(
string $data, LegacyBlockIdToStringIdMap $idMap, BlockStateUpgrader $blockStateUpgrader) : self{
88 $legacyStateMapReader =
new ByteBufferReader($data);
89 $nbtReader =
new LittleEndianNbtSerializer();
91 $idCount = VarInt::readUnsignedInt($legacyStateMapReader);
92 for($idIndex = 0; $idIndex < $idCount; $idIndex++){
93 $id = $legacyStateMapReader->readByteArray(VarInt::readUnsignedInt($legacyStateMapReader));
95 $metaCount = VarInt::readUnsignedInt($legacyStateMapReader);
96 for($metaIndex = 0; $metaIndex < $metaCount; $metaIndex++){
97 $meta = VarInt::readUnsignedInt($legacyStateMapReader);
99 $offset = $legacyStateMapReader->getOffset();
100 $state = $nbtReader->read($legacyStateMapReader->getData(), $offset)->mustGetCompoundTag();
101 $legacyStateMapReader->setOffset($offset);
102 $mappingTable[$id][$meta] = $blockStateUpgrader->upgrade(BlockStateData::fromNbt($state));
105 if($legacyStateMapReader->getUnreadLength() > 0){
106 throw new DataDecodeException(
"Unexpected trailing data in legacy state map data");
109 return new self($mappingTable, $idMap);