From 84c8ac03fb98bcb3e5c81e33eed0c264c918a727 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 23 Aug 2017 13:19:18 +0100 Subject: [PATCH] Fixed #1179 This solution isn't ideal, but it works... --- src/pocketmine/Player.php | 7 ++++--- src/pocketmine/Server.php | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index f26c637989..2443471e76 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1770,7 +1770,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ return; } - foreach($this->server->getOnlinePlayers() as $p){ + foreach($this->server->getLoggedInPlayers() as $p){ if($p !== $this and $p->iusername === $this->iusername){ if($p->kick("logged in from another location") === false){ $this->close($this->getLeaveMessage(), "Logged in from another location"); @@ -1827,6 +1827,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $this->sendPlayStatus(PlayStatusPacket::LOGIN_SUCCESS); $this->loggedIn = true; + $this->server->onPlayerLogin($this); $pk = new ResourcePacksInfoPacket(); $manager = $this->server->getResourceManager(); @@ -1910,8 +1911,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ } $this->server->addOnlinePlayer($this); - - $this->server->onPlayerLogin($this); + $this->server->onPlayerCompleteLoginSequence($this); } public function handleLogin(LoginPacket $packet) : bool{ @@ -3467,6 +3467,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $this->loadQueue = []; if($this->loggedIn){ + $this->server->onPlayerLogout($this); foreach($this->server->getOnlinePlayers() as $player){ if(!$player->canSee($this)){ $player->showPlayer($this); diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 88fc96bdbf..cd1c19fa69 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -254,6 +254,9 @@ class Server{ /** @var Player[] */ private $players = []; + /** @var Player[] */ + private $loggedInPlayers = []; + /** @var Player[] */ private $playerList = []; @@ -689,6 +692,13 @@ class Server{ return $this->commandMap; } + /** + * @return Player[] + */ + public function getLoggedInPlayers() : array{ + return $this->loggedInPlayers; + } + /** * @return Player[] */ @@ -2235,10 +2245,18 @@ class Server{ $this->uniquePlayers[$player->getRawUniqueId()] = $player->getRawUniqueId(); } + $this->loggedInPlayers[$player->getRawUniqueId()] = $player; + } + + public function onPlayerCompleteLoginSequence(Player $player){ $this->sendFullPlayerListData($player); $player->dataPacket($this->craftingManager->getCraftingDataPacket()); } + public function onPlayerLogout(Player $player){ + unset($this->loggedInPlayers[$player->getRawUniqueId()]); + } + public function addPlayer($identifier, Player $player){ $this->players[$identifier] = $player; $this->identifiers[spl_object_hash($player)] = $identifier;