diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index b7ebf1c91..82fb4a1b3 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2807,7 +2807,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade /** * Handles player data saving */ - public function save(){ + public function save($async = false){ if($this->closed){ throw new \InvalidStateException("Tried to save closed player"); } @@ -2830,7 +2830,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $this->namedtag["lastPlayed"] = floor(microtime(true) * 1000); if($this->username != "" and $this->namedtag instanceof Compound){ - $this->server->saveOfflinePlayerData($this->username, $this->namedtag); + $this->server->saveOfflinePlayerData($this->username, $this->namedtag, $async); } } } diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 5a218e220..74899a015 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -839,13 +839,18 @@ class Server{ /** * @param string $name * @param Compound $nbtTag + * @param bool $async */ - public function saveOfflinePlayerData($name, Compound $nbtTag){ + public function saveOfflinePlayerData($name, Compound $nbtTag, $async = false){ $nbt = new NBT(NBT::BIG_ENDIAN); try{ $nbt->setData($nbtTag); - $this->getScheduler()->scheduleAsyncTask(new FileWriteTask($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed())); + if($async){ + $this->getScheduler()->scheduleAsyncTask(new FileWriteTask($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed())); + }else{ + file_put_contents($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){ @@ -1402,7 +1407,7 @@ class Server{ if(($player = $this->getPlayerExact($name)) instanceof Player){ $player->recalculatePermissions(); } - $this->operators->save(); + $this->operators->save(true); } /** @@ -1422,7 +1427,7 @@ class Server{ */ public function addWhitelist($name){ $this->whitelist->set(strtolower($name), true); - $this->whitelist->save(); + $this->whitelist->save(true); } /** @@ -1740,7 +1745,7 @@ class Server{ } - $this->properties->save(); + $this->properties->save(true); if(!($this->getDefaultLevel() instanceof Level)){ $this->getLogger()->emergency($this->getLanguage()->translateString("pocketmine.level.defaultError")); @@ -2283,7 +2288,7 @@ class Server{ Timings::$worldSaveTimer->startTiming(); foreach($this->getOnlinePlayers() as $index => $player){ if($player->isOnline()){ - $player->save(); + $player->save(true); }elseif(!$player->isConnected()){ $this->removePlayer($player); }