server = $server; $this->manager = $manager; $this->maxCount = $this->server->getProperty("chunk-generation.per-tick", 1); } public function openLevel($levelID, $seed, $class, array $options){ if(!isset($this->levels[$levelID])){ $this->levels[$levelID] = new GenerationChunkManager($this, $levelID, $seed, $class, $options); } } public function generateChunk($levelID, $chunkX, $chunkZ){ if(isset($this->levels[$levelID])){ $this->levels[$levelID]->populateChunk($chunkX, $chunkZ); //Request population directly if(isset($this->levels[$levelID])){ foreach($this->levels[$levelID]->getChangedChunks() as $index => $chunk){ $this->sendChunk($levelID, $chunk); $this->levels[$levelID]->cleanChangedChunk($index); } $this->levels[$levelID]->doGarbageCollection(); $this->levels[$levelID]->cleanChangedChunks(); } } } public function process(){ if(count($this->requestQueue) > 0){ $count = 0; foreach($this->requestQueue as $levelID => $chunks){ if($count >= $this->maxCount){ break; } if(count($chunks) === 0){ unset($this->requestQueue[$levelID]); }else{ $key = key($chunks); Level::getXZ($key, $chunkX, $chunkZ); unset($this->requestQueue[$levelID][$key]); $this->generateChunk($levelID, $chunkX, $chunkZ); ++$count; } } } } public function shutdown(){ foreach($this->levels as $level){ $level->shutdown(); } $this->levels = []; } public function closeLevel($levelID){ if(isset($this->levels[$levelID])){ $this->levels[$levelID]->shutdown(); unset($this->levels[$levelID]); } } public function enqueueChunk($levelID, $chunkX, $chunkZ){ if(!isset($this->requestQueue[$levelID])){ $this->requestQueue[$levelID] = []; } if(!isset($this->requestQueue[$levelID][$index = Level::chunkHash($chunkX, $chunkZ)])){ $this->requestQueue[$levelID][$index] = 1; }else{ $this->requestQueue[$levelID][$index]++; arsort($this->requestQueue[$levelID]); } } /** * @param $levelID * @param $chunkX * @param $chunkZ * * @return FullChunk */ public function requestChunk($levelID, $chunkX, $chunkZ){ return $this->manager->getChunk($levelID, $chunkX, $chunkZ); } public function sendChunk($levelID, FullChunk $chunk){ $this->manager->receiveChunk($levelID, $chunk); } /** * @return \Logger */ public function getLogger(){ return $this->server->getLogger(); } }