mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-08 19:02:59 +00:00
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:
@ -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{
|
||||
|
@ -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(){
|
||||
|
@ -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);
|
||||
|
@ -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{
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user