diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index de955ce73e..b7ebf1c914 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -351,7 +351,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade * @return bool */ public function canSee(Player $player){ - return !isset($this->hiddenPlayers[$player->getName()]); + return !isset($this->hiddenPlayers[$player->getUniqueId()]); } /** @@ -361,7 +361,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($player === $this){ return; } - $this->hiddenPlayers[$player->getName()] = $player; + $this->hiddenPlayers[$player->getUniqueId()] = $player; $player->despawnFrom($this); } @@ -372,7 +372,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($player === $this){ return; } - unset($this->hiddenPlayers[$player->getName()]); + unset($this->hiddenPlayers[$player->getUniqueId()]); if($player->isOnline()){ $player->spawnTo($this); } @@ -2735,14 +2735,14 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade public function close($message = "", $reason = "generic reason", $notify = true){ if($this->connected and !$this->closed){ - if($notify and $reason != ""){ + if($notify and strlen((string) $reason) > 0){ $pk = new DisconnectPacket; $pk->message = $reason; $this->directDataPacket($pk->setChannel(Network::CHANNEL_PRIORITY)); } $this->connected = false; - if($this->username != ""){ + if(strlen($this->getName()) > 0){ $this->server->getPluginManager()->callEvent($ev = new PlayerQuitEvent($this, $message)); if($this->server->getAutoSave() and $this->loggedIn === true){ $this->save(); diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index a0546d71a7..5a218e2200 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -91,6 +91,7 @@ use pocketmine\plugin\PharPluginLoader; use pocketmine\plugin\Plugin; use pocketmine\plugin\PluginLoadOrder; use pocketmine\plugin\PluginManager; +use pocketmine\scheduler\FileWriteTask; use pocketmine\scheduler\SendUsageTask; use pocketmine\scheduler\ServerScheduler; use pocketmine\tile\Chest; @@ -843,7 +844,8 @@ class Server{ $nbt = new NBT(NBT::BIG_ENDIAN); try{ $nbt->setData($nbtTag); - file_put_contents($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed()); + + $this->getScheduler()->scheduleAsyncTask(new FileWriteTask($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed())); }catch(\Exception $e){ $this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()])); if(\pocketmine\DEBUG > 1 and $this->logger instanceof MainLogger){ diff --git a/src/pocketmine/scheduler/FileWriteTask.php b/src/pocketmine/scheduler/FileWriteTask.php new file mode 100644 index 0000000000..f952e91e85 --- /dev/null +++ b/src/pocketmine/scheduler/FileWriteTask.php @@ -0,0 +1,43 @@ +path = $path; + $this->contents = $contents; + $this->flags = (int) $flags; + } + + public function onRun(){ + try{ + file_put_contents($this->path, $this->contents, (int) $this->flags); + }catch (\Exception $e){ + + } + } +} diff --git a/src/pocketmine/utils/Config.php b/src/pocketmine/utils/Config.php index 38364e2e93..80b8e69d22 100644 --- a/src/pocketmine/utils/Config.php +++ b/src/pocketmine/utils/Config.php @@ -20,6 +20,7 @@ */ namespace pocketmine\utils; +use pocketmine\scheduler\FileWriteTask; use pocketmine\Server; @@ -170,9 +171,11 @@ class Config{ } /** + * @param bool $async + * * @return boolean */ - public function save(){ + public function save($async = false){ if($this->correct === true){ try{ $content = null; @@ -194,7 +197,12 @@ class Config{ $content = implode("\r\n", array_keys($this->config)); break; } - file_put_contents($this->file, $content); + + if($async){ + Server::getInstance()->getScheduler()->scheduleAsyncTask(new FileWriteTask($this->file, $content)); + }else{ + file_put_contents($this->file, $content); + } }catch(\Exception $e){ $logger = Server::getInstance()->getLogger(); $logger->critical("Could not save Config " . $this->file . ": " . $e->getMessage());