From 6b7a4e2c418e369348d00c3933cbe2934b49a22c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 2 Feb 2023 16:08:49 +0000 Subject: [PATCH] Split up ItemDataUpgrader (preparing for code backport) --- .../bedrock/item/upgrade/ItemDataUpgrader.php | 49 ++---------- .../item/upgrade/ItemIdMetaUpgrader.php | 77 +++++++++++++++++++ .../format/io/GlobalItemDataHandlers.php | 5 +- 3 files changed, 87 insertions(+), 44 deletions(-) create mode 100644 src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index f37bc7f8e..47ac61219 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -36,40 +36,19 @@ use pocketmine\nbt\tag\ShortTag; use pocketmine\nbt\tag\StringTag; use pocketmine\utils\Binary; use function assert; -use function ksort; -use const SORT_NUMERIC; final class ItemDataUpgrader{ private const TAG_LEGACY_ID = "id"; //TAG_Short (or TAG_String for Java itemstacks) /** - * @var ItemIdMetaUpgradeSchema[] - * @phpstan-var array - */ - private array $idMetaUpgradeSchemas = []; - - /** - * @param ItemIdMetaUpgradeSchema[] $idMetaUpgradeSchemas * @phpstan-param array $idMetaUpgradeSchemas */ public function __construct( + private ItemIdMetaUpgrader $idMetaUpgrader, private LegacyItemIdToStringIdMap $legacyIntToStringIdMap, private R12ItemIdToBlockIdMap $r12ItemIdToBlockIdMap, private BlockDataUpgrader $blockDataUpgrader, - array $idMetaUpgradeSchemas - ){ - foreach($idMetaUpgradeSchemas as $schema){ - $this->addIdMetaUpgradeSchema($schema); - } - } - - public function addIdMetaUpgradeSchema(ItemIdMetaUpgradeSchema $schema) : void{ - if(isset($this->idMetaUpgradeSchemas[$schema->getSchemaId()])){ - throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getSchemaId()); - } - $this->idMetaUpgradeSchemas[$schema->getSchemaId()] = $schema; - ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); - } + ){} /** * This function replaces the legacy ItemFactory::get(). @@ -87,7 +66,7 @@ final class ItemDataUpgrader{ $blockStateData = null; } - [$newNameId, $newMeta] = $this->upgradeItemStringIdMeta($rawNameId, $meta); + [$newNameId, $newMeta] = $this->idMetaUpgrader->upgradeStringIdMeta($rawNameId, $meta); //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? @@ -107,6 +86,8 @@ final class ItemDataUpgrader{ * @throws SavedDataLoadingException if the legacy numeric ID doesn't map to a string ID */ public function upgradeItemTypeDataInt(int $legacyNumericId, int $meta, int $count, ?CompoundTag $nbt) : SavedItemStackData{ + //do not upgrade the ID beyond this initial step - we need the 1.12 ID for the item ID -> block ID map in the + //next step $rawNameId = $this->legacyIntToStringIdMap->legacyToString($legacyNumericId); if($rawNameId === null){ throw new SavedDataLoadingException("Unmapped legacy item ID $legacyNumericId"); @@ -158,7 +139,7 @@ final class ItemDataUpgrader{ $blockStateData = null; } - [$newNameId, $newMeta] = $this->upgradeItemStringIdMeta($rawNameId, $meta); + [$newNameId, $newMeta] = $this->idMetaUpgrader->upgradeStringIdMeta($rawNameId, $meta); //TODO: this won't account for spawn eggs from before 1.16.100 - perhaps we're lucky and they just left the meta in there anyway? @@ -217,21 +198,5 @@ final class ItemDataUpgrader{ ); } - /** - * @phpstan-return array{string, int} - */ - public function upgradeItemStringIdMeta(string $id, int $meta) : array{ - $newId = $id; - $newMeta = $meta; - foreach($this->idMetaUpgradeSchemas as $schema){ - if(($remappedMetaId = $schema->remapMeta($newId, $newMeta)) !== null){ - $newId = $remappedMetaId; - $newMeta = 0; - }elseif(($renamedId = $schema->renameId($newId)) !== null){ - $newId = $renamedId; - } - } - - return [$newId, $newMeta]; - } + public function getIdMetaUpgrader() : ItemIdMetaUpgrader{ return $this->idMetaUpgrader; } } diff --git a/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php new file mode 100644 index 000000000..6a0ec3eed --- /dev/null +++ b/src/data/bedrock/item/upgrade/ItemIdMetaUpgrader.php @@ -0,0 +1,77 @@ + + */ + private array $idMetaUpgradeSchemas = []; + + /** + * @param ItemIdMetaUpgradeSchema[] $idMetaUpgradeSchemas + * @phpstan-param array $idMetaUpgradeSchemas + */ + public function __construct( + array $idMetaUpgradeSchemas, + ){ + foreach($idMetaUpgradeSchemas as $schema){ + $this->addIdMetaUpgradeSchema($schema); + } + } + + public function addIdMetaUpgradeSchema(ItemIdMetaUpgradeSchema $schema) : void{ + if(isset($this->idMetaUpgradeSchemas[$schema->getSchemaId()])){ + throw new \InvalidArgumentException("Already have a schema with priority " . $schema->getSchemaId()); + } + $this->idMetaUpgradeSchemas[$schema->getSchemaId()] = $schema; + ksort($this->idMetaUpgradeSchemas, SORT_NUMERIC); + } + + /** + * @phpstan-return array{string, int} + */ + public function upgradeStringIdMeta(string $id, int $meta) : array{ + $newId = $id; + $newMeta = $meta; + foreach($this->idMetaUpgradeSchemas as $schema){ + if(($remappedMetaId = $schema->remapMeta($newId, $newMeta)) !== null){ + $newId = $remappedMetaId; + $newMeta = 0; + }elseif(($renamedId = $schema->renameId($newId)) !== null){ + $newId = $renamedId; + } + } + + return [$newId, $newMeta]; + } +} diff --git a/src/world/format/io/GlobalItemDataHandlers.php b/src/world/format/io/GlobalItemDataHandlers.php index d7530113a..3c456dabd 100644 --- a/src/world/format/io/GlobalItemDataHandlers.php +++ b/src/world/format/io/GlobalItemDataHandlers.php @@ -26,6 +26,7 @@ namespace pocketmine\world\format\io; use pocketmine\data\bedrock\item\ItemDeserializer; use pocketmine\data\bedrock\item\ItemSerializer; use pocketmine\data\bedrock\item\upgrade\ItemDataUpgrader; +use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgrader; use pocketmine\data\bedrock\item\upgrade\ItemIdMetaUpgradeSchemaUtils; use pocketmine\data\bedrock\item\upgrade\LegacyItemIdToStringIdMap; use pocketmine\data\bedrock\item\upgrade\R12ItemIdToBlockIdMap; @@ -51,10 +52,10 @@ final class GlobalItemDataHandlers{ public static function getUpgrader() : ItemDataUpgrader{ return self::$itemDataUpgrader ??= new ItemDataUpgrader( + new ItemIdMetaUpgrader(ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), self::MAX_ITEM_ID_UPGRADE_SCHEMA_ID)), LegacyItemIdToStringIdMap::getInstance(), R12ItemIdToBlockIdMap::getInstance(), - GlobalBlockStateHandlers::getUpgrader(), - ItemIdMetaUpgradeSchemaUtils::loadSchemas(Path::join(BEDROCK_ITEM_UPGRADE_SCHEMA_PATH, 'id_meta_upgrade_schema'), self::MAX_ITEM_ID_UPGRADE_SCHEMA_ID) + GlobalBlockStateHandlers::getUpgrader() ); } }