From 503782d67c468f2ee278f0eebfe3a32b0bc00827 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 17 Jun 2020 21:24:12 +0100 Subject: [PATCH] moved skin-parsing code from LoginPacketHandler to its own dedicated helper class --- .../mcpe/handler/LoginPacketHandler.php | 46 +--------- .../login/ClientDataToSkinDataHelper.php | 86 +++++++++++++++++++ 2 files changed, 88 insertions(+), 44 deletions(-) create mode 100644 src/network/mcpe/protocol/types/login/ClientDataToSkinDataHelper.php diff --git a/src/network/mcpe/handler/LoginPacketHandler.php b/src/network/mcpe/handler/LoginPacketHandler.php index 496871ebc..7203f4bd0 100644 --- a/src/network/mcpe/handler/LoginPacketHandler.php +++ b/src/network/mcpe/handler/LoginPacketHandler.php @@ -38,6 +38,7 @@ use pocketmine\network\mcpe\protocol\types\login\AuthenticationData; use pocketmine\network\mcpe\protocol\types\login\ClientData; use pocketmine\network\mcpe\protocol\types\login\ClientDataPersonaPieceTintColor; use pocketmine\network\mcpe\protocol\types\login\ClientDataPersonaSkinPiece; +use pocketmine\network\mcpe\protocol\types\login\ClientDataToSkinDataHelper; use pocketmine\network\mcpe\protocol\types\login\JwtChain; use pocketmine\network\mcpe\protocol\types\PersonaPieceTintColor; use pocketmine\network\mcpe\protocol\types\PersonaSkinPiece; @@ -109,51 +110,8 @@ class LoginPacketHandler extends PacketHandler{ } $clientData = $this->parseClientData($packet->clientDataJwt); - $safeB64Decode = static function(string $base64, string $context) : string{ - $result = base64_decode($base64, true); - if($result === false){ - throw new \InvalidArgumentException("$context: Malformed base64, cannot be decoded"); - } - return $result; - }; try{ - /** @var SkinAnimation[] $animations */ - $animations = []; - foreach($clientData->AnimatedImageData as $k => $animation){ - $animations[] = new SkinAnimation( - new SkinImage( - $animation->ImageHeight, - $animation->ImageWidth, - $safeB64Decode($animation->Image, "AnimatedImageData.$k.Image") - ), - $animation->Type, - $animation->Frames - ); - } - $skinData = new SkinData( - $clientData->SkinId, - $safeB64Decode($clientData->SkinResourcePatch, "SkinResourcePatch"), - new SkinImage($clientData->SkinImageHeight, $clientData->SkinImageWidth, $safeB64Decode($clientData->SkinData, "SkinData")), - $animations, - new SkinImage($clientData->CapeImageHeight, $clientData->CapeImageWidth, $safeB64Decode($clientData->CapeData, "CapeData")), - $safeB64Decode($clientData->SkinGeometryData, "SkinGeometryData"), - $safeB64Decode($clientData->SkinAnimationData, "SkinAnimationData"), - $clientData->PremiumSkin, - $clientData->PersonaSkin, - $clientData->CapeOnClassicSkin, - $clientData->CapeId, - null, - $clientData->ArmSize, - $clientData->SkinColor, - array_map(function(ClientDataPersonaSkinPiece $piece) : PersonaSkinPiece{ - return new PersonaSkinPiece($piece->PieceId, $piece->PieceType, $piece->PackId, $piece->IsDefault, $piece->ProductId); - }, $clientData->PersonaPieces), - array_map(function(ClientDataPersonaPieceTintColor $tint) : PersonaPieceTintColor{ - return new PersonaPieceTintColor($tint->PieceType, $tint->Colors); - }, $clientData->PieceTintColors) - ); - - $skin = SkinAdapterSingleton::get()->fromSkinData($skinData); + $skin = SkinAdapterSingleton::get()->fromSkinData(ClientDataToSkinDataHelper::getInstance()->fromClientData($clientData)); }catch(\InvalidArgumentException $e){ $this->session->getLogger()->debug("Invalid skin: " . $e->getMessage()); $this->session->disconnect("disconnectionScreen.invalidSkin"); diff --git a/src/network/mcpe/protocol/types/login/ClientDataToSkinDataHelper.php b/src/network/mcpe/protocol/types/login/ClientDataToSkinDataHelper.php new file mode 100644 index 000000000..e334c0e5d --- /dev/null +++ b/src/network/mcpe/protocol/types/login/ClientDataToSkinDataHelper.php @@ -0,0 +1,86 @@ +AnimatedImageData as $k => $animation){ + $animations[] = new SkinAnimation( + new SkinImage( + $animation->ImageHeight, + $animation->ImageWidth, + $safeB64Decode($animation->Image, "AnimatedImageData.$k.Image") + ), + $animation->Type, + $animation->Frames + ); + } + return new SkinData( + $clientData->SkinId, + $safeB64Decode($clientData->SkinResourcePatch, "SkinResourcePatch"), + new SkinImage($clientData->SkinImageHeight, $clientData->SkinImageWidth, $safeB64Decode($clientData->SkinData, "SkinData")), + $animations, + new SkinImage($clientData->CapeImageHeight, $clientData->CapeImageWidth, $safeB64Decode($clientData->CapeData, "CapeData")), + $safeB64Decode($clientData->SkinGeometryData, "SkinGeometryData"), + $safeB64Decode($clientData->SkinAnimationData, "SkinAnimationData"), + $clientData->PremiumSkin, + $clientData->PersonaSkin, + $clientData->CapeOnClassicSkin, + $clientData->CapeId, + null, + $clientData->ArmSize, + $clientData->SkinColor, + array_map(function(ClientDataPersonaSkinPiece $piece) : PersonaSkinPiece{ + return new PersonaSkinPiece($piece->PieceId, $piece->PieceType, $piece->PackId, $piece->IsDefault, $piece->ProductId); + }, $clientData->PersonaPieces), + array_map(function(ClientDataPersonaPieceTintColor $tint) : PersonaPieceTintColor{ + return new PersonaPieceTintColor($tint->PieceType, $tint->Colors); + }, $clientData->PieceTintColors) + ); + } +} \ No newline at end of file