/** * Note for plugin developers: use kick() with the isAdmin * flag set to kick without the "Kicked by admin" part instead of this method. * * @param string $message Message to be broadcasted * @param string $reason Reason showed in console * @param bool $notify */ public final function close($message = "", $reason = "generic reason", $notify = true) { if ($this->connected and !$this->closed) { if ($notify and strlen((string) $reason) > 0) { $pk = new DisconnectPacket(); $pk->message = $reason; $this->directDataPacket($pk->setChannel(Network::CHANNEL_PRIORITY)); } $this->connected = false; if (strlen($this->getName()) > 0) { $this->server->getPluginManager()->callEvent($ev = new PlayerQuitEvent($this, $message, true)); if ($this->loggedIn === true and $ev->getAutoSave()) { $this->save(); } } foreach ($this->server->getOnlinePlayers() as $player) { if (!$player->canSee($this)) { $player->showPlayer($this); } } $this->hiddenPlayers = []; foreach ($this->windowIndex as $window) { $this->removeWindow($window); } foreach ($this->usedChunks as $index => $d) { Level::getXZ($index, $chunkX, $chunkZ); $this->level->unregisterChunkLoader($this, $chunkX, $chunkZ); unset($this->usedChunks[$index]); } parent::close(); $this->interface->close($this, $notify ? $reason : ""); $this->loggedIn = false; if (isset($ev) and $this->username != "" and $this->spawned !== false and $ev->getQuitMessage() != "") { $this->server->broadcastMessage($ev->getQuitMessage()); } $this->server->getPluginManager()->unsubscribeFromPermission(Server::BROADCAST_CHANNEL_USERS, $this); $this->spawned = false; $this->server->getLogger()->info($this->getServer()->getLanguage()->translateString("pocketmine.player.logOut", [TextFormat::AQUA . $this->getName() . TextFormat::WHITE, $this->ip, $this->port, $this->getServer()->getLanguage()->translateString($reason)])); $this->windows = new \SplObjectStorage(); $this->windowIndex = []; $this->usedChunks = []; $this->loadQueue = []; $this->hasSpawned = []; $this->spawnPosition = null; unset($this->buffer); } if ($this->perm !== null) { $this->perm->clearPermissions(); $this->perm = null; } if ($this->inventory !== null) { $this->inventory = null; $this->currentTransaction = null; } $this->chunk = null; $this->server->removePlayer($this); }
/** * @param string $message Message to be broadcasted * @param string $reason Reason showed in console */ public function close($message = "", $reason = "generic reason") { foreach ($this->tasks as $task) { $task->cancel(); } $this->tasks = []; if ($this->connected and !$this->closed) { if ($reason != "") { $pk = new DisconnectPacket(); $pk->message = $reason; $this->directDataPacket($pk->setChannel(Network::CHANNEL_PRIORITY)); } $this->connected = \false; if ($this->username != "") { $this->server->getPluginManager()->callEvent($ev = new PlayerQuitEvent($this, $message)); if ($this->server->getAutoSave() and $this->loggedIn === \true) { $this->save(); } } foreach ($this->server->getOnlinePlayers() as $player) { if (!$player->canSee($this)) { $player->showPlayer($this); } } $this->hiddenPlayers = []; foreach ($this->windowIndex as $window) { $this->removeWindow($window); } $this->interface->close($this, $reason); $chunkX = $chunkZ = \null; foreach ($this->usedChunks as $index => $d) { if (\PHP_INT_SIZE === 8) { $chunkX = $index >> 32 << 32 >> 32; $chunkZ = ($index & 0xffffffff) << 32 >> 32; } else { list($chunkX, $chunkZ) = \explode(":", $index); $chunkX = (int) $chunkX; $chunkZ = (int) $chunkZ; } $this->level->freeChunk($chunkX, $chunkZ, $this); unset($this->usedChunks[$index]); } parent::close(); $this->loggedIn = \false; if (isset($ev) and $this->username != "" and $this->spawned !== \false and $ev->getQuitMessage() != "") { $this->server->broadcastMessage($ev->getQuitMessage()); } $this->server->getPluginManager()->unsubscribeFromPermission(Server::BROADCAST_CHANNEL_USERS, $this); $this->spawned = \false; $this->server->getLogger()->info(TextFormat::AQUA . $this->username . TextFormat::WHITE . "/" . $this->ip . " logged out due to " . \str_replace(["\n", "\r"], [" ", ""], $reason)); $this->windows = new \SplObjectStorage(); $this->windowIndex = []; $this->usedChunks = []; $this->loadQueue = []; $this->hasSpawned = []; $this->spawnPosition = \null; unset($this->buffer); } $this->perm->clearPermissions(); $this->server->removePlayer($this); }