diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 8a4536dc30..eb6f5a4f72 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -174,6 +174,7 @@ use pocketmine\network\mcpe\protocol\StartGamePacket; use pocketmine\network\mcpe\protocol\TakeItemEntityPacket; use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\network\mcpe\protocol\TransferPacket; +use pocketmine\network\mcpe\protocol\UnknownPacket; use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; use pocketmine\network\mcpe\protocol\UpdateBlockPacket; use pocketmine\network\mcpe\protocol\UseItemPacket; @@ -3258,12 +3259,13 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade return false; } + public function handleUnknown(UnknownPacket $packet) : bool{ + $this->server->getLogger()->debug("Received unknown packet from " . $this->getName() . ": 0x" . bin2hex($packet->payload)); + return true; + } + /** - * Handles a Minecraft packet - * TODO: Separate all of this in handlers - * - * WARNING: Do not use this, it's only for internal use. - * Changes to this function won't be recorded on the version. + * TODO: get rid of these remains, fix DataPacketReceiveEvent, fix timings * * @param DataPacket $packet */ diff --git a/src/pocketmine/network/Network.php b/src/pocketmine/network/Network.php index 8dff1ebd43..18fac5c8b5 100644 --- a/src/pocketmine/network/Network.php +++ b/src/pocketmine/network/Network.php @@ -94,6 +94,7 @@ use pocketmine\network\mcpe\protocol\StartGamePacket; use pocketmine\network\mcpe\protocol\TakeItemEntityPacket; use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\network\mcpe\protocol\TransferPacket; +use pocketmine\network\mcpe\protocol\UnknownPacket; use pocketmine\network\mcpe\protocol\UpdateBlockPacket; use pocketmine\network\mcpe\protocol\UseItemPacket; use pocketmine\Player; @@ -245,8 +246,8 @@ class Network{ $buf = $stream->getString(); if(($pk = $this->getPacket(ord($buf{0}))) !== null){ - if($pk::NETWORK_ID === ProtocolInfo::BATCH_PACKET){ - throw new \InvalidStateException("Invalid BatchPacket inside BatchPacket"); + if(!$pk->canBeBatched()){ + throw new \InvalidStateException("Received invalid " . get_class($pk) . " inside BatchPacket"); } $pk->setBuffer($buf, 1); @@ -279,7 +280,7 @@ class Network{ if($class !== null){ return clone $class; } - return null; + return new UnknownPacket(); } diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index 89b91b488d..8876665639 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -93,6 +93,7 @@ use pocketmine\network\mcpe\protocol\StartGamePacket; use pocketmine\network\mcpe\protocol\TakeItemEntityPacket; use pocketmine\network\mcpe\protocol\TextPacket; use pocketmine\network\mcpe\protocol\TransferPacket; +use pocketmine\network\mcpe\protocol\UnknownPacket; use pocketmine\network\mcpe\protocol\UpdateAttributesPacket; use pocketmine\network\mcpe\protocol\UpdateBlockPacket; use pocketmine\network\mcpe\protocol\UseItemPacket; @@ -262,4 +263,6 @@ interface NetworkSession{ //public function handleResourcePackChunkRequest(ResourcePackChunkRequestPacket $packet) : bool; //TODO public function handleTransfer(TransferPacket $packet) : bool; + + public function handleUnknown(UnknownPacket $packet) : bool; } \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/UnknownPacket.php b/src/pocketmine/network/mcpe/protocol/UnknownPacket.php new file mode 100644 index 0000000000..87034a35e5 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/UnknownPacket.php @@ -0,0 +1,53 @@ +payload ?? "") > 0){ + return ord($this->payload{0}); + } + return self::NETWORK_ID; + } + + public function decode(){ + $this->offset -= 1; //Rewind one byte so we can read the PID + $this->payload = $this->get(true); + } + + public function encode(){ + //Do not reset the buffer, this class does not have a valid NETWORK_ID constant. + $this->put($this->payload); + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleUnknown($this); + } +} \ No newline at end of file