*/ public array $seenTypes = []; /** * @var string[][] * @phpstan-var array> */ public array $seenStateValues = []; } /** * @param BlockStateData[] $states * @phpstan-param list $states */ function generateBlockPaletteReport(array $states) : BlockPaletteReport{ $result = new BlockPaletteReport(); foreach($states as $stateData){ $name = $stateData->getName(); $result->seenTypes[$name] = $name; foreach(Utils::stringifyKeys($stateData->getStates()) as $k => $v){ $result->seenStateValues[$k][$v->getValue()] = $v->getValue(); asort($result->seenStateValues[$k]); } } ksort($result->seenTypes, SORT_STRING); ksort($result->seenStateValues, SORT_STRING); return $result; } function constifyMcId(string $id) : string{ return strtoupper(explode(":", $id, 2)[1]); } function generateClassHeader(string $className) : string{ $backslashPos = strrpos($className, "\\"); if($backslashPos === false){ throw new AssumptionFailedError("Expected a namespaced class FQN"); } $namespace = substr($className, 0, $backslashPos); $shortName = substr($className, $backslashPos + 1); return <<
$seenIds */ function generateBlockIds(array $seenIds) : void{ $output = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/block/BlockTypeNames.php', 'wb')); fwrite($output, generateClassHeader(BlockTypeNames::class)); foreach($seenIds as $id){ fwrite($output, "\tpublic const " . constifyMcId($id) . " = \"" . $id . "\";\n"); } fwrite($output, "}\n"); fclose($output); } function generateBlockStateNames(BlockPaletteReport $data) : void{ $output = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/block/BlockStateNames.php', 'wb')); fwrite($output, generateClassHeader(BlockStateNames::class)); foreach(Utils::stringifyKeys($data->seenStateValues) as $state => $values){ $constName = mb_strtoupper(preg_replace("/^minecraft:/", "mc_", $state) ?? throw new AssumptionFailedError("This regex is not invalid"), 'US-ASCII'); fwrite($output, "\tpublic const $constName = \"$state\";\n"); } fwrite($output, "}\n"); fclose($output); } function generateBlockStringValues(BlockPaletteReport $data) : void{ $output = ErrorToExceptionHandler::trapAndRemoveFalse(fn() => fopen(dirname(__DIR__) . '/src/data/bedrock/block/BlockStateStringValues.php', 'wb')); fwrite($output, generateClassHeader(BlockStateStringValues::class)); foreach(Utils::stringifyKeys($data->seenStateValues) as $stateName => $values){ $anyWritten = false; sort($values, SORT_STRING); foreach($values as $value){ if(!is_string($value)){ continue; } $anyWritten = true; $constName = mb_strtoupper(preg_replace("/^minecraft:/", "mc_", $stateName) . "_" . $value, 'US-ASCII'); fwrite($output, "\tpublic const $constName = \"$value\";\n"); } if($anyWritten){ fwrite($output, "\n"); } } fwrite($output, "}\n"); fclose($output); } if(count($argv) !== 2){ fwrite(STDERR, "This script regenerates BlockTypeNames, BlockStateNames and BlockStateStringValues from a given palette file\n"); fwrite(STDERR, "Required arguments: path to block palette file\n"); exit(1); } $palettePath = $argv[1]; $paletteRaw = file_get_contents($palettePath); if($paletteRaw === false){ fwrite(STDERR, "Failed to read block palette file\n"); exit(1); } try{ $states = BlockStateDictionary::loadPaletteFromString($paletteRaw); }catch(NbtException){ fwrite(STDERR, "Invalid block palette file $argv[1]\n"); exit(1); } $report = generateBlockPaletteReport($states); generateBlockIds(array_values($report->seenTypes)); generateBlockStateNames($report); generateBlockStringValues($report); echo "Done. Don't forget to run CS fixup after generating code.\n";