Bump version to 0.15.0.0 and protocol changes

This commit is contained in:
Intyre 2016-06-15 23:59:35 +02:00
parent 80d6f8dfb3
commit ef8227a074
No known key found for this signature in database
GPG Key ID: B06D41D26935005A
8 changed files with 140 additions and 106 deletions

View File

@ -101,7 +101,7 @@ use pocketmine\nbt\tag\StringTag;
use pocketmine\network\protocol\AdventureSettingsPacket; use pocketmine\network\protocol\AdventureSettingsPacket;
use pocketmine\network\protocol\AnimatePacket; use pocketmine\network\protocol\AnimatePacket;
use pocketmine\network\protocol\BatchPacket; use pocketmine\network\protocol\BatchPacket;
use pocketmine\network\protocol\ChunkRadiusUpdatePacket; use pocketmine\network\protocol\ChunkRadiusUpdatedPacket;
use pocketmine\network\protocol\ContainerClosePacket; use pocketmine\network\protocol\ContainerClosePacket;
use pocketmine\network\protocol\ContainerSetContentPacket; use pocketmine\network\protocol\ContainerSetContentPacket;
use pocketmine\network\protocol\DataPacket; use pocketmine\network\protocol\DataPacket;
@ -133,6 +133,7 @@ use pocketmine\tile\Sign;
use pocketmine\tile\Spawnable; use pocketmine\tile\Spawnable;
use pocketmine\tile\Tile; use pocketmine\tile\Tile;
use pocketmine\utils\TextFormat; use pocketmine\utils\TextFormat;
use pocketmine\utils\UUID;
use raklib\Binary; use raklib\Binary;
@ -1568,6 +1569,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
} }
public function tryAuthenticate(){ public function tryAuthenticate(){
$pk = new PlayStatusPacket();
$pk->status = PlayStatusPacket::LOGIN_SUCCESS;
$this->dataPacket($pk);
//TODO: implement authentication after it is available //TODO: implement authentication after it is available
$this->authenticateCallback(true); $this->authenticateCallback(true);
} }
@ -1614,6 +1618,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
} }
} }
} }
$this->setNameTag($this->username);
$nbt = $this->server->getOfflinePlayerData($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 $this->playedBefore = ($nbt["lastPlayed"] - $nbt["firstPlayed"]) > 1; // microtime(true) - microtime(true) may have less than one millisecond difference
@ -1787,15 +1792,14 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$this->username = TextFormat::clean($packet->username); $this->username = TextFormat::clean($packet->username);
$this->displayName = $this->username; $this->displayName = $this->username;
$this->setNameTag($this->username);
$this->iusername = strtolower($this->username); $this->iusername = strtolower($this->username);
if(count($this->server->getOnlinePlayers()) >= $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)){ if(count($this->server->getOnlinePlayers()) >= $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)){
break; break;
} }
if($packet->protocol1 !== ProtocolInfo::CURRENT_PROTOCOL){ if($packet->protocol !== ProtocolInfo::CURRENT_PROTOCOL){
if($packet->protocol1 < ProtocolInfo::CURRENT_PROTOCOL){ if($packet->protocol < ProtocolInfo::CURRENT_PROTOCOL){
$message = "disconnectionScreen.outdatedClient"; $message = "disconnectionScreen.outdatedClient";
$pk = new PlayStatusPacket(); $pk = new PlayStatusPacket();
@ -1815,9 +1819,8 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$this->randomClientId = $packet->clientId; $this->randomClientId = $packet->clientId;
$this->uuid = $packet->clientUUID; $this->uuid = UUID::fromString($packet->clientUUID);
$this->rawUUID = $this->uuid->toBinary(); $this->rawUUID = $this->uuid->toBinary();
$this->clientSecret = $packet->clientSecret;
$valid = true; $valid = true;
$len = strlen($packet->username); $len = strlen($packet->username);
@ -1848,7 +1851,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
break; break;
} }
$this->setSkin($packet->skin, $packet->skinName); $this->setSkin($packet->skin, $packet->skinID);
$this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason")); $this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason"));
if($ev->isCancelled()){ if($ev->isCancelled()){
@ -2848,7 +2851,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
if($this->spawned){ if($this->spawned){
$this->viewDistance = $packet->radius ** 2; $this->viewDistance = $packet->radius ** 2;
} }
$pk = new ChunkRadiusUpdatePacket(); $pk = new ChunkRadiusUpdatedPacket();
$pk->radius = $packet->radius; $pk->radius = $packet->radius;
$this->dataPacket($pk); $this->dataPacket($pk);
break; break;

View File

@ -75,8 +75,8 @@ namespace pocketmine {
const VERSION = "1.6dev"; const VERSION = "1.6dev";
const API_VERSION = "2.0.0"; const API_VERSION = "2.0.0";
const CODENAME = "[REDACTED]"; const CODENAME = "[REDACTED]";
const MINECRAFT_VERSION = "v0.14.3.0 alpha"; const MINECRAFT_VERSION = "v0.15.0.0 alpha";
const MINECRAFT_VERSION_NETWORK = "0.14.3.0"; const MINECRAFT_VERSION_NETWORK = "0.15.0.0";
/* /*
* Startup code. Do not look at it, it may harm you. * Startup code. Do not look at it, it may harm you.

View File

@ -36,7 +36,7 @@ use pocketmine\nbt\tag\ListTag;
use pocketmine\nbt\tag\ShortTag; use pocketmine\nbt\tag\ShortTag;
use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\StringTag;
use pocketmine\network\protocol\AddPlayerPacket; use pocketmine\network\protocol\AddPlayerPacket;
use pocketmine\network\protocol\RemovePlayerPacket; use pocketmine\network\protocol\RemoveEntityPacket;
use pocketmine\Player; use pocketmine\Player;
use pocketmine\utils\UUID; use pocketmine\utils\UUID;
@ -487,9 +487,9 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
public function despawnFrom(Player $player){ public function despawnFrom(Player $player){
if(isset($this->hasSpawned[$player->getLoaderId()])){ if(isset($this->hasSpawned[$player->getLoaderId()])){
$pk = new RemovePlayerPacket(); $pk = new RemoveEntityPacket();
$pk->eid = $this->getId(); $pk->eid = $this->getId();
$pk->clientId = $this->getUniqueId();
$player->dataPacket($pk); $player->dataPacket($pk);
unset($this->hasSpawned[$player->getLoaderId()]); unset($this->hasSpawned[$player->getLoaderId()]);
} }

View File

@ -31,7 +31,7 @@ use pocketmine\network\protocol\AddPlayerPacket;
use pocketmine\network\protocol\AdventureSettingsPacket; use pocketmine\network\protocol\AdventureSettingsPacket;
use pocketmine\network\protocol\AnimatePacket; use pocketmine\network\protocol\AnimatePacket;
use pocketmine\network\protocol\BatchPacket; use pocketmine\network\protocol\BatchPacket;
use pocketmine\network\protocol\ChunkRadiusUpdatePacket; use pocketmine\network\protocol\ChunkRadiusUpdatedPacket;
use pocketmine\network\protocol\ContainerClosePacket; use pocketmine\network\protocol\ContainerClosePacket;
use pocketmine\network\protocol\ContainerOpenPacket; use pocketmine\network\protocol\ContainerOpenPacket;
use pocketmine\network\protocol\ContainerSetContentPacket; use pocketmine\network\protocol\ContainerSetContentPacket;
@ -220,12 +220,12 @@ class Network{
$buf = substr($str, $offset, $pkLen); $buf = substr($str, $offset, $pkLen);
$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){ if($pk::NETWORK_ID === Info::BATCH_PACKET){
throw new \InvalidStateException("Invalid BatchPacket inside BatchPacket"); throw new \InvalidStateException("Invalid BatchPacket inside BatchPacket");
} }
$pk->setBuffer($buf, 2); // #blameshoghi $pk->setBuffer($buf, 1);
$pk->decode(); $pk->decode();
$p->handleDataPacket($pk); $p->handleDataPacket($pk);
@ -293,7 +293,6 @@ class Network{
$this->registerPacket(ProtocolInfo::SET_TIME_PACKET, SetTimePacket::class); $this->registerPacket(ProtocolInfo::SET_TIME_PACKET, SetTimePacket::class);
$this->registerPacket(ProtocolInfo::START_GAME_PACKET, StartGamePacket::class); $this->registerPacket(ProtocolInfo::START_GAME_PACKET, StartGamePacket::class);
$this->registerPacket(ProtocolInfo::ADD_PLAYER_PACKET, AddPlayerPacket::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::ADD_ENTITY_PACKET, AddEntityPacket::class);
$this->registerPacket(ProtocolInfo::REMOVE_ENTITY_PACKET, RemoveEntityPacket::class); $this->registerPacket(ProtocolInfo::REMOVE_ENTITY_PACKET, RemoveEntityPacket::class);
$this->registerPacket(ProtocolInfo::ADD_ITEM_ENTITY_PACKET, AddItemEntityPacket::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::SET_PLAYER_GAMETYPE_PACKET, SetPlayerGameTypePacket::class);
$this->registerPacket(ProtocolInfo::PLAYER_LIST_PACKET, PlayerListPacket::class); $this->registerPacket(ProtocolInfo::PLAYER_LIST_PACKET, PlayerListPacket::class);
$this->registerPacket(ProtocolInfo::REQUEST_CHUNK_RADIUS_PACKET, RequestChunkRadiusPacket::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);
} }
} }

View File

@ -199,7 +199,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
if(!isset($packet->__encapsulatedPacket)){ if(!isset($packet->__encapsulatedPacket)){
$packet->__encapsulatedPacket = new CachedEncapsulatedPacket; $packet->__encapsulatedPacket = new CachedEncapsulatedPacket;
$packet->__encapsulatedPacket->identifierACK = null; $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->reliability = 3;
$packet->__encapsulatedPacket->orderChannel = 0; $packet->__encapsulatedPacket->orderChannel = 0;
} }
@ -215,7 +215,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
if($pk === null){ if($pk === null){
$pk = new EncapsulatedPacket(); $pk = new EncapsulatedPacket();
$pk->buffer = chr(0x8e) . $packet->buffer; // #blameshoghi $pk->buffer = chr(0xfe) . $packet->buffer; // #blameshoghi
$packet->reliability = 3; $packet->reliability = 3;
$packet->orderChannel = 0; $packet->orderChannel = 0;
@ -233,12 +233,16 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
} }
private function getPacket($buffer){ 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){ if(($data = $this->network->getPacket($pid)) === null){
return null; return null;
} }
$data->setBuffer($buffer, 2); // #blameshoghi $data->setBuffer($buffer, $start);
return $data; return $data;
} }

View File

@ -24,8 +24,8 @@ namespace pocketmine\network\protocol;
#include <rules/DataPacket.h> #include <rules/DataPacket.h>
class ChunkRadiusUpdatePacket extends DataPacket{ class ChunkRadiusUpdatedPacket extends DataPacket{
const NETWORK_ID = Info::CHUNK_RADIUS_UPDATE_PACKET; const NETWORK_ID = Info::CHUNK_RADIUS_UPDATED_PACKET;
public $radius; public $radius;

View File

@ -30,69 +30,72 @@ interface Info{
/** /**
* Actual Minecraft: PE protocol version * Actual Minecraft: PE protocol version
*/ */
const CURRENT_PROTOCOL = 70; const CURRENT_PROTOCOL = 81;
const LOGIN_PACKET = 0x8f; const LOGIN_PACKET = 0x01;
const PLAY_STATUS_PACKET = 0x90; const PLAY_STATUS_PACKET = 0x02;
const DISCONNECT_PACKET = 0x91; const SERVER_TO_CLIENT_HANDSHAKE_PACKET = 0x03;
const BATCH_PACKET = 0x92; const CLIENT_TO_SERVER_HANDSHAKE_PACKET = 0x04;
const TEXT_PACKET = 0x93; const DISCONNECT_PACKET = 0x05;
const SET_TIME_PACKET = 0x94; const BATCH_PACKET = 0x06;
const START_GAME_PACKET = 0x95; const TEXT_PACKET = 0x07;
const ADD_PLAYER_PACKET = 0x96; const SET_TIME_PACKET = 0x08;
const REMOVE_PLAYER_PACKET = 0x97; const START_GAME_PACKET = 0x09;
const ADD_ENTITY_PACKET = 0x98; const ADD_PLAYER_PACKET = 0x0a;
const REMOVE_ENTITY_PACKET = 0x99; const ADD_ENTITY_PACKET = 0x0b;
const ADD_ITEM_ENTITY_PACKET = 0x9a; const REMOVE_ENTITY_PACKET = 0x0c;
const TAKE_ITEM_ENTITY_PACKET = 0x9b; const ADD_ITEM_ENTITY_PACKET = 0x0d;
const MOVE_ENTITY_PACKET = 0x9c; const TAKE_ITEM_ENTITY_PACKET = 0x0e;
const MOVE_PLAYER_PACKET = 0x9d; const MOVE_ENTITY_PACKET = 0x0f;
const REMOVE_BLOCK_PACKET = 0x9e; const MOVE_PLAYER_PACKET = 0x10;
const UPDATE_BLOCK_PACKET = 0x9f; const RIDER_JUMP_PACKET = 0x11;
const ADD_PAINTING_PACKET = 0xa0; const REMOVE_BLOCK_PACKET = 0x12;
const EXPLODE_PACKET = 0xa1; const UPDATE_BLOCK_PACKET = 0x13;
const LEVEL_EVENT_PACKET = 0xa2; const ADD_PAINTING_PACKET = 0x14;
const BLOCK_EVENT_PACKET = 0xa3; const EXPLODE_PACKET = 0x15;
const ENTITY_EVENT_PACKET = 0xa4; const LEVEL_EVENT_PACKET = 0x16;
const MOB_EFFECT_PACKET = 0xa5; const BLOCK_EVENT_PACKET = 0x17;
const UPDATE_ATTRIBUTES_PACKET = 0xa6; const ENTITY_EVENT_PACKET = 0x18;
const MOB_EQUIPMENT_PACKET = 0xa7; const MOB_EFFECT_PACKET = 0x19;
const MOB_ARMOR_EQUIPMENT_PACKET = 0xa8; const UPDATE_ATTRIBUTES_PACKET = 0x1a;
const INTERACT_PACKET = 0xa9; const MOB_EQUIPMENT_PACKET = 0x1b;
const USE_ITEM_PACKET = 0xaa; const MOB_ARMOR_EQUIPMENT_PACKET = 0x1c;
const PLAYER_ACTION_PACKET = 0xab; const INTERACT_PACKET = 0x1e;
const HURT_ARMOR_PACKET = 0xac; const USE_ITEM_PACKET = 0x1f;
const SET_ENTITY_DATA_PACKET = 0xad; const PLAYER_ACTION_PACKET = 0x20;
const SET_ENTITY_MOTION_PACKET = 0xae; const HURT_ARMOR_PACKET = 0x21;
const SET_ENTITY_LINK_PACKET = 0xaf; const SET_ENTITY_DATA_PACKET = 0x22;
const SET_HEALTH_PACKET = 0xb0; const SET_ENTITY_MOTION_PACKET = 0x23;
const SET_SPAWN_POSITION_PACKET = 0xb1; const SET_ENTITY_LINK_PACKET = 0x24;
const ANIMATE_PACKET = 0xb2; const SET_HEALTH_PACKET = 0x25;
const RESPAWN_PACKET = 0xb3; const SET_SPAWN_POSITION_PACKET = 0x26;
const DROP_ITEM_PACKET = 0xb4; const ANIMATE_PACKET = 0x27;
const CONTAINER_OPEN_PACKET = 0xb5; const RESPAWN_PACKET = 0x28;
const CONTAINER_CLOSE_PACKET = 0xb6; const DROP_ITEM_PACKET = 0x29;
const CONTAINER_SET_SLOT_PACKET = 0xb7; const CONTAINER_OPEN_PACKET = 0x2a;
const CONTAINER_SET_DATA_PACKET = 0xb8; const CONTAINER_CLOSE_PACKET = 0x2b;
const CONTAINER_SET_CONTENT_PACKET = 0xb9; const CONTAINER_SET_SLOT_PACKET = 0x2c;
const CRAFTING_DATA_PACKET = 0xba; const CONTAINER_SET_DATA_PACKET = 0x2d;
const CRAFTING_EVENT_PACKET = 0xbb; const CONTAINER_SET_CONTENT_PACKET = 0x2e;
const ADVENTURE_SETTINGS_PACKET = 0xbc; const CRAFTING_DATA_PACKET = 0x2f;
const BLOCK_ENTITY_DATA_PACKET = 0xbd; const CRAFTING_EVENT_PACKET = 0x30;
// const PLAYER_INPUT_PACKET = 0xbe; const ADVENTURE_SETTINGS_PACKET = 0x31;
const FULL_CHUNK_DATA_PACKET = 0xbf; const BLOCK_ENTITY_DATA_PACKET = 0x32;
const SET_DIFFICULTY_PACKET = 0xc0; const PLAYER_INPUT_PACKET = 0x33;
// const CHANGE_DIMENSION_PACKET = 0xc1; const FULL_CHUNK_DATA_PACKET = 0x34;
const SET_PLAYER_GAMETYPE_PACKET = 0xc2; const SET_DIFFICULTY_PACKET = 0x35;
const PLAYER_LIST_PACKET = 0xc3; const CHANGE_DIMENSION_PACKET = 0x36;
// const TELEMETRY_EVENT_PACKET = 0xc4; const SET_PLAYER_GAMETYPE_PACKET = 0x37;
// const SPAWN_EXPERIENCE_ORB_PACKET = 0xc5 const PLAYER_LIST_PACKET = 0x38;
// const CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0xc6; const TELEMETRY_EVENT_PACKET = 0x39;
// const MAP_INFO_REQUEST_PACKET = 0xc7; const SPAWN_EXPERIENCE_ORB_PACKET = 0x3a;
const REQUEST_CHUNK_RADIUS_PACKET = 0xc8; const CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0x3b;
const CHUNK_RADIUS_UPDATE_PACKET = 0xc9; const MAP_INFO_REQUEST_PACKET = 0x3c;
// const ITEM_FRAME_DROP_ITEM_PACKET = 0xca; const REQUEST_CHUNK_RADIUS_PACKET = 0x3d;
// const REPLACE_SELECTED_ITEM_PACKET = 0xcb; const CHUNK_RADIUS_UPDATED_PACKET = 0x3e;
const ITEM_FRAME_DROP_ITEM_PACKET = 0x3f;
const REPLACE_SELECTED_ITEM_PACKET = 0x40;
const ADD_ITEM_PACKET = 0x41;
} }

View File

@ -28,36 +28,61 @@ class LoginPacket extends DataPacket{
const NETWORK_ID = Info::LOGIN_PACKET; const NETWORK_ID = Info::LOGIN_PACKET;
public $username; public $username;
public $protocol1; public $protocol;
public $protocol2;
public $clientId;
public $clientUUID; public $clientUUID;
public $clientId;
public $identityPublicKey;
public $serverAddress; public $serverAddress;
public $clientSecret;
public $skinName; public $skinID;
public $skin = null; public $skin = null;
public function decode(){ public function decode(){
$this->username = $this->getString(); $this->protocol = $this->getInt();
$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->skinName = $this->getString(); $str = zlib_decode($this->get($this->getInt()), 1024 * 1024 * 64); //Max 64MB
$this->skin = $this->getString(); $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 encode(){
} }
public function decodeToken($token){
$tokens = explode(".", $token);
list($headB64, $payloadB64, $sigB64) = $tokens;
return json_decode(base64_decode($payloadB64), true);
}
} }