From 01f340985a52b1fb05e677eb9b527e9fb410aad2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 16:33:17 +0100 Subject: [PATCH] Centralize all conversion-related stuff under TypeConverter instead of having singletons for everything, which are a nightmare to manage for multi version --- src/Server.php | 4 +- src/block/tile/FlowerPot.php | 4 +- src/block/tile/ItemFrame.php | 4 +- src/block/tile/Jukebox.php | 4 +- src/block/tile/Lectern.php | 4 +- .../animation/ConsumingItemAnimation.php | 4 +- src/entity/object/FallingBlock.php | 4 +- src/network/mcpe/ChunkRequestTask.php | 8 +-- src/network/mcpe/cache/CraftingDataCache.php | 3 +- .../mcpe/convert/GlobalItemTypeDictionary.php | 45 --------------- src/network/mcpe/convert/ItemTranslator.php | 13 ----- .../mcpe/convert/RuntimeBlockMapping.php | 15 ----- src/network/mcpe/convert/TypeConverter.php | 56 +++++++++++++++---- .../mcpe/handler/PreSpawnPacketHandler.php | 3 +- src/world/World.php | 4 +- src/world/particle/BlockBreakParticle.php | 4 +- src/world/particle/BlockPunchParticle.php | 4 +- src/world/particle/FloatingTextParticle.php | 4 +- src/world/particle/ItemBreakParticle.php | 4 +- src/world/particle/TerrainParticle.php | 4 +- src/world/sound/BlockBreakSound.php | 4 +- src/world/sound/BlockPlaceSound.php | 4 +- src/world/sound/BlockPunchSound.php | 4 +- src/world/sound/EntityLandSound.php | 4 +- src/world/sound/ItemUseOnBlockSound.php | 4 +- .../mcpe/convert/RuntimeBlockMappingTest.php | 3 +- 26 files changed, 88 insertions(+), 130 deletions(-) delete mode 100644 src/network/mcpe/convert/GlobalItemTypeDictionary.php diff --git a/src/Server.php b/src/Server.php index 5bda2976b..7bc67aa38 100644 --- a/src/Server.php +++ b/src/Server.php @@ -53,7 +53,7 @@ use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\CompressBatchTask; use pocketmine\network\mcpe\compression\Compressor; use pocketmine\network\mcpe\compression\ZlibCompressor; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\encryption\EncryptionContext; use pocketmine\network\mcpe\EntityEventBroadcaster; use pocketmine\network\mcpe\NetworkSession; @@ -1204,7 +1204,7 @@ class Server{ private function startupPrepareNetworkInterfaces() : bool{ $useQuery = $this->configGroup->getConfigBool("enable-query", true); - $packetSerializerContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); + $packetSerializerContext = new PacketSerializerContext(TypeConverter::getInstance()->getItemTypeDictionary()); $packetBroadcaster = new StandardPacketBroadcaster($this, $packetSerializerContext); $entityEventBroadcaster = new StandardEntityEventBroadcaster($packetBroadcaster); diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 3f1d4ff2e..9a05a8cd0 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -33,7 +33,7 @@ use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ShortTag; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\world\format\io\GlobalBlockStateHandlers; /** @@ -95,7 +95,7 @@ class FlowerPot extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ if($this->plant !== null){ - $nbt->setTag(self::TAG_PLANT_BLOCK, RuntimeBlockMapping::getInstance()->toStateData($this->plant->getStateId())->toNbt()); + $nbt->setTag(self::TAG_PLANT_BLOCK, TypeConverter::getInstance()->getBlockTranslator()->toStateData($this->plant->getStateId())->toNbt()); } } diff --git a/src/block/tile/ItemFrame.php b/src/block/tile/ItemFrame.php index 7482fa089..faf0ddbb6 100644 --- a/src/block/tile/ItemFrame.php +++ b/src/block/tile/ItemFrame.php @@ -27,7 +27,7 @@ use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\world\World; /** @@ -100,7 +100,7 @@ class ItemFrame extends Spawnable{ $nbt->setFloat(self::TAG_ITEM_DROP_CHANCE, $this->itemDropChance); $nbt->setByte(self::TAG_ITEM_ROTATION, $this->itemRotation); if(!$this->item->isNull()){ - $nbt->setTag(self::TAG_ITEM, ItemTranslator::getInstance()->toNetworkNbt($this->item)); + $nbt->setTag(self::TAG_ITEM, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($this->item)); } } } diff --git a/src/block/tile/Jukebox.php b/src/block/tile/Jukebox.php index 12dd3c302..a94072bb1 100644 --- a/src/block/tile/Jukebox.php +++ b/src/block/tile/Jukebox.php @@ -26,7 +26,7 @@ namespace pocketmine\block\tile; use pocketmine\item\Item; use pocketmine\item\Record; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; class Jukebox extends Spawnable{ private const TAG_RECORD = "RecordItem"; //Item CompoundTag @@ -59,7 +59,7 @@ class Jukebox extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ //this is needed for the note particles to show on the client side if($this->record !== null){ - $nbt->setTag(self::TAG_RECORD, ItemTranslator::getInstance()->toNetworkNbt($this->record)); + $nbt->setTag(self::TAG_RECORD, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($this->record)); } } } diff --git a/src/block/tile/Lectern.php b/src/block/tile/Lectern.php index f094d2316..37e79b10e 100644 --- a/src/block/tile/Lectern.php +++ b/src/block/tile/Lectern.php @@ -26,7 +26,7 @@ namespace pocketmine\block\tile; use pocketmine\item\Item; use pocketmine\item\WritableBookBase; use pocketmine\nbt\tag\CompoundTag; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use function count; /** @@ -81,7 +81,7 @@ class Lectern extends Spawnable{ $nbt->setByte(self::TAG_HAS_BOOK, $this->book !== null ? 1 : 0); $nbt->setInt(self::TAG_PAGE, $this->viewedPage); if($this->book !== null){ - $nbt->setTag(self::TAG_BOOK, ItemTranslator::getInstance()->toNetworkNbt($this->book)); + $nbt->setTag(self::TAG_BOOK, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($this->book)); $nbt->setInt(self::TAG_TOTAL_PAGES, count($this->book->getPages())); } } diff --git a/src/entity/animation/ConsumingItemAnimation.php b/src/entity/animation/ConsumingItemAnimation.php index 99048abcb..aa6152a57 100644 --- a/src/entity/animation/ConsumingItemAnimation.php +++ b/src/entity/animation/ConsumingItemAnimation.php @@ -25,7 +25,7 @@ namespace pocketmine\entity\animation; use pocketmine\entity\Human; use pocketmine\item\Item; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\ActorEventPacket; use pocketmine\network\mcpe\protocol\types\ActorEvent; @@ -37,7 +37,7 @@ final class ConsumingItemAnimation implements Animation{ ){} public function encode() : array{ - [$netId, $netData] = ItemTranslator::getInstance()->toNetworkId($this->item); + [$netId, $netData] = TypeConverter::getInstance()->getItemTranslator()->toNetworkId($this->item); return [ //TODO: need to check the data values ActorEventPacket::create($this->human->getId(), ActorEvent::EATING_ITEM, ($netId << 16) | $netData) diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 8c2b1d5e6..10f53fc5d 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -39,7 +39,7 @@ use pocketmine\math\Vector3; use pocketmine\nbt\tag\ByteTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\types\entity\EntityIds; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; @@ -197,7 +197,7 @@ class FallingBlock extends Entity{ protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); - $properties->setInt(EntityMetadataProperties::VARIANT, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId())); + $properties->setInt(EntityMetadataProperties::VARIANT, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId())); } public function getOffsetPosition(Vector3 $vector3) : Vector3{ diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index fe30126ae..0f8f60fe6 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -25,8 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\network\mcpe\compression\CompressBatchPromise; use pocketmine\network\mcpe\compression\Compressor; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelChunkPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; @@ -67,8 +66,9 @@ class ChunkRequestTask extends AsyncTask{ public function onRun() : void{ $chunk = FastChunkSerializer::deserializeTerrain($this->chunk); $subCount = ChunkSerializer::getSubChunkCount($chunk); - $encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); - $payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles); + $converter = TypeConverter::getInstance(); + $encoderContext = new PacketSerializerContext($converter->getItemTypeDictionary()); + $payload = ChunkSerializer::serializeFullChunk($chunk, $converter->getBlockTranslator(), $encoderContext, $this->tiles); $stream = new BinaryStream(); PacketBatch::encodePackets($stream, $encoderContext, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload)]); diff --git a/src/network/mcpe/cache/CraftingDataCache.php b/src/network/mcpe/cache/CraftingDataCache.php index 9b70d00c9..e6ac6167b 100644 --- a/src/network/mcpe/cache/CraftingDataCache.php +++ b/src/network/mcpe/cache/CraftingDataCache.php @@ -30,7 +30,6 @@ use pocketmine\crafting\ShapedRecipe; use pocketmine\crafting\ShapelessRecipe; use pocketmine\crafting\ShapelessRecipeType; use pocketmine\item\Item; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\CraftingDataPacket; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; @@ -173,7 +172,7 @@ final class CraftingDataCache{ } $potionContainerChangeRecipes = []; - $itemTypeDictionary = GlobalItemTypeDictionary::getInstance()->getDictionary(); + $itemTypeDictionary = TypeConverter::getInstance()->getItemTypeDictionary(); foreach($manager->getPotionContainerChangeRecipes() as $recipe){ $input = $itemTypeDictionary->fromStringId($recipe->getInputItemId()); $ingredient = $converter->coreRecipeIngredientToNet($recipe->getIngredient())->getDescriptor(); diff --git a/src/network/mcpe/convert/GlobalItemTypeDictionary.php b/src/network/mcpe/convert/GlobalItemTypeDictionary.php deleted file mode 100644 index 0369a9e78..000000000 --- a/src/network/mcpe/convert/GlobalItemTypeDictionary.php +++ /dev/null @@ -1,45 +0,0 @@ -dictionary; } -} diff --git a/src/network/mcpe/convert/ItemTranslator.php b/src/network/mcpe/convert/ItemTranslator.php index 13a9bad4f..6309d774c 100644 --- a/src/network/mcpe/convert/ItemTranslator.php +++ b/src/network/mcpe/convert/ItemTranslator.php @@ -32,8 +32,6 @@ use pocketmine\item\Item; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\utils\AssumptionFailedError; -use pocketmine\utils\SingletonTrait; -use pocketmine\world\format\io\GlobalItemDataHandlers; /** * This class handles translation between network item ID+metadata to PocketMine-MP internal ID+metadata and vice versa. @@ -41,17 +39,6 @@ use pocketmine\world\format\io\GlobalItemDataHandlers; final class ItemTranslator{ public const NO_BLOCK_RUNTIME_ID = 0; - use SingletonTrait; - - private static function make() : self{ - return new self( - GlobalItemTypeDictionary::getInstance()->getDictionary(), - RuntimeBlockMapping::getInstance()->getBlockStateDictionary(), - GlobalItemDataHandlers::getSerializer(), - GlobalItemDataHandlers::getDeserializer() - ); - } - public function __construct( private ItemTypeDictionary $itemTypeDictionary, private BlockStateDictionary $blockStateDictionary, diff --git a/src/network/mcpe/convert/RuntimeBlockMapping.php b/src/network/mcpe/convert/RuntimeBlockMapping.php index 3d8fc831d..4df98f15c 100644 --- a/src/network/mcpe/convert/RuntimeBlockMapping.php +++ b/src/network/mcpe/convert/RuntimeBlockMapping.php @@ -23,22 +23,16 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\convert; -use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateSerializeException; use pocketmine\data\bedrock\block\BlockStateSerializer; use pocketmine\data\bedrock\block\BlockTypeNames; use pocketmine\utils\AssumptionFailedError; -use pocketmine\utils\Filesystem; -use pocketmine\utils\SingletonTrait; -use pocketmine\world\format\io\GlobalBlockStateHandlers; /** * @internal */ final class RuntimeBlockMapping{ - use SingletonTrait; - /** * @var int[] * @phpstan-var array @@ -49,15 +43,6 @@ final class RuntimeBlockMapping{ private BlockStateData $fallbackStateData; private int $fallbackStateId; - private static function make() : self{ - $canonicalBlockStatesRaw = Filesystem::fileGetContents(BedrockDataFiles::CANONICAL_BLOCK_STATES_NBT); - $metaMappingRaw = Filesystem::fileGetContents(BedrockDataFiles::BLOCK_STATE_META_MAP_JSON); - return new self( - BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw), - GlobalBlockStateHandlers::getSerializer() - ); - } - public function __construct( private BlockStateDictionary $blockStateDictionary, private BlockStateSerializer $blockStateSerializer diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index 634f8ee0c..ad9f631ee 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -28,11 +28,13 @@ use pocketmine\crafting\ExactRecipeIngredient; use pocketmine\crafting\MetaWildcardRecipeIngredient; use pocketmine\crafting\RecipeIngredient; use pocketmine\crafting\TagWildcardRecipeIngredient; +use pocketmine\data\bedrock\BedrockDataFiles; use pocketmine\data\bedrock\item\BlockItemIdMap; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; +use pocketmine\network\mcpe\protocol\serializer\ItemTypeDictionary; use pocketmine\network\mcpe\protocol\types\GameMode as ProtocolGameMode; use pocketmine\network\mcpe\protocol\types\inventory\ItemStack; use pocketmine\network\mcpe\protocol\types\recipe\IntIdMetaItemDescriptor; @@ -41,7 +43,10 @@ use pocketmine\network\mcpe\protocol\types\recipe\StringIdMetaItemDescriptor; use pocketmine\network\mcpe\protocol\types\recipe\TagItemDescriptor; use pocketmine\player\GameMode; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\Filesystem; use pocketmine\utils\SingletonTrait; +use pocketmine\world\format\io\GlobalBlockStateHandlers; +use pocketmine\world\format\io\GlobalItemDataHandlers; use function get_class; use function morton2d_encode; @@ -52,13 +57,40 @@ class TypeConverter{ private const RECIPE_INPUT_WILDCARD_META = 0x7fff; + private BlockItemIdMap $blockItemIdMap; + private RuntimeBlockMapping $blockTranslator; + private ItemTranslator $itemTranslator; + private ItemTypeDictionary $itemTypeDictionary; private int $shieldRuntimeId; public function __construct(){ //TODO: inject stuff via constructor - $this->shieldRuntimeId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId("minecraft:shield"); + $this->blockItemIdMap = BlockItemIdMap::getInstance(); + + $canonicalBlockStatesRaw = Filesystem::fileGetContents(BedrockDataFiles::CANONICAL_BLOCK_STATES_NBT); + $metaMappingRaw = Filesystem::fileGetContents(BedrockDataFiles::BLOCK_STATE_META_MAP_JSON); + $this->blockTranslator = new RuntimeBlockMapping( + BlockStateDictionary::loadFromString($canonicalBlockStatesRaw, $metaMappingRaw), + GlobalBlockStateHandlers::getSerializer() + ); + + $this->itemTypeDictionary = ItemTypeDictionaryFromDataHelper::loadFromString(Filesystem::fileGetContents(BedrockDataFiles::REQUIRED_ITEM_LIST_JSON)); + $this->shieldRuntimeId = $this->itemTypeDictionary->fromStringId("minecraft:shield"); + + $this->itemTranslator = new ItemTranslator( + $this->itemTypeDictionary, + $this->blockTranslator->getBlockStateDictionary(), + GlobalItemDataHandlers::getSerializer(), + GlobalItemDataHandlers::getDeserializer() + ); } + public function getBlockTranslator() : RuntimeBlockMapping{ return $this->blockTranslator; } + + public function getItemTypeDictionary() : ItemTypeDictionary{ return $this->itemTypeDictionary; } + + public function getItemTranslator() : ItemTranslator{ return $this->itemTranslator; } + /** * Returns a client-friendly gamemode of the specified real gamemode * This function takes care of handling gamemodes known to MCPE (as of 1.1.0.3, that includes Survival, Creative and Adventure) @@ -100,14 +132,14 @@ class TypeConverter{ return new ProtocolRecipeIngredient(null, 0); } if($ingredient instanceof MetaWildcardRecipeIngredient){ - $id = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId($ingredient->getItemId()); + $id = $this->itemTypeDictionary->fromStringId($ingredient->getItemId()); $meta = self::RECIPE_INPUT_WILDCARD_META; $descriptor = new IntIdMetaItemDescriptor($id, $meta); }elseif($ingredient instanceof ExactRecipeIngredient){ $item = $ingredient->getItem(); - [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId($item); + [$id, $meta, $blockRuntimeId] = $this->itemTranslator->toNetworkId($item); if($blockRuntimeId !== ItemTranslator::NO_BLOCK_RUNTIME_ID){ - $meta = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->getMetaFromStateId($blockRuntimeId); + $meta = $this->blockTranslator->getBlockStateDictionary()->getMetaFromStateId($blockRuntimeId); if($meta === null){ throw new AssumptionFailedError("Every block state should have an associated meta value"); } @@ -133,7 +165,7 @@ class TypeConverter{ } if($descriptor instanceof IntIdMetaItemDescriptor){ - $stringId = GlobalItemTypeDictionary::getInstance()->getDictionary()->fromIntId($descriptor->getId()); + $stringId = $this->itemTypeDictionary->fromIntId($descriptor->getId()); $meta = $descriptor->getMeta(); }elseif($descriptor instanceof StringIdMetaItemDescriptor){ $stringId = $descriptor->getId(); @@ -147,14 +179,14 @@ class TypeConverter{ } $blockRuntimeId = null; - if(($blockId = BlockItemIdMap::getInstance()->lookupBlockId($stringId)) !== null){ - $blockRuntimeId = RuntimeBlockMapping::getInstance()->getBlockStateDictionary()->lookupStateIdFromIdMeta($blockId, $meta); + if(($blockId = $this->blockItemIdMap->lookupBlockId($stringId)) !== null){ + $blockRuntimeId = $this->blockTranslator->getBlockStateDictionary()->lookupStateIdFromIdMeta($blockId, $meta); if($blockRuntimeId !== null){ $meta = 0; } } - $result = ItemTranslator::getInstance()->fromNetworkId( - GlobalItemTypeDictionary::getInstance()->getDictionary()->fromStringId($stringId), + $result = $this->itemTranslator->fromNetworkId( + $this->itemTypeDictionary->fromStringId($stringId), $meta, $blockRuntimeId ?? ItemTranslator::NO_BLOCK_RUNTIME_ID ); @@ -172,11 +204,11 @@ class TypeConverter{ $nbt = clone $nbt; } - $idMeta = ItemTranslator::getInstance()->toNetworkIdQuiet($itemStack); + $idMeta = $this->itemTranslator->toNetworkIdQuiet($itemStack); if($idMeta === null){ //Display unmapped items as INFO_UPDATE, but stick something in their NBT to make sure they don't stack with //other unmapped items. - [$id, $meta, $blockRuntimeId] = ItemTranslator::getInstance()->toNetworkId(VanillaBlocks::INFO_UPDATE()->asItem()); + [$id, $meta, $blockRuntimeId] = $this->itemTranslator->toNetworkId(VanillaBlocks::INFO_UPDATE()->asItem()); if($nbt === null){ $nbt = new CompoundTag(); } @@ -206,7 +238,7 @@ class TypeConverter{ } $compound = $itemStack->getNbt(); - $itemResult = ItemTranslator::getInstance()->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); + $itemResult = $this->itemTranslator->fromNetworkId($itemStack->getId(), $itemStack->getMeta(), $itemStack->getBlockRuntimeId()); if($compound !== null){ $compound = clone $compound; diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 91263a619..0ba686bed 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -26,7 +26,6 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\cache\CraftingDataCache; use pocketmine\network\mcpe\cache\StaticPacketCache; -use pocketmine\network\mcpe\convert\GlobalItemTypeDictionary; use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; @@ -108,7 +107,7 @@ class PreSpawnPacketHandler extends PacketHandler{ false, [], 0, - GlobalItemTypeDictionary::getInstance()->getDictionary()->getEntries(), + TypeConverter::getInstance()->getItemTypeDictionary()->getEntries(), )); $this->session->getLogger()->debug("Sending actor identifiers"); diff --git a/src/world/World.php b/src/world/World.php index a9798fb8a..a4528f4c2 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -67,7 +67,7 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\StringTag; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\NetworkBroadcastUtils; use pocketmine\network\mcpe\protocol\BlockActorDataPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket; @@ -1062,7 +1062,7 @@ class World implements ChunkManager{ public function createBlockUpdatePackets(array $blocks) : array{ $packets = []; - $blockMapping = RuntimeBlockMapping::getInstance(); + $blockMapping = TypeConverter::getInstance()->getBlockTranslator(); foreach($blocks as $b){ if(!($b instanceof Vector3)){ diff --git a/src/world/particle/BlockBreakParticle.php b/src/world/particle/BlockBreakParticle.php index 98b2eb9c8..b9cec0e78 100644 --- a/src/world/particle/BlockBreakParticle.php +++ b/src/world/particle/BlockBreakParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\LevelEvent; @@ -34,6 +34,6 @@ class BlockBreakParticle implements Particle{ public function __construct(private Block $b){} public function encode(Vector3 $pos) : array{ - return [LevelEventPacket::create(LevelEvent::PARTICLE_DESTROY, RuntimeBlockMapping::getInstance()->toRuntimeId($this->b->getStateId()), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_DESTROY, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/particle/BlockPunchParticle.php b/src/world/particle/BlockPunchParticle.php index fe754dc56..c8affffc5 100644 --- a/src/world/particle/BlockPunchParticle.php +++ b/src/world/particle/BlockPunchParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\LevelEvent; @@ -39,6 +39,6 @@ class BlockPunchParticle implements Particle{ ){} public function encode(Vector3 $pos) : array{ - return [LevelEventPacket::create(LevelEvent::PARTICLE_PUNCH_BLOCK, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) | ($this->face << 24), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_PUNCH_BLOCK, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) | ($this->face << 24), $pos)]; } } diff --git a/src/world/particle/FloatingTextParticle.php b/src/world/particle/FloatingTextParticle.php index e7766470f..a50aeef3a 100644 --- a/src/world/particle/FloatingTextParticle.php +++ b/src/world/particle/FloatingTextParticle.php @@ -26,7 +26,7 @@ namespace pocketmine\world\particle; use pocketmine\block\VanillaBlocks; use pocketmine\entity\Entity; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\AddActorPacket; use pocketmine\network\mcpe\protocol\RemoveActorPacket; use pocketmine\network\mcpe\protocol\types\entity\ByteMetadataProperty; @@ -95,7 +95,7 @@ class FloatingTextParticle implements Particle{ EntityMetadataProperties::BOUNDING_BOX_WIDTH => new FloatMetadataProperty(0.0), EntityMetadataProperties::BOUNDING_BOX_HEIGHT => new FloatMetadataProperty(0.0), EntityMetadataProperties::NAMETAG => new StringMetadataProperty($name), - EntityMetadataProperties::VARIANT => new IntMetadataProperty(RuntimeBlockMapping::getInstance()->toRuntimeId(VanillaBlocks::AIR()->getStateId())), + EntityMetadataProperties::VARIANT => new IntMetadataProperty(TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId(VanillaBlocks::AIR()->getStateId())), EntityMetadataProperties::ALWAYS_SHOW_NAMETAG => new ByteMetadataProperty(1), ]; $p[] = AddActorPacket::create( diff --git a/src/world/particle/ItemBreakParticle.php b/src/world/particle/ItemBreakParticle.php index ac0c5ac4b..4f8c9ea91 100644 --- a/src/world/particle/ItemBreakParticle.php +++ b/src/world/particle/ItemBreakParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\item\Item; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\ItemTranslator; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\ParticleIds; @@ -33,7 +33,7 @@ class ItemBreakParticle implements Particle{ public function __construct(private Item $item){} public function encode(Vector3 $pos) : array{ - [$id, $meta] = ItemTranslator::getInstance()->toNetworkId($this->item); + [$id, $meta] = TypeConverter::getInstance()->getItemTranslator()->toNetworkId($this->item); return [LevelEventPacket::standardParticle(ParticleIds::ITEM_BREAK, ($id << 16) | $meta, $pos)]; } } diff --git a/src/world/particle/TerrainParticle.php b/src/world/particle/TerrainParticle.php index 27de04b14..0eb1f0494 100644 --- a/src/world/particle/TerrainParticle.php +++ b/src/world/particle/TerrainParticle.php @@ -25,7 +25,7 @@ namespace pocketmine\world\particle; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\types\ParticleIds; @@ -33,6 +33,6 @@ class TerrainParticle implements Particle{ public function __construct(private Block $b){} public function encode(Vector3 $pos) : array{ - return [LevelEventPacket::standardParticle(ParticleIds::TERRAIN, RuntimeBlockMapping::getInstance()->toRuntimeId($this->b->getStateId()), $pos)]; + return [LevelEventPacket::standardParticle(ParticleIds::TERRAIN, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/sound/BlockBreakSound.php b/src/world/sound/BlockBreakSound.php index 4f919a396..6cdc5471e 100644 --- a/src/world/sound/BlockBreakSound.php +++ b/src/world/sound/BlockBreakSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -33,6 +33,6 @@ class BlockBreakSound implements Sound{ public function __construct(private Block $block){} public function encode(Vector3 $pos) : array{ - return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::BREAK, $pos, false, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::BREAK, $pos, false, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPlaceSound.php b/src/world/sound/BlockPlaceSound.php index 8440dbd47..80704a957 100644 --- a/src/world/sound/BlockPlaceSound.php +++ b/src/world/sound/BlockPlaceSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -33,6 +33,6 @@ class BlockPlaceSound implements Sound{ public function __construct(private Block $block){} public function encode(Vector3 $pos) : array{ - return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::PLACE, $pos, false, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::PLACE, $pos, false, TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPunchSound.php b/src/world/sound/BlockPunchSound.php index d3898b734..33754b93e 100644 --- a/src/world/sound/BlockPunchSound.php +++ b/src/world/sound/BlockPunchSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -40,7 +40,7 @@ class BlockPunchSound implements Sound{ LevelSoundEvent::HIT, $pos, false, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) + TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) )]; } } diff --git a/src/world/sound/EntityLandSound.php b/src/world/sound/EntityLandSound.php index 545753367..dd23b571f 100644 --- a/src/world/sound/EntityLandSound.php +++ b/src/world/sound/EntityLandSound.php @@ -26,7 +26,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\entity\Entity; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -43,7 +43,7 @@ class EntityLandSound implements Sound{ return [LevelSoundEventPacket::create( LevelSoundEvent::LAND, $pos, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->blockLandedOn->getStateId()), + TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->blockLandedOn->getStateId()), $this->entity::getNetworkTypeId(), false, //TODO: does isBaby have any relevance here? false diff --git a/src/world/sound/ItemUseOnBlockSound.php b/src/world/sound/ItemUseOnBlockSound.php index d3483d36b..4ab7e10a0 100644 --- a/src/world/sound/ItemUseOnBlockSound.php +++ b/src/world/sound/ItemUseOnBlockSound.php @@ -25,7 +25,7 @@ namespace pocketmine\world\sound; use pocketmine\block\Block; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\convert\RuntimeBlockMapping; +use pocketmine\network\mcpe\convert\TypeConverter; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\types\LevelSoundEvent; @@ -42,7 +42,7 @@ final class ItemUseOnBlockSound implements Sound{ LevelSoundEvent::ITEM_USE_ON, $pos, false, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) + TypeConverter::getInstance()->getBlockTranslator()->toRuntimeId($this->block->getStateId()) )]; } } diff --git a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php index 9e7287da2..46fb709ab 100644 --- a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php +++ b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php @@ -32,8 +32,9 @@ class RuntimeBlockMappingTest extends TestCase{ * @doesNotPerformAssertions */ public function testAllBlockStatesSerialize() : void{ + $blockTranslator = TypeConverter::getInstance()->getBlockTranslator(); foreach(RuntimeBlockStateRegistry::getInstance()->getAllKnownStates() as $state){ - RuntimeBlockMapping::getInstance()->toRuntimeId($state->getStateId()); + $blockTranslator->toRuntimeId($state->getStateId()); } } }