diff --git a/src/network/mcpe/protocol/DataPacket.php b/src/network/mcpe/protocol/DataPacket.php index e61ad00f7..be7904ee6 100644 --- a/src/network/mcpe/protocol/DataPacket.php +++ b/src/network/mcpe/protocol/DataPacket.php @@ -55,6 +55,10 @@ abstract class DataPacket implements Packet{ return $this->buf; } + public function setSerializer(PacketSerializer $serializer) : void{ + $this->buf = $serializer; + } + public function pid() : int{ return $this::NETWORK_ID; } @@ -105,7 +109,7 @@ abstract class DataPacket implements Packet{ abstract protected function decodePayload(PacketSerializer $in) : void; final public function encode() : void{ - $this->buf->reset(); + $this->buf = new PacketSerializer(); $this->encodeHeader($this->buf); $this->encodePayload($this->buf); } diff --git a/src/network/mcpe/protocol/Packet.php b/src/network/mcpe/protocol/Packet.php index b2f6317ee..6ea81b4f7 100644 --- a/src/network/mcpe/protocol/Packet.php +++ b/src/network/mcpe/protocol/Packet.php @@ -29,6 +29,8 @@ interface Packet{ public function getSerializer() : PacketSerializer; + public function setSerializer(PacketSerializer $serializer) : void; + public function pid() : int; public function getName() : string; diff --git a/src/network/mcpe/protocol/PacketPool.php b/src/network/mcpe/protocol/PacketPool.php index dd2b0879b..14abe765f 100644 --- a/src/network/mcpe/protocol/PacketPool.php +++ b/src/network/mcpe/protocol/PacketPool.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\protocol; -use pocketmine\utils\Binary; +use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; use pocketmine\utils\BinaryDataException; class PacketPool{ @@ -199,9 +199,9 @@ class PacketPool{ * @throws BinaryDataException */ public function getPacket(string $buffer) : Packet{ - $offset = 0; - $pk = $this->getPacketById(Binary::readUnsignedVarInt($buffer, $offset) & DataPacket::PID_MASK); - $pk->getSerializer()->setBuffer($buffer, $offset); + $serializer = new PacketSerializer($buffer); + $pk = $this->getPacketById($serializer->getUnsignedVarInt() & DataPacket::PID_MASK); + $pk->setSerializer($serializer); return $pk; } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 6c2a76b97..769c7faaf 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -240,8 +240,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $chunkVersion = ord($chunkVersionRaw); $hasBeenUpgraded = $chunkVersion < self::CURRENT_LEVEL_CHUNK_VERSION; - $binaryStream = new BinaryStream(); - switch($chunkVersion){ case 15: //MCPE 1.12.0.4 beta (???) case 14: //MCPE 1.11.1.2 (???) @@ -262,7 +260,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ continue; } - $binaryStream->setBuffer($data); + $binaryStream = new BinaryStream($data); if($binaryStream->feof()){ throw new CorruptedChunkException("Unexpected empty data for subchunk $y"); } @@ -324,7 +322,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } if(($maps2d = $this->db->get($index . self::TAG_DATA_2D)) !== false){ - $binaryStream->setBuffer($maps2d); + $binaryStream = new BinaryStream($maps2d); try{ $binaryStream->get(512); //heightmap, discard it @@ -343,7 +341,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ if($legacyTerrain === false){ throw new CorruptedChunkException("Missing expected LEGACY_TERRAIN tag for format version $chunkVersion"); } - $binaryStream->setBuffer($legacyTerrain); + $binaryStream = new BinaryStream($legacyTerrain); try{ $fullIds = $binaryStream->get(32768); $fullData = $binaryStream->get(16384); diff --git a/tests/phpunit/network/mcpe/protocol/DataPacketTest.php b/tests/phpunit/network/mcpe/protocol/DataPacketTest.php index bcfd0e9d2..52634b4c5 100644 --- a/tests/phpunit/network/mcpe/protocol/DataPacketTest.php +++ b/tests/phpunit/network/mcpe/protocol/DataPacketTest.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\protocol; use PHPUnit\Framework\TestCase; +use pocketmine\network\mcpe\protocol\serializer\PacketSerializer; class DataPacketTest extends TestCase{ @@ -34,7 +35,7 @@ class DataPacketTest extends TestCase{ $pk->encode(); $pk2 = new TestPacket(); - $pk2->getSerializer()->setBuffer($pk->getSerializer()->getBuffer()); + $pk2->setSerializer(new PacketSerializer($pk->getSerializer()->getBuffer())); $pk2->decode(); self::assertSame($pk2->senderSubId, 3); self::assertSame($pk2->recipientSubId, 2);