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.
This commit is contained in:
Dylan K. Taylor 2017-12-04 09:57:53 +00:00
parent 5a0afa9f88
commit af68125872

View File

@ -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;
}
/**