Protocol changes for 1.2.10

This commit is contained in:
Dylan K. Taylor 2018-01-25 14:42:27 +00:00
parent a3fa8adf4a
commit fc795b80ae
12 changed files with 118 additions and 30 deletions

View File

@ -2908,7 +2908,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
public function handleBookEdit(BookEditPacket $packet) : bool{ public function handleBookEdit(BookEditPacket $packet) : bool{
/** @var WritableBook $oldBook */ /** @var WritableBook $oldBook */
$oldBook = $this->inventory->getItem($packet->inventorySlot - 9); $oldBook = $this->inventory->getItem($packet->inventorySlot);
if($oldBook->getId() !== Item::WRITABLE_BOOK){ if($oldBook->getId() !== Item::WRITABLE_BOOK){
return false; return false;
} }
@ -2949,7 +2949,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return true; return true;
} }
$this->getInventory()->setItem($packet->inventorySlot - 9, $event->getNewBook()); $this->getInventory()->setItem($packet->inventorySlot, $event->getNewBook());
return true; return true;
} }
@ -3255,7 +3255,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
public function sendWhisper(string $sender, string $message){ public function sendWhisper(string $sender, string $message){
$pk = new TextPacket(); $pk = new TextPacket();
$pk->type = TextPacket::TYPE_WHISPER; $pk->type = TextPacket::TYPE_WHISPER;
$pk->source = $sender; $pk->sourceName = $sender;
$pk->message = $message; $pk->message = $message;
$this->dataPacket($pk); $this->dataPacket($pk);
} }

View File

@ -2339,7 +2339,8 @@ class Server{
$pk = new PlayerListPacket(); $pk = new PlayerListPacket();
$pk->type = PlayerListPacket::TYPE_ADD; $pk->type = PlayerListPacket::TYPE_ADD;
$pk->entries[] = PlayerListEntry::createAdditionEntry($uuid, $entityId, $name, $skin); $pk->entries[] = PlayerListEntry::createAdditionEntry($uuid, $entityId, $name, "", 0, $skin);
$this->broadcastPacket($players ?? $this->playerList, $pk); $this->broadcastPacket($players ?? $this->playerList, $pk);
} }
@ -2361,7 +2362,7 @@ class Server{
$pk = new PlayerListPacket(); $pk = new PlayerListPacket();
$pk->type = PlayerListPacket::TYPE_ADD; $pk->type = PlayerListPacket::TYPE_ADD;
foreach($this->playerList as $player){ foreach($this->playerList as $player){
$pk->entries[] = PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), $player->getSkin()); $pk->entries[] = PlayerListEntry::createAdditionEntry($player->getUniqueId(), $player->getId(), $player->getDisplayName(), "", 0, $player->getSkin());
} }
$p->dataPacket($pk); $p->dataPacket($pk);

View File

@ -44,6 +44,8 @@ class AddItemEntityPacket extends DataPacket{
public $motion; public $motion;
/** @var array */ /** @var array */
public $metadata = []; public $metadata = [];
/** @var bool */
public $bool1 = false;
protected function decodePayload(){ protected function decodePayload(){
$this->entityUniqueId = $this->getEntityUniqueId(); $this->entityUniqueId = $this->getEntityUniqueId();
@ -52,6 +54,7 @@ class AddItemEntityPacket extends DataPacket{
$this->position = $this->getVector3(); $this->position = $this->getVector3();
$this->motion = $this->getVector3(); $this->motion = $this->getVector3();
$this->metadata = $this->getEntityMetadata(); $this->metadata = $this->getEntityMetadata();
$this->bool1 = $this->getBool();
} }
protected function encodePayload(){ protected function encodePayload(){
@ -61,6 +64,7 @@ class AddItemEntityPacket extends DataPacket{
$this->putVector3($this->position); $this->putVector3($this->position);
$this->putVector3Nullable($this->motion); $this->putVector3Nullable($this->motion);
$this->putEntityMetadata($this->metadata); $this->putEntityMetadata($this->metadata);
$this->putBool($this->bool1);
} }
public function handle(NetworkSession $session) : bool{ public function handle(NetworkSession $session) : bool{

View File

@ -38,10 +38,16 @@ class AddPlayerPacket extends DataPacket{
public $uuid; public $uuid;
/** @var string */ /** @var string */
public $username; public $username;
/** @var string */
public $thirdPartyName = "";
/** @var int */
public $platform = 0;
/** @var int|null */ /** @var int|null */
public $entityUniqueId = null; //TODO public $entityUniqueId = null; //TODO
/** @var int */ /** @var int */
public $entityRuntimeId; public $entityRuntimeId;
/** @var string */
public $string1 = "";
/** @var Vector3 */ /** @var Vector3 */
public $position; public $position;
/** @var Vector3|null */ /** @var Vector3|null */
@ -72,8 +78,11 @@ class AddPlayerPacket extends DataPacket{
protected function decodePayload(){ protected function decodePayload(){
$this->uuid = $this->getUUID(); $this->uuid = $this->getUUID();
$this->username = $this->getString(); $this->username = $this->getString();
$this->thirdPartyName = $this->getString();
$this->platform = $this->getVarInt();
$this->entityUniqueId = $this->getEntityUniqueId(); $this->entityUniqueId = $this->getEntityUniqueId();
$this->entityRuntimeId = $this->getEntityRuntimeId(); $this->entityRuntimeId = $this->getEntityRuntimeId();
$this->string1 = $this->getString();
$this->position = $this->getVector3(); $this->position = $this->getVector3();
$this->motion = $this->getVector3(); $this->motion = $this->getVector3();
$this->pitch = $this->getLFloat(); $this->pitch = $this->getLFloat();
@ -99,8 +108,11 @@ class AddPlayerPacket extends DataPacket{
protected function encodePayload(){ protected function encodePayload(){
$this->putUUID($this->uuid); $this->putUUID($this->uuid);
$this->putString($this->username); $this->putString($this->username);
$this->putString($this->thirdPartyName);
$this->putVarInt($this->platform);
$this->putEntityUniqueId($this->entityUniqueId ?? $this->entityRuntimeId); $this->putEntityUniqueId($this->entityUniqueId ?? $this->entityRuntimeId);
$this->putEntityRuntimeId($this->entityRuntimeId); $this->putEntityRuntimeId($this->entityRuntimeId);
$this->putString($this->string1);
$this->putVector3($this->position); $this->putVector3($this->position);
$this->putVector3Nullable($this->motion); $this->putVector3Nullable($this->motion);
$this->putLFloat($this->pitch); $this->putLFloat($this->pitch);

View File

@ -54,6 +54,8 @@ class BookEditPacket extends DataPacket{
public $title; public $title;
/** @var string */ /** @var string */
public $author; public $author;
/** @var string */
public $xuid;
protected function decodePayload(){ protected function decodePayload(){
$this->type = $this->getByte(); $this->type = $this->getByte();
@ -76,6 +78,7 @@ class BookEditPacket extends DataPacket{
case self::TYPE_SIGN_BOOK: case self::TYPE_SIGN_BOOK:
$this->title = $this->getString(); $this->title = $this->getString();
$this->author = $this->getString(); $this->author = $this->getString();
$this->xuid = $this->getString();
break; break;
default: default:
throw new \UnexpectedValueException("Unknown book edit type $this->type!"); throw new \UnexpectedValueException("Unknown book edit type $this->type!");
@ -103,6 +106,7 @@ class BookEditPacket extends DataPacket{
case self::TYPE_SIGN_BOOK: case self::TYPE_SIGN_BOOK:
$this->putString($this->title); $this->putString($this->title);
$this->putString($this->author); $this->putString($this->author);
$this->putString($this->xuid);
break; break;
default: default:
throw new \UnexpectedValueException("Unknown book edit type $this->type!"); throw new \UnexpectedValueException("Unknown book edit type $this->type!");

View File

@ -31,6 +31,9 @@ use pocketmine\network\mcpe\protocol\types\ContainerIds;
use pocketmine\utils\Binary; use pocketmine\utils\Binary;
#endif #endif
/**
* One of the most useless packets.
*/
class PlayerHotbarPacket extends DataPacket{ class PlayerHotbarPacket extends DataPacket{
public const NETWORK_ID = ProtocolInfo::PLAYER_HOTBAR_PACKET; public const NETWORK_ID = ProtocolInfo::PLAYER_HOTBAR_PACKET;
@ -38,28 +41,18 @@ class PlayerHotbarPacket extends DataPacket{
public $selectedHotbarSlot; public $selectedHotbarSlot;
/** @var int */ /** @var int */
public $windowId = ContainerIds::INVENTORY; public $windowId = ContainerIds::INVENTORY;
/** @var int[] */
public $slots = [];
/** @var bool */ /** @var bool */
public $selectHotbarSlot = true; public $selectHotbarSlot = true;
protected function decodePayload(){ protected function decodePayload(){
$this->selectedHotbarSlot = $this->getUnsignedVarInt(); $this->selectedHotbarSlot = $this->getUnsignedVarInt();
$this->windowId = $this->getByte(); $this->windowId = $this->getByte();
$count = $this->getUnsignedVarInt();
for($i = 0; $i < $count; ++$i){
$this->slots[$i] = Binary::signInt($this->getUnsignedVarInt());
}
$this->selectHotbarSlot = $this->getBool(); $this->selectHotbarSlot = $this->getBool();
} }
protected function encodePayload(){ protected function encodePayload(){
$this->putUnsignedVarInt($this->selectedHotbarSlot); $this->putUnsignedVarInt($this->selectedHotbarSlot);
$this->putByte($this->windowId); $this->putByte($this->windowId);
$this->putUnsignedVarInt(count($this->slots));
foreach($this->slots as $slot){
$this->putUnsignedVarInt($slot);
}
$this->putBool($this->selectHotbarSlot); $this->putBool($this->selectHotbarSlot);
} }

View File

@ -56,14 +56,28 @@ class PlayerListPacket extends DataPacket{
$entry->uuid = $this->getUUID(); $entry->uuid = $this->getUUID();
$entry->entityUniqueId = $this->getEntityUniqueId(); $entry->entityUniqueId = $this->getEntityUniqueId();
$entry->username = $this->getString(); $entry->username = $this->getString();
$entry->thirdPartyName = $this->getString();
$entry->platform = $this->getVarInt();
$skinId = $this->getString();
$this->getLInt(); //always 1
$skinData = $this->getString();
$capeData = "";
if($this->getLInt() !== 0){
$capeData = $this->getString();
}
$geometryName = $this->getString();
$geometryData = $this->getString();
$entry->skin = new Skin( $entry->skin = new Skin(
$this->getString(), //id $skinId,
$this->getString(), //data $skinData,
$this->getString(), //cape $capeData,
$this->getString(), //geometry name $geometryName,
$this->getString() //geometry data $geometryData
); );
$entry->xboxUserId = $this->getString(); $entry->xboxUserId = $this->getString();
$this->getString(); //unknown
}else{ }else{
$entry->uuid = $this->getUUID(); $entry->uuid = $this->getUUID();
} }
@ -80,12 +94,24 @@ class PlayerListPacket extends DataPacket{
$this->putUUID($entry->uuid); $this->putUUID($entry->uuid);
$this->putEntityUniqueId($entry->entityUniqueId); $this->putEntityUniqueId($entry->entityUniqueId);
$this->putString($entry->username); $this->putString($entry->username);
$this->putString($entry->thirdPartyName);
$this->putVarInt($entry->platform);
$this->putString($entry->skin->getSkinId()); $this->putString($entry->skin->getSkinId());
$this->putLInt(1);
$this->putString($entry->skin->getSkinData()); $this->putString($entry->skin->getSkinData());
$this->putString($entry->skin->getCapeData());
$capeData = $entry->skin->getCapeData();
if($capeData !== ""){
$this->putLInt(1);
$this->putString($capeData);
}else{
$this->putLInt(0);
}
$this->putString($entry->skin->getGeometryName()); $this->putString($entry->skin->getGeometryName());
$this->putString($entry->skin->getGeometryData()); $this->putString($entry->skin->getGeometryData());
$this->putString($entry->xboxUserId); $this->putString($entry->xboxUserId);
$this->putString("");
}else{ }else{
$this->putUUID($entry->uuid); $this->putUUID($entry->uuid);
} }

View File

@ -48,8 +48,15 @@ class PlayerSkinPacket extends DataPacket{
$skinId = $this->getString(); $skinId = $this->getString();
$this->newSkinName = $this->getString(); $this->newSkinName = $this->getString();
$this->oldSkinName = $this->getString(); $this->oldSkinName = $this->getString();
$this->getLInt(); //always 1
$this->getLInt(); //length, unneeded
$skinData = $this->getString(); $skinData = $this->getString();
$this->getLInt(); //0 if there's no cape, 1 if there is
$this->getLInt(); //length, again unneeded.
$capeData = $this->getString(); $capeData = $this->getString();
$geometryModel = $this->getString(); $geometryModel = $this->getString();
$geometryData = $this->getString(); $geometryData = $this->getString();
@ -62,8 +69,17 @@ class PlayerSkinPacket extends DataPacket{
$this->putString($this->skin->getSkinId()); $this->putString($this->skin->getSkinId());
$this->putString($this->newSkinName); $this->putString($this->newSkinName);
$this->putString($this->oldSkinName); $this->putString($this->oldSkinName);
$this->putString($this->skin->getSkinData());
$this->putString($this->skin->getCapeData()); $skinData = $this->skin->getSkinData();
$this->putLInt(1);
$this->putLInt(strlen($skinData));
$this->putString($skinData);
$capeData = $this->skin->getCapeData();
$this->putLInt($capeData !== "" ? 1 : 0);
$this->putLInt(strlen($capeData));
$this->putString($capeData);
$this->putString($this->skin->getGeometryName()); $this->putString($this->skin->getGeometryName());
$this->putString($this->skin->getGeometryData()); $this->putString($this->skin->getGeometryData());
} }

View File

@ -39,15 +39,15 @@ interface ProtocolInfo{
/** /**
* Actual Minecraft: PE protocol version * Actual Minecraft: PE protocol version
*/ */
public const CURRENT_PROTOCOL = 201; public const CURRENT_PROTOCOL = 200;
/** /**
* Current Minecraft PE version reported by the server. This is usually the earliest currently supported version. * Current Minecraft PE version reported by the server. This is usually the earliest currently supported version.
*/ */
public const MINECRAFT_VERSION = 'v1.2.10'; public const MINECRAFT_VERSION = 'v1.2.10.1 beta';
/** /**
* Version number sent to clients in ping responses. * Version number sent to clients in ping responses.
*/ */
public const MINECRAFT_VERSION_NETWORK = '1.2.10'; public const MINECRAFT_VERSION_NETWORK = '1.2.10.1';
public const LOGIN_PACKET = 0x01; public const LOGIN_PACKET = 0x01;
public const PLAY_STATUS_PACKET = 0x02; public const PLAY_STATUS_PACKET = 0x02;

View File

@ -98,6 +98,12 @@ class StartGamePacket extends DataPacket{
public $xboxLiveBroadcastMode = 0; //TODO: find values public $xboxLiveBroadcastMode = 0; //TODO: find values
/** @var int */ /** @var int */
public $serverChunkTickRadius = 4; //TODO (leave as default for now) public $serverChunkTickRadius = 4; //TODO (leave as default for now)
/** @var bool */
public $hasPlatformBroadcast = false;
/** @var int */
public $platformBroadcastMode = 0;
/** @var bool */
public $xboxLiveBroadcastIntent = false;
/** @var string */ /** @var string */
public $levelId = ""; //base64 string, usually the same as world folder name in vanilla public $levelId = ""; //base64 string, usually the same as world folder name in vanilla
@ -146,6 +152,9 @@ class StartGamePacket extends DataPacket{
$this->defaultPlayerPermission = $this->getVarInt(); $this->defaultPlayerPermission = $this->getVarInt();
$this->xboxLiveBroadcastMode = $this->getVarInt(); $this->xboxLiveBroadcastMode = $this->getVarInt();
$this->serverChunkTickRadius = $this->getLInt(); $this->serverChunkTickRadius = $this->getLInt();
$this->hasPlatformBroadcast = $this->getBool();
$this->platformBroadcastMode = $this->getUnsignedVarInt();
$this->xboxLiveBroadcastIntent = $this->getBool();
$this->levelId = $this->getString(); $this->levelId = $this->getString();
$this->worldName = $this->getString(); $this->worldName = $this->getString();
@ -190,6 +199,9 @@ class StartGamePacket extends DataPacket{
$this->putVarInt($this->defaultPlayerPermission); $this->putVarInt($this->defaultPlayerPermission);
$this->putVarInt($this->xboxLiveBroadcastMode); $this->putVarInt($this->xboxLiveBroadcastMode);
$this->putLInt($this->serverChunkTickRadius); $this->putLInt($this->serverChunkTickRadius);
$this->putBool($this->hasPlatformBroadcast);
$this->putUnsignedVarInt($this->platformBroadcastMode);
$this->putBool($this->xboxLiveBroadcastIntent);
$this->putString($this->levelId); $this->putString($this->levelId);
$this->putString($this->worldName); $this->putString($this->worldName);

View File

@ -46,13 +46,19 @@ class TextPacket extends DataPacket{
/** @var bool */ /** @var bool */
public $needsTranslation = false; public $needsTranslation = false;
/** @var string */ /** @var string */
public $source; public $sourceName;
/** @var string */
public $sourceThirdPartyName = "";
/** @var int */
public $sourcePlatform = 0;
/** @var string */ /** @var string */
public $message; public $message;
/** @var string[] */ /** @var string[] */
public $parameters = []; public $parameters = [];
/** @var string */ /** @var string */
public $xboxUserId = ""; public $xboxUserId = "";
/** @var string */
public $string1 = "";
protected function decodePayload(){ protected function decodePayload(){
$this->type = $this->getByte(); $this->type = $this->getByte();
@ -62,7 +68,9 @@ class TextPacket extends DataPacket{
case self::TYPE_WHISPER: case self::TYPE_WHISPER:
/** @noinspection PhpMissingBreakStatementInspection */ /** @noinspection PhpMissingBreakStatementInspection */
case self::TYPE_ANNOUNCEMENT: case self::TYPE_ANNOUNCEMENT:
$this->source = $this->getString(); $this->sourceName = $this->getString();
$this->sourceThirdPartyName = $this->getString();
$this->sourcePlatform = $this->getVarInt();
case self::TYPE_RAW: case self::TYPE_RAW:
case self::TYPE_TIP: case self::TYPE_TIP:
case self::TYPE_SYSTEM: case self::TYPE_SYSTEM:
@ -81,6 +89,7 @@ class TextPacket extends DataPacket{
} }
$this->xboxUserId = $this->getString(); $this->xboxUserId = $this->getString();
$this->string1 = $this->getString();
} }
protected function encodePayload(){ protected function encodePayload(){
@ -91,7 +100,9 @@ class TextPacket extends DataPacket{
case self::TYPE_WHISPER: case self::TYPE_WHISPER:
/** @noinspection PhpMissingBreakStatementInspection */ /** @noinspection PhpMissingBreakStatementInspection */
case self::TYPE_ANNOUNCEMENT: case self::TYPE_ANNOUNCEMENT:
$this->putString($this->source); $this->putString($this->sourceName);
$this->putString($this->sourceThirdPartyName);
$this->putVarInt($this->sourcePlatform);
case self::TYPE_RAW: case self::TYPE_RAW:
case self::TYPE_TIP: case self::TYPE_TIP:
case self::TYPE_SYSTEM: case self::TYPE_SYSTEM:
@ -110,6 +121,7 @@ class TextPacket extends DataPacket{
} }
$this->putString($this->xboxUserId); $this->putString($this->xboxUserId);
$this->putString($this->string1);
} }
public function handle(NetworkSession $session) : bool{ public function handle(NetworkSession $session) : bool{

View File

@ -34,6 +34,12 @@ class PlayerListEntry{
public $entityUniqueId; public $entityUniqueId;
/** @var string */ /** @var string */
public $username; public $username;
/** @var string */
public $thirdPartyName = "";
/** @var int */
public $platform = 0;
/** @var string */
public $string1 = "";
/** @var Skin */ /** @var Skin */
public $skin; public $skin;
/** @var string */ /** @var string */
@ -46,11 +52,13 @@ class PlayerListEntry{
return $entry; return $entry;
} }
public static function createAdditionEntry(UUID $uuid, int $entityUniqueId, string $username, Skin $skin, string $xboxUserId = "") : PlayerListEntry{ public static function createAdditionEntry(UUID $uuid, int $entityUniqueId, string $username, string $thirdPartyName, int $platform, Skin $skin, string $xboxUserId = "") : PlayerListEntry{
$entry = new PlayerListEntry(); $entry = new PlayerListEntry();
$entry->uuid = $uuid; $entry->uuid = $uuid;
$entry->entityUniqueId = $entityUniqueId; $entry->entityUniqueId = $entityUniqueId;
$entry->username = $username; $entry->username = $username;
$entry->thirdPartyName = $thirdPartyName;
$entry->platform = $platform;
$entry->skin = $skin; $entry->skin = $skin;
$entry->xboxUserId = $xboxUserId; $entry->xboxUserId = $xboxUserId;