blockStateDeserializer = GlobalBlockStateHandlers::getDeserializer(); $this->blockDataUpgrader = GlobalBlockStateHandlers::getUpgrader(); $this->blockStateSerializer = GlobalBlockStateHandlers::getSerializer(); $this->worldData = $this->loadLevelData(); } /** * @throws CorruptedWorldException * @throws UnsupportedWorldFormatException */ abstract protected function loadLevelData() : WorldData; private function translatePalette(PalettedBlockArray $blockArray, \Logger $logger) : PalettedBlockArray{ //TODO: missing type info in stubs /** @phpstan-var list $palette */ $palette = $blockArray->getPalette(); $newPalette = []; $blockDecodeErrors = []; foreach($palette as $k => $legacyIdMeta){ //TODO: remember data for unknown states so we can implement them later $id = $legacyIdMeta >> 4; $meta = $legacyIdMeta & 0xf; try{ $newStateData = $this->blockDataUpgrader->upgradeIntIdMeta($id, $meta); }catch(BlockStateDeserializeException $e){ $blockDecodeErrors[] = "Palette offset $k / Failed to upgrade legacy ID/meta $id:$meta: " . $e->getMessage(); $newStateData = GlobalBlockStateHandlers::getUnknownBlockStateData(); } try{ $newPalette[$k] = $this->blockStateDeserializer->deserialize($newStateData); }catch(BlockStateDeserializeException $e){ //this should never happen anyway - if the upgrader returned an invalid state, we have bigger problems $blockDecodeErrors[] = "Palette offset $k / Failed to deserialize upgraded state $id:$meta: " . $e->getMessage(); $newPalette[$k] = $this->blockStateDeserializer->deserialize(GlobalBlockStateHandlers::getUnknownBlockStateData()); } } if(count($blockDecodeErrors) > 0){ $logger->error("Errors decoding/upgrading blocks:\n - " . implode("\n - ", $blockDecodeErrors)); } //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, \Logger $logger) : PalettedBlockArray{ return $this->translatePalette(SubChunkConverter::convertSubChunkXZY($idArray, $metaArray), $logger); } protected function palettizeLegacySubChunkYZX(string $idArray, string $metaArray, \Logger $logger) : PalettedBlockArray{ return $this->translatePalette(SubChunkConverter::convertSubChunkYZX($idArray, $metaArray), $logger); } protected function palettizeLegacySubChunkFromColumn(string $idArray, string $metaArray, int $yOffset, \Logger $logger) : PalettedBlockArray{ return $this->translatePalette(SubChunkConverter::convertSubChunkFromLegacyColumn($idArray, $metaArray, $yOffset), $logger); } public function getPath() : string{ return $this->path; } public function getWorldData() : WorldData{ return $this->worldData; } }