pocketmine\level\Level::getSafeSpawn PHP Method

getSafeSpawn() public method

public getSafeSpawn ( Vector3 $spawn = null ) : boolean | Position
$spawn pocketmine\math\Vector3 default null
return boolean | Position
    public function getSafeSpawn($spawn = null)
    {
        if (!$spawn instanceof Vector3 or $spawn->y < 1) {
            $spawn = $this->getSpawnLocation();
        }
        if ($spawn instanceof Vector3) {
            $v = $spawn->floor();
            $chunk = $this->getChunk($v->x >> 4, $v->z >> 4, false);
            $x = $v->x & 0xf;
            $z = $v->z & 0xf;
            if ($chunk !== null) {
                $y = (int) min(126, $v->y);
                $wasAir = $chunk->getBlockId($x, $y - 1, $z) === 0;
                for (; $y > 0; --$y) {
                    $b = $chunk->getFullBlock($x, $y, $z);
                    $block = Block::get($b >> 4, $b & 0xf);
                    if ($this->isFullBlock($block)) {
                        if ($wasAir) {
                            $y++;
                            break;
                        }
                    } else {
                        $wasAir = true;
                    }
                }
                for (; $y >= 0 and $y < 128; ++$y) {
                    $b = $chunk->getFullBlock($x, $y + 1, $z);
                    $block = Block::get($b >> 4, $b & 0xf);
                    if (!$this->isFullBlock($block)) {
                        $b = $chunk->getFullBlock($x, $y, $z);
                        $block = Block::get($b >> 4, $b & 0xf);
                        if (!$this->isFullBlock($block)) {
                            return new Position($spawn->x, $y === (int) $spawn->y ? $spawn->y : $y, $spawn->z, $this);
                        }
                    } else {
                        ++$y;
                    }
                }
                $v->y = $y;
            }
            return new Position($spawn->x, $v->y, $spawn->z, $this);
        }
        return false;
    }

Usage Example

 /**
  * @param CommandSender $sender
  * @param Level $level
  */
 public function sendLevelInfo(CommandSender $sender, Level $level)
 {
     $sender->sendMessage("Name: " . $level->getName());
     $sender->sendMessage("Id: " . $level->getId());
     $sender->sendMessage("Entities: " . count($level->getEntities()));
     $sender->sendMessage("Players: " . count($level->getPlayers()));
     $sender->sendMessage("Tiles: " . count($level->getTiles()));
     $sender->sendMessage("Chunks: " . count($level->getChunks()));
     $sender->sendMessage("Loaders: " . count($level->getLoaders()));
     $sender->sendMessage("Spawn: " . $level->getSafeSpawn()->getFloorX() . ":" . $level->getSafeSpawn()->getFloorY() . ":" . $level->getSafeSpawn()->getFloorZ());
     $sender->sendMessage("Time: " . $level->getTime());
     $sender->sendMessage("Tick-rate: " . $level->getTickRate());
     $sender->sendMessage("Tick-rate-time: " . $level->getTickRateTime());
     $sender->sendMessage("Seed: " . $level->getSeed());
     $sender->sendMessage("Is-auto-saving: " . ($level->getAutoSave() ? TextFormat::GREEN . "yes" : TextFormat::RED . "no"));
     $sender->sendMessage("Is-generated: " . ($level->getServer()->isLevelGenerated($level->getName()) ? TextFormat::GREEN . "yes" : TextFormat::RED . "no"));
     $sender->sendMessage("Is-loaded: " . ($level->getServer()->isLevelLoaded($level->getName()) ? TextFormat::GREEN . "yes" : TextFormat::RED . "no"));
 }
Level