Improved chunk unload queue, possible fix for #1661

This commit is contained in:
Shoghi Cervantes 2014-09-25 23:03:56 +02:00
parent 7e49d073fa
commit 2975509d0f

View File

@ -448,6 +448,8 @@ class Level implements ChunkManager, Metadatable{
$this->sendTime();
}
$this->unloadChunks();
if(count($this->changedCount) > 0){
if(count($this->players) > 0){
foreach($this->changedCount as $index => $mini){
@ -1989,41 +1991,30 @@ class Level implements ChunkManager, Metadatable{
$Z = null;
foreach($this->chunks as $index => $chunk){
if(!isset($this->usedChunks[$index])){
if(!isset($this->unloadQueue[$index]) and (!isset($this->usedChunks[$index]) or count($this->usedChunks[$index]) === 0)){
Level::getXZ($index, $X, $Z);
$this->unloadChunkRequest($X, $Z, true);
if(!$this->isSpawnChunk($X, $Z)){
$this->unloadChunkRequest($X, $Z, true);
}
}
}
$this->timings->doChunkGC->stopTiming();
}
protected function unloadChunks(){
if(count($this->unloadQueue) > 0){
$X = null;
$Z = null;
foreach($this->unloadQueue as $index => $time){
Level::getXZ($index, $X, $Z);
if($this->getAutoSave()){
$this->provider->saveChunk($X, $Z);
}
//If the chunk can't be unloaded, it stays on the queue
if($this->unloadChunk($X, $Z, true)){
unset($this->unloadQueue[$index]);
}
}
}
foreach($this->usedChunks as $i => $c){
if(count($c) === 0){
Level::getXZ($i, $X, $Z);
if(!$this->isSpawnChunk($X, $Z)){
if($this->getAutoSave()){
$this->provider->saveChunk($X, $Z);
}
$this->unloadChunk($X, $Z, true);
}
}
}
$this->timings->doChunkGC->stopTiming();
}