tools/generate-bedrock-data-from-packets: generate less noise for items

if we have only a name (the majority case), we can just return the name directly instead of an object.
this massively reduces the amount of noise in the files as seen in pmmp/BedrockData@f814036229
This commit is contained in:
Dylan K. Taylor 2025-08-28 21:15:09 +01:00
parent de234d1f38
commit dd9030f1f5
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
4 changed files with 34 additions and 8 deletions

View File

@ -162,7 +162,7 @@ final class CraftingManagerFromDataHelper{
} }
$mapper = new \JsonMapper(); $mapper = new \JsonMapper();
$mapper->bStrictObjectTypeChecking = true; $mapper->bStrictObjectTypeChecking = false; //to allow hydrating ItemStackData - since this is only used for offline data it's safe
$mapper->bExceptionOnUndefinedProperty = true; $mapper->bExceptionOnUndefinedProperty = true;
$mapper->bExceptionOnMissingData = true; $mapper->bExceptionOnMissingData = true;

View File

@ -23,7 +23,9 @@ declare(strict_types=1);
namespace pocketmine\crafting\json; namespace pocketmine\crafting\json;
final class ItemStackData{ use function count;
final class ItemStackData implements \JsonSerializable{
/** @required */ /** @required */
public string $name; public string $name;
@ -40,4 +42,15 @@ final class ItemStackData{
public function __construct(string $name){ public function __construct(string $name){
$this->name = $name; $this->name = $name;
} }
/**
* @return mixed[]|string
*/
public function jsonSerialize() : array|string{
$result = (array) $this;
if(count($result) === 1 && isset($result["name"])){
return $this->name;
}
return $result;
}
} }

View File

@ -168,6 +168,12 @@ parameters:
count: 1 count: 1
path: ../../../src/crafting/ShapedRecipe.php path: ../../../src/crafting/ShapedRecipe.php
-
message: '#^Offset ''name'' on \*NEVER\* in isset\(\) always exists and is not nullable\.$#'
identifier: isset.offset
count: 1
path: ../../../src/crafting/json/ItemStackData.php
- -
message: '#^Property pocketmine\\crash\\CrashDumpData\:\:\$parameters \(list\<string\>\) does not accept array\.$#' message: '#^Property pocketmine\\crash\\CrashDumpData\:\:\$parameters \(list\<string\>\) does not accept array\.$#'
identifier: assign.propertyType identifier: assign.propertyType

View File

@ -209,11 +209,18 @@ class ParserPacketHandler extends PacketHandler{
return $data; return $data;
} }
/** private static function objectToOrderedArray(object $object) : mixed{
* @return mixed[] if($object instanceof \JsonSerializable){
*/ $result = $object->jsonSerialize();
private static function objectToOrderedArray(object $object) : array{ if(is_object($result)){
$result = (array) ($object instanceof \JsonSerializable ? $object->jsonSerialize() : $object); $result = (array) $result;
}elseif(!is_array($result)){
return $result;
}
}else{
$result = (array) $object;
}
ksort($result, SORT_STRING); ksort($result, SORT_STRING);
foreach(Utils::promoteKeys($result) as $property => $value){ foreach(Utils::promoteKeys($result) as $property => $value){
@ -280,7 +287,7 @@ class ParserPacketHandler extends PacketHandler{
file_put_contents($this->bedrockDataPath . '/required_item_list.json', json_encode($table, JSON_PRETTY_PRINT) . "\n"); file_put_contents($this->bedrockDataPath . '/required_item_list.json', json_encode($table, JSON_PRETTY_PRINT) . "\n");
echo "updating item registry\n"; echo "updating item registry\n";
$items = array_map(function(ItemTypeEntry $entry) : array{ $items = array_map(function(ItemTypeEntry $entry) : mixed{
return self::objectToOrderedArray($entry); return self::objectToOrderedArray($entry);
}, $packet->getEntries()); }, $packet->getEntries());
file_put_contents($this->bedrockDataPath . '/item_registry.json', json_encode($items, JSON_PRETTY_PRINT) . "\n"); file_put_contents($this->bedrockDataPath . '/item_registry.json', json_encode($items, JSON_PRETTY_PRINT) . "\n");