From af68125872e734d65eee025f216dc536787de6ed Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 4 Dec 2017 09:57:53 +0000 Subject: [PATCH] Make Level->getName() less volatile this resolves problems with crashes when getName() is called on an unloaded level. This obviously doesn't solve the root cause of the issue (level being accessed after unload) but since many things use the level name without checking if it's unloaded first, it's a bad idea for it to be volatile. This resolves the server crash issue noted in #1527, where an exception is raised due to level unload during a tick, which subsequently causes a crash when trying to log the exception. --- src/pocketmine/level/Level.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 7665d5b6b..a64201e7b 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -170,6 +170,8 @@ class Level implements ChunkManager, Metadatable{ /** @var string */ private $folderName; + /** @var string */ + private $displayName; /** @var Chunk[] */ private $chunks = []; @@ -339,12 +341,14 @@ class Level implements ChunkManager, Metadatable{ throw new LevelException("Provider is not a subclass of LevelProvider"); } + $this->displayName = $this->provider->getName(); $this->worldHeight = $this->provider->getWorldHeight(); - $this->server->getLogger()->info($this->server->getLanguage()->translateString("pocketmine.level.preparing", [$this->provider->getName()])); + $this->server->getLogger()->info($this->server->getLanguage()->translateString("pocketmine.level.preparing", [$this->displayName])); $this->generator = Generator::getGenerator($this->provider->getGenerator()); $this->folderName = $name; + $this->scheduledBlockUpdateQueue = new ReversePriorityQueue(); $this->scheduledBlockUpdateQueue->setExtractFlags(\SplPriorityQueue::EXTR_BOTH); @@ -2751,7 +2755,7 @@ class Level implements ChunkManager, Metadatable{ * @return string */ public function getName() : string{ - return $this->provider->getName(); + return $this->displayName; } /**