2727use pocketmine \data \bedrock \block \BlockStateNames ;
2828use pocketmine \data \bedrock \block \BlockStateStringValues ;
2929use pocketmine \data \bedrock \block \BlockTypeNames ;
30- use pocketmine \errorhandler \ErrorToExceptionHandler ;
3130use pocketmine \nbt \NbtException ;
3231use pocketmine \nbt \tag \ByteTag ;
3332use pocketmine \nbt \tag \IntTag ;
3433use pocketmine \nbt \tag \StringTag ;
3534use pocketmine \network \mcpe \convert \BlockStateDictionary ;
3635use pocketmine \utils \AssumptionFailedError ;
36+ use pocketmine \utils \Filesystem ;
3737use pocketmine \utils \Utils ;
3838use function array_values ;
3939use function asort ;
4444use function file_get_contents ;
4545use function fopen ;
4646use function fwrite ;
47+ use function is_dir ;
4748use function is_string ;
4849use function ksort ;
4950use function mb_strtoupper ;
51+ use function mkdir ;
5052use function preg_replace ;
5153use function sort ;
5254use function strrpos ;
5557use const SORT_STRING ;
5658use const STDERR ;
5759
58- require dirname (__DIR__ ) . '/vendor/autoload.php ' ;
60+ require dirname (__DIR__ , 2 ) . '/vendor/autoload.php ' ;
5961
6062class BlockPaletteReport{
6163 /**
@@ -98,36 +100,15 @@ function constifyMcId(string $id) : string{
98100 return strtoupper (explode (": " , $ id , 2 )[1 ]);
99101}
100102
101- function generateClassHeader (string $ className ) : string {
103+ function generateClassHeader (string $ className, string $ fileHeader ) : string {
102104 $ backslashPos = strrpos ($ className , "\\" );
103105 if ($ backslashPos === false ){
104106 throw new AssumptionFailedError ("Expected a namespaced class FQN " );
105107 }
106108 $ namespace = substr ($ className , 0 , $ backslashPos );
107109 $ shortName = substr ($ className , $ backslashPos + 1 );
108- return <<<HEADER
109- <?php
110110
111- /*
112- *
113- * ____ _ _ __ __ _ __ __ ____
114- * | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
115- * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
116- * | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
117- * |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
118- *
119- * This program is free software: you can redistribute it and/or modify
120- * it under the terms of the GNU Lesser General Public License as published by
121- * the Free Software Foundation, either version 3 of the License, or
122- * (at your option) any later version.
123- *
124- * @author PocketMine Team
125- * @link http://www.pocketmine.net/
126- *
127- *
128- */
129-
130- declare(strict_types=1);
111+ return $ fileHeader . <<<HEADER
131112
132113namespace $ namespace;
133114
@@ -143,13 +124,26 @@ private function __construct(){
143124HEADER ;
144125}
145126
127+ /** @return resource */
128+ function safe_fopen (string $ file , string $ flags ){
129+ $ dir = dirname ($ file );
130+ if (!@mkdir ($ dir , recursive: true ) && !is_dir ($ dir )){
131+ throw new \RuntimeException ("Couldn't create directory: $ dir " );
132+ }
133+ $ result = fopen ($ file , $ flags );
134+ if ($ result === false ){
135+ throw new \RuntimeException ("Failed to open file: $ file " );
136+ }
137+ return $ result ;
138+ }
139+
146140/**
147141 * @phpstan-param list<string> $seenIds
148142 */
149- function generateBlockIds (array $ seenIds ) : void {
150- $ output = ErrorToExceptionHandler:: trapAndRemoveFalse ( fn () => fopen ( dirname (__DIR__ ) . '/src /data/bedrock/block/BlockTypeNames.php ' , 'wb ' ) );
143+ function generateBlockIds (array $ seenIds, string $ fileHeader ) : void {
144+ $ output = safe_fopen ( dirname (__DIR__ , 2 ) . '/generated /data/bedrock/block/BlockTypeNames.php ' , 'wb ' );
151145
152- fwrite ($ output , generateClassHeader (BlockTypeNames::class));
146+ fwrite ($ output , generateClassHeader (BlockTypeNames::class, $ fileHeader ));
153147
154148 foreach ($ seenIds as $ id ){
155149 fwrite ($ output , "\tpublic const " . constifyMcId ($ id ) . " = \"" . $ id . "\"; \n" );
@@ -159,10 +153,10 @@ function generateBlockIds(array $seenIds) : void{
159153 fclose ($ output );
160154}
161155
162- function generateBlockStateNames (BlockPaletteReport $ data ) : void {
163- $ output = ErrorToExceptionHandler:: trapAndRemoveFalse ( fn () => fopen ( dirname (__DIR__ ) . '/src /data/bedrock/block/BlockStateNames.php ' , 'wb ' ) );
156+ function generateBlockStateNames (BlockPaletteReport $ data, string $ fileHeader ) : void {
157+ $ output = safe_fopen ( dirname (__DIR__ , 2 ) . '/generated /data/bedrock/block/BlockStateNames.php ' , 'wb ' );
164158
165- fwrite ($ output , generateClassHeader (BlockStateNames::class));
159+ fwrite ($ output , generateClassHeader (BlockStateNames::class, $ fileHeader ));
166160 foreach (Utils::stringifyKeys ($ data ->seenStateValues ) as $ state => $ values ){
167161 $ constName = mb_strtoupper (preg_replace ("/^minecraft:/ " , "mc_ " , $ state ) ?? throw new AssumptionFailedError ("This regex is not invalid " ), 'US-ASCII ' );
168162 fwrite ($ output , "\tpublic const $ constName = \"$ state \"; \n" );
@@ -172,10 +166,10 @@ function generateBlockStateNames(BlockPaletteReport $data) : void{
172166 fclose ($ output );
173167}
174168
175- function generateBlockStringValues (BlockPaletteReport $ data ) : void {
176- $ output = ErrorToExceptionHandler:: trapAndRemoveFalse ( fn () => fopen ( dirname (__DIR__ ) . '/src /data/bedrock/block/BlockStateStringValues.php ' , 'wb ' ) );
169+ function generateBlockStringValues (BlockPaletteReport $ data, string $ fileHeader ) : void {
170+ $ output = safe_fopen ( dirname (__DIR__ , 2 ) . '/generated /data/bedrock/block/BlockStateStringValues.php ' , 'wb ' );
177171
178- fwrite ($ output , generateClassHeader (BlockStateStringValues::class));
172+ fwrite ($ output , generateClassHeader (BlockStateStringValues::class, $ fileHeader ));
179173 foreach (Utils::stringifyKeys ($ data ->seenStateValues ) as $ stateName => $ values ){
180174 $ anyWritten = false ;
181175 sort ($ values , SORT_STRING );
@@ -201,6 +195,8 @@ function generateBlockStringValues(BlockPaletteReport $data) : void{
201195 exit (1 );
202196}
203197
198+ $ fileHeader = Filesystem::fileGetContents (__DIR__ . "/templates/header.php " );
199+
204200$ palettePath = $ argv [1 ];
205201$ paletteRaw = file_get_contents ($ palettePath );
206202if ($ paletteRaw === false ){
@@ -216,8 +212,8 @@ function generateBlockStringValues(BlockPaletteReport $data) : void{
216212}
217213
218214$ report = generateBlockPaletteReport ($ states );
219- generateBlockIds (array_values ($ report ->seenTypes ));
220- generateBlockStateNames ($ report );
221- generateBlockStringValues ($ report );
215+ generateBlockIds (array_values ($ report ->seenTypes ), $ fileHeader );
216+ generateBlockStateNames ($ report, $ fileHeader );
217+ generateBlockStringValues ($ report, $ fileHeader );
222218
223219echo "Done. Don't forget to run CS fixup after generating code. \n" ;
0 commit comments