public function unloadChunk(int $x, int $z, bool $safe = true, bool $trySave = true) : bool
{
if ($safe === true and $this->isChunkInUse($x, $z)) {
return false;
}
if (!$this->isChunkLoaded($x, $z)) {
return true;
}
$this->timings->doChunkUnload->startTiming();
$index = Level::chunkHash($x, $z);
$chunk = $this->getChunk($x, $z);
if ($chunk !== null and $chunk->getProvider() !== null) {
$this->server->getPluginManager()->callEvent($ev = new ChunkUnloadEvent($chunk));
if ($ev->isCancelled()) {
$this->timings->doChunkUnload->stopTiming();
return false;
}
}
try {
if ($chunk !== null) {
if ($trySave and $this->getAutoSave()) {
$entities = 0;
foreach ($chunk->getEntities() as $e) {
if ($e instanceof Player) {
continue;
}
++$entities;
}
if ($chunk->hasChanged() or count($chunk->getTiles()) > 0 or $entities > 0) {
$this->provider->setChunk($x, $z, $chunk);
$this->provider->saveChunk($x, $z);
}
}
foreach ($this->getChunkLoaders($x, $z) as $loader) {
$loader->onChunkUnloaded($chunk);
}
}
$this->provider->unloadChunk($x, $z, $safe);
} catch (\Throwable $e) {
$logger = $this->server->getLogger();
$logger->error($this->server->getLanguage()->translateString("pocketmine.level.chunkUnloadError", [$e->getMessage()]));
if ($logger instanceof MainLogger) {
$logger->logException($e);
}
}
unset($this->chunks[$index]);
unset($this->chunkTickList[$index]);
unset($this->chunkCache[$index]);
$this->timings->doChunkUnload->stopTiming();
return true;
}