diff --git a/src/network/mcpe/convert/GlobalItemTypeDictionary.php b/src/network/mcpe/convert/GlobalItemTypeDictionary.php new file mode 100644 index 000000000..349ddc3bb --- /dev/null +++ b/src/network/mcpe/convert/GlobalItemTypeDictionary.php @@ -0,0 +1,65 @@ + $entry){ + if(!is_array($entry) || !is_string($name) || !isset($entry["component_based"], $entry["runtime_id"]) || !is_bool($entry["component_based"]) || !is_int($entry["runtime_id"])){ + throw new AssumptionFailedError("Invalid item list format"); + } + $params[] = new ItemTypeEntry($name, $entry["runtime_id"], $entry["component_based"]); + } + return new self(new ItemTypeDictionary($params)); + } + + private ItemTypeDictionary $dictionary; + + public function __construct(ItemTypeDictionary $dictionary){ + $this->dictionary = $dictionary; + } + + public function getDictionary() : ItemTypeDictionary{ return $this->dictionary; } +} diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 530f4af4c..f1d2a3ebd 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; +use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use function array_key_exists; @@ -108,7 +109,7 @@ final class ItemTranslator{ } } - return new self(ItemTypeDictionary::getInstance(), $simpleMappings, $complexMappings); + return new self(GlobalItemTypeDictionary::getInstance()->getDictionary(), $simpleMappings, $complexMappings); } /** diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 5ac4c0b0d..a1adb20e6 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -63,7 +63,7 @@ class TypeConverter{ public function __construct(){ //TODO: inject stuff via constructor - $this->shieldRuntimeId = ItemTypeDictionary::getInstance()->fromStringId("minecraft:shield"); + $this->shieldRuntimeId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId("minecraft:shield"); } /** diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 4d1b991cf..a52f86e73 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -25,7 +25,7 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\network\mcpe\cache\CraftingDataCache; use pocketmine\network\mcpe\cache\StaticPacketCache; -use pocketmine\network\mcpe\convert\ItemTypeDictionary; +use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\RequestChunkRadiusPacket; @@ -87,7 +87,7 @@ class PreSpawnPacketHandler extends PacketHandler{ $pk->experiments = new Experiments([], false); $pk->levelId = ""; $pk->worldName = $this->server->getMotd(); - $pk->itemTable = ItemTypeDictionary::getInstance()->getEntries(); //TODO: check if this is actually needed + $pk->itemTable = GlobalItemTypeDictionary::getInstance()->getDictionary()->getEntries(); //TODO: check if this is actually needed $pk->playerMovementSettings = new PlayerMovementSettings(PlayerMovementType::LEGACY, 0, false); $this->session->sendDataPacket($pk); diff --git a/src/network/mcpe/convert/ItemTypeDictionary.php b/src/network/mcpe/protocol/serializer/ItemTypeDictionary.php similarity index 63% rename from src/network/mcpe/convert/ItemTypeDictionary.php rename to src/network/mcpe/protocol/serializer/ItemTypeDictionary.php index b23983dc4..bdb166589 100644 --- a/src/network/mcpe/convert/ItemTypeDictionary.php +++ b/src/network/mcpe/protocol/serializer/ItemTypeDictionary.php @@ -21,55 +21,28 @@ declare(strict_types=1); -namespace pocketmine\network\mcpe\convert; +namespace pocketmine\network\mcpe\protocol\serializer; use pocketmine\network\mcpe\protocol\types\ItemTypeEntry; -use pocketmine\utils\AssumptionFailedError; -use pocketmine\utils\SingletonTrait; use function array_key_exists; -use function file_get_contents; -use function is_array; -use function is_bool; -use function is_int; -use function is_string; -use function json_decode; final class ItemTypeDictionary{ - use SingletonTrait; /** * @var ItemTypeEntry[] * @phpstan-var list */ - private $itemTypes; + private array $itemTypes; /** * @var string[] * @phpstan-var array */ - private $intToStringIdMap = []; + private array $intToStringIdMap = []; /** * @var int[] * @phpstan-var array */ - private $stringToIntMap = []; - - private static function make() : self{ - $data = file_get_contents(\pocketmine\RESOURCE_PATH . '/vanilla/required_item_list.json'); - if($data === false) throw new AssumptionFailedError("Missing required resource file"); - $table = json_decode($data, true); - if(!is_array($table)){ - throw new AssumptionFailedError("Invalid item list format"); - } - - $params = []; - foreach($table as $name => $entry){ - if(!is_array($entry) || !is_string($name) || !isset($entry["component_based"], $entry["runtime_id"]) || !is_bool($entry["component_based"]) || !is_int($entry["runtime_id"])){ - throw new AssumptionFailedError("Invalid item list format"); - } - $params[] = new ItemTypeEntry($name, $entry["runtime_id"], $entry["component_based"]); - } - return new self($params); - } + private array $stringToIntMap = []; /** * @param ItemTypeEntry[] $itemTypes diff --git a/src/network/mcpe/protocol/serializer/PacketSerializer.php b/src/network/mcpe/protocol/serializer/PacketSerializer.php index e569599c1..29a70c0b3 100644 --- a/src/network/mcpe/protocol/serializer/PacketSerializer.php +++ b/src/network/mcpe/protocol/serializer/PacketSerializer.php @@ -30,7 +30,7 @@ use pocketmine\nbt\LittleEndianNbtSerializer; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\TreeRoot; -use pocketmine\network\mcpe\convert\ItemTypeDictionary; +use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\protocol\PacketDecodeException; use pocketmine\network\mcpe\protocol\types\BoolGameRule; use pocketmine\network\mcpe\protocol\types\command\CommandOriginData; @@ -73,7 +73,7 @@ class PacketSerializer extends BinaryStream{ public function __construct(string $buffer = "", int $offset = 0){ parent::__construct($buffer, $offset); - $this->shieldItemRuntimeId = ItemTypeDictionary::getInstance()->fromStringId("minecraft:shield"); + $this->shieldItemRuntimeId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId("minecraft:shield"); } /**