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\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;

View File

@ -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.

View File

@ -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()]);
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -24,8 +24,8 @@ namespace pocketmine\network\protocol;
#include <rules/DataPacket.h>
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;

View File

@ -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;
}

View File

@ -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);
}
}