use pocketmine\network\mcpe\protocol\types\inventory\MismatchTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\NormalTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\ReleaseItemTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\TransactionData; use pocketmine\network\mcpe\protocol\types\inventory\UseItemOnEntityTransactionData; use pocketmine\network\mcpe\protocol\types\inventory\UseItemTransactionData; use pocketmine\network\mcpe\serializer\NetworkBinaryStream; /** * This packet effectively crams multiple packets into one. */ class InventoryTransactionPacket extends DataPacket implements ClientboundPacket, ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::INVENTORY_TRANSACTION_PACKET; public const TYPE_NORMAL = 0; public const TYPE_MISMATCH = 1; public const TYPE_USE_ITEM = 2; public const TYPE_USE_ITEM_ON_ENTITY = 3; public const TYPE_RELEASE_ITEM = 4; /** @var TransactionData */ public $trData; protected function decodePayload(NetworkBinaryStream $in) : void{ $transactionType = $in->getUnsignedVarInt(); switch($transactionType){ case self::TYPE_NORMAL: $this->trData = new NormalTransactionData(); break; case self::TYPE_MISMATCH: $this->trData = new MismatchTransactionData(); break; case self::TYPE_USE_ITEM: $this->trData = new UseItemTransactionData(); break; case self::TYPE_USE_ITEM_ON_ENTITY: $this->trData = new UseItemOnEntityTransactionData(); break; case self::TYPE_RELEASE_ITEM: $this->trData = new ReleaseItemTransactionData(); break; default: throw new PacketDecodeException("Unknown transaction type $transactionType"); } $this->trData->decode($in); } protected function encodePayload(NetworkBinaryStream $out) : void{ $out->putUnsignedVarInt($this->trData->getTypeId()); $this->trData->encode($out); } public function handle(PacketHandlerInterface $handler) : bool{ return $handler->handleInventoryTransaction($this); } }