From 3cc4afbcd650903d9bd193fce699ec184812d0e1 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Mon, 22 Sep 2014 11:21:54 +0200 Subject: [PATCH] Possible fix for #1920 --- .../level/generator/GenerationChunkManager.php | 11 +++++++---- .../level/generator/GenerationManager.php | 14 +++----------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/pocketmine/level/generator/GenerationChunkManager.php b/src/pocketmine/level/generator/GenerationChunkManager.php index 264174b28..b66b36fc1 100644 --- a/src/pocketmine/level/generator/GenerationChunkManager.php +++ b/src/pocketmine/level/generator/GenerationChunkManager.php @@ -83,7 +83,6 @@ class GenerationChunkManager implements ChunkManager{ if($chunk === null){ throw new \Exception("null chunk received"); } - $this->changes[$index] = $chunk; return $chunk; } @@ -104,12 +103,17 @@ class GenerationChunkManager implements ChunkManager{ } public function doGarbageCollection(){ + $count = 0; + foreach($this->chunks as $index => $chunk){ if(!isset($this->changes[$index]) or $chunk->isPopulated()){ unset($this->chunks[$index]); unset($this->changes[$index]); + ++$count; } } + + return $count; } public function generateChunk($chunkX, $chunkZ){ @@ -154,19 +158,18 @@ class GenerationChunkManager implements ChunkManager{ } public function setChunkGenerated($chunkX, $chunkZ){ - $chunk = $this->getChunk($chunkX, $chunkZ); - $chunk->setGenerated(true); try{ $chunk = $this->getChunk($chunkX, $chunkZ); $chunk->setGenerated(true); + $this->changes["$chunkX:$chunkZ"] = $chunk; }catch(\Exception $e){} } public function setChunkPopulated($chunkX, $chunkZ){ - try{ $chunk = $this->getChunk($chunkX, $chunkZ); $chunk->setPopulated(true); + $this->changes["$chunkX:$chunkZ"] = $chunk; }catch(\Exception $e){} } diff --git a/src/pocketmine/level/generator/GenerationManager.php b/src/pocketmine/level/generator/GenerationManager.php index 9be9290cd..04b94d987 100644 --- a/src/pocketmine/level/generator/GenerationManager.php +++ b/src/pocketmine/level/generator/GenerationManager.php @@ -100,8 +100,6 @@ class GenerationManager{ /** @var GenerationChunkManager[] */ protected $levels = []; - protected $generatedQueue = []; - /** @var array */ protected $requestQueue = []; @@ -145,15 +143,13 @@ class GenerationManager{ protected function openLevel($levelID, $seed, $class, array $options){ if(!isset($this->levels[$levelID])){ $this->levels[$levelID] = new GenerationChunkManager($this, $levelID, $seed, $class, $options); - $this->generatedQueue[$levelID] = []; } } protected function generateChunk($levelID, $chunkX, $chunkZ){ - if(isset($this->levels[$levelID]) and !isset($this->generatedQueue[$levelID][$index = Level::chunkHash($chunkX, $chunkZ)])){ + if(isset($this->levels[$levelID])){ $this->levels[$levelID]->populateChunk($chunkX, $chunkZ); //Request population directly if(isset($this->levels[$levelID])){ - $this->generatedQueue[$levelID][$index] = true; foreach($this->levels[$levelID]->getChangedChunks() as $index => $chunk){ if($chunk->isPopulated()){ $this->sendChunk($levelID, $chunk); @@ -161,11 +157,8 @@ class GenerationManager{ } } - if(count($this->generatedQueue[$levelID]) > 4){ - $this->levels[$levelID]->doGarbageCollection(); - $this->generatedQueue[$levelID] = []; - $this->levels[$levelID]->cleanChangedChunks(); - } + $this->levels[$levelID]->doGarbageCollection(); + $this->levels[$levelID]->cleanChangedChunks(); } } } @@ -174,7 +167,6 @@ class GenerationManager{ if(!isset($this->levels[$levelID])){ $this->levels[$levelID]->shutdown(); unset($this->levels[$levelID]); - unset($this->generatedQueue[$levelID]); } }