/** * 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; }
/** * 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\Generator * @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 ($generator !== null and class_exists($generator) and is_subclass_of($generator, Generator::class)) { $generator = new $generator($options); } else { $options["preset"] = $this->getConfigString("generator-settings", ""); $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(); } catch (\Exception $e) { $this->logger->error("Could not generate level \"" . $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("Spawn terrain for level \"{$name}\" is being generated in the background"); $radiusSquared = ($this->getViewDistance() + 1) / M_PI; $radius = ceil(sqrt($radiusSquared)); $centerX = $level->getSpawnLocation()->getX() >> 4; $centerZ = $level->getSpawnLocation()->getZ() >> 4; $order = []; for ($X = -$radius; $X <= $radius; ++$X) { for ($Z = -$radius; $Z <= $radius; ++$Z) { $distance = $X ** 2 + $Z ** 2; if ($distance > $radiusSquared) { continue; } $chunkX = $X + $centerX; $chunkZ = $Z + $centerZ; $index = Level::chunkHash($chunkX, $chunkZ); $order[$index] = $distance; } } asort($order); $chunkX = $chunkZ = null; foreach ($order as $index => $distance) { Level::getXZ($index, $chunkX, $chunkZ); $level->generateChunk($chunkX, $chunkZ); } return true; }
/** * 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\Generator * @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 ? PHP_INT_SIZE === 8 ? unpack("N", @Utils::getRandomBytes(4, false))[1] << 32 >> 32 : unpack("N", @Utils::getRandomBytes(4, false))[1] : (int) $seed; if ($generator !== null and class_exists($generator) and is_subclass_of($generator, Generator::class)) { $generator = new $generator($options); } else { $options["preset"] = $this->getConfigString("generator-settings", ""); $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(); } catch (\Exception $e) { $this->logger->error("Could not generate level \"" . $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("Spawn terrain for level \"{$name}\" is being generated in the background"); $centerX = $level->getSpawnLocation()->getX() >> 4; $centerZ = $level->getSpawnLocation()->getZ() >> 4; $order = []; for ($X = -4; $X <= 4; ++$X) { for ($Z = -4; $Z <= 4; ++$Z) { $distance = $X ** 2 + $Z ** 2; $chunkX = $X + $centerX; $chunkZ = $Z + $centerZ; $index = PHP_INT_SIZE === 8 ? ($chunkX & 0xffffffff) << 32 | $chunkZ & 0xffffffff : $chunkX . ":" . $chunkZ; $order[$index] = $distance; } } asort($order); $chunkX = $chunkZ = null; foreach ($order as $index => $distance) { if (PHP_INT_SIZE === 8) { $chunkX = $index >> 32 << 32 >> 32; $chunkZ = ($index & 0xffffffff) << 32 >> 32; } else { list($chunkX, $chunkZ) = explode(":", $index); $chunkX = (int) $chunkX; $chunkZ = (int) $chunkZ; } $level->generateChunk($chunkX, $chunkZ, true); } return true; }
/** * 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 ? \PHP_INT_SIZE === 8 ? \unpack("N", @Utils::getRandomBytes(4, \false))[1] << 32 >> 32 : \unpack("N", @Utils::getRandomBytes(4, \false))[1] : (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 = \PHP_INT_SIZE === 8 ? ($chunkX & 4294967295.0) << 32 | $chunkZ & 4294967295.0 : $chunkX . ":" . $chunkZ; $order[$index] = $distance; } } \asort($order); foreach ($order as $index => $distance) { if (\PHP_INT_SIZE === 8) { $chunkX = $index >> 32 << 32 >> 32; $chunkZ = ($index & 4294967295.0) << 32 >> 32; } else { list($chunkX, $chunkZ) = \explode(":", $index); $chunkX = (int) $chunkX; $chunkZ = (int) $chunkZ; } $level->populateChunk($chunkX, $chunkZ, \true); } return \true; }
public function transferPlayer(Player $player, $address, $port = 19132) { $this->logger->error("This function (transferPlayer) has been deprecated. A new method may be available soon"); }
/** * Loads a level from the data directory * * @param string $name * * @return bool * * @throws LevelException */ public function loadLevel($name) { if (trim($name) === "") { throw new LevelException("Invalid empty level name"); } if ($this->isLevelLoaded($name)) { return true; } elseif (!$this->isLevelGenerated($name)) { $this->logger->notice("Level \"" . $name . "\" not found"); return false; } $path = $this->getDataPath() . "worlds/" . $name . "/"; $provider = LevelProviderManager::getProvider($path); if ($provider === null) { $this->logger->error("Could not load level \"" . $name . "\": Unknown provider"); return false; } //$entities = new Config($path."entities.yml", Config::YAML); //if(file_exists($path . "tileEntities.yml")){ // @rename($path . "tileEntities.yml", $path . "tiles.yml"); //} try { $level = new Level($this, $name, $path, $provider); } catch (\Exception $e) { $this->logger->error("Could not load level \"" . $name . "\": " . $e->getMessage()); return false; } $this->levels[$level->getId()] = $level; $level->initLevel(); $this->getPluginManager()->callEvent(new LevelLoadEvent($level)); /*foreach($entities->getAll() as $entity){ if(!isset($entity["id"])){ break; } if($entity["id"] === 64){ //Item Drop $e = $this->server->api->entity->add($this->levels[$name], ENTITY_ITEM, $entity["Item"]["id"], array( "meta" => $entity["Item"]["Damage"], "stack" => $entity["Item"]["Count"], "x" => $entity["Pos"][0], "y" => $entity["Pos"][1], "z" => $entity["Pos"][2], "yaw" => $entity["Rotation"][0], "pitch" => $entity["Rotation"][1], )); }elseif($entity["id"] === FALLING_SAND){ $e = $this->server->api->entity->add($this->levels[$name], ENTITY_FALLING, $entity["id"], $entity); $e->setPosition(new Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]); $e->setHealth($entity["Health"]); }elseif($entity["id"] === OBJECT_PAINTING or $entity["id"] === OBJECT_ARROW){ //Painting $e = $this->server->api->entity->add($this->levels[$name], ENTITY_OBJECT, $entity["id"], $entity); $e->setPosition(new Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]); $e->setHealth(1); }else{ $e = $this->server->api->entity->add($this->levels[$name], ENTITY_MOB, $entity["id"], $entity); $e->setPosition(new Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]); $e->setHealth($entity["Health"]); } }*/ /*if(file_exists($path . "tiles.yml")){ $tiles = new Config($path . "tiles.yml", Config::YAML); foreach($tiles->getAll() as $tile){ if(!isset($tile["id"])){ continue; } $level->loadChunk($tile["x"] >> 4, $tile["z"] >> 4); $nbt = new Compound(false, []); foreach($tile as $index => $data){ switch($index){ case "Items": $tag = new Enum("Items", []); $tag->setTagType(NBT::TAG_Compound); foreach($data as $slot => $fields){ $tag[(int) $slot] = new Compound(false, array( "Count" => new Byte("Count", $fields["Count"]), "Slot" => new Short("Slot", $fields["Slot"]), "Damage" => new Short("Damage", $fields["Damage"]), "id" => new String("id", $fields["id"]) )); } $nbt["Items"] = $tag; break; case "id": case "Text1": case "Text2": case "Text3": case "Text4": $nbt[$index] = new String($index, $data); break; case "x": case "y": case "z": case "pairx": case "pairz": $nbt[$index] = new Int($index, $data); break; case "BurnTime": case "CookTime": case "MaxTime": $nbt[$index] = new Short($index, $data); break; } } switch($tile["id"]){ case Tile::FURNACE: new Furnace($level, $nbt); break; case Tile::CHEST: new Chest($level, $nbt); break; case Tile::SIGN: new Sign($level, $nbt); break; } } unlink($path . "tiles.yml"); $level->save(true, true); }*/ return true; }
/** * Generates a new level if it does not exists * * @param string $name * @param int $seed * @param array $options * * @return bool */ public function generateLevel($name, $seed = null, $options = []) { if (trim($name) === "" or $this->isLevelGenerated($name)) { return false; } $seed = $seed === null ? PHP_INT_SIZE === 8 ? unpack("N", @Utils::getRandomBytes(4, false))[1] << 32 >> 32 : unpack("N", @Utils::getRandomBytes(4, false))[1] : (int) $seed; 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, $options); $level = new Level($this, $name, $path, $provider); $this->levels[$level->getId()] = $level; $level->initLevel(); } catch (\Exception $e) { $this->logger->error("Could not generate level \"" . $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)); $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->generateChunk($chunkX, $chunkZ, true); } return true; }
public function transferPlayer(Player $player, $address, $port = 19132) { $this->logger->error("This function (transferPlayer) has been deprecated."); }