NetworkSession: inject PacketPool instead of hardcoding it

this will make it slightly easier for multi version implementations, but handlers are still quite a big problem.
This commit is contained in:
Dylan K. Taylor 2020-04-29 12:48:28 +01:00
parent 09e994a026
commit b6214744d5
3 changed files with 11 additions and 4 deletions

View File

@ -64,6 +64,7 @@ use pocketmine\network\mcpe\protocol\MovePlayerPacket;
use pocketmine\network\mcpe\protocol\NetworkChunkPublisherUpdatePacket; use pocketmine\network\mcpe\protocol\NetworkChunkPublisherUpdatePacket;
use pocketmine\network\mcpe\protocol\Packet; use pocketmine\network\mcpe\protocol\Packet;
use pocketmine\network\mcpe\protocol\PacketDecodeException; use pocketmine\network\mcpe\protocol\PacketDecodeException;
use pocketmine\network\mcpe\protocol\PacketPool;
use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket;
use pocketmine\network\mcpe\protocol\PlayStatusPacket; use pocketmine\network\mcpe\protocol\PlayStatusPacket;
use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\serializer\PacketBatch;
@ -150,13 +151,16 @@ class NetworkSession{
/** @var Compressor */ /** @var Compressor */
private $compressor; private $compressor;
/** @var PacketPool */
private $packetPool;
/** @var InventoryManager|null */ /** @var InventoryManager|null */
private $invManager = null; private $invManager = null;
/** @var PacketSender */ /** @var PacketSender */
private $sender; private $sender;
public function __construct(Server $server, NetworkSessionManager $manager, PacketSender $sender, Compressor $compressor, string $ip, int $port){ public function __construct(Server $server, NetworkSessionManager $manager, PacketPool $packetPool, PacketSender $sender, Compressor $compressor, string $ip, int $port){
$this->server = $server; $this->server = $server;
$this->manager = $manager; $this->manager = $manager;
$this->sender = $sender; $this->sender = $sender;
@ -167,6 +171,7 @@ class NetworkSession{
$this->compressedQueue = new \SplQueue(); $this->compressedQueue = new \SplQueue();
$this->compressor = $compressor; $this->compressor = $compressor;
$this->packetPool = $packetPool;
$this->connectTime = time(); $this->connectTime = time();
@ -301,7 +306,7 @@ class NetworkSession{
throw new BadPacketException("Too many packets in a single batch"); throw new BadPacketException("Too many packets in a single batch");
} }
try{ try{
$pk = $stream->getPacket(); $pk = $stream->getPacket($this->packetPool);
}catch(BinaryDataException $e){ }catch(BinaryDataException $e){
$this->logger->debug("Packet batch: " . base64_encode($stream->getBuffer())); $this->logger->debug("Packet batch: " . base64_encode($stream->getBuffer()));
throw BadPacketException::wrap($e, "Packet batch decode error"); throw BadPacketException::wrap($e, "Packet batch decode error");

View File

@ -37,8 +37,8 @@ class PacketBatch extends NetworkBinaryStream{
/** /**
* @throws BinaryDataException * @throws BinaryDataException
*/ */
public function getPacket() : Packet{ public function getPacket(PacketPool $packetPool) : Packet{
return PacketPool::getInstance()->getPacket($this->getString()); return $packetPool->getPacket($this->getString());
} }
/** /**

View File

@ -27,6 +27,7 @@ use pocketmine\network\AdvancedNetworkInterface;
use pocketmine\network\BadPacketException; use pocketmine\network\BadPacketException;
use pocketmine\network\mcpe\compression\ZlibCompressor; use pocketmine\network\mcpe\compression\ZlibCompressor;
use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\NetworkSession;
use pocketmine\network\mcpe\protocol\PacketPool;
use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\ProtocolInfo;
use pocketmine\network\Network; use pocketmine\network\Network;
use pocketmine\Server; use pocketmine\Server;
@ -156,6 +157,7 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{
$session = new NetworkSession( $session = new NetworkSession(
$this->server, $this->server,
$this->network->getSessionManager(), $this->network->getSessionManager(),
PacketPool::getInstance(),
new RakLibPacketSender($sessionId, $this), new RakLibPacketSender($sessionId, $this),
ZlibCompressor::getInstance(), //TODO: this shouldn't be hardcoded, but we might need the RakNet protocol version to select it ZlibCompressor::getInstance(), //TODO: this shouldn't be hardcoded, but we might need the RakNet protocol version to select it
$address, $address,