From 76f1ee18274c9fbe20b04eb944ee307f0af532d8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 4 Jan 2019 03:19:47 +0000 Subject: [PATCH] Add restrictions on packet send directions with interfaces This prevents plugins sending wrong packets at the compiler level (or would, if we had a compiler). It's more robust than a getter for client/server and throwing an exception since a static analysis tool can detect faults created by sending wrong packets from the server. This is also used to deny service to dodgy clients which send wrong packets to the server to attack it. --- src/pocketmine/Player.php | 12 ++++---- src/pocketmine/Server.php | 12 ++++---- .../event/server/DataPacketBroadcastEvent.php | 12 ++++---- .../event/server/DataPacketReceiveEvent.php | 14 +++++----- .../event/server/DataPacketSendEvent.php | 14 +++++----- src/pocketmine/level/Level.php | 24 ++++++++-------- src/pocketmine/level/particle/Particle.php | 4 +-- src/pocketmine/level/sound/Sound.php | 4 +-- .../network/mcpe/NetworkSession.php | 12 ++++++-- .../mcpe/protocol/AddBehaviorTreePacket.php | 2 +- .../network/mcpe/protocol/AddEntityPacket.php | 2 +- .../mcpe/protocol/AddHangingEntityPacket.php | 2 +- .../mcpe/protocol/AddItemEntityPacket.php | 2 +- .../network/mcpe/protocol/AddPlayerPacket.php | 2 +- .../mcpe/protocol/AdventureSettingsPacket.php | 2 +- .../network/mcpe/protocol/AnimatePacket.php | 2 +- .../mcpe/protocol/AvailableCommandsPacket.php | 2 +- .../AvailableEntityIdentifiersPacket.php | 2 +- .../protocol/BiomeDefinitionListPacket.php | 2 +- .../mcpe/protocol/BlockEntityDataPacket.php | 2 +- .../mcpe/protocol/BlockEventPacket.php | 2 +- .../mcpe/protocol/BlockPickRequestPacket.php | 2 +- .../network/mcpe/protocol/BookEditPacket.php | 2 +- .../network/mcpe/protocol/BossEventPacket.php | 2 +- .../network/mcpe/protocol/CameraPacket.php | 2 +- .../mcpe/protocol/ChangeDimensionPacket.php | 2 +- .../protocol/ChunkRadiusUpdatedPacket.php | 2 +- .../ClientToServerHandshakePacket.php | 2 +- .../protocol/ClientboundMapItemDataPacket.php | 2 +- .../mcpe/protocol/ClientboundPacket.php | 28 +++++++++++++++++++ .../protocol/CommandBlockUpdatePacket.php | 2 +- .../mcpe/protocol/CommandOutputPacket.php | 2 +- .../mcpe/protocol/CommandRequestPacket.php | 2 +- .../mcpe/protocol/ContainerClosePacket.php | 2 +- .../mcpe/protocol/ContainerOpenPacket.php | 2 +- .../mcpe/protocol/ContainerSetDataPacket.php | 2 +- .../mcpe/protocol/CraftingDataPacket.php | 2 +- .../mcpe/protocol/CraftingEventPacket.php | 2 +- .../mcpe/protocol/DisconnectPacket.php | 2 +- .../mcpe/protocol/EntityEventPacket.php | 2 +- .../mcpe/protocol/EntityFallPacket.php | 2 +- .../mcpe/protocol/EntityPickRequestPacket.php | 2 +- .../network/mcpe/protocol/EventPacket.php | 2 +- .../network/mcpe/protocol/ExplodePacket.php | 2 +- .../mcpe/protocol/FullChunkDataPacket.php | 2 +- .../mcpe/protocol/GameRulesChangedPacket.php | 2 +- .../mcpe/protocol/GuiDataPickItemPacket.php | 2 +- .../network/mcpe/protocol/HurtArmorPacket.php | 2 +- .../network/mcpe/protocol/InteractPacket.php | 2 +- .../mcpe/protocol/InventoryContentPacket.php | 2 +- .../mcpe/protocol/InventorySlotPacket.php | 2 +- .../protocol/InventoryTransactionPacket.php | 2 +- .../mcpe/protocol/ItemFrameDropItemPacket.php | 2 +- .../network/mcpe/protocol/LabTablePacket.php | 2 +- .../mcpe/protocol/LevelEventPacket.php | 2 +- .../mcpe/protocol/LevelSoundEventPacket.php | 2 +- .../network/mcpe/protocol/LoginPacket.php | 2 +- .../mcpe/protocol/MapInfoRequestPacket.php | 2 +- .../mcpe/protocol/MobArmorEquipmentPacket.php | 2 +- .../network/mcpe/protocol/MobEffectPacket.php | 2 +- .../mcpe/protocol/MobEquipmentPacket.php | 2 +- .../mcpe/protocol/ModalFormRequestPacket.php | 2 +- .../mcpe/protocol/ModalFormResponsePacket.php | 2 +- .../protocol/MoveEntityAbsolutePacket.php | 2 +- .../mcpe/protocol/MoveEntityDeltaPacket.php | 2 +- .../mcpe/protocol/MovePlayerPacket.php | 2 +- .../NetworkChunkPublisherUpdatePacket.php | 2 +- .../protocol/NetworkStackLatencyPacket.php | 2 +- .../mcpe/protocol/NpcRequestPacket.php | 2 +- .../mcpe/protocol/PhotoTransferPacket.php | 2 +- .../network/mcpe/protocol/PlaySoundPacket.php | 2 +- .../mcpe/protocol/PlayStatusPacket.php | 2 +- .../mcpe/protocol/PlayerActionPacket.php | 2 +- .../mcpe/protocol/PlayerHotbarPacket.php | 2 +- .../mcpe/protocol/PlayerInputPacket.php | 2 +- .../mcpe/protocol/PlayerListPacket.php | 2 +- .../mcpe/protocol/PlayerSkinPacket.php | 2 +- .../mcpe/protocol/PurchaseReceiptPacket.php | 2 +- .../mcpe/protocol/RemoveEntityPacket.php | 2 +- .../mcpe/protocol/RemoveObjectivePacket.php | 2 +- .../protocol/RequestChunkRadiusPacket.php | 2 +- .../protocol/ResourcePackChunkDataPacket.php | 2 +- .../ResourcePackChunkRequestPacket.php | 2 +- .../ResourcePackClientResponsePacket.php | 2 +- .../protocol/ResourcePackDataInfoPacket.php | 2 +- .../mcpe/protocol/ResourcePackStackPacket.php | 2 +- .../mcpe/protocol/ResourcePacksInfoPacket.php | 2 +- .../network/mcpe/protocol/RespawnPacket.php | 2 +- .../network/mcpe/protocol/RiderJumpPacket.php | 2 +- .../mcpe/protocol/ScriptCustomEventPacket.php | 2 +- .../protocol/ServerSettingsRequestPacket.php | 2 +- .../protocol/ServerSettingsResponsePacket.php | 2 +- .../ServerToClientHandshakePacket.php | 2 +- .../mcpe/protocol/ServerboundPacket.php | 28 +++++++++++++++++++ .../protocol/SetCommandsEnabledPacket.php | 2 +- .../protocol/SetDefaultGameTypePacket.php | 2 +- .../mcpe/protocol/SetDifficultyPacket.php | 2 +- .../protocol/SetDisplayObjectivePacket.php | 2 +- .../mcpe/protocol/SetEntityDataPacket.php | 2 +- .../mcpe/protocol/SetEntityLinkPacket.php | 2 +- .../mcpe/protocol/SetEntityMotionPacket.php | 2 +- .../network/mcpe/protocol/SetHealthPacket.php | 2 +- .../mcpe/protocol/SetLastHurtByPacket.php | 2 +- .../SetLocalPlayerAsInitializedPacket.php | 2 +- .../mcpe/protocol/SetPlayerGameTypePacket.php | 2 +- .../network/mcpe/protocol/SetScorePacket.php | 2 +- .../protocol/SetScoreboardIdentityPacket.php | 2 +- .../mcpe/protocol/SetSpawnPositionPacket.php | 2 +- .../network/mcpe/protocol/SetTimePacket.php | 2 +- .../network/mcpe/protocol/SetTitlePacket.php | 2 +- .../mcpe/protocol/ShowCreditsPacket.php | 2 +- .../mcpe/protocol/ShowProfilePacket.php | 2 +- .../mcpe/protocol/ShowStoreOfferPacket.php | 2 +- .../mcpe/protocol/SimpleEventPacket.php | 2 +- .../protocol/SpawnExperienceOrbPacket.php | 2 +- .../protocol/SpawnParticleEffectPacket.php | 2 +- .../network/mcpe/protocol/StartGamePacket.php | 2 +- .../network/mcpe/protocol/StopSoundPacket.php | 2 +- .../protocol/StructureBlockUpdatePacket.php | 2 +- .../mcpe/protocol/SubClientLoginPacket.php | 2 +- .../mcpe/protocol/TakeItemEntityPacket.php | 2 +- .../network/mcpe/protocol/TextPacket.php | 2 +- .../network/mcpe/protocol/TransferPacket.php | 2 +- .../mcpe/protocol/UpdateAttributesPacket.php | 2 +- .../mcpe/protocol/UpdateBlockPacket.php | 2 +- .../mcpe/protocol/UpdateEquipPacket.php | 2 +- .../mcpe/protocol/UpdateSoftEnumPacket.php | 2 +- .../mcpe/protocol/UpdateTradePacket.php | 2 +- .../network/mcpe/protocol/WSConnectPacket.php | 2 +- src/pocketmine/timings/Timings.php | 11 ++++---- 130 files changed, 237 insertions(+), 174 deletions(-) create mode 100644 src/pocketmine/network/mcpe/protocol/ClientboundPacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/ServerboundPacket.php diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 8ed1746f4..4d4915ba2 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -103,6 +103,7 @@ use pocketmine\network\mcpe\protocol\AvailableCommandsPacket; use pocketmine\network\mcpe\protocol\BlockEntityDataPacket; use pocketmine\network\mcpe\protocol\BookEditPacket; use pocketmine\network\mcpe\protocol\ChunkRadiusUpdatedPacket; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\EntityEventPacket; use pocketmine\network\mcpe\protocol\ItemFrameDropItemPacket; use pocketmine\network\mcpe\protocol\LevelEventPacket; @@ -112,7 +113,6 @@ use pocketmine\network\mcpe\protocol\MobEffectPacket; use pocketmine\network\mcpe\protocol\ModalFormRequestPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; use pocketmine\network\mcpe\protocol\NetworkChunkPublisherUpdatePacket; -use pocketmine\network\mcpe\protocol\Packet; use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket; use pocketmine\network\mcpe\protocol\SetSpawnPositionPacket; use pocketmine\network\mcpe\protocol\SetTitlePacket; @@ -2546,12 +2546,12 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ } /** - * @param Packet $packet - * @param bool $immediate + * @param ClientboundPacket $packet + * @param bool $immediate * * @return bool */ - public function sendDataPacket(Packet $packet, bool $immediate = false) : bool{ + public function sendDataPacket(ClientboundPacket $packet, bool $immediate = false) : bool{ if(!$this->isConnected()){ return false; } @@ -2568,11 +2568,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ * @deprecated This is a proxy for sendDataPacket() and will be removed in the next major release. * @see Player::sendDataPacket() * - * @param Packet $packet + * @param ClientboundPacket $packet * * @return bool */ - public function dataPacket(Packet $packet) : bool{ + public function dataPacket(ClientboundPacket $packet) : bool{ return $this->sendDataPacket($packet, false); } diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index f79d470a1..b838ff906 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -75,7 +75,7 @@ use pocketmine\network\mcpe\NetworkCipher; use pocketmine\network\mcpe\NetworkCompression; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\PacketStream; -use pocketmine\network\mcpe\protocol\Packet; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\PlayerListPacket; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; @@ -1535,18 +1535,18 @@ class Server{ /** * Broadcasts a Minecraft packet to a list of players * - * @param Player[] $players - * @param Packet $packet + * @param Player[] $players + * @param ClientboundPacket $packet * * @return bool */ - public function broadcastPacket(array $players, Packet $packet) : bool{ + public function broadcastPacket(array $players, ClientboundPacket $packet) : bool{ return $this->broadcastPackets($players, [$packet]); } /** - * @param Player[] $players - * @param Packet[] $packets + * @param Player[] $players + * @param ClientboundPacket[] $packets * * @return bool */ diff --git a/src/pocketmine/event/server/DataPacketBroadcastEvent.php b/src/pocketmine/event/server/DataPacketBroadcastEvent.php index 364b45c55..d42d6ea3f 100644 --- a/src/pocketmine/event/server/DataPacketBroadcastEvent.php +++ b/src/pocketmine/event/server/DataPacketBroadcastEvent.php @@ -25,7 +25,7 @@ namespace pocketmine\event\server; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; -use pocketmine\network\mcpe\protocol\Packet; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\Player; /** @@ -36,12 +36,12 @@ class DataPacketBroadcastEvent extends ServerEvent implements Cancellable{ /** @var Player[] */ private $players; - /** @var Packet[] */ + /** @var ClientboundPacket[] */ private $packets; /** - * @param Player[] $players - * @param Packet[] $packets + * @param Player[] $players + * @param ClientboundPacket[] $packets */ public function __construct(array $players, array $packets){ $this->players = $players; @@ -63,14 +63,14 @@ class DataPacketBroadcastEvent extends ServerEvent implements Cancellable{ } /** - * @return Packet[] + * @return ClientboundPacket[] */ public function getPackets() : array{ return $this->packets; } /** - * @param Packet[] $packets + * @param ClientboundPacket[] $packets */ public function setPackets(array $packets) : void{ $this->packets = $packets; diff --git a/src/pocketmine/event/server/DataPacketReceiveEvent.php b/src/pocketmine/event/server/DataPacketReceiveEvent.php index 8ed8e2de0..946cd7ee9 100644 --- a/src/pocketmine/event/server/DataPacketReceiveEvent.php +++ b/src/pocketmine/event/server/DataPacketReceiveEvent.php @@ -25,30 +25,30 @@ namespace pocketmine\event\server; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; -use pocketmine\network\mcpe\protocol\Packet; +use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\Player; class DataPacketReceiveEvent extends ServerEvent implements Cancellable{ use CancellableTrait; - /** @var Packet */ + /** @var ServerboundPacket */ private $packet; /** @var Player */ private $player; /** - * @param Player $player - * @param Packet $packet + * @param Player $player + * @param ServerboundPacket $packet */ - public function __construct(Player $player, Packet $packet){ + public function __construct(Player $player, ServerboundPacket $packet){ $this->packet = $packet; $this->player = $player; } /** - * @return Packet + * @return ServerboundPacket */ - public function getPacket() : Packet{ + public function getPacket() : ServerboundPacket{ return $this->packet; } diff --git a/src/pocketmine/event/server/DataPacketSendEvent.php b/src/pocketmine/event/server/DataPacketSendEvent.php index 32c839900..c14b16037 100644 --- a/src/pocketmine/event/server/DataPacketSendEvent.php +++ b/src/pocketmine/event/server/DataPacketSendEvent.php @@ -25,30 +25,30 @@ namespace pocketmine\event\server; use pocketmine\event\Cancellable; use pocketmine\event\CancellableTrait; -use pocketmine\network\mcpe\protocol\Packet; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\Player; class DataPacketSendEvent extends ServerEvent implements Cancellable{ use CancellableTrait; - /** @var Packet */ + /** @var ClientboundPacket */ private $packet; /** @var Player */ private $player; /** - * @param Player $player - * @param Packet $packet + * @param Player $player + * @param ClientboundPacket $packet */ - public function __construct(Player $player, Packet $packet){ + public function __construct(Player $player, ClientboundPacket $packet){ $this->packet = $packet; $this->player = $player; } /** - * @return Packet + * @return ClientboundPacket */ - public function getPacket() : Packet{ + public function getPacket() : ClientboundPacket{ return $this->packet; } diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 94ba6eb21..47d9dd04a 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -73,9 +73,9 @@ use pocketmine\nbt\tag\StringTag; use pocketmine\network\mcpe\ChunkRequestTask; use pocketmine\network\mcpe\CompressBatchPromise; use pocketmine\network\mcpe\protocol\AddEntityPacket; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; -use pocketmine\network\mcpe\protocol\Packet; use pocketmine\network\mcpe\protocol\SetDifficultyPacket; use pocketmine\network\mcpe\protocol\SetTimePacket; use pocketmine\network\mcpe\protocol\UpdateBlockPacket; @@ -180,9 +180,9 @@ class Level implements ChunkManager, Metadatable{ /** @var Player[][] */ private $playerLoaders = []; - /** @var Packet[][] */ + /** @var ClientboundPacket[][] */ private $chunkPackets = []; - /** @var Packet[] */ + /** @var ClientboundPacket[] */ private $globalPackets = []; /** @var float[] */ @@ -598,11 +598,11 @@ class Level implements ChunkManager, Metadatable{ * Queues a packet to be sent to all players using the chunk at the specified X/Z coordinates at the end of the * current tick. * - * @param int $chunkX - * @param int $chunkZ - * @param Packet $packet + * @param int $chunkX + * @param int $chunkZ + * @param ClientboundPacket $packet */ - public function addChunkPacket(int $chunkX, int $chunkZ, Packet $packet){ + public function addChunkPacket(int $chunkX, int $chunkZ, ClientboundPacket $packet){ if(!isset($this->chunkPackets[$index = Level::chunkHash($chunkX, $chunkZ)])){ $this->chunkPackets[$index] = [$packet]; }else{ @@ -613,19 +613,19 @@ class Level implements ChunkManager, Metadatable{ /** * Broadcasts a packet to every player who has the target position within their view distance. * - * @param Vector3 $pos - * @param Packet $packet + * @param Vector3 $pos + * @param ClientboundPacket $packet */ - public function broadcastPacketToViewers(Vector3 $pos, Packet $packet) : void{ + public function broadcastPacketToViewers(Vector3 $pos, ClientboundPacket $packet) : void{ $this->addChunkPacket($pos->getFloorX() >> 4, $pos->getFloorZ() >> 4, $packet); } /** * Broadcasts a packet to every player in the level. * - * @param Packet $packet + * @param ClientboundPacket $packet */ - public function broadcastGlobalPacket(Packet $packet) : void{ + public function broadcastGlobalPacket(ClientboundPacket $packet) : void{ $this->globalPackets[] = $packet; } diff --git a/src/pocketmine/level/particle/Particle.php b/src/pocketmine/level/particle/Particle.php index cef6dbcc8..ccf97d35b 100644 --- a/src/pocketmine/level/particle/Particle.php +++ b/src/pocketmine/level/particle/Particle.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\level\particle; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\protocol\Packet; +use pocketmine\network\mcpe\protocol\ClientboundPacket; abstract class Particle{ @@ -86,7 +86,7 @@ abstract class Particle{ /** * @param Vector3 $pos * - * @return Packet|Packet[] + * @return ClientboundPacket|ClientboundPacket[] */ abstract public function encode(Vector3 $pos); diff --git a/src/pocketmine/level/sound/Sound.php b/src/pocketmine/level/sound/Sound.php index 8cf77770d..20b7533ae 100644 --- a/src/pocketmine/level/sound/Sound.php +++ b/src/pocketmine/level/sound/Sound.php @@ -24,14 +24,14 @@ declare(strict_types=1); namespace pocketmine\level\sound; use pocketmine\math\Vector3; -use pocketmine\network\mcpe\protocol\Packet; +use pocketmine\network\mcpe\protocol\ClientboundPacket; abstract class Sound{ /** * @param Vector3 $pos * - * @return Packet|Packet[] + * @return ClientboundPacket|ClientboundPacket[] */ abstract public function encode(Vector3 $pos); diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index f91e327e2..0d4a9e404 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -34,10 +34,12 @@ use pocketmine\network\mcpe\handler\PreSpawnSessionHandler; use pocketmine\network\mcpe\handler\ResourcePacksSessionHandler; use pocketmine\network\mcpe\handler\SessionHandler; use pocketmine\network\mcpe\handler\SimpleSessionHandler; +use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\DisconnectPacket; use pocketmine\network\mcpe\protocol\Packet; use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\PlayStatusPacket; +use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\network\mcpe\protocol\ServerToClientHandshakePacket; use pocketmine\network\NetworkInterface; use pocketmine\Player; @@ -214,6 +216,10 @@ class NetworkSession{ * @throws BadPacketException */ public function handleDataPacket(Packet $packet) : void{ + if(!($packet instanceof ServerboundPacket)){ + throw new BadPacketException("Unexpected non-serverbound packet " . $packet->getName()); + } + $timings = Timings::getReceiveDataPacketTimings($packet); $timings->startTiming(); @@ -237,7 +243,7 @@ class NetworkSession{ $timings->stopTiming(); } - public function sendDataPacket(Packet $packet, bool $immediate = false) : bool{ + public function sendDataPacket(ClientboundPacket $packet, bool $immediate = false) : bool{ $timings = Timings::getSendDataPacketTimings($packet); $timings->startTiming(); try{ @@ -260,9 +266,9 @@ class NetworkSession{ /** * @internal - * @param Packet $packet + * @param ClientboundPacket $packet */ - public function addToSendBuffer(Packet $packet) : void{ + public function addToSendBuffer(ClientboundPacket $packet) : void{ $timings = Timings::getSendDataPacketTimings($packet); $timings->startTiming(); try{ diff --git a/src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php b/src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php index 8472b1b45..863880bef 100644 --- a/src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php +++ b/src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php @@ -27,7 +27,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class AddBehaviorTreePacket extends DataPacket{ +class AddBehaviorTreePacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::ADD_BEHAVIOR_TREE_PACKET; /** @var string */ diff --git a/src/pocketmine/network/mcpe/protocol/AddEntityPacket.php b/src/pocketmine/network/mcpe/protocol/AddEntityPacket.php index 6a417a587..56b95fcb2 100644 --- a/src/pocketmine/network/mcpe/protocol/AddEntityPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AddEntityPacket.php @@ -34,7 +34,7 @@ use pocketmine\network\mcpe\protocol\types\EntityLink; use function array_search; use function count; -class AddEntityPacket extends DataPacket{ +class AddEntityPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::ADD_ENTITY_PACKET; /* diff --git a/src/pocketmine/network/mcpe/protocol/AddHangingEntityPacket.php b/src/pocketmine/network/mcpe/protocol/AddHangingEntityPacket.php index 032de9f55..07f575ace 100644 --- a/src/pocketmine/network/mcpe/protocol/AddHangingEntityPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AddHangingEntityPacket.php @@ -27,7 +27,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class AddHangingEntityPacket extends DataPacket{ +class AddHangingEntityPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::ADD_HANGING_ENTITY_PACKET; /** @var int|null */ diff --git a/src/pocketmine/network/mcpe/protocol/AddItemEntityPacket.php b/src/pocketmine/network/mcpe/protocol/AddItemEntityPacket.php index ff1a32dbd..9ee9a2d10 100644 --- a/src/pocketmine/network/mcpe/protocol/AddItemEntityPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AddItemEntityPacket.php @@ -29,7 +29,7 @@ use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\network\mcpe\handler\SessionHandler; -class AddItemEntityPacket extends DataPacket{ +class AddItemEntityPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::ADD_ITEM_ENTITY_PACKET; /** @var int|null */ diff --git a/src/pocketmine/network/mcpe/protocol/AddPlayerPacket.php b/src/pocketmine/network/mcpe/protocol/AddPlayerPacket.php index cb80125c7..693009353 100644 --- a/src/pocketmine/network/mcpe/protocol/AddPlayerPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AddPlayerPacket.php @@ -32,7 +32,7 @@ use pocketmine\network\mcpe\protocol\types\EntityLink; use pocketmine\utils\UUID; use function count; -class AddPlayerPacket extends DataPacket{ +class AddPlayerPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::ADD_PLAYER_PACKET; /** @var UUID */ diff --git a/src/pocketmine/network/mcpe/protocol/AdventureSettingsPacket.php b/src/pocketmine/network/mcpe/protocol/AdventureSettingsPacket.php index b98739fde..43eaa4e9f 100644 --- a/src/pocketmine/network/mcpe/protocol/AdventureSettingsPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AdventureSettingsPacket.php @@ -29,7 +29,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; -class AdventureSettingsPacket extends DataPacket{ +class AdventureSettingsPacket extends DataPacket implements ClientboundPacket, ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::ADVENTURE_SETTINGS_PACKET; public const PERMISSION_NORMAL = 0; diff --git a/src/pocketmine/network/mcpe/protocol/AnimatePacket.php b/src/pocketmine/network/mcpe/protocol/AnimatePacket.php index 22ec0ccd0..49f9c59bc 100644 --- a/src/pocketmine/network/mcpe/protocol/AnimatePacket.php +++ b/src/pocketmine/network/mcpe/protocol/AnimatePacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class AnimatePacket extends DataPacket{ +class AnimatePacket extends DataPacket implements ClientboundPacket, ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::ANIMATE_PACKET; public const ACTION_SWING_ARM = 1; diff --git a/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php b/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php index e2458df49..c67601e2f 100644 --- a/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php @@ -39,7 +39,7 @@ use function array_values; use function count; use function dechex; -class AvailableCommandsPacket extends DataPacket{ +class AvailableCommandsPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::AVAILABLE_COMMANDS_PACKET; diff --git a/src/pocketmine/network/mcpe/protocol/AvailableEntityIdentifiersPacket.php b/src/pocketmine/network/mcpe/protocol/AvailableEntityIdentifiersPacket.php index 194094f25..e5ba51e19 100644 --- a/src/pocketmine/network/mcpe/protocol/AvailableEntityIdentifiersPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AvailableEntityIdentifiersPacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; use function base64_decode; -class AvailableEntityIdentifiersPacket extends DataPacket{ +class AvailableEntityIdentifiersPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::AVAILABLE_ENTITY_IDENTIFIERS_PACKET; /** diff --git a/src/pocketmine/network/mcpe/protocol/BiomeDefinitionListPacket.php b/src/pocketmine/network/mcpe/protocol/BiomeDefinitionListPacket.php index e518a148f..018afab65 100644 --- a/src/pocketmine/network/mcpe/protocol/BiomeDefinitionListPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BiomeDefinitionListPacket.php @@ -27,7 +27,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class BiomeDefinitionListPacket extends DataPacket{ +class BiomeDefinitionListPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::BIOME_DEFINITION_LIST_PACKET; /** @var string */ diff --git a/src/pocketmine/network/mcpe/protocol/BlockEntityDataPacket.php b/src/pocketmine/network/mcpe/protocol/BlockEntityDataPacket.php index 6e06e38b2..663c24227 100644 --- a/src/pocketmine/network/mcpe/protocol/BlockEntityDataPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BlockEntityDataPacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class BlockEntityDataPacket extends DataPacket{ +class BlockEntityDataPacket extends DataPacket implements ClientboundPacket, ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::BLOCK_ENTITY_DATA_PACKET; /** @var int */ diff --git a/src/pocketmine/network/mcpe/protocol/BlockEventPacket.php b/src/pocketmine/network/mcpe/protocol/BlockEventPacket.php index 462e4d9e5..755b971e2 100644 --- a/src/pocketmine/network/mcpe/protocol/BlockEventPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BlockEventPacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class BlockEventPacket extends DataPacket{ +class BlockEventPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::BLOCK_EVENT_PACKET; /** @var int */ diff --git a/src/pocketmine/network/mcpe/protocol/BlockPickRequestPacket.php b/src/pocketmine/network/mcpe/protocol/BlockPickRequestPacket.php index 1bc27cef1..8bd44a725 100644 --- a/src/pocketmine/network/mcpe/protocol/BlockPickRequestPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BlockPickRequestPacket.php @@ -29,7 +29,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class BlockPickRequestPacket extends DataPacket{ +class BlockPickRequestPacket extends DataPacket implements ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::BLOCK_PICK_REQUEST_PACKET; /** @var int */ diff --git a/src/pocketmine/network/mcpe/protocol/BookEditPacket.php b/src/pocketmine/network/mcpe/protocol/BookEditPacket.php index f1b0a0851..38eed556a 100644 --- a/src/pocketmine/network/mcpe/protocol/BookEditPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BookEditPacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\BadPacketException; use pocketmine\network\mcpe\handler\SessionHandler; -class BookEditPacket extends DataPacket{ +class BookEditPacket extends DataPacket implements ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::BOOK_EDIT_PACKET; public const TYPE_REPLACE_PAGE = 0; diff --git a/src/pocketmine/network/mcpe/protocol/BossEventPacket.php b/src/pocketmine/network/mcpe/protocol/BossEventPacket.php index 89a9be354..4a3c50eab 100644 --- a/src/pocketmine/network/mcpe/protocol/BossEventPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BossEventPacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class BossEventPacket extends DataPacket{ +class BossEventPacket extends DataPacket implements ClientboundPacket, ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::BOSS_EVENT_PACKET; /* S2C: Shows the boss-bar to the player. */ diff --git a/src/pocketmine/network/mcpe/protocol/CameraPacket.php b/src/pocketmine/network/mcpe/protocol/CameraPacket.php index 6e211d516..ddca6dd15 100644 --- a/src/pocketmine/network/mcpe/protocol/CameraPacket.php +++ b/src/pocketmine/network/mcpe/protocol/CameraPacket.php @@ -27,7 +27,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class CameraPacket extends DataPacket{ +class CameraPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::CAMERA_PACKET; /** @var int */ diff --git a/src/pocketmine/network/mcpe/protocol/ChangeDimensionPacket.php b/src/pocketmine/network/mcpe/protocol/ChangeDimensionPacket.php index 90f487000..6e13a7296 100644 --- a/src/pocketmine/network/mcpe/protocol/ChangeDimensionPacket.php +++ b/src/pocketmine/network/mcpe/protocol/ChangeDimensionPacket.php @@ -29,7 +29,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\math\Vector3; use pocketmine\network\mcpe\handler\SessionHandler; -class ChangeDimensionPacket extends DataPacket{ +class ChangeDimensionPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::CHANGE_DIMENSION_PACKET; /** @var int */ diff --git a/src/pocketmine/network/mcpe/protocol/ChunkRadiusUpdatedPacket.php b/src/pocketmine/network/mcpe/protocol/ChunkRadiusUpdatedPacket.php index cf6ec6ef8..7fe8c056b 100644 --- a/src/pocketmine/network/mcpe/protocol/ChunkRadiusUpdatedPacket.php +++ b/src/pocketmine/network/mcpe/protocol/ChunkRadiusUpdatedPacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class ChunkRadiusUpdatedPacket extends DataPacket{ +class ChunkRadiusUpdatedPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::CHUNK_RADIUS_UPDATED_PACKET; /** @var int */ diff --git a/src/pocketmine/network/mcpe/protocol/ClientToServerHandshakePacket.php b/src/pocketmine/network/mcpe/protocol/ClientToServerHandshakePacket.php index 0e42af7bb..e744ff0ff 100644 --- a/src/pocketmine/network/mcpe/protocol/ClientToServerHandshakePacket.php +++ b/src/pocketmine/network/mcpe/protocol/ClientToServerHandshakePacket.php @@ -28,7 +28,7 @@ namespace pocketmine\network\mcpe\protocol; use pocketmine\network\mcpe\handler\SessionHandler; -class ClientToServerHandshakePacket extends DataPacket{ +class ClientToServerHandshakePacket extends DataPacket implements ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::CLIENT_TO_SERVER_HANDSHAKE_PACKET; public function canBeSentBeforeLogin() : bool{ diff --git a/src/pocketmine/network/mcpe/protocol/ClientboundMapItemDataPacket.php b/src/pocketmine/network/mcpe/protocol/ClientboundMapItemDataPacket.php index c068b50ef..6c716ffaa 100644 --- a/src/pocketmine/network/mcpe/protocol/ClientboundMapItemDataPacket.php +++ b/src/pocketmine/network/mcpe/protocol/ClientboundMapItemDataPacket.php @@ -35,7 +35,7 @@ use pocketmine\utils\Color; use function assert; use function count; -class ClientboundMapItemDataPacket extends DataPacket{ +class ClientboundMapItemDataPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::CLIENTBOUND_MAP_ITEM_DATA_PACKET; public const BITFLAG_TEXTURE_UPDATE = 0x02; diff --git a/src/pocketmine/network/mcpe/protocol/ClientboundPacket.php b/src/pocketmine/network/mcpe/protocol/ClientboundPacket.php new file mode 100644 index 000000000..edd22bf0e --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/ClientboundPacket.php @@ -0,0 +1,28 @@ +pid(); if(!isset(self::$packetReceiveTimingMap[$pid])){ $pkName = (new \ReflectionClass($pk))->getShortName(); @@ -228,11 +229,11 @@ abstract class Timings{ /** - * @param Packet $pk + * @param ClientboundPacket $pk * * @return TimingsHandler */ - public static function getSendDataPacketTimings(Packet $pk) : TimingsHandler{ + public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ $pkName = (new \ReflectionClass($pk))->getShortName();