From 30df0c2418ad71e21df48b93fb9172a54033527c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 12 Jul 2017 16:32:39 +0100 Subject: [PATCH] Refactor a bunch of network-related things for easier auto-generation of protocol stuff --- src/pocketmine/network/Network.php | 211 +---- .../network/mcpe/BaseNetworkSession.php | 794 ------------------ .../network/mcpe/NetworkSession.php | 403 ++++++--- .../mcpe/PlayerNetworkSessionAdapter.php | 6 +- .../network/mcpe/RakLibInterface.php | 3 +- .../mcpe/protocol/AddBehaviorTreePacket.php | 44 + .../network/mcpe/protocol/BatchPacket.php | 3 +- .../network/mcpe/protocol/CameraPacket.php | 44 + .../network/mcpe/protocol/EventPacket.php | 44 + .../network/mcpe/protocol/PacketPool.php | 157 ++++ .../network/mcpe/protocol/ProtocolInfo.php | 4 +- .../mcpe/protocol/PurchaseReceiptPacket.php | 44 + .../mcpe/protocol/ShowStoreOfferPacket.php | 44 + .../mcpe/protocol/SimpleEventPacket.php | 44 + .../protocol/StructureBlockUpdatePacket.php | 44 + .../mcpe/protocol/UpdateEquipPacket.php | 44 + 16 files changed, 818 insertions(+), 1115 deletions(-) delete mode 100644 src/pocketmine/network/mcpe/BaseNetworkSession.php create mode 100644 src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/CameraPacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/EventPacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/PacketPool.php create mode 100644 src/pocketmine/network/mcpe/protocol/PurchaseReceiptPacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/ShowStoreOfferPacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/SimpleEventPacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/StructureBlockUpdatePacket.php create mode 100644 src/pocketmine/network/mcpe/protocol/UpdateEquipPacket.php diff --git a/src/pocketmine/network/Network.php b/src/pocketmine/network/Network.php index a29aa3789..83d3ac6f7 100644 --- a/src/pocketmine/network/Network.php +++ b/src/pocketmine/network/Network.php @@ -26,104 +26,13 @@ declare(strict_types=1); */ namespace pocketmine\network; -use pocketmine\network\mcpe\protocol\AddEntityPacket; -use pocketmine\network\mcpe\protocol\AddHangingEntityPacket; -use pocketmine\network\mcpe\protocol\AddItemEntityPacket; -use pocketmine\network\mcpe\protocol\AddItemPacket; -use pocketmine\network\mcpe\protocol\AddPaintingPacket; -use pocketmine\network\mcpe\protocol\AddPlayerPacket; -use pocketmine\network\mcpe\protocol\AdventureSettingsPacket; -use pocketmine\network\mcpe\protocol\AnimatePacket; -use pocketmine\network\mcpe\protocol\AvailableCommandsPacket; -use pocketmine\network\mcpe\protocol\BatchPacket; -use pocketmine\network\mcpe\protocol\BlockEntityDataPacket; -use pocketmine\network\mcpe\protocol\BlockEventPacket; -use pocketmine\network\mcpe\protocol\BlockPickRequestPacket; -use pocketmine\network\mcpe\protocol\BossEventPacket; -use pocketmine\network\mcpe\protocol\ChangeDimensionPacket; -use pocketmine\network\mcpe\protocol\ChunkRadiusUpdatedPacket; -use pocketmine\network\mcpe\protocol\ClientboundMapItemDataPacket; -use pocketmine\network\mcpe\protocol\ClientToServerHandshakePacket; -use pocketmine\network\mcpe\protocol\CommandBlockUpdatePacket; -use pocketmine\network\mcpe\protocol\CommandStepPacket; -use pocketmine\network\mcpe\protocol\ContainerClosePacket; -use pocketmine\network\mcpe\protocol\ContainerOpenPacket; -use pocketmine\network\mcpe\protocol\ContainerSetContentPacket; -use pocketmine\network\mcpe\protocol\ContainerSetDataPacket; -use pocketmine\network\mcpe\protocol\ContainerSetSlotPacket; -use pocketmine\network\mcpe\protocol\CraftingDataPacket; -use pocketmine\network\mcpe\protocol\CraftingEventPacket; -use pocketmine\network\mcpe\protocol\DataPacket; -use pocketmine\network\mcpe\protocol\DisconnectPacket; -use pocketmine\network\mcpe\protocol\DropItemPacket; -use pocketmine\network\mcpe\protocol\EntityEventPacket; -use pocketmine\network\mcpe\protocol\ExplodePacket; -use pocketmine\network\mcpe\protocol\FullChunkDataPacket; -use pocketmine\network\mcpe\protocol\GameRulesChangedPacket; -use pocketmine\network\mcpe\protocol\HurtArmorPacket; -use pocketmine\network\mcpe\protocol\InteractPacket; -use pocketmine\network\mcpe\protocol\InventoryActionPacket; -use pocketmine\network\mcpe\protocol\ItemFrameDropItemPacket; -use pocketmine\network\mcpe\protocol\LevelEventPacket; -use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; -use pocketmine\network\mcpe\protocol\LoginPacket; -use pocketmine\network\mcpe\protocol\MapInfoRequestPacket; -use pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket; -use pocketmine\network\mcpe\protocol\MobEffectPacket; -use pocketmine\network\mcpe\protocol\MobEquipmentPacket; -use pocketmine\network\mcpe\protocol\MoveEntityPacket; -use pocketmine\network\mcpe\protocol\MovePlayerPacket; -use pocketmine\network\mcpe\protocol\PlayerActionPacket; -use pocketmine\network\mcpe\protocol\EntityFallPacket; -use pocketmine\network\mcpe\protocol\PlayerInputPacket; -use pocketmine\network\mcpe\protocol\PlayerListPacket; -use pocketmine\network\mcpe\protocol\PlaySoundPacket; -use pocketmine\network\mcpe\protocol\PlayStatusPacket; -use pocketmine\network\mcpe\protocol\ProtocolInfo; -use pocketmine\network\mcpe\protocol\RemoveBlockPacket; -use pocketmine\network\mcpe\protocol\RemoveEntityPacket; -use pocketmine\network\mcpe\protocol\ReplaceItemInSlotPacket; -use pocketmine\network\mcpe\protocol\RequestChunkRadiusPacket; -use pocketmine\network\mcpe\protocol\ResourcePackChunkDataPacket; -use pocketmine\network\mcpe\protocol\ResourcePackChunkRequestPacket; -use pocketmine\network\mcpe\protocol\ResourcePackClientResponsePacket; -use pocketmine\network\mcpe\protocol\ResourcePackDataInfoPacket; -use pocketmine\network\mcpe\protocol\ResourcePackStackPacket; -use pocketmine\network\mcpe\protocol\ResourcePacksInfoPacket; -use pocketmine\network\mcpe\protocol\RespawnPacket; -use pocketmine\network\mcpe\protocol\RiderJumpPacket; -use pocketmine\network\mcpe\protocol\ServerToClientHandshakePacket; -use pocketmine\network\mcpe\protocol\SetCommandsEnabledPacket; -use pocketmine\network\mcpe\protocol\SetDifficultyPacket; -use pocketmine\network\mcpe\protocol\SetEntityDataPacket; -use pocketmine\network\mcpe\protocol\SetEntityLinkPacket; -use pocketmine\network\mcpe\protocol\SetEntityMotionPacket; -use pocketmine\network\mcpe\protocol\SetHealthPacket; -use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket; -use pocketmine\network\mcpe\protocol\SetSpawnPositionPacket; -use pocketmine\network\mcpe\protocol\SetTimePacket; -use pocketmine\network\mcpe\protocol\SetTitlePacket; -use pocketmine\network\mcpe\protocol\ShowCreditsPacket; -use pocketmine\network\mcpe\protocol\SpawnExperienceOrbPacket; -use pocketmine\network\mcpe\protocol\StartGamePacket; -use pocketmine\network\mcpe\protocol\StopSoundPacket; -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\UpdateTradePacket; -use pocketmine\network\mcpe\protocol\UseItemPacket; +use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\Server; class Network{ public static $BATCH_THRESHOLD = 512; - /** @var \SplFixedArray */ - private $packetPool; - /** @var Server */ private $server; @@ -139,8 +48,7 @@ class Network{ private $name; public function __construct(Server $server){ - - $this->registerPackets(); + PacketPool::init(); $this->server = $server; @@ -230,33 +138,10 @@ class Network{ } } - /** - * @param int $id 0-255 - * @param DataPacket $class - */ - public function registerPacket($id, $class){ - $this->packetPool[$id] = new $class; - } - public function getServer(){ return $this->server; } - /** - * @param $id - * - * @return DataPacket - */ - public function getPacket($id){ - /** @var DataPacket $class */ - $class = $this->packetPool[$id]; - if($class !== null){ - return clone $class; - } - return new UnknownPacket(); - } - - /** * @param string $address * @param int $port @@ -279,96 +164,4 @@ class Network{ $interface->blockAddress($address, $timeout); } } - - private function registerPackets(){ - $this->packetPool = new \SplFixedArray(256); - - $this->registerPacket(ProtocolInfo::ADD_ENTITY_PACKET, AddEntityPacket::class); - $this->registerPacket(ProtocolInfo::ADD_HANGING_ENTITY_PACKET, AddHangingEntityPacket::class); - $this->registerPacket(ProtocolInfo::ADD_ITEM_ENTITY_PACKET, AddItemEntityPacket::class); - $this->registerPacket(ProtocolInfo::ADD_ITEM_PACKET, AddItemPacket::class); - $this->registerPacket(ProtocolInfo::ADD_PAINTING_PACKET, AddPaintingPacket::class); - $this->registerPacket(ProtocolInfo::ADD_PLAYER_PACKET, AddPlayerPacket::class); - $this->registerPacket(ProtocolInfo::ADVENTURE_SETTINGS_PACKET, AdventureSettingsPacket::class); - $this->registerPacket(ProtocolInfo::ANIMATE_PACKET, AnimatePacket::class); - $this->registerPacket(ProtocolInfo::AVAILABLE_COMMANDS_PACKET, AvailableCommandsPacket::class); - $this->registerPacket(ProtocolInfo::BLOCK_ENTITY_DATA_PACKET, BlockEntityDataPacket::class); - $this->registerPacket(ProtocolInfo::BLOCK_EVENT_PACKET, BlockEventPacket::class); - $this->registerPacket(ProtocolInfo::BLOCK_PICK_REQUEST_PACKET, BlockPickRequestPacket::class); - $this->registerPacket(ProtocolInfo::BOSS_EVENT_PACKET, BossEventPacket::class); - $this->registerPacket(ProtocolInfo::CHANGE_DIMENSION_PACKET, ChangeDimensionPacket::class); - $this->registerPacket(ProtocolInfo::CHUNK_RADIUS_UPDATED_PACKET, ChunkRadiusUpdatedPacket::class); - $this->registerPacket(ProtocolInfo::CLIENTBOUND_MAP_ITEM_DATA_PACKET, ClientboundMapItemDataPacket::class); - $this->registerPacket(ProtocolInfo::CLIENT_TO_SERVER_HANDSHAKE_PACKET, ClientToServerHandshakePacket::class); - $this->registerPacket(ProtocolInfo::COMMAND_BLOCK_UPDATE_PACKET, CommandBlockUpdatePacket::class); - $this->registerPacket(ProtocolInfo::COMMAND_STEP_PACKET, CommandStepPacket::class); - $this->registerPacket(ProtocolInfo::CONTAINER_CLOSE_PACKET, ContainerClosePacket::class); - $this->registerPacket(ProtocolInfo::CONTAINER_OPEN_PACKET, ContainerOpenPacket::class); - $this->registerPacket(ProtocolInfo::CONTAINER_SET_CONTENT_PACKET, ContainerSetContentPacket::class); - $this->registerPacket(ProtocolInfo::CONTAINER_SET_DATA_PACKET, ContainerSetDataPacket::class); - $this->registerPacket(ProtocolInfo::CONTAINER_SET_SLOT_PACKET, ContainerSetSlotPacket::class); - $this->registerPacket(ProtocolInfo::CRAFTING_DATA_PACKET, CraftingDataPacket::class); - $this->registerPacket(ProtocolInfo::CRAFTING_EVENT_PACKET, CraftingEventPacket::class); - $this->registerPacket(ProtocolInfo::DISCONNECT_PACKET, DisconnectPacket::class); - $this->registerPacket(ProtocolInfo::DROP_ITEM_PACKET, DropItemPacket::class); - $this->registerPacket(ProtocolInfo::ENTITY_EVENT_PACKET, EntityEventPacket::class); - $this->registerPacket(ProtocolInfo::ENTITY_FALL_PACKET, EntityFallPacket::class); - $this->registerPacket(ProtocolInfo::EXPLODE_PACKET, ExplodePacket::class); - $this->registerPacket(ProtocolInfo::FULL_CHUNK_DATA_PACKET, FullChunkDataPacket::class); - $this->registerPacket(ProtocolInfo::GAME_RULES_CHANGED_PACKET, GameRulesChangedPacket::class); - $this->registerPacket(ProtocolInfo::HURT_ARMOR_PACKET, HurtArmorPacket::class); - $this->registerPacket(ProtocolInfo::INTERACT_PACKET, InteractPacket::class); - $this->registerPacket(ProtocolInfo::INVENTORY_ACTION_PACKET, InventoryActionPacket::class); - $this->registerPacket(ProtocolInfo::ITEM_FRAME_DROP_ITEM_PACKET, ItemFrameDropItemPacket::class); - $this->registerPacket(ProtocolInfo::LEVEL_EVENT_PACKET, LevelEventPacket::class); - $this->registerPacket(ProtocolInfo::LEVEL_SOUND_EVENT_PACKET, LevelSoundEventPacket::class); - $this->registerPacket(ProtocolInfo::LOGIN_PACKET, LoginPacket::class); - $this->registerPacket(ProtocolInfo::MAP_INFO_REQUEST_PACKET, MapInfoRequestPacket::class); - $this->registerPacket(ProtocolInfo::MOB_ARMOR_EQUIPMENT_PACKET, MobArmorEquipmentPacket::class); - $this->registerPacket(ProtocolInfo::MOB_EFFECT_PACKET, MobEffectPacket::class); - $this->registerPacket(ProtocolInfo::MOB_EQUIPMENT_PACKET, MobEquipmentPacket::class); - $this->registerPacket(ProtocolInfo::MOVE_ENTITY_PACKET, MoveEntityPacket::class); - $this->registerPacket(ProtocolInfo::MOVE_PLAYER_PACKET, MovePlayerPacket::class); - $this->registerPacket(ProtocolInfo::PLAYER_ACTION_PACKET, PlayerActionPacket::class); - $this->registerPacket(ProtocolInfo::PLAYER_INPUT_PACKET, PlayerInputPacket::class); - $this->registerPacket(ProtocolInfo::PLAYER_LIST_PACKET, PlayerListPacket::class); - $this->registerPacket(ProtocolInfo::PLAY_SOUND_PACKET, PlaySoundPacket::class); - $this->registerPacket(ProtocolInfo::PLAY_STATUS_PACKET, PlayStatusPacket::class); - $this->registerPacket(ProtocolInfo::REMOVE_BLOCK_PACKET, RemoveBlockPacket::class); - $this->registerPacket(ProtocolInfo::REMOVE_ENTITY_PACKET, RemoveEntityPacket::class); - $this->registerPacket(ProtocolInfo::REPLACE_ITEM_IN_SLOT_PACKET, ReplaceItemInSlotPacket::class); - $this->registerPacket(ProtocolInfo::REQUEST_CHUNK_RADIUS_PACKET, RequestChunkRadiusPacket::class); - $this->registerPacket(ProtocolInfo::RESOURCE_PACKS_INFO_PACKET, ResourcePacksInfoPacket::class); - $this->registerPacket(ProtocolInfo::RESOURCE_PACK_CHUNK_DATA_PACKET, ResourcePackChunkDataPacket::class); - $this->registerPacket(ProtocolInfo::RESOURCE_PACK_CHUNK_REQUEST_PACKET, ResourcePackChunkRequestPacket::class); - $this->registerPacket(ProtocolInfo::RESOURCE_PACK_CLIENT_RESPONSE_PACKET, ResourcePackClientResponsePacket::class); - $this->registerPacket(ProtocolInfo::RESOURCE_PACK_DATA_INFO_PACKET, ResourcePackDataInfoPacket::class); - $this->registerPacket(ProtocolInfo::RESOURCE_PACK_STACK_PACKET, ResourcePackStackPacket::class); - $this->registerPacket(ProtocolInfo::RESPAWN_PACKET, RespawnPacket::class); - $this->registerPacket(ProtocolInfo::RIDER_JUMP_PACKET, RiderJumpPacket::class); - $this->registerPacket(ProtocolInfo::SERVER_TO_CLIENT_HANDSHAKE_PACKET, ServerToClientHandshakePacket::class); - $this->registerPacket(ProtocolInfo::SET_COMMANDS_ENABLED_PACKET, SetCommandsEnabledPacket::class); - $this->registerPacket(ProtocolInfo::SET_DIFFICULTY_PACKET, SetDifficultyPacket::class); - $this->registerPacket(ProtocolInfo::SET_ENTITY_DATA_PACKET, SetEntityDataPacket::class); - $this->registerPacket(ProtocolInfo::SET_ENTITY_LINK_PACKET, SetEntityLinkPacket::class); - $this->registerPacket(ProtocolInfo::SET_ENTITY_MOTION_PACKET, SetEntityMotionPacket::class); - $this->registerPacket(ProtocolInfo::SET_HEALTH_PACKET, SetHealthPacket::class); - $this->registerPacket(ProtocolInfo::SET_PLAYER_GAME_TYPE_PACKET, SetPlayerGameTypePacket::class); - $this->registerPacket(ProtocolInfo::SET_SPAWN_POSITION_PACKET, SetSpawnPositionPacket::class); - $this->registerPacket(ProtocolInfo::SET_TIME_PACKET, SetTimePacket::class); - $this->registerPacket(ProtocolInfo::SET_TITLE_PACKET, SetTitlePacket::class); - $this->registerPacket(ProtocolInfo::SHOW_CREDITS_PACKET, ShowCreditsPacket::class); - $this->registerPacket(ProtocolInfo::SPAWN_EXPERIENCE_ORB_PACKET, SpawnExperienceOrbPacket::class); - $this->registerPacket(ProtocolInfo::START_GAME_PACKET, StartGamePacket::class); - $this->registerPacket(ProtocolInfo::STOP_SOUND_PACKET, StopSoundPacket::class); - $this->registerPacket(ProtocolInfo::TAKE_ITEM_ENTITY_PACKET, TakeItemEntityPacket::class); - $this->registerPacket(ProtocolInfo::TEXT_PACKET, TextPacket::class); - $this->registerPacket(ProtocolInfo::TRANSFER_PACKET, TransferPacket::class); - $this->registerPacket(ProtocolInfo::UPDATE_ATTRIBUTES_PACKET, UpdateAttributesPacket::class); - $this->registerPacket(ProtocolInfo::UPDATE_BLOCK_PACKET, UpdateBlockPacket::class); - $this->registerPacket(ProtocolInfo::UPDATE_TRADE_PACKET, UpdateTradePacket::class); - $this->registerPacket(ProtocolInfo::USE_ITEM_PACKET, UseItemPacket::class); - - $this->registerPacket(0xfe, BatchPacket::class); - } } diff --git a/src/pocketmine/network/mcpe/BaseNetworkSession.php b/src/pocketmine/network/mcpe/BaseNetworkSession.php deleted file mode 100644 index 030495d44..000000000 --- a/src/pocketmine/network/mcpe/BaseNetworkSession.php +++ /dev/null @@ -1,794 +0,0 @@ -player = $player; } - public function getServer(){ - return $this->server; - } - public function handleDataPacket(DataPacket $packet){ //TODO: Remove this hack once InteractPacket spam issue is fixed if($packet->buffer === "\x21\x04\x00"){ diff --git a/src/pocketmine/network/mcpe/RakLibInterface.php b/src/pocketmine/network/mcpe/RakLibInterface.php index a90cdd0d9..4239eaa39 100644 --- a/src/pocketmine/network/mcpe/RakLibInterface.php +++ b/src/pocketmine/network/mcpe/RakLibInterface.php @@ -27,6 +27,7 @@ use pocketmine\event\player\PlayerCreationEvent; use pocketmine\network\AdvancedSourceInterface; use pocketmine\network\mcpe\protocol\BatchPacket; use pocketmine\network\mcpe\protocol\DataPacket; +use pocketmine\network\mcpe\protocol\PacketPool; use pocketmine\network\mcpe\protocol\ProtocolInfo; use pocketmine\network\Network; use pocketmine\Player; @@ -236,7 +237,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ private function getPacket($buffer){ $pid = ord($buffer{0}); - if(($data = $this->network->getPacket($pid)) === null){ + if(($data = PacketPool::getPacketById($pid)) === null){ return null; } $data->setBuffer($buffer, 1); diff --git a/src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php b/src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php new file mode 100644 index 000000000..af461e714 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/AddBehaviorTreePacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class AddBehaviorTreePacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::ADD_BEHAVIOR_TREE_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleAddBehaviorTree($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/BatchPacket.php b/src/pocketmine/network/mcpe/protocol/BatchPacket.php index 21962fc05..a2095c050 100644 --- a/src/pocketmine/network/mcpe/protocol/BatchPacket.php +++ b/src/pocketmine/network/mcpe/protocol/BatchPacket.php @@ -91,10 +91,9 @@ class BatchPacket extends DataPacket{ $this->setBuffer($str, 0); - $network = $session->getServer()->getNetwork(); while(!$this->feof()){ $buf = $this->getString(); - $pk = $network->getPacket(ord($buf{0})); + $pk = PacketPool::getPacketById(ord($buf{0})); if(!$pk->canBeBatched()){ throw new \InvalidArgumentException("Received invalid " . get_class($pk) . " inside BatchPacket"); diff --git a/src/pocketmine/network/mcpe/protocol/CameraPacket.php b/src/pocketmine/network/mcpe/protocol/CameraPacket.php new file mode 100644 index 000000000..2f697bb39 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/CameraPacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class CameraPacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::CAMERA_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleCamera($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/EventPacket.php b/src/pocketmine/network/mcpe/protocol/EventPacket.php new file mode 100644 index 000000000..984c45680 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/EventPacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class EventPacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::EVENT_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleEvent($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/PacketPool.php b/src/pocketmine/network/mcpe/protocol/PacketPool.php new file mode 100644 index 000000000..39cbf1877 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/PacketPool.php @@ -0,0 +1,157 @@ + */ + protected static $pool = null; + + public static function init(){ + static::$pool = new \SplFixedArray(256); + + //Normal packets + static::registerPacket(new LoginPacket()); + static::registerPacket(new PlayStatusPacket()); + static::registerPacket(new ServerToClientHandshakePacket()); + static::registerPacket(new ClientToServerHandshakePacket()); + static::registerPacket(new DisconnectPacket()); + static::registerPacket(new ResourcePacksInfoPacket()); + static::registerPacket(new ResourcePackStackPacket()); + static::registerPacket(new ResourcePackClientResponsePacket()); + static::registerPacket(new TextPacket()); + static::registerPacket(new SetTimePacket()); + static::registerPacket(new StartGamePacket()); + static::registerPacket(new AddPlayerPacket()); + static::registerPacket(new AddEntityPacket()); + static::registerPacket(new RemoveEntityPacket()); + static::registerPacket(new AddItemEntityPacket()); + static::registerPacket(new AddHangingEntityPacket()); + static::registerPacket(new TakeItemEntityPacket()); + static::registerPacket(new MoveEntityPacket()); + static::registerPacket(new MovePlayerPacket()); + static::registerPacket(new RiderJumpPacket()); + static::registerPacket(new RemoveBlockPacket()); + static::registerPacket(new UpdateBlockPacket()); + static::registerPacket(new AddPaintingPacket()); + static::registerPacket(new ExplodePacket()); + static::registerPacket(new LevelSoundEventPacket()); + static::registerPacket(new LevelEventPacket()); + static::registerPacket(new BlockEventPacket()); + static::registerPacket(new EntityEventPacket()); + static::registerPacket(new MobEffectPacket()); + static::registerPacket(new UpdateAttributesPacket()); + static::registerPacket(new MobEquipmentPacket()); + static::registerPacket(new MobArmorEquipmentPacket()); + static::registerPacket(new InteractPacket()); + static::registerPacket(new BlockPickRequestPacket()); + static::registerPacket(new UseItemPacket()); + static::registerPacket(new PlayerActionPacket()); + static::registerPacket(new EntityFallPacket()); + static::registerPacket(new HurtArmorPacket()); + static::registerPacket(new SetEntityDataPacket()); + static::registerPacket(new SetEntityMotionPacket()); + static::registerPacket(new SetEntityLinkPacket()); + static::registerPacket(new SetHealthPacket()); + static::registerPacket(new SetSpawnPositionPacket()); + static::registerPacket(new AnimatePacket()); + static::registerPacket(new RespawnPacket()); + static::registerPacket(new DropItemPacket()); + static::registerPacket(new InventoryActionPacket()); + static::registerPacket(new ContainerOpenPacket()); + static::registerPacket(new ContainerClosePacket()); + static::registerPacket(new ContainerSetSlotPacket()); + static::registerPacket(new ContainerSetDataPacket()); + static::registerPacket(new ContainerSetContentPacket()); + static::registerPacket(new CraftingDataPacket()); + static::registerPacket(new CraftingEventPacket()); + static::registerPacket(new AdventureSettingsPacket()); + static::registerPacket(new BlockEntityDataPacket()); + static::registerPacket(new PlayerInputPacket()); + static::registerPacket(new FullChunkDataPacket()); + static::registerPacket(new SetCommandsEnabledPacket()); + static::registerPacket(new SetDifficultyPacket()); + static::registerPacket(new ChangeDimensionPacket()); + static::registerPacket(new SetPlayerGameTypePacket()); + static::registerPacket(new PlayerListPacket()); + static::registerPacket(new SimpleEventPacket()); + static::registerPacket(new EventPacket()); + static::registerPacket(new SpawnExperienceOrbPacket()); + static::registerPacket(new ClientboundMapItemDataPacket()); + static::registerPacket(new MapInfoRequestPacket()); + static::registerPacket(new RequestChunkRadiusPacket()); + static::registerPacket(new ChunkRadiusUpdatedPacket()); + static::registerPacket(new ItemFrameDropItemPacket()); + static::registerPacket(new ReplaceItemInSlotPacket()); + static::registerPacket(new GameRulesChangedPacket()); + static::registerPacket(new CameraPacket()); + static::registerPacket(new AddItemPacket()); + static::registerPacket(new BossEventPacket()); + static::registerPacket(new ShowCreditsPacket()); + static::registerPacket(new AvailableCommandsPacket()); + static::registerPacket(new CommandStepPacket()); + static::registerPacket(new CommandBlockUpdatePacket()); + static::registerPacket(new UpdateTradePacket()); + static::registerPacket(new UpdateEquipPacket()); + static::registerPacket(new ResourcePackDataInfoPacket()); + static::registerPacket(new ResourcePackChunkDataPacket()); + static::registerPacket(new ResourcePackChunkRequestPacket()); + static::registerPacket(new TransferPacket()); + static::registerPacket(new PlaySoundPacket()); + static::registerPacket(new StopSoundPacket()); + static::registerPacket(new SetTitlePacket()); + static::registerPacket(new AddBehaviorTreePacket()); + static::registerPacket(new StructureBlockUpdatePacket()); + static::registerPacket(new ShowStoreOfferPacket()); + static::registerPacket(new PurchaseReceiptPacket()); + + static::registerPacket(new BatchPacket()); + } + + /** + * @param DataPacket $packet + */ + public static function registerPacket(DataPacket $packet){ + static::$pool[$packet->pid()] = clone $packet; + } + + /** + * @param int $pid + * @return DataPacket + */ + public static function getPacketById(int $pid) : DataPacket{ + return static::$pool[$pid] ?? new UnknownPacket(); + } + + /** + * @param string $buffer + * @return DataPacket + */ + public static function getPacket(string $buffer) : DataPacket{ + $pk = static::getPacketById(ord($buffer{0})); + $pk->setBuffer($buffer); + + return $pk; + } + +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php b/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php index e399bb864..d49946a51 100644 --- a/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php +++ b/src/pocketmine/network/mcpe/protocol/ProtocolInfo.php @@ -43,11 +43,11 @@ interface ProtocolInfo{ /** * Current Minecraft PE version reported by the server. This is usually the earliest currently supported version. */ - const MINECRAFT_VERSION = 'v1.1.0.55'; + const MINECRAFT_VERSION = 'v1.1.3.1 beta'; /** * Version number sent to clients in ping responses. */ - const MINECRAFT_VERSION_NETWORK = '1.1.0.55'; + const MINECRAFT_VERSION_NETWORK = '1.1.3.1'; const LOGIN_PACKET = 0x01; const PLAY_STATUS_PACKET = 0x02; diff --git a/src/pocketmine/network/mcpe/protocol/PurchaseReceiptPacket.php b/src/pocketmine/network/mcpe/protocol/PurchaseReceiptPacket.php new file mode 100644 index 000000000..7da5afa0e --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/PurchaseReceiptPacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class PurchaseReceiptPacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::PURCHASE_RECEIPT_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handlePurchaseReceipt($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/ShowStoreOfferPacket.php b/src/pocketmine/network/mcpe/protocol/ShowStoreOfferPacket.php new file mode 100644 index 000000000..b44e1d352 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/ShowStoreOfferPacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class ShowStoreOfferPacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::SHOW_STORE_OFFER_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleShowStoreOffer($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/SimpleEventPacket.php b/src/pocketmine/network/mcpe/protocol/SimpleEventPacket.php new file mode 100644 index 000000000..4337a8a1e --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/SimpleEventPacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class SimpleEventPacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::SIMPLE_EVENT_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleSimpleEvent($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/StructureBlockUpdatePacket.php b/src/pocketmine/network/mcpe/protocol/StructureBlockUpdatePacket.php new file mode 100644 index 000000000..f6971700e --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/StructureBlockUpdatePacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class StructureBlockUpdatePacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::STRUCTURE_BLOCK_UPDATE_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleStructureBlockUpdate($this); + } +} \ No newline at end of file diff --git a/src/pocketmine/network/mcpe/protocol/UpdateEquipPacket.php b/src/pocketmine/network/mcpe/protocol/UpdateEquipPacket.php new file mode 100644 index 000000000..16b8239b6 --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/UpdateEquipPacket.php @@ -0,0 +1,44 @@ + + +use pocketmine\network\mcpe\NetworkSession; + +class UpdateEquipPacket extends DataPacket{ + const NETWORK_ID = ProtocolInfo::UPDATE_EQUIP_PACKET; + + public function decodePayload(){ + //TODO + } + + public function encodePayload(){ + //TODO + } + + public function handle(NetworkSession $session) : bool{ + return $session->handleUpdateEquip($this); + } +} \ No newline at end of file