pocketmine\level\Level::populateChunk PHP Метод

populateChunk() публичный Метод

public populateChunk ( integer $x, integer $z, boolean $force = false ) : boolean
$x integer
$z integer
$force boolean
Результат boolean
    public function populateChunk(int $x, int $z, bool $force = false) : bool
    {
        if (isset($this->chunkPopulationQueue[$index = Level::chunkHash($x, $z)]) or count($this->chunkPopulationQueue) >= $this->chunkPopulationQueueSize and !$force) {
            return false;
        }
        $chunk = $this->getChunk($x, $z, true);
        if (!$chunk->isPopulated()) {
            Timings::$populationTimer->startTiming();
            $populate = true;
            for ($xx = -1; $xx <= 1; ++$xx) {
                for ($zz = -1; $zz <= 1; ++$zz) {
                    if (isset($this->chunkPopulationLock[Level::chunkHash($x + $xx, $z + $zz)])) {
                        $populate = false;
                        break;
                    }
                }
            }
            if ($populate) {
                if (!isset($this->chunkPopulationQueue[$index])) {
                    $this->chunkPopulationQueue[$index] = true;
                    for ($xx = -1; $xx <= 1; ++$xx) {
                        for ($zz = -1; $zz <= 1; ++$zz) {
                            $this->chunkPopulationLock[Level::chunkHash($x + $xx, $z + $zz)] = true;
                        }
                    }
                    $task = new PopulationTask($this, $chunk);
                    $this->server->getScheduler()->scheduleAsyncTask($task);
                }
            }
            Timings::$populationTimer->stopTiming();
            return false;
        }
        return true;
    }

Usage Example

Пример #1
0
 /**
  * Generates a new level if it does not exists
  *
  * @param string $name
  * @param int    $seed
  * @param string $generator Class name that extends pocketmine\level\generator\Noise
  * @param array  $options
  *
  * @return bool
  */
 public function generateLevel($name, $seed = null, $generator = null, $options = [])
 {
     if (trim($name) === "" or $this->isLevelGenerated($name)) {
         return false;
     }
     $seed = $seed === null ? Binary::readInt(@Utils::getRandomBytes(4, false)) : (int) $seed;
     if (!isset($options["preset"])) {
         $options["preset"] = $this->getConfigString("generator-settings", "");
     }
     if (!($generator !== null and class_exists($generator, true) and is_subclass_of($generator, Generator::class))) {
         $generator = Generator::getGenerator($this->getLevelType());
     }
     if (($provider = LevelProviderManager::getProviderByName($providerName = $this->getProperty("level-settings.default-format", "mcregion"))) === null) {
         $provider = LevelProviderManager::getProviderByName($providerName = "mcregion");
     }
     try {
         $path = $this->getDataPath() . "worlds/" . $name . "/";
         /** @var \pocketmine\level\format\LevelProvider $provider */
         $provider::generate($path, $name, $seed, $generator, $options);
         $level = new Level($this, $name, $path, $provider);
         $this->levels[$level->getId()] = $level;
         $level->initLevel();
         $level->setTickRate($this->baseTickRate);
     } catch (\Exception $e) {
         $this->logger->error($this->getLanguage()->translateString("pocketmine.level.generateError", [$name, $e->getMessage()]));
         if ($this->logger instanceof MainLogger) {
             $this->logger->logException($e);
         }
         return false;
     }
     $this->getPluginManager()->callEvent(new LevelInitEvent($level));
     $this->getPluginManager()->callEvent(new LevelLoadEvent($level));
     $this->getLogger()->notice($this->getLanguage()->translateString("pocketmine.level.backgroundGeneration", [$name]));
     $centerX = $level->getSpawnLocation()->getX() >> 4;
     $centerZ = $level->getSpawnLocation()->getZ() >> 4;
     $order = [];
     for ($X = -3; $X <= 3; ++$X) {
         for ($Z = -3; $Z <= 3; ++$Z) {
             $distance = $X ** 2 + $Z ** 2;
             $chunkX = $X + $centerX;
             $chunkZ = $Z + $centerZ;
             $index = Level::chunkHash($chunkX, $chunkZ);
             $order[$index] = $distance;
         }
     }
     asort($order);
     foreach ($order as $index => $distance) {
         Level::getXZ($index, $chunkX, $chunkZ);
         $level->populateChunk($chunkX, $chunkZ, true);
     }
     return true;
 }
All Usage Examples Of pocketmine\level\Level::populateChunk
Level