Eliminate usages of BinaryStream->setBuffer() and BinaryStream->reset()

This commit is contained in:
Dylan K. Taylor 2020-06-17 13:49:43 +01:00
parent 893f7cb6ef
commit c618932d25
5 changed files with 16 additions and 11 deletions

View File

@ -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);
}

View File

@ -29,6 +29,8 @@ interface Packet{
public function getSerializer() : PacketSerializer;
public function setSerializer(PacketSerializer $serializer) : void;
public function pid() : int;
public function getName() : string;

View File

@ -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;
}

View File

@ -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);

View File

@ -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);