From ef8227a074c7acaa1c244ee4c709603c21ee1584 Mon Sep 17 00:00:00 2001 From: Intyre Date: Wed, 15 Jun 2016 23:59:35 +0200 Subject: [PATCH] Bump version to 0.15.0.0 and protocol changes --- src/pocketmine/Player.php | 21 +-- src/pocketmine/PocketMine.php | 4 +- src/pocketmine/entity/Human.php | 6 +- src/pocketmine/network/Network.php | 9 +- src/pocketmine/network/RakLibInterface.php | 14 +- ...acket.php => ChunkRadiusUpdatedPacket.php} | 4 +- src/pocketmine/network/protocol/Info.php | 127 +++++++++--------- .../network/protocol/LoginPacket.php | 61 ++++++--- 8 files changed, 140 insertions(+), 106 deletions(-) rename src/pocketmine/network/protocol/{ChunkRadiusUpdatePacket.php => ChunkRadiusUpdatedPacket.php} (89%) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 076fb1363..b6361213e 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -101,7 +101,7 @@ use pocketmine\nbt\tag\StringTag; use pocketmine\network\protocol\AdventureSettingsPacket; use pocketmine\network\protocol\AnimatePacket; use pocketmine\network\protocol\BatchPacket; -use pocketmine\network\protocol\ChunkRadiusUpdatePacket; +use pocketmine\network\protocol\ChunkRadiusUpdatedPacket; use pocketmine\network\protocol\ContainerClosePacket; use pocketmine\network\protocol\ContainerSetContentPacket; use pocketmine\network\protocol\DataPacket; @@ -133,6 +133,7 @@ use pocketmine\tile\Sign; use pocketmine\tile\Spawnable; use pocketmine\tile\Tile; use pocketmine\utils\TextFormat; +use pocketmine\utils\UUID; use raklib\Binary; @@ -1568,6 +1569,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade } public function tryAuthenticate(){ + $pk = new PlayStatusPacket(); + $pk->status = PlayStatusPacket::LOGIN_SUCCESS; + $this->dataPacket($pk); //TODO: implement authentication after it is available $this->authenticateCallback(true); } @@ -1614,7 +1618,8 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade } } } - + $this->setNameTag($this->username); + $nbt = $this->server->getOfflinePlayerData($this->username); $this->playedBefore = ($nbt["lastPlayed"] - $nbt["firstPlayed"]) > 1; // microtime(true) - microtime(true) may have less than one millisecond difference if(!isset($nbt->NameTag)){ @@ -1787,15 +1792,14 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $this->username = TextFormat::clean($packet->username); $this->displayName = $this->username; - $this->setNameTag($this->username); $this->iusername = strtolower($this->username); if(count($this->server->getOnlinePlayers()) >= $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)){ break; } - if($packet->protocol1 !== ProtocolInfo::CURRENT_PROTOCOL){ - if($packet->protocol1 < ProtocolInfo::CURRENT_PROTOCOL){ + if($packet->protocol !== ProtocolInfo::CURRENT_PROTOCOL){ + if($packet->protocol < ProtocolInfo::CURRENT_PROTOCOL){ $message = "disconnectionScreen.outdatedClient"; $pk = new PlayStatusPacket(); @@ -1815,9 +1819,8 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $this->randomClientId = $packet->clientId; - $this->uuid = $packet->clientUUID; + $this->uuid = UUID::fromString($packet->clientUUID); $this->rawUUID = $this->uuid->toBinary(); - $this->clientSecret = $packet->clientSecret; $valid = true; $len = strlen($packet->username); @@ -1848,7 +1851,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade break; } - $this->setSkin($packet->skin, $packet->skinName); + $this->setSkin($packet->skin, $packet->skinID); $this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason")); if($ev->isCancelled()){ @@ -2848,7 +2851,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($this->spawned){ $this->viewDistance = $packet->radius ** 2; } - $pk = new ChunkRadiusUpdatePacket(); + $pk = new ChunkRadiusUpdatedPacket(); $pk->radius = $packet->radius; $this->dataPacket($pk); break; diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index d108be5c0..b7bb32462 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -75,8 +75,8 @@ namespace pocketmine { const VERSION = "1.6dev"; const API_VERSION = "2.0.0"; const CODENAME = "[REDACTED]"; - const MINECRAFT_VERSION = "v0.14.3.0 alpha"; - const MINECRAFT_VERSION_NETWORK = "0.14.3.0"; + const MINECRAFT_VERSION = "v0.15.0.0 alpha"; + const MINECRAFT_VERSION_NETWORK = "0.15.0.0"; /* * Startup code. Do not look at it, it may harm you. diff --git a/src/pocketmine/entity/Human.php b/src/pocketmine/entity/Human.php index 659fb6216..7005a8d3d 100644 --- a/src/pocketmine/entity/Human.php +++ b/src/pocketmine/entity/Human.php @@ -36,7 +36,7 @@ use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\ShortTag; use pocketmine\nbt\tag\StringTag; use pocketmine\network\protocol\AddPlayerPacket; -use pocketmine\network\protocol\RemovePlayerPacket; +use pocketmine\network\protocol\RemoveEntityPacket; use pocketmine\Player; use pocketmine\utils\UUID; @@ -487,9 +487,9 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{ public function despawnFrom(Player $player){ if(isset($this->hasSpawned[$player->getLoaderId()])){ - $pk = new RemovePlayerPacket(); + $pk = new RemoveEntityPacket(); $pk->eid = $this->getId(); - $pk->clientId = $this->getUniqueId(); + $player->dataPacket($pk); unset($this->hasSpawned[$player->getLoaderId()]); } diff --git a/src/pocketmine/network/Network.php b/src/pocketmine/network/Network.php index c82f6a0e8..cee935e8c 100644 --- a/src/pocketmine/network/Network.php +++ b/src/pocketmine/network/Network.php @@ -31,7 +31,7 @@ use pocketmine\network\protocol\AddPlayerPacket; use pocketmine\network\protocol\AdventureSettingsPacket; use pocketmine\network\protocol\AnimatePacket; use pocketmine\network\protocol\BatchPacket; -use pocketmine\network\protocol\ChunkRadiusUpdatePacket; +use pocketmine\network\protocol\ChunkRadiusUpdatedPacket; use pocketmine\network\protocol\ContainerClosePacket; use pocketmine\network\protocol\ContainerOpenPacket; use pocketmine\network\protocol\ContainerSetContentPacket; @@ -220,12 +220,12 @@ class Network{ $buf = substr($str, $offset, $pkLen); $offset += $pkLen; - if(($pk = $this->getPacket(ord($buf{1}))) !== null){ // #blameshoghi + if(($pk = $this->getPacket(ord($buf{0}))) !== null){ // #blameshoghi if($pk::NETWORK_ID === Info::BATCH_PACKET){ throw new \InvalidStateException("Invalid BatchPacket inside BatchPacket"); } - $pk->setBuffer($buf, 2); // #blameshoghi + $pk->setBuffer($buf, 1); $pk->decode(); $p->handleDataPacket($pk); @@ -293,7 +293,6 @@ class Network{ $this->registerPacket(ProtocolInfo::SET_TIME_PACKET, SetTimePacket::class); $this->registerPacket(ProtocolInfo::START_GAME_PACKET, StartGamePacket::class); $this->registerPacket(ProtocolInfo::ADD_PLAYER_PACKET, AddPlayerPacket::class); - $this->registerPacket(ProtocolInfo::REMOVE_PLAYER_PACKET, RemovePlayerPacket::class); $this->registerPacket(ProtocolInfo::ADD_ENTITY_PACKET, AddEntityPacket::class); $this->registerPacket(ProtocolInfo::REMOVE_ENTITY_PACKET, RemoveEntityPacket::class); $this->registerPacket(ProtocolInfo::ADD_ITEM_ENTITY_PACKET, AddItemEntityPacket::class); @@ -335,6 +334,6 @@ class Network{ $this->registerPacket(ProtocolInfo::SET_PLAYER_GAMETYPE_PACKET, SetPlayerGameTypePacket::class); $this->registerPacket(ProtocolInfo::PLAYER_LIST_PACKET, PlayerListPacket::class); $this->registerPacket(ProtocolInfo::REQUEST_CHUNK_RADIUS_PACKET, RequestChunkRadiusPacket::class); - $this->registerPacket(ProtocolInfo::CHUNK_RADIUS_UPDATE_PACKET, ChunkRadiusUpdatePacket::class); + $this->registerPacket(ProtocolInfo::CHUNK_RADIUS_UPDATED_PACKET, ChunkRadiusUpdatedPacket::class); } } diff --git a/src/pocketmine/network/RakLibInterface.php b/src/pocketmine/network/RakLibInterface.php index de195a44e..f71a410b4 100644 --- a/src/pocketmine/network/RakLibInterface.php +++ b/src/pocketmine/network/RakLibInterface.php @@ -199,7 +199,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ if(!isset($packet->__encapsulatedPacket)){ $packet->__encapsulatedPacket = new CachedEncapsulatedPacket; $packet->__encapsulatedPacket->identifierACK = null; - $packet->__encapsulatedPacket->buffer = chr(0x8e) . $packet->buffer; // #blameshoghi + $packet->__encapsulatedPacket->buffer = chr(0xfe) . $packet->buffer; // #blameshoghi $packet->__encapsulatedPacket->reliability = 3; $packet->__encapsulatedPacket->orderChannel = 0; } @@ -215,7 +215,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ if($pk === null){ $pk = new EncapsulatedPacket(); - $pk->buffer = chr(0x8e) . $packet->buffer; // #blameshoghi + $pk->buffer = chr(0xfe) . $packet->buffer; // #blameshoghi $packet->reliability = 3; $packet->orderChannel = 0; @@ -233,12 +233,16 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ } private function getPacket($buffer){ - $pid = ord($buffer{1}); // #blameshoghi - + $pid = ord($buffer{0}); + $start = 1; + if($pid == 0xfe){ + $pid = ord($buffer{1}); + $start++; + } if(($data = $this->network->getPacket($pid)) === null){ return null; } - $data->setBuffer($buffer, 2); // #blameshoghi + $data->setBuffer($buffer, $start); return $data; } diff --git a/src/pocketmine/network/protocol/ChunkRadiusUpdatePacket.php b/src/pocketmine/network/protocol/ChunkRadiusUpdatedPacket.php similarity index 89% rename from src/pocketmine/network/protocol/ChunkRadiusUpdatePacket.php rename to src/pocketmine/network/protocol/ChunkRadiusUpdatedPacket.php index 113b4e7a6..78020df2c 100644 --- a/src/pocketmine/network/protocol/ChunkRadiusUpdatePacket.php +++ b/src/pocketmine/network/protocol/ChunkRadiusUpdatedPacket.php @@ -24,8 +24,8 @@ namespace pocketmine\network\protocol; #include -class ChunkRadiusUpdatePacket extends DataPacket{ - const NETWORK_ID = Info::CHUNK_RADIUS_UPDATE_PACKET; +class ChunkRadiusUpdatedPacket extends DataPacket{ + const NETWORK_ID = Info::CHUNK_RADIUS_UPDATED_PACKET; public $radius; diff --git a/src/pocketmine/network/protocol/Info.php b/src/pocketmine/network/protocol/Info.php index f19905ae7..458250c2b 100644 --- a/src/pocketmine/network/protocol/Info.php +++ b/src/pocketmine/network/protocol/Info.php @@ -30,69 +30,72 @@ interface Info{ /** * Actual Minecraft: PE protocol version */ - const CURRENT_PROTOCOL = 70; + const CURRENT_PROTOCOL = 81; - const LOGIN_PACKET = 0x8f; - const PLAY_STATUS_PACKET = 0x90; - const DISCONNECT_PACKET = 0x91; - const BATCH_PACKET = 0x92; - const TEXT_PACKET = 0x93; - const SET_TIME_PACKET = 0x94; - const START_GAME_PACKET = 0x95; - const ADD_PLAYER_PACKET = 0x96; - const REMOVE_PLAYER_PACKET = 0x97; - const ADD_ENTITY_PACKET = 0x98; - const REMOVE_ENTITY_PACKET = 0x99; - const ADD_ITEM_ENTITY_PACKET = 0x9a; - const TAKE_ITEM_ENTITY_PACKET = 0x9b; - const MOVE_ENTITY_PACKET = 0x9c; - const MOVE_PLAYER_PACKET = 0x9d; - const REMOVE_BLOCK_PACKET = 0x9e; - const UPDATE_BLOCK_PACKET = 0x9f; - const ADD_PAINTING_PACKET = 0xa0; - const EXPLODE_PACKET = 0xa1; - const LEVEL_EVENT_PACKET = 0xa2; - const BLOCK_EVENT_PACKET = 0xa3; - const ENTITY_EVENT_PACKET = 0xa4; - const MOB_EFFECT_PACKET = 0xa5; - const UPDATE_ATTRIBUTES_PACKET = 0xa6; - const MOB_EQUIPMENT_PACKET = 0xa7; - const MOB_ARMOR_EQUIPMENT_PACKET = 0xa8; - const INTERACT_PACKET = 0xa9; - const USE_ITEM_PACKET = 0xaa; - const PLAYER_ACTION_PACKET = 0xab; - const HURT_ARMOR_PACKET = 0xac; - const SET_ENTITY_DATA_PACKET = 0xad; - const SET_ENTITY_MOTION_PACKET = 0xae; - const SET_ENTITY_LINK_PACKET = 0xaf; - const SET_HEALTH_PACKET = 0xb0; - const SET_SPAWN_POSITION_PACKET = 0xb1; - const ANIMATE_PACKET = 0xb2; - const RESPAWN_PACKET = 0xb3; - const DROP_ITEM_PACKET = 0xb4; - const CONTAINER_OPEN_PACKET = 0xb5; - const CONTAINER_CLOSE_PACKET = 0xb6; - const CONTAINER_SET_SLOT_PACKET = 0xb7; - const CONTAINER_SET_DATA_PACKET = 0xb8; - const CONTAINER_SET_CONTENT_PACKET = 0xb9; - const CRAFTING_DATA_PACKET = 0xba; - const CRAFTING_EVENT_PACKET = 0xbb; - const ADVENTURE_SETTINGS_PACKET = 0xbc; - const BLOCK_ENTITY_DATA_PACKET = 0xbd; - // const PLAYER_INPUT_PACKET = 0xbe; - const FULL_CHUNK_DATA_PACKET = 0xbf; - const SET_DIFFICULTY_PACKET = 0xc0; - // const CHANGE_DIMENSION_PACKET = 0xc1; - const SET_PLAYER_GAMETYPE_PACKET = 0xc2; - const PLAYER_LIST_PACKET = 0xc3; - // const TELEMETRY_EVENT_PACKET = 0xc4; - // const SPAWN_EXPERIENCE_ORB_PACKET = 0xc5 - // const CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0xc6; - // const MAP_INFO_REQUEST_PACKET = 0xc7; - const REQUEST_CHUNK_RADIUS_PACKET = 0xc8; - const CHUNK_RADIUS_UPDATE_PACKET = 0xc9; - // const ITEM_FRAME_DROP_ITEM_PACKET = 0xca; - // const REPLACE_SELECTED_ITEM_PACKET = 0xcb; + const LOGIN_PACKET = 0x01; + const PLAY_STATUS_PACKET = 0x02; + const SERVER_TO_CLIENT_HANDSHAKE_PACKET = 0x03; + const CLIENT_TO_SERVER_HANDSHAKE_PACKET = 0x04; + const DISCONNECT_PACKET = 0x05; + const BATCH_PACKET = 0x06; + const TEXT_PACKET = 0x07; + const SET_TIME_PACKET = 0x08; + const START_GAME_PACKET = 0x09; + const ADD_PLAYER_PACKET = 0x0a; + const ADD_ENTITY_PACKET = 0x0b; + const REMOVE_ENTITY_PACKET = 0x0c; + const ADD_ITEM_ENTITY_PACKET = 0x0d; + const TAKE_ITEM_ENTITY_PACKET = 0x0e; + const MOVE_ENTITY_PACKET = 0x0f; + const MOVE_PLAYER_PACKET = 0x10; + const RIDER_JUMP_PACKET = 0x11; + const REMOVE_BLOCK_PACKET = 0x12; + const UPDATE_BLOCK_PACKET = 0x13; + const ADD_PAINTING_PACKET = 0x14; + const EXPLODE_PACKET = 0x15; + const LEVEL_EVENT_PACKET = 0x16; + const BLOCK_EVENT_PACKET = 0x17; + const ENTITY_EVENT_PACKET = 0x18; + const MOB_EFFECT_PACKET = 0x19; + const UPDATE_ATTRIBUTES_PACKET = 0x1a; + const MOB_EQUIPMENT_PACKET = 0x1b; + const MOB_ARMOR_EQUIPMENT_PACKET = 0x1c; + const INTERACT_PACKET = 0x1e; + const USE_ITEM_PACKET = 0x1f; + const PLAYER_ACTION_PACKET = 0x20; + const HURT_ARMOR_PACKET = 0x21; + const SET_ENTITY_DATA_PACKET = 0x22; + const SET_ENTITY_MOTION_PACKET = 0x23; + const SET_ENTITY_LINK_PACKET = 0x24; + const SET_HEALTH_PACKET = 0x25; + const SET_SPAWN_POSITION_PACKET = 0x26; + const ANIMATE_PACKET = 0x27; + const RESPAWN_PACKET = 0x28; + const DROP_ITEM_PACKET = 0x29; + const CONTAINER_OPEN_PACKET = 0x2a; + const CONTAINER_CLOSE_PACKET = 0x2b; + const CONTAINER_SET_SLOT_PACKET = 0x2c; + const CONTAINER_SET_DATA_PACKET = 0x2d; + const CONTAINER_SET_CONTENT_PACKET = 0x2e; + const CRAFTING_DATA_PACKET = 0x2f; + const CRAFTING_EVENT_PACKET = 0x30; + const ADVENTURE_SETTINGS_PACKET = 0x31; + const BLOCK_ENTITY_DATA_PACKET = 0x32; + const PLAYER_INPUT_PACKET = 0x33; + const FULL_CHUNK_DATA_PACKET = 0x34; + const SET_DIFFICULTY_PACKET = 0x35; + const CHANGE_DIMENSION_PACKET = 0x36; + const SET_PLAYER_GAMETYPE_PACKET = 0x37; + const PLAYER_LIST_PACKET = 0x38; + const TELEMETRY_EVENT_PACKET = 0x39; + const SPAWN_EXPERIENCE_ORB_PACKET = 0x3a; + const CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0x3b; + const MAP_INFO_REQUEST_PACKET = 0x3c; + const REQUEST_CHUNK_RADIUS_PACKET = 0x3d; + const CHUNK_RADIUS_UPDATED_PACKET = 0x3e; + const ITEM_FRAME_DROP_ITEM_PACKET = 0x3f; + const REPLACE_SELECTED_ITEM_PACKET = 0x40; + const ADD_ITEM_PACKET = 0x41; } diff --git a/src/pocketmine/network/protocol/LoginPacket.php b/src/pocketmine/network/protocol/LoginPacket.php index 6b8079f19..93444fdb6 100644 --- a/src/pocketmine/network/protocol/LoginPacket.php +++ b/src/pocketmine/network/protocol/LoginPacket.php @@ -28,36 +28,61 @@ class LoginPacket extends DataPacket{ const NETWORK_ID = Info::LOGIN_PACKET; public $username; - public $protocol1; - public $protocol2; - public $clientId; + public $protocol; public $clientUUID; + public $clientId; + public $identityPublicKey; public $serverAddress; - public $clientSecret; - public $skinName; + public $skinID; public $skin = null; public function decode(){ - $this->username = $this->getString(); - $this->protocol1 = $this->getInt(); - $this->protocol2 = $this->getInt(); - if($this->protocol1 < Info::CURRENT_PROTOCOL){ //New fields! - $this->setBuffer(null, 0); //Skip batch packet handling - return; - } - $this->clientId = $this->getLong(); - $this->clientUUID = $this->getUUID(); - $this->serverAddress = $this->getString(); - $this->clientSecret = $this->getString(); + $this->protocol = $this->getInt(); - $this->skinName = $this->getString(); - $this->skin = $this->getString(); + $str = zlib_decode($this->get($this->getInt()), 1024 * 1024 * 64); //Max 64MB + $this->setBuffer($str, 0); + + $chainData = json_decode($this->get($this->getLInt())); + foreach ($chainData->{"chain"} as $chain){ + $webtoken = $this->decodeToken($chain); + if(isset($webtoken["extraData"])){ + if(isset($webtoken["extraData"]["displayName"])){ + $this->username = $webtoken["extraData"]["displayName"]; + } + if(isset($webtoken["extraData"]["identity"])){ + $this->clientUUID = $webtoken["extraData"]["identity"]; + } + if(isset($webtoken["identityPublicKey"])){ + $this->identityPublicKey = $webtoken["identityPublicKey"]; + } + } + } + + $skinToken = $this->decodeToken($this->get($this->getLInt())); + if(isset($skinToken["ClientRandomId"])){ + $this->clientId = $skinToken["ClientRandomId"]; + } + if(isset($skinToken["ServerAddress"])){ + $this->serverAddress = $skinToken["ServerAddress"]; + } + if(isset($skinToken["SkinData"])){ + $this->skin = base64_decode($skinToken["SkinData"]); + } + if(isset($skinToken["SkinId"])){ + $this->skinId = $skinToken["SkinId"]; + } } public function encode(){ } + public function decodeToken($token){ + $tokens = explode(".", $token); + list($headB64, $payloadB64, $sigB64) = $tokens; + + return json_decode(base64_decode($payloadB64), true); + } } \ No newline at end of file