/** * @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); } $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(); if ($this->loggedIn) { $this->server->removeOnlinePlayer($this); } $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); }
/** * 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); } $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 : ""); if ($this->loggedIn) { $this->server->removeOnlinePlayer($this); } $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) { $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->windowIndex as $window) { $this->removeWindow($window); } $this->interface->close($this, $reason); $chunkX = $chunkZ = null; foreach ($this->usedChunks as $index => $d) { Level::getXZ($index, $chunkX, $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 . ":" . $this->port . "] 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); }
/** * 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); } //$this->setLinked(); if ($this->fishingHook instanceof FishingHook) { $this->fishingHook->close(); $this->fishingHook = null; } $this->removeEffect(Effect::HEALTH_BOOST); $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 : ""); if ($this->loggedIn) { $this->server->removeOnlinePlayer($this); } $this->loggedIn = false; if (isset($ev) and $this->username != "" and $this->spawned !== false and $ev->getQuitMessage() != "") { if ($this->server->playerMsgType === Server::PLAYER_MSG_TYPE_MESSAGE) { $this->server->broadcastMessage($ev->getQuitMessage()); } elseif ($this->server->playerMsgType === Server::PLAYER_MSG_TYPE_TIP) { $this->server->broadcastTip(str_replace("@player", $this->getName(), $this->server->playerLogoutMsg)); } elseif ($this->server->playerMsgType === Server::PLAYER_MSG_TYPE_POPUP) { $this->server->broadcastPopup(str_replace("@player", $this->getName(), $this->server->playerLogoutMsg)); } } $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->server->dserverConfig["enable"] and $this->server->dserverConfig["queryAutoUpdate"]) { $this->server->updateQuery(); } } if ($this->perm !== null) { $this->perm->clearPermissions(); $this->perm = null; } $this->inventory = null; $this->transactionQueue = null; $this->chunk = null; $this->server->removePlayer($this); }
public function onUpdate($currentTick) { $p = $this->player; if ($this->closed == true || $this->dead == true || !$p instanceof Player || !$p->isSleeping()) { if (!$this->closed) { parent::close(); } $this->player = false; return false; } else { if ($this->healTick >= 60) { $p->heal(1); $this->healTick = 0; } $this->healTick++; $name = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; $name .= "Healing..."; if ($this->healTick < 55) { $name .= "\n " . (3 - floor($this->healTick * 0.05)) . "..."; $name .= ["-", "\\", ".|", "/"][floor($this->healTick * 0.5) % 4]; } $property = (new \ReflectionClass("\\pocketmine\\Player"))->getProperty("sleeping"); $property->setAccessible(true); $b = $this->getLevel()->getBlock($property->getValue($p)); $xTabel = [1 => 2, 3 => -2, 9 => 2, 11 => -2]; $x = isset($xTabel[$dmg = $b->getDamage()]) ? $xTabel[$dmg] : 0.5; $zTabel = [0 => -2, 2 => 2, 8 => -2, 10 => 2]; $z = isset($zTabel[$dmg]) ? $zTabel[$dmg] : 0.5; $this->x = $b->x + $x . ($this->y = $p->y + 19); $this->z = $b->z + $z; if ($this->nameTag !== $name) { $this->nameTag = $name; $this->despawnFrom($p); } $this->spawnTo($p); $pk = new MovePlayerPacket(); $pk->eid = $this->id; $pk->x = $this->x; $pk->y = $this->y; $pk->z = $this->z; $pk->yaw = 0; $pk->bodyYaw = 0; $pk->pitch = 0; $p->getServer()->broadcastPacket($this->hasSpawned, $pk); } return true; }
/** * @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 === true) { if ($this->username != "") { $this->server->getPluginManager()->callEvent($ev = new PlayerQuitEvent($this, $message)); if ($this->loggedIn === true) { $this->save(); } } $this->connected = false; $this->interface->close($this, $reason); $this->getLevel()->freeAllChunks($this); 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 . ":" . $this->port . "] logged out due to " . str_replace(["\n", "\r"], [" ", ""], $reason)); $this->windows = new \SplObjectStorage(); $this->windowIndex = []; $this->usedChunks = []; $this->loadQueue = []; unset($this->buffer); } $this->server->removePlayer($this); }
public function onUpdate($currentTick) { $p = $this->player; if ($this->closed == true || $this->dead == true || $p instanceof Player && !$p->spawned) { if (!$this->closed) { parent::close(); } $this->player = false; return false; } else { if ((($pitch = $p->getPitch()) >= 2 || $pitch <= -12) && !$p->isSleeping()) { $this->despawnFrom($p); return true; } else { $name = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; if ($p->dead) { $name .= "You Dead..."; } else { $name .= "Health: " . $p->getHealth() . "/" . $p->getMaxHealth() . " " . $p->getHealth() / $p->getMaxHealth() * 100 . "%"; } if ($p->isSleeping()) { $property = (new \ReflectionClass("\\pocketmine\\Player"))->getProperty("sleeping"); $property->setAccessible(true); $b = $this->getLevel()->getBlock($property->getValue($p)); $xTabel = [1 => 2, 3 => -2, 9 => 2, 11 => -2]; $x = isset($xTabel[$dmg = $b->getDamage()]) ? $xTabel[$dmg] : 0.5; $zTabel = [0 => -2, 2 => 2, 8 => -2, 10 => 2]; $z = isset($zTabel[$dmg]) ? $zTabel[$dmg] : 0.5; $this->x = $b->x + $x; $this->y = $p->y + 19; $this->z = $b->z + $z; } else { $this->x = $p->x - sin($p->getyaw() / 180 * M_PI) * cos($p->getPitch() / 180 * M_PI * 3); $this->y = $p->y + 20; $this->z = $p->z + cos($p->getyaw() / 180 * M_PI) * cos($p->getPitch() / 180 * M_PI * 3); } if ($this->nameTag !== $name) { $this->nameTag = $name; $this->despawnFrom($p); } $this->spawnTo($p); $pk = new MovePlayerPacket(); $pk->eid = $this->id; $pk->x = $this->x; $pk->y = $this->y; $pk->z = $this->z; $pk->yaw = 0; $pk->bodyYaw = 0; $pk->pitch = 0; $p->getServer()->broadcastPacket($this->hasSpawned, $pk); } } return true; }