path = $path; $this->worldData = $this->loadLevelData(); } /** * @throws CorruptedWorldException * @throws UnsupportedWorldFormatException */ abstract protected function loadLevelData() : WorldData; private function translatePalette(PalettedBlockArray $blockArray) : PalettedBlockArray{ $palette = $blockArray->getPalette(); //TODO: this should be dependency-injected so it can be replaced, but that would break BC //also, we want it to be lazy-loaded ... $legacyBlockStateMapper = GlobalBlockStateHandlers::getLegacyBlockStateMapper(); $blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); $newPalette = []; foreach($palette as $k => $legacyIdMeta){ $newStateData = $legacyBlockStateMapper->fromIntIdMeta($legacyIdMeta >> 4, $legacyIdMeta & 0xf); if($newStateData === null){ //TODO: remember data for unknown states so we can implement them later $newStateData = new BlockStateData(BlockTypeNames::INFO_UPDATE, CompoundTag::create(), BlockStateData::CURRENT_VERSION); } $newPalette[$k] = $blockStateDeserializer->deserialize($newStateData); } //TODO: this is sub-optimal since it reallocates the offset table multiple times return PalettedBlockArray::fromData( $blockArray->getBitsPerBlock(), $blockArray->getWordArray(), $newPalette ); } protected function palettizeLegacySubChunkXZY(string $idArray, string $metaArray) : PalettedBlockArray{ return $this->translatePalette(SubChunkConverter::convertSubChunkXZY($idArray, $metaArray)); } protected function palettizeLegacySubChunkYZX(string $idArray, string $metaArray) : PalettedBlockArray{ return $this->translatePalette(SubChunkConverter::convertSubChunkYZX($idArray, $metaArray)); } protected function palettizeLegacySubChunkFromColumn(string $idArray, string $metaArray, int $yOffset) : PalettedBlockArray{ return $this->translatePalette(SubChunkConverter::convertSubChunkFromLegacyColumn($idArray, $metaArray, $yOffset)); } public function getPath() : string{ return $this->path; } public function getWorldData() : WorldData{ return $this->worldData; } }