public function processLogin(Player $player, CompoundTag $nbt)
{
if (!$this->server->isWhitelisted(strtolower($player->getName()))) {
$player->close($player->getLeaveMessage(), "Server is white-listed");
return;
} elseif ($this->server->getNameBans()->isBanned(strtolower($player->getName())) or $this->server->getIPBans()->isBanned($player->getAddress())) {
$player->close($player->getLeaveMessage(), "You are banned");
return;
}
if ($player->hasPermission(Server::BROADCAST_CHANNEL_USERS)) {
$this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $player);
}
if ($player->hasPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE)) {
$this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $player);
}
foreach ($this->server->getOnlinePlayers() as $p) {
if ($p !== $player and strtolower($p->getName()) === strtolower($player->getName())) {
if ($p->kick("logged in from another location") === false) {
$player->close($player->getLeaveMessage(), "Logged in from another location");
return;
}
} elseif ($p->loggedIn and $player->getUniqueId()->equals($p->getUniqueId())) {
if ($p->kick("logged in from another location") === false) {
$player->close($player->getLeaveMessage(), "Logged in from another location");
return;
}
}
}
// $nbt = $player->server->getOfflinePlayerData ( $this->username );
if (!isset($nbt->NameTag)) {
$nbt->NameTag = new StringTag("NameTag", $this->getPrivateVariableData($player, 'username'));
} else {
$nbt["NameTag"] = $this->getPrivateVariableData($player, 'username');
}
$player->gamemode = $nbt["playerGameType"] & 0x3;
if ($this->server->getForceGamemode()) {
$player->gamemode = $this->server->getGamemode();
$nbt->playerGameType = new IntTag("playerGameType", $player->gamemode);
}
// $player->allowFlight = $player->isCreative ();
$this->setPrivateVariableData($player, 'allowFlight', $player->isCreative());
if (($level = $this->server->getLevelByName($nbt["Level"])) === null) {
$player->setLevel($this->server->getDefaultLevel());
$nbt["Level"] = $this->level->getName();
$nbt["Pos"][0] = $player->level->getSpawnLocation()->x;
$nbt["Pos"][1] = $player->level->getSpawnLocation()->y;
$nbt["Pos"][2] = $player->level->getSpawnLocation()->z;
} else {
$player->setLevel($level);
}
if (!$nbt instanceof CompoundTag) {
$player->close($player->getLeaveMessage(), "Invalid data");
return;
}
$player->achievements = [];
/** @var Byte $achievement */
foreach ($nbt->Achievements as $achievement) {
$player->achievements[$achievement->getName()] = $achievement->getValue() > 0 ? true : false;
}
$nbt->lastPlayed = new LongTag("lastPlayed", floor(microtime(true) * 1000));
if ($this->server->getAutoSave()) {
$this->server->saveOfflinePlayerData($player->getName(), $nbt, true);
}
// parent::__construct ( $this->level->getChunk ( $nbt ["Pos"] [0] >> 4, $nbt ["Pos"] [2] >> 4, true ), $nbt );
$this->entityConstruct($player, $player->getLevel()->getChunk($nbt["Pos"][0] >> 4, $nbt["Pos"][2] >> 4, true), $nbt);
$player->loggedIn = true;
$this->server->addOnlinePlayer($player);
$this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($player, "Plugin reason"));
if ($ev->isCancelled()) {
$player->close($player->getLeaveMessage(), $ev->getKickMessage());
return;
}
if ($player->isCreative()) {
$player->getInventory()->setHeldItemSlot(0);
} else {
$player->getInventory()->setHeldItemSlot($player->getInventory()->getHotbarSlotIndex(0));
}
$pk = new PlayStatusPacket();
$pk->status = PlayStatusPacket::LOGIN_SUCCESS;
$player->dataPacket($pk);
if ($this->getPrivateVariableData($player, 'spawnPosition') === null and isset($player->namedtag->SpawnLevel) and ($level = $this->server->getLevelByName($player->namedtag["SpawnLevel"])) instanceof Level) {
$this->setPrivateVariableData($player, 'spawnPosition', new Position($player->namedtag["SpawnX"], $player->namedtag["SpawnY"], $player->namedtag["SpawnZ"], $level));
}
$spawnPosition = $player->getSpawn();
$pk = new StartGamePacket();
$pk->seed = -1;
$pk->dimension = 0;
$pk->x = $player->x;
$pk->y = $player->y;
$pk->z = $player->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 = $player->gamemode & 0x1;
$pk->eid = 0;
// Always use EntityID as zero for the actual player
$player->dataPacket($pk);
$pk = new SetTimePacket();
$pk->time = $player->level->getTime();
$pk->started = $player->level->stopTime == false;
$player->dataPacket($pk);
$pk = new SetSpawnPositionPacket();
$pk->x = (int) $spawnPosition->x;
$pk->y = (int) $spawnPosition->y;
$pk->z = (int) $spawnPosition->z;
$player->dataPacket($pk);
$pk = new SetHealthPacket();
$pk->health = $player->getHealth();
$player->dataPacket($pk);
$pk = new SetDifficultyPacket();
$pk->difficulty = $this->server->getDifficulty();
$player->dataPacket($pk);
// $this->server->getLogger ()->info ( $this->server->getLanguage ()->translateString ( "pocketmine.player.logIn", [
// TextFormat::AQUA . $player->username . TextFormat::WHITE,
// $player->ip,
// $player->port,
// $player->id,
// $player->level->getName (),
// round ( $player->x, 4 ),
// round ( $player->y, 4 ),
// round ( $player->z, 4 )
// ] ) );
$this->server->getLogger()->info($this->server->getLanguage()->translateString("pocketmine.player.logIn", [TextFormat::AQUA . $this->getPrivateVariableData($player, 'username') . TextFormat::WHITE, $this->getPrivateVariableData($player, 'ip'), $this->getPrivateVariableData($player, 'port'), $this->getPrivateVariableData($player, 'id'), $player->level->getName(), round($player->x, 4), round($player->y, 4), round($player->z, 4)]));
if ($player->isOp()) {
$player->setRemoveFormat(false);
}
if ($player->gamemode === Player::SPECTATOR) {
$pk = new ContainerSetContentPacket();
$pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE;
$player->dataPacket($pk);
} else {
$pk = new ContainerSetContentPacket();
$pk->windowid = ContainerSetContentPacket::SPECIAL_CREATIVE;
$pk->slots = Item::getCreativeItems();
$player->dataPacket($pk);
}
$this->setPrivateVariableData($player, 'teleportPosition', $player->getPosition());
$this->setPrivateVariableData($player, 'forceMovement', $player->getPosition());
$this->server->onPlayerLogin($player);
}