mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-07 20:28:31 +00:00
Level: fix chunk locks not getting released on generation errors
This commit is contained in:
parent
edd150971e
commit
7b17a83227
@ -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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user