mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-17 08:54:22 +00:00
Arrange login sequence code in a bit more chronological order
This commit is contained in:
parent
db4a8be240
commit
7508524b7b
@ -1763,6 +1763,96 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
|||||||
$this->addDefaultWindows();
|
$this->addDefaultWindows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function handleLogin(LoginPacket $packet) : bool{
|
||||||
|
if($this->loggedIn){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->protocol = $packet->protocol;
|
||||||
|
|
||||||
|
if($packet->protocol !== ProtocolInfo::CURRENT_PROTOCOL){
|
||||||
|
if($packet->protocol < ProtocolInfo::CURRENT_PROTOCOL){
|
||||||
|
$this->sendPlayStatus(PlayStatusPacket::LOGIN_FAILED_CLIENT, true);
|
||||||
|
}else{
|
||||||
|
$this->sendPlayStatus(PlayStatusPacket::LOGIN_FAILED_SERVER, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client)
|
||||||
|
$this->close("", $this->server->getLanguage()->translateString("pocketmine.disconnect.incompatibleProtocol", [$packet->protocol ?? "unknown"]), false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!self::isValidUserName($packet->username)){
|
||||||
|
$this->close("", "disconnectionScreen.invalidName");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->username = TextFormat::clean($packet->username);
|
||||||
|
$this->displayName = $this->username;
|
||||||
|
$this->iusername = strtolower($this->username);
|
||||||
|
|
||||||
|
if($packet->locale !== null){
|
||||||
|
$this->locale = $packet->locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(count($this->server->getOnlinePlayers()) >= $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->randomClientId = $packet->clientId;
|
||||||
|
|
||||||
|
$this->uuid = UUID::fromString($packet->clientUUID);
|
||||||
|
$this->rawUUID = $this->uuid->toBinary();
|
||||||
|
|
||||||
|
$skin = new Skin(
|
||||||
|
$packet->clientData["SkinId"],
|
||||||
|
base64_decode($packet->clientData["SkinData"] ?? ""),
|
||||||
|
base64_decode($packet->clientData["CapeData"] ?? ""),
|
||||||
|
$packet->clientData["SkinGeometryName"],
|
||||||
|
base64_decode($packet->clientData["SkinGeometry"] ?? "")
|
||||||
|
);
|
||||||
|
$skin->debloatGeometryData();
|
||||||
|
|
||||||
|
if(!$skin->isValid()){
|
||||||
|
$this->close("", "disconnectionScreen.invalidSkin");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setSkin($skin);
|
||||||
|
|
||||||
|
if(!$this->server->isWhitelisted($this->iusername) and $this->kick("Server is white-listed", false)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(
|
||||||
|
($this->server->getNameBans()->isBanned($this->iusername) or $this->server->getIPBans()->isBanned($this->getAddress())) and
|
||||||
|
$this->kick("You are banned", false)
|
||||||
|
){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason"));
|
||||||
|
if($ev->isCancelled()){
|
||||||
|
$this->close("", $ev->getKickMessage());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->server->getScheduler()->scheduleAsyncTask(new VerifyLoginTask($this, $packet));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sendPlayStatus(int $status, bool $immediate = false){
|
||||||
|
$pk = new PlayStatusPacket();
|
||||||
|
$pk->status = $status;
|
||||||
|
$pk->protocol = $this->protocol;
|
||||||
|
$this->sendDataPacket($pk, false, $immediate);
|
||||||
|
}
|
||||||
|
|
||||||
public function onVerifyCompleted(LoginPacket $packet, bool $isValid, bool $isAuthenticated) : void{
|
public function onVerifyCompleted(LoginPacket $packet, bool $isValid, bool $isAuthenticated) : void{
|
||||||
if($this->closed){
|
if($this->closed){
|
||||||
return;
|
return;
|
||||||
@ -1859,6 +1949,51 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
|||||||
$this->dataPacket($pk);
|
$this->dataPacket($pk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function handleResourcePackClientResponse(ResourcePackClientResponsePacket $packet) : bool{
|
||||||
|
switch($packet->status){
|
||||||
|
case ResourcePackClientResponsePacket::STATUS_REFUSED:
|
||||||
|
//TODO: add lang strings for this
|
||||||
|
$this->close("", "You must accept resource packs to join this server.", true);
|
||||||
|
break;
|
||||||
|
case ResourcePackClientResponsePacket::STATUS_SEND_PACKS:
|
||||||
|
$manager = $this->server->getResourceManager();
|
||||||
|
foreach($packet->packIds as $uuid){
|
||||||
|
$pack = $manager->getPackById($uuid);
|
||||||
|
if(!($pack instanceof ResourcePack)){
|
||||||
|
//Client requested a resource pack but we don't have it available on the server
|
||||||
|
$this->close("", "disconnectionScreen.resourcePack", true);
|
||||||
|
$this->server->getLogger()->debug("Got a resource pack request for unknown pack with UUID " . $uuid . ", available packs: " . implode(", ", $manager->getPackIdList()));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pk = new ResourcePackDataInfoPacket();
|
||||||
|
$pk->packId = $pack->getPackId();
|
||||||
|
$pk->maxChunkSize = 1048576; //1MB
|
||||||
|
$pk->chunkCount = (int) ceil($pack->getPackSize() / $pk->maxChunkSize);
|
||||||
|
$pk->compressedPackSize = $pack->getPackSize();
|
||||||
|
$pk->sha256 = $pack->getSha256();
|
||||||
|
$this->dataPacket($pk);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case ResourcePackClientResponsePacket::STATUS_HAVE_ALL_PACKS:
|
||||||
|
$pk = new ResourcePackStackPacket();
|
||||||
|
$manager = $this->server->getResourceManager();
|
||||||
|
$pk->resourcePackStack = $manager->getResourceStack();
|
||||||
|
$pk->mustAccept = $manager->resourcePacksRequired();
|
||||||
|
$this->dataPacket($pk);
|
||||||
|
break;
|
||||||
|
case ResourcePackClientResponsePacket::STATUS_COMPLETED:
|
||||||
|
$this->completeLoginSequence();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
protected function completeLoginSequence(){
|
protected function completeLoginSequence(){
|
||||||
parent::__construct($this->level, $this->namedtag);
|
parent::__construct($this->level, $this->namedtag);
|
||||||
$this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason"));
|
$this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason"));
|
||||||
@ -1940,138 +2075,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
|||||||
$this->server->onPlayerCompleteLoginSequence($this);
|
$this->server->onPlayerCompleteLoginSequence($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function handleLogin(LoginPacket $packet) : bool{
|
|
||||||
if($this->loggedIn){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->protocol = $packet->protocol;
|
|
||||||
|
|
||||||
if($packet->protocol !== ProtocolInfo::CURRENT_PROTOCOL){
|
|
||||||
if($packet->protocol < ProtocolInfo::CURRENT_PROTOCOL){
|
|
||||||
$this->sendPlayStatus(PlayStatusPacket::LOGIN_FAILED_CLIENT, true);
|
|
||||||
}else{
|
|
||||||
$this->sendPlayStatus(PlayStatusPacket::LOGIN_FAILED_SERVER, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//This pocketmine disconnect message will only be seen by the console (PlayStatusPacket causes the messages to be shown for the client)
|
|
||||||
$this->close("", $this->server->getLanguage()->translateString("pocketmine.disconnect.incompatibleProtocol", [$packet->protocol ?? "unknown"]), false);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!self::isValidUserName($packet->username)){
|
|
||||||
$this->close("", "disconnectionScreen.invalidName");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->username = TextFormat::clean($packet->username);
|
|
||||||
$this->displayName = $this->username;
|
|
||||||
$this->iusername = strtolower($this->username);
|
|
||||||
|
|
||||||
if($packet->locale !== null){
|
|
||||||
$this->locale = $packet->locale;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(count($this->server->getOnlinePlayers()) >= $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->randomClientId = $packet->clientId;
|
|
||||||
|
|
||||||
$this->uuid = UUID::fromString($packet->clientUUID);
|
|
||||||
$this->rawUUID = $this->uuid->toBinary();
|
|
||||||
|
|
||||||
$skin = new Skin(
|
|
||||||
$packet->clientData["SkinId"],
|
|
||||||
base64_decode($packet->clientData["SkinData"] ?? ""),
|
|
||||||
base64_decode($packet->clientData["CapeData"] ?? ""),
|
|
||||||
$packet->clientData["SkinGeometryName"],
|
|
||||||
base64_decode($packet->clientData["SkinGeometry"] ?? "")
|
|
||||||
);
|
|
||||||
$skin->debloatGeometryData();
|
|
||||||
|
|
||||||
if(!$skin->isValid()){
|
|
||||||
$this->close("", "disconnectionScreen.invalidSkin");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->setSkin($skin);
|
|
||||||
|
|
||||||
if(!$this->server->isWhitelisted($this->iusername) and $this->kick("Server is white-listed", false)){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(
|
|
||||||
($this->server->getNameBans()->isBanned($this->iusername) or $this->server->getIPBans()->isBanned($this->getAddress())) and
|
|
||||||
$this->kick("You are banned", false)
|
|
||||||
){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason"));
|
|
||||||
if($ev->isCancelled()){
|
|
||||||
$this->close("", $ev->getKickMessage());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->server->getScheduler()->scheduleAsyncTask(new VerifyLoginTask($this, $packet));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function sendPlayStatus(int $status, bool $immediate = false){
|
|
||||||
$pk = new PlayStatusPacket();
|
|
||||||
$pk->status = $status;
|
|
||||||
$pk->protocol = $this->protocol;
|
|
||||||
$this->sendDataPacket($pk, false, $immediate);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function handleResourcePackClientResponse(ResourcePackClientResponsePacket $packet) : bool{
|
|
||||||
switch($packet->status){
|
|
||||||
case ResourcePackClientResponsePacket::STATUS_REFUSED:
|
|
||||||
//TODO: add lang strings for this
|
|
||||||
$this->close("", "You must accept resource packs to join this server.", true);
|
|
||||||
break;
|
|
||||||
case ResourcePackClientResponsePacket::STATUS_SEND_PACKS:
|
|
||||||
$manager = $this->server->getResourceManager();
|
|
||||||
foreach($packet->packIds as $uuid){
|
|
||||||
$pack = $manager->getPackById($uuid);
|
|
||||||
if(!($pack instanceof ResourcePack)){
|
|
||||||
//Client requested a resource pack but we don't have it available on the server
|
|
||||||
$this->close("", "disconnectionScreen.resourcePack", true);
|
|
||||||
$this->server->getLogger()->debug("Got a resource pack request for unknown pack with UUID " . $uuid . ", available packs: " . implode(", ", $manager->getPackIdList()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$pk = new ResourcePackDataInfoPacket();
|
|
||||||
$pk->packId = $pack->getPackId();
|
|
||||||
$pk->maxChunkSize = 1048576; //1MB
|
|
||||||
$pk->chunkCount = (int) ceil($pack->getPackSize() / $pk->maxChunkSize);
|
|
||||||
$pk->compressedPackSize = $pack->getPackSize();
|
|
||||||
$pk->sha256 = $pack->getSha256();
|
|
||||||
$this->dataPacket($pk);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case ResourcePackClientResponsePacket::STATUS_HAVE_ALL_PACKS:
|
|
||||||
$pk = new ResourcePackStackPacket();
|
|
||||||
$manager = $this->server->getResourceManager();
|
|
||||||
$pk->resourcePackStack = $manager->getResourceStack();
|
|
||||||
$pk->mustAccept = $manager->resourcePacksRequired();
|
|
||||||
$this->dataPacket($pk);
|
|
||||||
break;
|
|
||||||
case ResourcePackClientResponsePacket::STATUS_COMPLETED:
|
|
||||||
$this->completeLoginSequence();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a chat message as this player. If the message begins with a / (forward-slash) it will be treated
|
* Sends a chat message as this player. If the message begins with a / (forward-slash) it will be treated
|
||||||
* as a command.
|
* as a command.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user