mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-22 16:51:42 +00:00
Bump version to 0.15.0.0 and protocol changes
This commit is contained in:
parent
80d6f8dfb3
commit
ef8227a074
@ -101,7 +101,7 @@ use pocketmine\nbt\tag\StringTag;
|
||||
use pocketmine\network\protocol\AdventureSettingsPacket;
|
||||
use pocketmine\network\protocol\AnimatePacket;
|
||||
use pocketmine\network\protocol\BatchPacket;
|
||||
use pocketmine\network\protocol\ChunkRadiusUpdatePacket;
|
||||
use pocketmine\network\protocol\ChunkRadiusUpdatedPacket;
|
||||
use pocketmine\network\protocol\ContainerClosePacket;
|
||||
use pocketmine\network\protocol\ContainerSetContentPacket;
|
||||
use pocketmine\network\protocol\DataPacket;
|
||||
@ -133,6 +133,7 @@ use pocketmine\tile\Sign;
|
||||
use pocketmine\tile\Spawnable;
|
||||
use pocketmine\tile\Tile;
|
||||
use pocketmine\utils\TextFormat;
|
||||
use pocketmine\utils\UUID;
|
||||
use raklib\Binary;
|
||||
|
||||
|
||||
@ -1568,6 +1569,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
||||
}
|
||||
|
||||
public function tryAuthenticate(){
|
||||
$pk = new PlayStatusPacket();
|
||||
$pk->status = PlayStatusPacket::LOGIN_SUCCESS;
|
||||
$this->dataPacket($pk);
|
||||
//TODO: implement authentication after it is available
|
||||
$this->authenticateCallback(true);
|
||||
}
|
||||
@ -1614,7 +1618,8 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->setNameTag($this->username);
|
||||
|
||||
$nbt = $this->server->getOfflinePlayerData($this->username);
|
||||
$this->playedBefore = ($nbt["lastPlayed"] - $nbt["firstPlayed"]) > 1; // microtime(true) - microtime(true) may have less than one millisecond difference
|
||||
if(!isset($nbt->NameTag)){
|
||||
@ -1787,15 +1792,14 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
||||
|
||||
$this->username = TextFormat::clean($packet->username);
|
||||
$this->displayName = $this->username;
|
||||
$this->setNameTag($this->username);
|
||||
$this->iusername = strtolower($this->username);
|
||||
|
||||
if(count($this->server->getOnlinePlayers()) >= $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)){
|
||||
break;
|
||||
}
|
||||
|
||||
if($packet->protocol1 !== ProtocolInfo::CURRENT_PROTOCOL){
|
||||
if($packet->protocol1 < ProtocolInfo::CURRENT_PROTOCOL){
|
||||
if($packet->protocol !== ProtocolInfo::CURRENT_PROTOCOL){
|
||||
if($packet->protocol < ProtocolInfo::CURRENT_PROTOCOL){
|
||||
$message = "disconnectionScreen.outdatedClient";
|
||||
|
||||
$pk = new PlayStatusPacket();
|
||||
@ -1815,9 +1819,8 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
||||
|
||||
$this->randomClientId = $packet->clientId;
|
||||
|
||||
$this->uuid = $packet->clientUUID;
|
||||
$this->uuid = UUID::fromString($packet->clientUUID);
|
||||
$this->rawUUID = $this->uuid->toBinary();
|
||||
$this->clientSecret = $packet->clientSecret;
|
||||
|
||||
$valid = true;
|
||||
$len = strlen($packet->username);
|
||||
@ -1848,7 +1851,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
||||
break;
|
||||
}
|
||||
|
||||
$this->setSkin($packet->skin, $packet->skinName);
|
||||
$this->setSkin($packet->skin, $packet->skinID);
|
||||
|
||||
$this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason"));
|
||||
if($ev->isCancelled()){
|
||||
@ -2848,7 +2851,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
|
||||
if($this->spawned){
|
||||
$this->viewDistance = $packet->radius ** 2;
|
||||
}
|
||||
$pk = new ChunkRadiusUpdatePacket();
|
||||
$pk = new ChunkRadiusUpdatedPacket();
|
||||
$pk->radius = $packet->radius;
|
||||
$this->dataPacket($pk);
|
||||
break;
|
||||
|
@ -75,8 +75,8 @@ namespace pocketmine {
|
||||
const VERSION = "1.6dev";
|
||||
const API_VERSION = "2.0.0";
|
||||
const CODENAME = "[REDACTED]";
|
||||
const MINECRAFT_VERSION = "v0.14.3.0 alpha";
|
||||
const MINECRAFT_VERSION_NETWORK = "0.14.3.0";
|
||||
const MINECRAFT_VERSION = "v0.15.0.0 alpha";
|
||||
const MINECRAFT_VERSION_NETWORK = "0.15.0.0";
|
||||
|
||||
/*
|
||||
* Startup code. Do not look at it, it may harm you.
|
||||
|
@ -36,7 +36,7 @@ use pocketmine\nbt\tag\ListTag;
|
||||
use pocketmine\nbt\tag\ShortTag;
|
||||
use pocketmine\nbt\tag\StringTag;
|
||||
use pocketmine\network\protocol\AddPlayerPacket;
|
||||
use pocketmine\network\protocol\RemovePlayerPacket;
|
||||
use pocketmine\network\protocol\RemoveEntityPacket;
|
||||
use pocketmine\Player;
|
||||
use pocketmine\utils\UUID;
|
||||
|
||||
@ -487,9 +487,9 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
||||
public function despawnFrom(Player $player){
|
||||
if(isset($this->hasSpawned[$player->getLoaderId()])){
|
||||
|
||||
$pk = new RemovePlayerPacket();
|
||||
$pk = new RemoveEntityPacket();
|
||||
$pk->eid = $this->getId();
|
||||
$pk->clientId = $this->getUniqueId();
|
||||
|
||||
$player->dataPacket($pk);
|
||||
unset($this->hasSpawned[$player->getLoaderId()]);
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ use pocketmine\network\protocol\AddPlayerPacket;
|
||||
use pocketmine\network\protocol\AdventureSettingsPacket;
|
||||
use pocketmine\network\protocol\AnimatePacket;
|
||||
use pocketmine\network\protocol\BatchPacket;
|
||||
use pocketmine\network\protocol\ChunkRadiusUpdatePacket;
|
||||
use pocketmine\network\protocol\ChunkRadiusUpdatedPacket;
|
||||
use pocketmine\network\protocol\ContainerClosePacket;
|
||||
use pocketmine\network\protocol\ContainerOpenPacket;
|
||||
use pocketmine\network\protocol\ContainerSetContentPacket;
|
||||
@ -220,12 +220,12 @@ class Network{
|
||||
$buf = substr($str, $offset, $pkLen);
|
||||
$offset += $pkLen;
|
||||
|
||||
if(($pk = $this->getPacket(ord($buf{1}))) !== null){ // #blameshoghi
|
||||
if(($pk = $this->getPacket(ord($buf{0}))) !== null){ // #blameshoghi
|
||||
if($pk::NETWORK_ID === Info::BATCH_PACKET){
|
||||
throw new \InvalidStateException("Invalid BatchPacket inside BatchPacket");
|
||||
}
|
||||
|
||||
$pk->setBuffer($buf, 2); // #blameshoghi
|
||||
$pk->setBuffer($buf, 1);
|
||||
|
||||
$pk->decode();
|
||||
$p->handleDataPacket($pk);
|
||||
@ -293,7 +293,6 @@ class Network{
|
||||
$this->registerPacket(ProtocolInfo::SET_TIME_PACKET, SetTimePacket::class);
|
||||
$this->registerPacket(ProtocolInfo::START_GAME_PACKET, StartGamePacket::class);
|
||||
$this->registerPacket(ProtocolInfo::ADD_PLAYER_PACKET, AddPlayerPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::REMOVE_PLAYER_PACKET, RemovePlayerPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::ADD_ENTITY_PACKET, AddEntityPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::REMOVE_ENTITY_PACKET, RemoveEntityPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::ADD_ITEM_ENTITY_PACKET, AddItemEntityPacket::class);
|
||||
@ -335,6 +334,6 @@ class Network{
|
||||
$this->registerPacket(ProtocolInfo::SET_PLAYER_GAMETYPE_PACKET, SetPlayerGameTypePacket::class);
|
||||
$this->registerPacket(ProtocolInfo::PLAYER_LIST_PACKET, PlayerListPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::REQUEST_CHUNK_RADIUS_PACKET, RequestChunkRadiusPacket::class);
|
||||
$this->registerPacket(ProtocolInfo::CHUNK_RADIUS_UPDATE_PACKET, ChunkRadiusUpdatePacket::class);
|
||||
$this->registerPacket(ProtocolInfo::CHUNK_RADIUS_UPDATED_PACKET, ChunkRadiusUpdatedPacket::class);
|
||||
}
|
||||
}
|
||||
|
@ -199,7 +199,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
|
||||
if(!isset($packet->__encapsulatedPacket)){
|
||||
$packet->__encapsulatedPacket = new CachedEncapsulatedPacket;
|
||||
$packet->__encapsulatedPacket->identifierACK = null;
|
||||
$packet->__encapsulatedPacket->buffer = chr(0x8e) . $packet->buffer; // #blameshoghi
|
||||
$packet->__encapsulatedPacket->buffer = chr(0xfe) . $packet->buffer; // #blameshoghi
|
||||
$packet->__encapsulatedPacket->reliability = 3;
|
||||
$packet->__encapsulatedPacket->orderChannel = 0;
|
||||
}
|
||||
@ -215,7 +215,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
|
||||
|
||||
if($pk === null){
|
||||
$pk = new EncapsulatedPacket();
|
||||
$pk->buffer = chr(0x8e) . $packet->buffer; // #blameshoghi
|
||||
$pk->buffer = chr(0xfe) . $packet->buffer; // #blameshoghi
|
||||
$packet->reliability = 3;
|
||||
$packet->orderChannel = 0;
|
||||
|
||||
@ -233,12 +233,16 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
|
||||
}
|
||||
|
||||
private function getPacket($buffer){
|
||||
$pid = ord($buffer{1}); // #blameshoghi
|
||||
|
||||
$pid = ord($buffer{0});
|
||||
$start = 1;
|
||||
if($pid == 0xfe){
|
||||
$pid = ord($buffer{1});
|
||||
$start++;
|
||||
}
|
||||
if(($data = $this->network->getPacket($pid)) === null){
|
||||
return null;
|
||||
}
|
||||
$data->setBuffer($buffer, 2); // #blameshoghi
|
||||
$data->setBuffer($buffer, $start);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
@ -24,8 +24,8 @@ namespace pocketmine\network\protocol;
|
||||
#include <rules/DataPacket.h>
|
||||
|
||||
|
||||
class ChunkRadiusUpdatePacket extends DataPacket{
|
||||
const NETWORK_ID = Info::CHUNK_RADIUS_UPDATE_PACKET;
|
||||
class ChunkRadiusUpdatedPacket extends DataPacket{
|
||||
const NETWORK_ID = Info::CHUNK_RADIUS_UPDATED_PACKET;
|
||||
|
||||
public $radius;
|
||||
|
@ -30,69 +30,72 @@ interface Info{
|
||||
/**
|
||||
* Actual Minecraft: PE protocol version
|
||||
*/
|
||||
const CURRENT_PROTOCOL = 70;
|
||||
const CURRENT_PROTOCOL = 81;
|
||||
|
||||
const LOGIN_PACKET = 0x8f;
|
||||
const PLAY_STATUS_PACKET = 0x90;
|
||||
const DISCONNECT_PACKET = 0x91;
|
||||
const BATCH_PACKET = 0x92;
|
||||
const TEXT_PACKET = 0x93;
|
||||
const SET_TIME_PACKET = 0x94;
|
||||
const START_GAME_PACKET = 0x95;
|
||||
const ADD_PLAYER_PACKET = 0x96;
|
||||
const REMOVE_PLAYER_PACKET = 0x97;
|
||||
const ADD_ENTITY_PACKET = 0x98;
|
||||
const REMOVE_ENTITY_PACKET = 0x99;
|
||||
const ADD_ITEM_ENTITY_PACKET = 0x9a;
|
||||
const TAKE_ITEM_ENTITY_PACKET = 0x9b;
|
||||
const MOVE_ENTITY_PACKET = 0x9c;
|
||||
const MOVE_PLAYER_PACKET = 0x9d;
|
||||
const REMOVE_BLOCK_PACKET = 0x9e;
|
||||
const UPDATE_BLOCK_PACKET = 0x9f;
|
||||
const ADD_PAINTING_PACKET = 0xa0;
|
||||
const EXPLODE_PACKET = 0xa1;
|
||||
const LEVEL_EVENT_PACKET = 0xa2;
|
||||
const BLOCK_EVENT_PACKET = 0xa3;
|
||||
const ENTITY_EVENT_PACKET = 0xa4;
|
||||
const MOB_EFFECT_PACKET = 0xa5;
|
||||
const UPDATE_ATTRIBUTES_PACKET = 0xa6;
|
||||
const MOB_EQUIPMENT_PACKET = 0xa7;
|
||||
const MOB_ARMOR_EQUIPMENT_PACKET = 0xa8;
|
||||
const INTERACT_PACKET = 0xa9;
|
||||
const USE_ITEM_PACKET = 0xaa;
|
||||
const PLAYER_ACTION_PACKET = 0xab;
|
||||
const HURT_ARMOR_PACKET = 0xac;
|
||||
const SET_ENTITY_DATA_PACKET = 0xad;
|
||||
const SET_ENTITY_MOTION_PACKET = 0xae;
|
||||
const SET_ENTITY_LINK_PACKET = 0xaf;
|
||||
const SET_HEALTH_PACKET = 0xb0;
|
||||
const SET_SPAWN_POSITION_PACKET = 0xb1;
|
||||
const ANIMATE_PACKET = 0xb2;
|
||||
const RESPAWN_PACKET = 0xb3;
|
||||
const DROP_ITEM_PACKET = 0xb4;
|
||||
const CONTAINER_OPEN_PACKET = 0xb5;
|
||||
const CONTAINER_CLOSE_PACKET = 0xb6;
|
||||
const CONTAINER_SET_SLOT_PACKET = 0xb7;
|
||||
const CONTAINER_SET_DATA_PACKET = 0xb8;
|
||||
const CONTAINER_SET_CONTENT_PACKET = 0xb9;
|
||||
const CRAFTING_DATA_PACKET = 0xba;
|
||||
const CRAFTING_EVENT_PACKET = 0xbb;
|
||||
const ADVENTURE_SETTINGS_PACKET = 0xbc;
|
||||
const BLOCK_ENTITY_DATA_PACKET = 0xbd;
|
||||
// const PLAYER_INPUT_PACKET = 0xbe;
|
||||
const FULL_CHUNK_DATA_PACKET = 0xbf;
|
||||
const SET_DIFFICULTY_PACKET = 0xc0;
|
||||
// const CHANGE_DIMENSION_PACKET = 0xc1;
|
||||
const SET_PLAYER_GAMETYPE_PACKET = 0xc2;
|
||||
const PLAYER_LIST_PACKET = 0xc3;
|
||||
// const TELEMETRY_EVENT_PACKET = 0xc4;
|
||||
// const SPAWN_EXPERIENCE_ORB_PACKET = 0xc5
|
||||
// const CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0xc6;
|
||||
// const MAP_INFO_REQUEST_PACKET = 0xc7;
|
||||
const REQUEST_CHUNK_RADIUS_PACKET = 0xc8;
|
||||
const CHUNK_RADIUS_UPDATE_PACKET = 0xc9;
|
||||
// const ITEM_FRAME_DROP_ITEM_PACKET = 0xca;
|
||||
// const REPLACE_SELECTED_ITEM_PACKET = 0xcb;
|
||||
const LOGIN_PACKET = 0x01;
|
||||
const PLAY_STATUS_PACKET = 0x02;
|
||||
const SERVER_TO_CLIENT_HANDSHAKE_PACKET = 0x03;
|
||||
const CLIENT_TO_SERVER_HANDSHAKE_PACKET = 0x04;
|
||||
const DISCONNECT_PACKET = 0x05;
|
||||
const BATCH_PACKET = 0x06;
|
||||
const TEXT_PACKET = 0x07;
|
||||
const SET_TIME_PACKET = 0x08;
|
||||
const START_GAME_PACKET = 0x09;
|
||||
const ADD_PLAYER_PACKET = 0x0a;
|
||||
const ADD_ENTITY_PACKET = 0x0b;
|
||||
const REMOVE_ENTITY_PACKET = 0x0c;
|
||||
const ADD_ITEM_ENTITY_PACKET = 0x0d;
|
||||
const TAKE_ITEM_ENTITY_PACKET = 0x0e;
|
||||
const MOVE_ENTITY_PACKET = 0x0f;
|
||||
const MOVE_PLAYER_PACKET = 0x10;
|
||||
const RIDER_JUMP_PACKET = 0x11;
|
||||
const REMOVE_BLOCK_PACKET = 0x12;
|
||||
const UPDATE_BLOCK_PACKET = 0x13;
|
||||
const ADD_PAINTING_PACKET = 0x14;
|
||||
const EXPLODE_PACKET = 0x15;
|
||||
const LEVEL_EVENT_PACKET = 0x16;
|
||||
const BLOCK_EVENT_PACKET = 0x17;
|
||||
const ENTITY_EVENT_PACKET = 0x18;
|
||||
const MOB_EFFECT_PACKET = 0x19;
|
||||
const UPDATE_ATTRIBUTES_PACKET = 0x1a;
|
||||
const MOB_EQUIPMENT_PACKET = 0x1b;
|
||||
const MOB_ARMOR_EQUIPMENT_PACKET = 0x1c;
|
||||
const INTERACT_PACKET = 0x1e;
|
||||
const USE_ITEM_PACKET = 0x1f;
|
||||
const PLAYER_ACTION_PACKET = 0x20;
|
||||
const HURT_ARMOR_PACKET = 0x21;
|
||||
const SET_ENTITY_DATA_PACKET = 0x22;
|
||||
const SET_ENTITY_MOTION_PACKET = 0x23;
|
||||
const SET_ENTITY_LINK_PACKET = 0x24;
|
||||
const SET_HEALTH_PACKET = 0x25;
|
||||
const SET_SPAWN_POSITION_PACKET = 0x26;
|
||||
const ANIMATE_PACKET = 0x27;
|
||||
const RESPAWN_PACKET = 0x28;
|
||||
const DROP_ITEM_PACKET = 0x29;
|
||||
const CONTAINER_OPEN_PACKET = 0x2a;
|
||||
const CONTAINER_CLOSE_PACKET = 0x2b;
|
||||
const CONTAINER_SET_SLOT_PACKET = 0x2c;
|
||||
const CONTAINER_SET_DATA_PACKET = 0x2d;
|
||||
const CONTAINER_SET_CONTENT_PACKET = 0x2e;
|
||||
const CRAFTING_DATA_PACKET = 0x2f;
|
||||
const CRAFTING_EVENT_PACKET = 0x30;
|
||||
const ADVENTURE_SETTINGS_PACKET = 0x31;
|
||||
const BLOCK_ENTITY_DATA_PACKET = 0x32;
|
||||
const PLAYER_INPUT_PACKET = 0x33;
|
||||
const FULL_CHUNK_DATA_PACKET = 0x34;
|
||||
const SET_DIFFICULTY_PACKET = 0x35;
|
||||
const CHANGE_DIMENSION_PACKET = 0x36;
|
||||
const SET_PLAYER_GAMETYPE_PACKET = 0x37;
|
||||
const PLAYER_LIST_PACKET = 0x38;
|
||||
const TELEMETRY_EVENT_PACKET = 0x39;
|
||||
const SPAWN_EXPERIENCE_ORB_PACKET = 0x3a;
|
||||
const CLIENTBOUND_MAP_ITEM_DATA_PACKET = 0x3b;
|
||||
const MAP_INFO_REQUEST_PACKET = 0x3c;
|
||||
const REQUEST_CHUNK_RADIUS_PACKET = 0x3d;
|
||||
const CHUNK_RADIUS_UPDATED_PACKET = 0x3e;
|
||||
const ITEM_FRAME_DROP_ITEM_PACKET = 0x3f;
|
||||
const REPLACE_SELECTED_ITEM_PACKET = 0x40;
|
||||
const ADD_ITEM_PACKET = 0x41;
|
||||
}
|
||||
|
||||
|
||||
|
@ -28,36 +28,61 @@ class LoginPacket extends DataPacket{
|
||||
const NETWORK_ID = Info::LOGIN_PACKET;
|
||||
|
||||
public $username;
|
||||
public $protocol1;
|
||||
public $protocol2;
|
||||
public $clientId;
|
||||
public $protocol;
|
||||
|
||||
public $clientUUID;
|
||||
public $clientId;
|
||||
public $identityPublicKey;
|
||||
public $serverAddress;
|
||||
public $clientSecret;
|
||||
|
||||
public $skinName;
|
||||
public $skinID;
|
||||
public $skin = null;
|
||||
|
||||
public function decode(){
|
||||
$this->username = $this->getString();
|
||||
$this->protocol1 = $this->getInt();
|
||||
$this->protocol2 = $this->getInt();
|
||||
if($this->protocol1 < Info::CURRENT_PROTOCOL){ //New fields!
|
||||
$this->setBuffer(null, 0); //Skip batch packet handling
|
||||
return;
|
||||
}
|
||||
$this->clientId = $this->getLong();
|
||||
$this->clientUUID = $this->getUUID();
|
||||
$this->serverAddress = $this->getString();
|
||||
$this->clientSecret = $this->getString();
|
||||
$this->protocol = $this->getInt();
|
||||
|
||||
$this->skinName = $this->getString();
|
||||
$this->skin = $this->getString();
|
||||
$str = zlib_decode($this->get($this->getInt()), 1024 * 1024 * 64); //Max 64MB
|
||||
$this->setBuffer($str, 0);
|
||||
|
||||
$chainData = json_decode($this->get($this->getLInt()));
|
||||
foreach ($chainData->{"chain"} as $chain){
|
||||
$webtoken = $this->decodeToken($chain);
|
||||
if(isset($webtoken["extraData"])){
|
||||
if(isset($webtoken["extraData"]["displayName"])){
|
||||
$this->username = $webtoken["extraData"]["displayName"];
|
||||
}
|
||||
if(isset($webtoken["extraData"]["identity"])){
|
||||
$this->clientUUID = $webtoken["extraData"]["identity"];
|
||||
}
|
||||
if(isset($webtoken["identityPublicKey"])){
|
||||
$this->identityPublicKey = $webtoken["identityPublicKey"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$skinToken = $this->decodeToken($this->get($this->getLInt()));
|
||||
if(isset($skinToken["ClientRandomId"])){
|
||||
$this->clientId = $skinToken["ClientRandomId"];
|
||||
}
|
||||
if(isset($skinToken["ServerAddress"])){
|
||||
$this->serverAddress = $skinToken["ServerAddress"];
|
||||
}
|
||||
if(isset($skinToken["SkinData"])){
|
||||
$this->skin = base64_decode($skinToken["SkinData"]);
|
||||
}
|
||||
if(isset($skinToken["SkinId"])){
|
||||
$this->skinId = $skinToken["SkinId"];
|
||||
}
|
||||
}
|
||||
|
||||
public function encode(){
|
||||
|
||||
}
|
||||
|
||||
public function decodeToken($token){
|
||||
$tokens = explode(".", $token);
|
||||
list($headB64, $payloadB64, $sigB64) = $tokens;
|
||||
|
||||
return json_decode(base64_decode($payloadB64), true);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user