pocketmine\Player::processLogin PHP Method

processLogin() protected method

protected processLogin ( )
    protected function processLogin()
    {
        if (!$this->server->isWhitelisted(strtolower($this->getName()))) {
            $this->close($this->getLeaveMessage(), "Server is white-listed");
            return;
        } elseif ($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress()) or $this->server->getCIDBans()->isBanned($this->randomClientId)) {
            $this->close($this->getLeaveMessage(), TextFormat::RED . "You are banned");
            return;
        }
        if ($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)) {
            $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this);
        }
        if ($this->hasPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE)) {
            $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this);
        }
        foreach ($this->server->getOnlinePlayers() as $p) {
            if ($p !== $this and strtolower($p->getName()) === strtolower($this->getName())) {
                if ($p->kick("logged in from another location") === false) {
                    $this->close($this->getLeaveMessage(), "Logged in from another location");
                    return;
                }
            } elseif ($p->loggedIn and $this->getUniqueId()->equals($p->getUniqueId())) {
                if ($p->kick("logged in from another location") === false) {
                    $this->close($this->getLeaveMessage(), "Logged in from another location");
                    return;
                }
            }
        }
        $this->setNameTag($this->getDisplayName());
        $nbt = $this->server->getOfflinePlayerData($this->username);
        $this->playedBefore = $nbt["lastPlayed"] - $nbt["firstPlayed"] > 1;
        if (!isset($nbt->NameTag)) {
            $nbt->NameTag = new StringTag("NameTag", $this->username);
        } else {
            $nbt["NameTag"] = $this->username;
        }
        if (!isset($nbt->Hunger) or !isset($nbt->Health) or !isset($nbt->MaxHealth)) {
            $nbt->Hunger = new ShortTag("Hunger", 20);
            $nbt->Health = new ShortTag("Health", 20);
            $nbt->MaxHealth = new ShortTag("MaxHealth", 20);
        }
        $this->food = $nbt["Hunger"];
        $this->setMaxHealth($nbt["MaxHealth"]);
        Entity::setHealth($nbt["Health"] <= 0 ? 20 : $nbt["Health"]);
        $this->gamemode = $nbt["playerGameType"] & 0x3;
        if ($this->server->getForceGamemode()) {
            $this->gamemode = $this->server->getGamemode();
            $nbt->playerGameType = new IntTag("playerGameType", $this->gamemode);
        }
        $this->allowFlight = $this->isCreative();
        if (($level = $this->server->getLevelByName($nbt["Level"])) === null) {
            $this->setLevel($this->server->getDefaultLevel());
            $nbt["Level"] = $this->level->getName();
            $nbt["Pos"][0] = $this->level->getSpawnLocation()->x;
            $nbt["Pos"][1] = $this->level->getSpawnLocation()->y;
            $nbt["Pos"][2] = $this->level->getSpawnLocation()->z;
        } else {
            $this->setLevel($level);
        }
        if (!$nbt instanceof CompoundTag) {
            $this->close($this->getLeaveMessage(), "Invalid data");
            return;
        }
        $this->achievements = [];
        /** @var ByteTag $achievement */
        foreach ($nbt->Achievements as $achievement) {
            $this->achievements[$achievement->getName()] = $achievement->getValue() > 0 ? true : false;
        }
        $nbt->lastPlayed = new LongTag("lastPlayed", floor(microtime(true) * 1000));
        if ($this->server->getAutoSave()) {
            $this->server->saveOfflinePlayerData($this->username, $nbt, true);
        }
        parent::__construct($this->level->getChunk($nbt["Pos"][0] >> 4, $nbt["Pos"][2] >> 4, true), $nbt);
        $this->loggedIn = true;
        $this->server->addOnlinePlayer($this);
        $this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason"));
        if ($ev->isCancelled()) {
            $this->close($this->getLeaveMessage(), $ev->getKickMessage());
            return;
        }
        if (!$this->isConnected()) {
            return;
        }
        $pk = new PlayStatusPacket();
        $pk->status = PlayStatusPacket::LOGIN_SUCCESS;
        $this->dataPacket($pk);
        if ($this->spawnPosition === null and isset($this->namedtag->SpawnLevel) and ($level = $this->server->getLevelByName($this->namedtag["SpawnLevel"])) instanceof Level) {
            $this->spawnPosition = new Position($this->namedtag["SpawnX"], $this->namedtag["SpawnY"], $this->namedtag["SpawnZ"], $level);
        }
        $spawnPosition = $this->getSpawn();
        $pk = new StartGamePacket();
        $pk->seed = -1;
        $pk->dimension = $this->level->getDimension();
        $pk->x = $this->x;
        $pk->y = $this->y;
        $pk->z = $this->z;
        $pk->spawnX = (int) $spawnPosition->x;
        $pk->spawnY = (int) $spawnPosition->y;
        $pk->spawnZ = (int) $spawnPosition->z;
        $pk->generator = 1;
        //0 old, 1 infinite, 2 flat
        $pk->gamemode = $this->gamemode & 0x1;
        $pk->eid = 0;
        //Always use EntityID as zero for the actual player
        /*$pk = new SetPlayerGameTypePacket();
        		$pk->gamemode = $this->gamemode & 0x01;*/
        $this->dataPacket($pk);
        $pk = new SetTimePacket();
        $pk->time = $this->level->getTime();
        $pk->started = $this->level->stopTime == false;
        $this->dataPacket($pk);
        $pk = new SetSpawnPositionPacket();
        $pk->x = (int) $spawnPosition->x;
        $pk->y = (int) $spawnPosition->y;
        $pk->z = (int) $spawnPosition->z;
        $this->dataPacket($pk);
        $pk = new SetHealthPacket();
        $pk->health = $this->getHealth();
        $this->dataPacket($pk);
        $pk = new SetDifficultyPacket();
        $pk->difficulty = $this->server->getDifficulty();
        $this->dataPacket($pk);
        $this->server->getLogger()->info($this->getServer()->getLanguage()->translateString("pocketmine.player.logIn", [TextFormat::AQUA . $this->username . TextFormat::WHITE, $this->ip, $this->port, TextFormat::GREEN . $this->randomClientId . TextFormat::WHITE, $this->id, $this->level->getName(), round($this->x, 4), round($this->y, 4), round($this->z, 4)]));
        /*if($this->isOp()){
        			$this->setRemoveFormat(false);
        		}*/
        if ($this->gamemode === Player::SPECTATOR) {
            $pk = new ContainerSetContentPacket();
            $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE;
            $this->dataPacket($pk);
        } else {
            $pk = new ContainerSetContentPacket();
            $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE;
            $pk->slots = array_merge(Item::getCreativeItems(), $this->personalCreativeItems);
            $this->dataPacket($pk);
        }
        $pk = new SetEntityDataPacket();
        $pk->eid = 0;
        $pk->metadata = [self::DATA_LEAD_HOLDER => [self::DATA_TYPE_LONG, -1]];
        $this->dataPacket($pk);
        $this->level->getWeather()->sendWeather($this);
        $this->forceMovement = $this->teleportPosition = $this->getPosition();
    }

Usage Example

Example #1
0
 protected function processLogin()
 {
     if ($this->isFirstTimeLogin) {
         parent::processLogin();
     } else {
         if (!$this->server->isWhitelisted(strtolower($this->getName()))) {
             $this->close($this->getLeaveMessage(), "Server is white-listed");
             return;
         } elseif ($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress()) or $this->server->getCIDBans()->isBanned($this->randomClientId)) {
             $this->close($this->getLeaveMessage(), TextFormat::RED . "You are banned");
             return;
         }
         if ($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)) {
             $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this);
         }
         if ($this->hasPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE)) {
             $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this);
         }
         foreach ($this->server->getOnlinePlayers() as $p) {
             if ($p !== $this and strtolower($p->getName()) === strtolower($this->getName())) {
                 if ($p->kick("logged in from another location") === false) {
                     $this->close($this->getLeaveMessage(), "Logged in from another location");
                     return;
                 }
             } elseif ($p->loggedIn and $this->getUniqueId()->equals($p->getUniqueId())) {
                 if ($p->kick("logged in from another location") === false) {
                     $this->close($this->getLeaveMessage(), "Logged in from another location");
                     return;
                 }
             }
         }
         $nbt = $this->server->getOfflinePlayerData($this->username);
         $this->playedBefore = $nbt["lastPlayed"] - $nbt["firstPlayed"] > 1;
         if (!isset($nbt->NameTag)) {
             $nbt->NameTag = new StringTag("NameTag", $this->username);
         } else {
             $nbt["NameTag"] = $this->username;
         }
         if (!isset($nbt->Hunger) or !isset($nbt->Health) or !isset($nbt->MaxHealth)) {
             $nbt->Hunger = new ShortTag("Hunger", 20);
             $nbt->Health = new ShortTag("Health", 20);
             $nbt->MaxHealth = new ShortTag("MaxHealth", 20);
         }
         $this->food = $nbt["Hunger"];
         $this->setMaxHealth($nbt["MaxHealth"]);
         Entity::setHealth($nbt["Health"] <= 0 ? 20 : $nbt["Health"]);
         $this->gamemode = $nbt["playerGameType"] & 0x3;
         if ($this->server->getForceGamemode()) {
             $this->gamemode = $this->server->getGamemode();
             $nbt->playerGameType = new IntTag("playerGameType", $this->gamemode);
         }
         $this->allowFlight = $this->isCreative();
         if (($level = $this->server->getLevelByName($nbt["Level"])) === null) {
             $this->setLevel($this->server->getDefaultLevel());
             $nbt["Level"] = $this->level->getName();
             $nbt["Pos"][0] = $this->level->getSpawnLocation()->x;
             $nbt["Pos"][1] = $this->level->getSpawnLocation()->y;
             $nbt["Pos"][2] = $this->level->getSpawnLocation()->z;
         } else {
             $this->setLevel($level);
         }
         if (!$nbt instanceof CompoundTag) {
             $this->close($this->getLeaveMessage(), "Invalid data");
             return;
         }
         $this->achievements = [];
         /** @var ByteTag $achievement */
         foreach ($nbt->Achievements as $achievement) {
             $this->achievements[$achievement->getName()] = $achievement->getValue() > 0 ? true : false;
         }
         $nbt->lastPlayed = new LongTag("lastPlayed", floor(microtime(true) * 1000));
         if ($this->server->getAutoSave()) {
             $this->server->saveOfflinePlayerData($this->username, $nbt, true);
         }
         Entity::__construct($this->level->getChunk($nbt["Pos"][0] >> 4, $nbt["Pos"][2] >> 4, true), $nbt);
         $this->loggedIn = true;
         $this->server->addOnlinePlayer($this);
         $this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason"));
         if ($ev->isCancelled()) {
             $this->close($this->getLeaveMessage(), $ev->getKickMessage());
             return;
         }
         if ($this->isCreative()) {
             $this->inventory->setHeldItemSlot(0);
         } else {
             $this->inventory->setHeldItemSlot($this->inventory->getHotbarSlotIndex(0));
         }
         if ($this->spawnPosition === null and isset($this->namedtag->SpawnLevel) and ($level = $this->server->getLevelByName($this->namedtag["SpawnLevel"])) instanceof Level) {
             $this->spawnPosition = new Position($this->namedtag["SpawnX"], $this->namedtag["SpawnY"], $this->namedtag["SpawnZ"], $level);
         }
         $spawnPosition = $this->getSpawn();
         $pk = new SetTimePacket();
         $pk->time = $this->level->getTime();
         $pk->started = $this->level->stopTime == false;
         $this->dataPacket($pk);
         $pk = new SetSpawnPositionPacket();
         $pk->x = (int) $spawnPosition->x;
         $pk->y = (int) $spawnPosition->y;
         $pk->z = (int) $spawnPosition->z;
         $this->dataPacket($pk);
         $this->sendAttributes();
         $pk = new SetDifficultyPacket();
         $pk->difficulty = $this->server->getDifficulty();
         $this->dataPacket($pk);
         $pk = new SetPlayerGameTypePacket();
         $pk->gamemode = $this->gamemode & 0x1;
         $this->dataPacket($pk);
         $this->sendSettings();
         $this->server->getLogger()->info($this->getServer()->getLanguage()->translateString("pocketmine.player.logIn", [TextFormat::AQUA . $this->username . TextFormat::WHITE, $this->ip, $this->port, TextFormat::GREEN . $this->randomClientId . TextFormat::WHITE, $this->id, $this->level->getName(), round($this->x, 4), round($this->y, 4), round($this->z, 4)]));
         if ($this->gamemode === Player::SPECTATOR) {
             $pk = new ContainerSetContentPacket();
             $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE;
             $this->dataPacket($pk);
         } else {
             $pk = new ContainerSetContentPacket();
             $pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE;
             $pk->slots = array_merge(Item::getCreativeItems(), $this->personalCreativeItems);
             $this->dataPacket($pk);
         }
         $pk = new SetEntityDataPacket();
         $pk->eid = 0;
         $pk->metadata = [self::DATA_LEAD_HOLDER => [self::DATA_TYPE_LONG, -1]];
         $this->dataPacket($pk);
         $this->forceMovement = $this->teleportPosition = $this->getPosition();
     }
 }
Player