Level: fix chunk locks not getting released on generation errors

This commit is contained in:
Dylan K. Taylor 2018-06-06 11:42:29 +01:00
parent edd150971e
commit 7b17a83227
2 changed files with 16 additions and 11 deletions

View File

@ -2296,16 +2296,18 @@ class Level implements ChunkManager, Metadatable{
return $result; return $result;
} }
public function generateChunkCallback(int $x, int $z, Chunk $chunk){ public function generateChunkCallback(int $x, int $z, ?Chunk $chunk){
Timings::$generationCallbackTimer->startTiming(); Timings::$generationCallbackTimer->startTiming();
if(isset($this->chunkPopulationQueue[$index = Level::chunkHash($x, $z)])){ if(isset($this->chunkPopulationQueue[$index = Level::chunkHash($x, $z)])){
$oldChunk = $this->getChunk($x, $z, false);
for($xx = -1; $xx <= 1; ++$xx){ for($xx = -1; $xx <= 1; ++$xx){
for($zz = -1; $zz <= 1; ++$zz){ for($zz = -1; $zz <= 1; ++$zz){
unset($this->chunkPopulationLock[Level::chunkHash($x + $xx, $z + $zz)]); unset($this->chunkPopulationLock[Level::chunkHash($x + $xx, $z + $zz)]);
} }
} }
unset($this->chunkPopulationQueue[$index]); unset($this->chunkPopulationQueue[$index]);
if($chunk !== null){
$oldChunk = $this->getChunk($x, $z, false);
$this->setChunk($x, $z, $chunk, false); $this->setChunk($x, $z, $chunk, false);
if(($oldChunk === null or !$oldChunk->isPopulated()) and $chunk->isPopulated()){ if(($oldChunk === null or !$oldChunk->isPopulated()) and $chunk->isPopulated()){
$this->server->getPluginManager()->callEvent(new ChunkPopulateEvent($this, $chunk)); $this->server->getPluginManager()->callEvent(new ChunkPopulateEvent($this, $chunk));
@ -2314,10 +2316,13 @@ class Level implements ChunkManager, Metadatable{
$loader->onChunkPopulated($chunk); $loader->onChunkPopulated($chunk);
} }
} }
}
}elseif(isset($this->chunkPopulationLock[$index])){ }elseif(isset($this->chunkPopulationLock[$index])){
unset($this->chunkPopulationLock[$index]); unset($this->chunkPopulationLock[$index]);
if($chunk !== null){
$this->setChunk($x, $z, $chunk, false); $this->setChunk($x, $z, $chunk, false);
}else{ }
}elseif($chunk !== null){
$this->setChunk($x, $z, $chunk, false); $this->setChunk($x, $z, $chunk, false);
} }
Timings::$generationCallbackTimer->stopTiming(); Timings::$generationCallbackTimer->stopTiming();

View File

@ -152,11 +152,11 @@ class PopulationTask extends AsyncTask{
$c = $this->{"chunk$i"}; $c = $this->{"chunk$i"};
if($c !== null){ if($c !== null){
$c = Chunk::fastDeserialize($c); $c = Chunk::fastDeserialize($c);
$level->generateChunkCallback($c->getX(), $c->getZ(), $c); $level->generateChunkCallback($c->getX(), $c->getZ(), $this->state ? $c : null);
} }
} }
$level->generateChunkCallback($chunk->getX(), $chunk->getZ(), $chunk); $level->generateChunkCallback($chunk->getX(), $chunk->getZ(), $this->state ? $chunk : null);
} }
} }
} }