mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-06 01:46:04 +00:00
Added PlayerInfo, Player is no longer accessible during PlayerPreLoginEvent
This commit is contained in:
@ -29,8 +29,10 @@ namespace pocketmine\network\mcpe\protocol;
|
||||
use Particle\Validator\Validator;
|
||||
use pocketmine\entity\Skin;
|
||||
use pocketmine\network\mcpe\handler\SessionHandler;
|
||||
use pocketmine\PlayerInfo;
|
||||
use pocketmine\utils\BinaryStream;
|
||||
use pocketmine\utils\Utils;
|
||||
use pocketmine\utils\UUID;
|
||||
use function array_filter;
|
||||
use function base64_decode;
|
||||
use function count;
|
||||
@ -44,6 +46,10 @@ class LoginPacket extends DataPacket{
|
||||
|
||||
public const EDITION_POCKET = 0;
|
||||
|
||||
public const I_USERNAME = 'displayName';
|
||||
public const I_UUID = 'identity';
|
||||
public const I_XUID = 'XUID';
|
||||
|
||||
public const I_CLIENT_RANDOM_ID = 'ClientRandomId';
|
||||
public const I_SERVER_ADDRESS = 'ServerAddress';
|
||||
public const I_LANGUAGE_CODE = 'LanguageCode';
|
||||
@ -54,27 +60,16 @@ class LoginPacket extends DataPacket{
|
||||
public const I_GEOMETRY_NAME = 'SkinGeometryName';
|
||||
public const I_GEOMETRY_DATA = 'SkinGeometry';
|
||||
|
||||
/** @var string */
|
||||
public $username;
|
||||
/** @var int */
|
||||
public $protocol;
|
||||
/** @var string */
|
||||
public $clientUUID;
|
||||
/** @var int */
|
||||
public $clientId;
|
||||
/** @var string */
|
||||
public $xuid;
|
||||
/** @var string */
|
||||
public $identityPublicKey;
|
||||
/** @var string */
|
||||
public $serverAddress;
|
||||
/** @var string */
|
||||
public $locale;
|
||||
/** @var Skin|null */
|
||||
public $skin;
|
||||
|
||||
/** @var PlayerInfo */
|
||||
public $playerInfo;
|
||||
|
||||
/** @var string[] array of encoded JWT */
|
||||
public $chainDataJwt = [];
|
||||
/** @var array|null extraData index of whichever JWT has it */
|
||||
public $extraData = null;
|
||||
/** @var string */
|
||||
public $clientDataJwt;
|
||||
/** @var array decoded payload of the clientData JWT */
|
||||
@ -138,8 +133,6 @@ class LoginPacket extends DataPacket{
|
||||
self::validate($vd, "chainData", $chainData);
|
||||
|
||||
$this->chainDataJwt = $chainData['chain'];
|
||||
|
||||
$hasExtraData = false;
|
||||
foreach($this->chainDataJwt as $k => $chain){
|
||||
//validate every chain element
|
||||
$claims = Utils::getJwtClaims($chain);
|
||||
@ -147,23 +140,20 @@ class LoginPacket extends DataPacket{
|
||||
if(!is_array($claims["extraData"])){
|
||||
throw new \UnexpectedValueException("'extraData' key should be an array");
|
||||
}
|
||||
if($hasExtraData){
|
||||
if($this->extraData !== null){
|
||||
throw new \UnexpectedValueException("Found 'extraData' more than once in chainData");
|
||||
}
|
||||
$hasExtraData = true;
|
||||
|
||||
$extraV = new Validator();
|
||||
$extraV->required('displayName')->string();
|
||||
$extraV->required('identity')->uuid();
|
||||
$extraV->required('XUID')->string()->digits()->allowEmpty(true);
|
||||
$extraV->required(self::I_USERNAME)->string();
|
||||
$extraV->required(self::I_UUID)->uuid();
|
||||
$extraV->required(self::I_XUID)->string()->digits()->allowEmpty(true);
|
||||
self::validate($extraV, "chain.$k.extraData", $claims['extraData']);
|
||||
|
||||
$this->username = $claims["extraData"]["displayName"];
|
||||
$this->clientUUID = $claims["extraData"]["identity"];
|
||||
$this->xuid = $claims["extraData"]["XUID"];
|
||||
$this->extraData = $claims['extraData'];
|
||||
}
|
||||
}
|
||||
if(!$hasExtraData){
|
||||
if($this->extraData === null){
|
||||
throw new \UnexpectedValueException("'extraData' not found in chain data");
|
||||
}
|
||||
|
||||
@ -184,16 +174,19 @@ class LoginPacket extends DataPacket{
|
||||
|
||||
$this->clientData = $clientData;
|
||||
|
||||
$this->clientId = $this->clientData[self::I_CLIENT_RANDOM_ID];
|
||||
$this->serverAddress = $this->clientData[self::I_SERVER_ADDRESS];
|
||||
$this->locale = $this->clientData[self::I_LANGUAGE_CODE];
|
||||
|
||||
$this->skin = new Skin(
|
||||
$this->clientData[self::I_SKIN_ID],
|
||||
base64_decode($this->clientData[self::I_SKIN_DATA]),
|
||||
base64_decode($this->clientData[self::I_CAPE_DATA]),
|
||||
$this->clientData[self::I_GEOMETRY_NAME],
|
||||
base64_decode($this->clientData[self::I_GEOMETRY_DATA])
|
||||
$this->playerInfo = new PlayerInfo(
|
||||
$this->extraData[self::I_USERNAME],
|
||||
UUID::fromString($this->extraData[self::I_UUID]),
|
||||
new Skin(
|
||||
$this->clientData[self::I_SKIN_ID],
|
||||
base64_decode($this->clientData[self::I_SKIN_DATA]),
|
||||
base64_decode($this->clientData[self::I_CAPE_DATA]),
|
||||
$this->clientData[self::I_GEOMETRY_NAME],
|
||||
base64_decode($this->clientData[self::I_GEOMETRY_DATA])
|
||||
),
|
||||
$this->clientData[self::I_LANGUAGE_CODE],
|
||||
$this->extraData[self::I_XUID],
|
||||
$this->clientData[self::I_CLIENT_RANDOM_ID]
|
||||
);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user