diff --git a/src/pocketmine/network/mcpe/protocol/DataPacket.php b/src/pocketmine/network/mcpe/protocol/DataPacket.php index 7f8aa2fb7..0bd10be43 100644 --- a/src/pocketmine/network/mcpe/protocol/DataPacket.php +++ b/src/pocketmine/network/mcpe/protocol/DataPacket.php @@ -39,6 +39,12 @@ abstract class DataPacket extends NetworkBinaryStream{ public const NETWORK_ID = 0; + public const PID_MASK = 0x3ff; //10 bits + + private const SUBCLIENT_ID_MASK = 0x03; //2 bits + private const SENDER_SUBCLIENT_ID_SHIFT = 10; + private const RECIPIENT_SUBCLIENT_ID_SHIFT = 12; + /** @var bool */ public $isEncoded = false; /** @var CachedEncapsulatedPacket|null */ @@ -92,10 +98,13 @@ abstract class DataPacket extends NetworkBinaryStream{ * @throws \UnexpectedValueException */ protected function decodeHeader(){ - $pid = $this->getUnsignedVarInt(); + $header = $this->getUnsignedVarInt(); + $pid = $header & self::PID_MASK; if($pid !== static::NETWORK_ID){ throw new \UnexpectedValueException("Expected " . static::NETWORK_ID . " for packet ID, got $pid"); } + $this->senderSubId = ($header >> self::SENDER_SUBCLIENT_ID_SHIFT) & self::SUBCLIENT_ID_MASK; + $this->recipientSubId = ($header >> self::RECIPIENT_SUBCLIENT_ID_SHIFT) & self::SUBCLIENT_ID_MASK; } /** @@ -123,7 +132,11 @@ abstract class DataPacket extends NetworkBinaryStream{ * @return void */ protected function encodeHeader(){ - $this->putUnsignedVarInt(static::NETWORK_ID); + $this->putUnsignedVarInt( + static::NETWORK_ID | + ($this->senderSubId << self::SENDER_SUBCLIENT_ID_SHIFT) | + ($this->recipientSubId << self::RECIPIENT_SUBCLIENT_ID_SHIFT) + ); } /** diff --git a/src/pocketmine/network/mcpe/protocol/PacketPool.php b/src/pocketmine/network/mcpe/protocol/PacketPool.php index 3c8e3610e..d6383dded 100644 --- a/src/pocketmine/network/mcpe/protocol/PacketPool.php +++ b/src/pocketmine/network/mcpe/protocol/PacketPool.php @@ -196,7 +196,7 @@ class PacketPool{ */ public static function getPacket(string $buffer) : DataPacket{ $offset = 0; - $pk = static::getPacketById(Binary::readUnsignedVarInt($buffer, $offset)); + $pk = static::getPacketById(Binary::readUnsignedVarInt($buffer, $offset) & DataPacket::PID_MASK); $pk->setBuffer($buffer, $offset); return $pk; diff --git a/tests/phpunit/network/mcpe/protocol/DataPacketTest.php b/tests/phpunit/network/mcpe/protocol/DataPacketTest.php new file mode 100644 index 000000000..99cd0b4f2 --- /dev/null +++ b/tests/phpunit/network/mcpe/protocol/DataPacketTest.php @@ -0,0 +1,42 @@ +senderSubId = 3; + $pk->recipientSubId = 2; + $pk->encode(); + + $pk2 = new TestPacket(); + $pk2->setBuffer($pk->getBuffer()); + $pk2->decode(); + self::assertSame($pk2->senderSubId, 3); + self::assertSame($pk2->recipientSubId, 2); + } +} diff --git a/tests/phpunit/network/mcpe/protocol/TestPacket.php b/tests/phpunit/network/mcpe/protocol/TestPacket.php new file mode 100644 index 000000000..b38e04ec4 --- /dev/null +++ b/tests/phpunit/network/mcpe/protocol/TestPacket.php @@ -0,0 +1,34 @@ +