New skin API, add support for custom capes & custom geometry (#1416)

* Added support for changing skins ingame, custom capes & geometry
* Use PlayerSkinPacket for setting Human skin instead of PlayerList hack
This commit is contained in:
Dylan K. Taylor
2017-09-29 14:09:00 +01:00
committed by GitHub
parent c273a46537
commit e6cecabf3f
13 changed files with 302 additions and 120 deletions

View File

@ -228,7 +228,7 @@ class PlayerNetworkSessionAdapter extends NetworkSession{
}
public function handlePlayerSkin(PlayerSkinPacket $packet) : bool{
return false; //TODO
return $this->player->changeSkin($packet->skin, $packet->newSkinName, $packet->oldSkinName);
}
public function handleModalFormResponse(ModalFormResponsePacket $packet) : bool{

View File

@ -48,11 +48,6 @@ class LoginPacket extends DataPacket{
/** @var string */
public $serverAddress;
/** @var string */
public $skinId;
/** @var string */
public $skin = "";
/** @var array (the "chain" index contains one or more JWTs) */
public $chainData = [];
/** @var string */
@ -102,11 +97,6 @@ class LoginPacket extends DataPacket{
$this->clientId = $this->clientData["ClientRandomId"] ?? null;
$this->serverAddress = $this->clientData["ServerAddress"] ?? null;
$this->skinId = $this->clientData["SkinId"] ?? null;
if(isset($this->clientData["SkinData"])){
$this->skin = base64_decode($this->clientData["SkinData"]);
}
}
protected function encodePayload(){

View File

@ -26,6 +26,7 @@ namespace pocketmine\network\mcpe\protocol;
#include <rules/DataPacket.h>
use pocketmine\entity\Skin;
use pocketmine\network\mcpe\NetworkSession;
use pocketmine\network\mcpe\protocol\types\PlayerListEntry;
@ -55,11 +56,13 @@ class PlayerListPacket extends DataPacket{
$entry->uuid = $this->getUUID();
$entry->entityUniqueId = $this->getEntityUniqueId();
$entry->username = $this->getString();
$entry->skinId = $this->getString();
$entry->skinData = $this->getString();
$entry->capeData = $this->getString();
$entry->geometryModel = $this->getString();
$entry->geometryData = $this->getString();
$entry->skin = new Skin(
$this->getString(), //id
$this->getString(), //data
$this->getString(), //cape
$this->getString(), //geometry name
$this->getString() //geometry data
);
$entry->xboxUserId = $this->getString();
}else{
$entry->uuid = $this->getUUID();
@ -77,11 +80,11 @@ class PlayerListPacket extends DataPacket{
$this->putUUID($entry->uuid);
$this->putEntityUniqueId($entry->entityUniqueId);
$this->putString($entry->username);
$this->putString($entry->skinId);
$this->putString($entry->skinData);
$this->putString($entry->capeData);
$this->putString($entry->geometryModel);
$this->putString($entry->geometryData);
$this->putString($entry->skin->getSkinId());
$this->putString($entry->skin->getSkinData());
$this->putString($entry->skin->getCapeData());
$this->putString($entry->skin->getGeometryName());
$this->putString($entry->skin->getGeometryData());
$this->putString($entry->xboxUserId);
}else{
$this->putUUID($entry->uuid);

View File

@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe\protocol;
#include <rules/DataPacket.h>
use pocketmine\entity\Skin;
use pocketmine\network\mcpe\NetworkSession;
use pocketmine\utils\UUID;
@ -34,41 +35,37 @@ class PlayerSkinPacket extends DataPacket{
/** @var UUID */
public $uuid;
/** @var string */
public $skinId;
public $oldSkinName = "";
/** @var string */
public $newSkinName;
/** @var string */
public $oldSkinName;
/** @var string */
public $skinData;
/** @var string */
public $capeData;
/** @var string */
public $geometryModel;
/** @var string */
public $geometryData;
public $newSkinName = "";
/** @var Skin */
public $skin;
protected function decodePayload(){
$this->uuid = $this->getUUID();
$this->skinId = $this->getString();
$skinId = $this->getString();
$this->newSkinName = $this->getString();
$this->oldSkinName = $this->getString();
$this->skinData = $this->getString();
$this->capeData = $this->getString();
$this->geometryModel = $this->getString();
$this->geometryData = $this->getString();
$skinData = $this->getString();
$capeData = $this->getString();
$geometryModel = $this->getString();
$geometryData = $this->getString();
$this->skin = new Skin($skinId, $skinData, $capeData, $geometryModel, $geometryData);
}
protected function encodePayload(){
$this->putUUID($this->uuid);
$this->putString($this->skinId);
$this->putString($this->skin->getSkinId());
$this->putString($this->newSkinName);
$this->putString($this->oldSkinName);
$this->putString($this->skinData);
$this->putString($this->capeData);
$this->putString($this->geometryModel);
$this->putString($this->geometryData);
$this->putString($this->skin->getSkinData());
$this->putString($this->skin->getCapeData());
$this->putString($this->skin->getGeometryName());
$this->putString($this->skin->getGeometryData());
}
public function handle(NetworkSession $session) : bool{

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\network\mcpe\protocol\types;
use pocketmine\entity\Skin;
use pocketmine\utils\UUID;
class PlayerListEntry{
@ -33,16 +34,8 @@ class PlayerListEntry{
public $entityUniqueId;
/** @var string */
public $username;
/** @var string */
public $skinId;
/** @var string */
public $skinData;
/** @var string */
public $capeData; //TODO
/** @var string */
public $geometryModel; //TODO
/** @var string */
public $geometryData; //TODO
/** @var Skin */
public $skin;
/** @var string */
public $xboxUserId; //TODO
@ -53,26 +46,12 @@ class PlayerListEntry{
return $entry;
}
public static function createAdditionEntry(
UUID $uuid,
int $entityUniqueId,
string $username,
string $skinId,
string $skinData,
string $capeData = "",
string $geometryModel = "",
string $geometryData = "",
string $xboxUserId = ""
) : PlayerListEntry{
public static function createAdditionEntry(UUID $uuid, int $entityUniqueId, string $username, Skin $skin, string $xboxUserId = "") : PlayerListEntry{
$entry = new PlayerListEntry();
$entry->uuid = $uuid;
$entry->entityUniqueId = $entityUniqueId;
$entry->username = $username;
$entry->skinId = $skinId;
$entry->skinData = $skinData;
$entry->capeData = $capeData;
$entry->geometryModel = $geometryModel;
$entry->geometryData = $geometryData;
$entry->skin = $skin;
$entry->xboxUserId = $xboxUserId;
return $entry;