diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index dcb28421e..b2df4f827 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -3484,11 +3484,9 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ /** * Handles player data saving * - * @param bool $async - * * @throws \InvalidStateException if the player is closed */ - public function save(bool $async = false){ + public function save(){ if($this->closed){ throw new \InvalidStateException("Tried to save closed player"); } @@ -3525,7 +3523,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $this->namedtag->setLong("lastPlayed", (int) floor(microtime(true) * 1000)); if($this->username != "" and $this->namedtag instanceof CompoundTag){ - $this->server->saveOfflinePlayerData($this->username, $this->namedtag, $async); + $this->server->saveOfflinePlayerData($this->username, $this->namedtag); } } diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index e50b64986..4621c024c 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -814,9 +814,8 @@ class Server{ /** * @param string $name * @param CompoundTag $nbtTag - * @param bool $async */ - public function saveOfflinePlayerData(string $name, CompoundTag $nbtTag, bool $async = false){ + public function saveOfflinePlayerData(string $name, CompoundTag $nbtTag){ $ev = new PlayerDataSaveEvent($nbtTag, $name); $ev->setCancelled(!$this->shouldSavePlayerData()); @@ -825,11 +824,7 @@ class Server{ if(!$ev->isCancelled()){ $nbt = new BigEndianNBTStream(); try{ - if($async){ - $this->asyncPool->submitTask(new FileWriteTask($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed($ev->getSaveData()))); - }else{ - file_put_contents($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed($ev->getSaveData())); - } + file_put_contents($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed($ev->getSaveData())); }catch(\Throwable $e){ $this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()])); $this->logger->logException($e); @@ -2412,7 +2407,7 @@ class Server{ Timings::$worldSaveTimer->startTiming(); foreach($this->players as $index => $player){ if($player->spawned){ - $player->save(true); + $player->save(); }elseif(!$player->isConnected()){ $this->removePlayer($player); } diff --git a/src/pocketmine/item/PaintingItem.php b/src/pocketmine/item/PaintingItem.php index c342502a3..b044f249f 100644 --- a/src/pocketmine/item/PaintingItem.php +++ b/src/pocketmine/item/PaintingItem.php @@ -37,67 +37,68 @@ class PaintingItem extends Item{ } public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ - if(!$blockClicked->isTransparent() and $face > 1 and !$blockReplace->isSolid()){ - /** @var PaintingMotive[] $motives */ - $motives = []; + if($face === Vector3::SIDE_DOWN or $face === Vector3::SIDE_UP){ + return false; + } - $totalDimension = 0; - foreach(PaintingMotive::getAll() as $motive){ - $currentTotalDimension = $motive->getHeight() + $motive->getWidth(); - if($currentTotalDimension < $totalDimension){ - continue; + $motives = []; + + $totalDimension = 0; + foreach(PaintingMotive::getAll() as $motive){ + $currentTotalDimension = $motive->getHeight() + $motive->getWidth(); + if($currentTotalDimension < $totalDimension){ + continue; + } + + if(Painting::canFit($player->level, $blockReplace, $face, true, $motive)){ + if($currentTotalDimension > $totalDimension){ + $totalDimension = $currentTotalDimension; + /* + * This drops all motive possibilities smaller than this + * We use the total of height + width to allow equal chance of horizontal/vertical paintings + * when there is an L-shape of space available. + */ + $motives = []; } - if(Painting::canFit($player->level, $blockReplace, $face, true, $motive)){ - if($currentTotalDimension > $totalDimension){ - $totalDimension = $currentTotalDimension; - /* - * This drops all motive possibilities smaller than this - * We use the total of height + width to allow equal chance of horizontal/vertical paintings - * when there is an L-shape of space available. - */ - $motives = []; - } - - $motives[] = $motive; - } + $motives[] = $motive; } + } - if(empty($motives)){ //No space available - return false; - } + if(empty($motives)){ //No space available + return false; + } - /** @var PaintingMotive $motive */ - $motive = $motives[array_rand($motives)]; + /** @var PaintingMotive $motive */ + $motive = $motives[array_rand($motives)]; - static $directions = [ - Vector3::SIDE_SOUTH => 0, - Vector3::SIDE_WEST => 1, - Vector3::SIDE_NORTH => 2, - Vector3::SIDE_EAST => 3 - ]; + static $directions = [ + Vector3::SIDE_SOUTH => 0, + Vector3::SIDE_WEST => 1, + Vector3::SIDE_NORTH => 2, + Vector3::SIDE_EAST => 3 + ]; - $direction = $directions[$face] ?? -1; - if($direction === -1){ - return false; - } + $direction = $directions[$face] ?? -1; + if($direction === -1){ + return false; + } - $nbt = Entity::createBaseNBT($blockReplace, null, $direction * 90, 0); - $nbt->setByte("Direction", $direction); - $nbt->setString("Motive", $motive->getName()); - $nbt->setInt("TileX", $blockClicked->getFloorX()); - $nbt->setInt("TileY", $blockClicked->getFloorY()); - $nbt->setInt("TileZ", $blockClicked->getFloorZ()); + $nbt = Entity::createBaseNBT($blockReplace, null, $direction * 90, 0); + $nbt->setByte("Direction", $direction); + $nbt->setString("Motive", $motive->getName()); + $nbt->setInt("TileX", $blockClicked->getFloorX()); + $nbt->setInt("TileY", $blockClicked->getFloorY()); + $nbt->setInt("TileZ", $blockClicked->getFloorZ()); - $entity = Entity::createEntity("Painting", $blockReplace->getLevel(), $nbt); + $entity = Entity::createEntity("Painting", $blockReplace->getLevel(), $nbt); - if($entity instanceof Entity){ - --$this->count; - $entity->spawnToAll(); + if($entity instanceof Entity){ + --$this->count; + $entity->spawnToAll(); - $player->getLevel()->broadcastLevelEvent($blockReplace->add(0.5, 0.5, 0.5), LevelEventPacket::EVENT_SOUND_ITEMFRAME_PLACE); //item frame and painting have the same sound - return true; - } + $player->getLevel()->broadcastLevelEvent($blockReplace->add(0.5, 0.5, 0.5), LevelEventPacket::EVENT_SOUND_ITEMFRAME_PLACE); //item frame and painting have the same sound + return true; } return false;