Ejemplo n.º 1
0
 /**
  * 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($this->getLanguage()->translateString("pocketmine.level.notFound", [$name]));
         return false;
     }
     $path = $this->getDataPath() . "worlds/" . $name . "/";
     $provider = LevelProviderManager::getProvider($path);
     if ($provider === null) {
         $this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$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($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, $e->getMessage()]));
         if ($this->logger instanceof MainLogger) {
             $this->logger->logException($e);
         }
         return false;
     }
     $this->levels[$level->getId()] = $level;
     $level->initLevel();
     $this->getPluginManager()->callEvent(new LevelLoadEvent($level));
     $level->setTickRate($this->baseTickRate);
     return true;
 }
Ejemplo n.º 2
0
 /**
  * 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());
         if ($this->logger instanceof MainLogger) {
             $this->logger->logException($e);
         }
         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;
 }
Ejemplo n.º 3
0
 /**
  * @param \ClassLoader    $autoloader
  * @param \ThreadedLogger $logger
  * @param string          $filePath
  * @param string          $dataPath
  * @param string          $pluginPath
  */
 public function __construct(\ClassLoader $autoloader, \ThreadedLogger $logger, $filePath, $dataPath, $pluginPath)
 {
     self::$instance = $this;
     $this->autoloader = $autoloader;
     $this->logger = $logger;
     $this->filePath = $filePath;
     if (!file_exists($dataPath . "worlds/")) {
         mkdir($dataPath . "worlds/", 0777);
     }
     if (!file_exists($dataPath . "players/")) {
         mkdir($dataPath . "players/", 0777);
     }
     if (!file_exists($pluginPath)) {
         mkdir($pluginPath, 0777);
     }
     $this->dataPath = realpath($dataPath) . DIRECTORY_SEPARATOR;
     $this->pluginPath = realpath($pluginPath) . DIRECTORY_SEPARATOR;
     $this->console = new CommandReader();
     $version = new VersionString($this->getPocketMineVersion());
     $this->logger->info("Loading pocketmine.yml...");
     if (!file_exists($this->dataPath . "pocketmine.yml")) {
         $content = file_get_contents($this->filePath . "src/pocketmine/resources/pocketmine.yml");
         if ($version->isDev()) {
             $content = str_replace("preferred-channel: stable", "preferred-channel: beta", $content);
         }
         @file_put_contents($this->dataPath . "pocketmine.yml", $content);
     }
     $this->config = new Config($this->dataPath . "pocketmine.yml", Config::YAML, []);
     $this->logger->info("Loading server properties...");
     $this->properties = new Config($this->dataPath . "server.properties", Config::PROPERTIES, ["motd" => "Minecraft: PE Server", "server-port" => 19132, "white-list" => false, "announce-player-achievements" => true, "spawn-protection" => 16, "max-players" => 20, "allow-flight" => false, "spawn-animals" => true, "spawn-mobs" => true, "gamemode" => 0, "force-gamemode" => false, "hardcore" => false, "pvp" => true, "difficulty" => 1, "generator-settings" => "", "level-name" => "world", "level-seed" => "", "level-type" => "DEFAULT", "enable-query" => true, "enable-rcon" => false, "rcon.password" => substr(base64_encode(@Utils::getRandomBytes(20, false)), 3, 10), "auto-save" => true]);
     $this->forceLanguage = $this->getProperty("settings.force-language", false);
     $this->baseLang = new BaseLang($this->getProperty("settings.language", BaseLang::FALLBACK_LANGUAGE));
     $this->logger->info($this->getLanguage()->translateString("language.selected", [$this->getLanguage()->getName(), $this->getLanguage()->getLang()]));
     $this->memoryManager = new MemoryManager($this);
     $this->logger->info($this->getLanguage()->translateString("pocketmine.server.start", [TextFormat::AQUA . $this->getVersion()]));
     if (($poolSize = $this->getProperty("settings.async-workers", "auto")) === "auto") {
         $poolSize = ServerScheduler::$WORKERS;
         $processors = Utils::getCoreCount() - 2;
         if ($processors > 0) {
             $poolSize = max(1, $processors);
         }
     }
     ServerScheduler::$WORKERS = $poolSize;
     if ($this->getProperty("network.batch-threshold", 256) >= 0) {
         Network::$BATCH_THRESHOLD = (int) $this->getProperty("network.batch-threshold", 256);
     } else {
         Network::$BATCH_THRESHOLD = -1;
     }
     $this->networkCompressionLevel = $this->getProperty("network.compression-level", 7);
     $this->networkCompressionAsync = $this->getProperty("network.async-compression", true);
     $this->autoTickRate = (bool) $this->getProperty("level-settings.auto-tick-rate", true);
     $this->autoTickRateLimit = (int) $this->getProperty("level-settings.auto-tick-rate-limit", 20);
     $this->alwaysTickPlayers = (int) $this->getProperty("level-settings.always-tick-players", false);
     $this->baseTickRate = (int) $this->getProperty("level-settings.base-tick-rate", 1);
     $this->scheduler = new ServerScheduler();
     if ($this->getConfigBoolean("enable-rcon", false) === true) {
         $this->rcon = new RCON($this, $this->getConfigString("rcon.password", ""), $this->getConfigInt("rcon.port", $this->getPort()), ($ip = $this->getIp()) != "" ? $ip : "0.0.0.0", $this->getConfigInt("rcon.threads", 1), $this->getConfigInt("rcon.clients-per-thread", 50));
     }
     $this->entityMetadata = new EntityMetadataStore();
     $this->playerMetadata = new PlayerMetadataStore();
     $this->levelMetadata = new LevelMetadataStore();
     $this->operators = new Config($this->dataPath . "ops.txt", Config::ENUM);
     $this->whitelist = new Config($this->dataPath . "white-list.txt", Config::ENUM);
     if (file_exists($this->dataPath . "banned.txt") and !file_exists($this->dataPath . "banned-players.txt")) {
         @rename($this->dataPath . "banned.txt", $this->dataPath . "banned-players.txt");
     }
     @touch($this->dataPath . "banned-players.txt");
     $this->banByName = new BanList($this->dataPath . "banned-players.txt");
     $this->banByName->load();
     @touch($this->dataPath . "banned-ips.txt");
     $this->banByIP = new BanList($this->dataPath . "banned-ips.txt");
     $this->banByIP->load();
     $this->maxPlayers = $this->getConfigInt("max-players", 20);
     $this->setAutoSave($this->getConfigBoolean("auto-save", true));
     if ($this->getConfigString("memory-limit", false) !== false) {
         $this->logger->notice("The memory-limit setting has been deprecated.");
         $this->logger->notice("There are new memory settings on pocketmine.yml to tune memory and events.");
         $this->logger->notice("You can also reduce the amount of threads and chunks loaded control the memory usage.");
     }
     if ($this->getConfigBoolean("hardcore", false) === true and $this->getDifficulty() < 3) {
         $this->setConfigInt("difficulty", 3);
     }
     define("pocketmine\\DEBUG", (int) $this->getProperty("debug.level", 1));
     if ($this->logger instanceof MainLogger) {
         $this->logger->setLogDebug(\pocketmine\DEBUG > 1);
     }
     if (\pocketmine\DEBUG >= 0) {
         @cli_set_process_title($this->getName() . " " . $this->getPocketMineVersion());
     }
     $this->logger->info($this->getLanguage()->translateString("pocketmine.server.networkStart", [$this->getIp() === "" ? "*" : $this->getIp(), $this->getPort()]));
     define("BOOTUP_RANDOM", @Utils::getRandomBytes(16));
     $this->serverID = Utils::getMachineUniqueId($this->getIp() . $this->getPort());
     $this->getLogger()->debug("Server unique id: " . $this->getServerUniqueId());
     $this->getLogger()->debug("Machine unique id: " . Utils::getMachineUniqueId());
     $this->network = new Network($this);
     $this->network->setName($this->getMotd());
     $this->logger->info($this->getLanguage()->translateString("pocketmine.server.info", [$this->getName(), ($version->isDev() ? TextFormat::YELLOW : "") . $version->get(true) . TextFormat::WHITE, $this->getCodename(), $this->getApiVersion()]));
     $this->logger->info($this->getLanguage()->translateString("pocketmine.server.license", [$this->getName()]));
     Timings::init();
     $this->consoleSender = new ConsoleCommandSender();
     $this->commandMap = new SimpleCommandMap($this);
     $this->registerEntities();
     $this->registerTiles();
     InventoryType::init();
     Block::init();
     Item::init();
     Biome::init();
     Effect::init();
     /** TODO: @deprecated */
     TextWrapper::init();
     $this->craftingManager = new CraftingManager();
     $this->pluginManager = new PluginManager($this, $this->commandMap);
     $this->pluginManager->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this->consoleSender);
     $this->pluginManager->setUseTimings($this->getProperty("settings.enable-profiling", false));
     $this->profilingTickRate = (double) $this->getProperty("settings.profile-report-trigger", 20);
     $this->pluginManager->registerInterface(PharPluginLoader::class);
     $this->pluginManager->registerInterface(ScriptPluginLoader::class);
     set_exception_handler([$this, "exceptionHandler"]);
     register_shutdown_function([$this, "crashDump"]);
     $this->queryRegenerateTask = new QueryRegenerateEvent($this, 5);
     $this->network->registerInterface(new RakLibInterface($this));
     $this->pluginManager->loadPlugins($this->pluginPath);
     $this->updater = new AutoUpdater($this, $this->getProperty("auto-updater.host", "www.pocketmine.net"));
     $this->enablePlugins(PluginLoadOrder::STARTUP);
     LevelProviderManager::addProvider($this, Anvil::class);
     LevelProviderManager::addProvider($this, McRegion::class);
     if (extension_loaded("leveldb")) {
         $this->logger->debug($this->getLanguage()->translateString("pocketmine.debug.enable"));
         LevelProviderManager::addProvider($this, LevelDB::class);
     }
     Generator::addGenerator(Flat::class, "flat");
     Generator::addGenerator(Normal::class, "normal");
     Generator::addGenerator(Normal::class, "default");
     foreach ((array) $this->getProperty("worlds", []) as $name => $worldSetting) {
         if ($this->loadLevel($name) === false) {
             $seed = $this->getProperty("worlds.{$name}.seed", time());
             $options = explode(":", $this->getProperty("worlds.{$name}.generator", Generator::getGenerator("default")));
             $generator = Generator::getGenerator(array_shift($options));
             if (count($options) > 0) {
                 $options = ["preset" => implode(":", $options)];
             } else {
                 $options = [];
             }
             $this->generateLevel($name, $seed, $generator, $options);
         }
     }
     if ($this->getDefaultLevel() === null) {
         $default = $this->getConfigString("level-name", "world");
         if (trim($default) == "") {
             $this->getLogger()->warning("level-name cannot be null, using default");
             $default = "world";
             $this->setConfigString("level-name", "world");
         }
         if ($this->loadLevel($default) === false) {
             $seed = $this->getConfigInt("level-seed", time());
             $this->generateLevel($default, $seed === 0 ? time() : $seed);
         }
         $this->setDefaultLevel($this->getLevelByName($default));
     }
     $this->properties->save(true);
     if (!$this->getDefaultLevel() instanceof Level) {
         $this->getLogger()->emergency($this->getLanguage()->translateString("pocketmine.level.defaultError"));
         $this->forceShutdown();
         return;
     }
     if ($this->getProperty("ticks-per.autosave", 6000) > 0) {
         $this->autoSaveTicks = (int) $this->getProperty("ticks-per.autosave", 6000);
     }
     $this->enablePlugins(PluginLoadOrder::POSTWORLD);
     $this->start();
 }
Ejemplo n.º 4
0
 /**
  * @param \ClassLoader    $autoloader
  * @param \ThreadedLogger $logger
  * @param string          $filePath
  * @param string          $dataPath
  * @param string          $pluginPath
  */
 public function __construct(\ClassLoader $autoloader, \ThreadedLogger $logger, $filePath, $dataPath, $pluginPath)
 {
     self::$instance = $this;
     self::$sleeper = new \Threaded();
     $this->autoloader = $autoloader;
     $this->logger = $logger;
     $this->filePath = $filePath;
     try {
         if (!file_exists($dataPath . "worlds/")) {
             mkdir($dataPath . "worlds/", 0777);
         }
         if (!file_exists($dataPath . "players/")) {
             mkdir($dataPath . "players/", 0777);
         }
         if (!file_exists($pluginPath)) {
             mkdir($pluginPath, 0777);
         }
         if (!file_exists($dataPath . "crashdumps/")) {
             mkdir($dataPath . "crashdumps/", 0777);
         }
         $this->dataPath = realpath($dataPath) . DIRECTORY_SEPARATOR;
         $this->pluginPath = realpath($pluginPath) . DIRECTORY_SEPARATOR;
         $this->console = new CommandReader();
         $version = new VersionString($this->getPocketMineVersion());
         $this->version = $version;
         $this->aboutstring = "\n\n\t\t   §5PocketMine-iTX §3Genisys §fis a fork of PocketMine-MP.\n\t\t   Powered by §5iTX Technologies LLC.\n\t\t   §fVersion: §6" . $this->getPocketMineVersion() . "\n\t\t   §fClient Version: §d0.13.1 alpha\n\t\t   §fYou could get the lastest code on https://github.com/iTXTech/Genisys\n\t\t   §fDonate link: http://pl.zxda.net/plugins/203.html\n\t\t   §f如果你在免费使用本核心,希望你可以进入上面的链接捐赠给我们,这会成为我们前进的动力。\n\t\t\n";
         $this->about();
         $this->logger->info("Loading pocketmine.yml...");
         if (!file_exists($this->dataPath . "pocketmine.yml")) {
             $content = file_get_contents($this->filePath . "src/pocketmine/resources/pocketmine.yml");
             if ($version->isDev()) {
                 $content = str_replace("preferred-channel: stable", "preferred-channel: beta", $content);
             }
             @file_put_contents($this->dataPath . "pocketmine.yml", $content);
         }
         $this->config = new Config($this->dataPath . "pocketmine.yml", Config::YAML, []);
         $this->logger->info("Loading genisys.yml...");
         $lang = $this->getProperty("settings.language", BaseLang::FALLBACK_LANGUAGE);
         if (file_exists($this->filePath . "src/pocketmine/resources/genisys_{$lang}.yml")) {
             $content = file_get_contents($file = $this->filePath . "src/pocketmine/resources/genisys_{$lang}.yml");
         } else {
             $content = file_get_contents($file = $this->filePath . "src/pocketmine/resources/genisys_eng.yml");
         }
         if (!file_exists($this->dataPath . "genisys.yml")) {
             @file_put_contents($this->dataPath . "genisys.yml", $content);
         }
         $internelConfig = new Config($file, Config::YAML, []);
         $this->advancedConfig = new Config($this->dataPath . "genisys.yml", Config::YAML, []);
         $cfgVer = $this->getAdvancedProperty("config.version", 0, $internelConfig);
         $advVer = $this->getAdvancedProperty("config.version", 0);
         $this->loadAdvancedConfig();
         if ($this->expWriteAhead > 0) {
             $this->generateExpCache($this->expWriteAhead);
         }
         $this->logger->info("Loading server properties...");
         $this->properties = new Config($this->dataPath . "server.properties", Config::PROPERTIES, ["motd" => "Minecraft: PE Server", "server-port" => 19132, "white-list" => false, "announce-player-achievements" => true, "spawn-protection" => 16, "max-players" => 20, "allow-flight" => false, "spawn-animals" => true, "spawn-mobs" => true, "gamemode" => 0, "force-gamemode" => false, "hardcore" => false, "pvp" => true, "difficulty" => 1, "generator-settings" => "", "level-name" => "world", "level-seed" => "", "level-type" => "DEFAULT", "enable-query" => true, "enable-rcon" => false, "rcon.password" => substr(base64_encode(@Utils::getRandomBytes(20, false)), 3, 10), "auto-save" => true]);
         $this->forceLanguage = $this->getProperty("settings.force-language", false);
         $this->baseLang = new BaseLang($this->getProperty("settings.language", BaseLang::FALLBACK_LANGUAGE));
         $this->logger->info($this->getLanguage()->translateString("language.selected", [$this->getLanguage()->getName(), $this->getLanguage()->getLang()]));
         $this->memoryManager = new MemoryManager($this);
         $this->logger->info($this->getLanguage()->translateString("pocketmine.server.start", [TextFormat::AQUA . $this->getVersion()]));
         if (($poolSize = $this->getProperty("settings.async-workers", "auto")) === "auto") {
             $poolSize = ServerScheduler::$WORKERS;
             $processors = Utils::getCoreCount() - 2;
             if ($processors > 0) {
                 $poolSize = max(1, $processors);
             }
         }
         ServerScheduler::$WORKERS = $poolSize;
         if ($this->getProperty("network.batch-threshold", 256) >= 0) {
             Network::$BATCH_THRESHOLD = (int) $this->getProperty("network.batch-threshold", 256);
         } else {
             Network::$BATCH_THRESHOLD = -1;
         }
         $this->networkCompressionLevel = $this->getProperty("network.compression-level", 7);
         $this->networkCompressionAsync = $this->getProperty("network.async-compression", true);
         $this->autoTickRate = (bool) $this->getProperty("level-settings.auto-tick-rate", true);
         $this->autoTickRateLimit = (int) $this->getProperty("level-settings.auto-tick-rate-limit", 20);
         $this->alwaysTickPlayers = (int) $this->getProperty("level-settings.always-tick-players", false);
         $this->baseTickRate = (int) $this->getProperty("level-settings.base-tick-rate", 1);
         $this->scheduler = new ServerScheduler();
         if ($this->getConfigBoolean("enable-rcon", false) === true) {
             $this->rcon = new RCON($this, $this->getConfigString("rcon.password", ""), $this->getConfigInt("rcon.port", $this->getPort()), ($ip = $this->getIp()) != "" ? $ip : "0.0.0.0", $this->getConfigInt("rcon.threads", 1), $this->getConfigInt("rcon.clients-per-thread", 50));
         }
         $this->entityMetadata = new EntityMetadataStore();
         $this->playerMetadata = new PlayerMetadataStore();
         $this->levelMetadata = new LevelMetadataStore();
         $this->operators = new Config($this->dataPath . "ops.txt", Config::ENUM);
         $this->whitelist = new Config($this->dataPath . "white-list.txt", Config::ENUM);
         if (file_exists($this->dataPath . "banned.txt") and !file_exists($this->dataPath . "banned-players.txt")) {
             @rename($this->dataPath . "banned.txt", $this->dataPath . "banned-players.txt");
         }
         @touch($this->dataPath . "banned-players.txt");
         $this->banByName = new BanList($this->dataPath . "banned-players.txt");
         $this->banByName->load();
         @touch($this->dataPath . "banned-ips.txt");
         $this->banByIP = new BanList($this->dataPath . "banned-ips.txt");
         $this->banByIP->load();
         @touch($this->dataPath . "banned-cids.txt");
         $this->banByCID = new BanList($this->dataPath . "banned-cids.txt");
         $this->banByCID->load();
         $this->maxPlayers = $this->getConfigInt("max-players", 20);
         $this->setAutoSave($this->getConfigBoolean("auto-save", true));
         if ($this->getConfigBoolean("hardcore", false) === true and $this->getDifficulty() < 3) {
             $this->setConfigInt("difficulty", 3);
         }
         define("pocketmine\\DEBUG", (int) $this->getProperty("debug.level", 1));
         if ($this->logger instanceof MainLogger) {
             $this->logger->setLogDebug(\pocketmine\DEBUG > 1);
         }
         if (\pocketmine\DEBUG >= 0) {
             @cli_set_process_title($this->getName() . " " . $this->getPocketMineVersion());
         }
         $this->logger->info($this->getLanguage()->translateString("pocketmine.server.networkStart", [$this->getIp() === "" ? "*" : $this->getIp(), $this->getPort()]));
         define("BOOTUP_RANDOM", @Utils::getRandomBytes(16));
         $this->serverID = Utils::getMachineUniqueId($this->getIp() . $this->getPort());
         $this->getLogger()->debug("Server unique id: " . $this->getServerUniqueId());
         $this->getLogger()->debug("Machine unique id: " . Utils::getMachineUniqueId());
         $this->network = new Network($this);
         $this->network->setName($this->getMotd());
         $this->logger->info($this->getLanguage()->translateString("pocketmine.server.info", [$this->getName(), $this->getPocketMineVersion(), $this->getCodename(), $this->getApiVersion()]));
         $this->logger->info($this->getLanguage()->translateString("pocketmine.server.license", [$this->getName()]));
         Timings::init();
         $this->consoleSender = new ConsoleCommandSender();
         $this->commandMap = new SimpleCommandMap($this);
         $this->registerEntities();
         $this->registerTiles();
         InventoryType::init(min(32, $this->inventoryNum));
         //Bigger than 32 with cause problems
         Block::init();
         Item::init();
         Biome::init();
         Effect::init();
         Enchantment::init();
         Attribute::init();
         /** TODO: @deprecated */
         //TextWrapper::init();
         $this->craftingManager = new CraftingManager($this->readRecipesFromJson);
         $this->pluginManager = new PluginManager($this, $this->commandMap);
         $this->pluginManager->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this->consoleSender);
         $this->pluginManager->setUseTimings($this->getProperty("settings.enable-profiling", false));
         $this->profilingTickRate = (double) $this->getProperty("settings.profile-report-trigger", 20);
         $this->pluginManager->registerInterface(PharPluginLoader::class);
         $this->pluginManager->registerInterface(FolderPluginLoader::class);
         $this->pluginManager->registerInterface(ScriptPluginLoader::class);
         //set_exception_handler([$this, "exceptionHandler"]);
         register_shutdown_function([$this, "crashDump"]);
         $this->queryRegenerateTask = new QueryRegenerateEvent($this, 5);
         $this->network->registerInterface(new RakLibInterface($this));
         $this->pluginManager->loadPlugins($this->pluginPath);
         //$this->updater = new AutoUpdater($this, $this->getProperty("auto-updater.host", "www.pocketmine.net"));
         $this->enablePlugins(PluginLoadOrder::STARTUP);
         LevelProviderManager::addProvider($this, Anvil::class);
         LevelProviderManager::addProvider($this, McRegion::class);
         if (extension_loaded("leveldb")) {
             $this->logger->debug($this->getLanguage()->translateString("pocketmine.debug.enable"));
             LevelProviderManager::addProvider($this, LevelDB::class);
         }
         Generator::addGenerator(Flat::class, "flat");
         Generator::addGenerator(Normal::class, "normal");
         Generator::addGenerator(Normal::class, "default");
         Generator::addGenerator(Nether::class, "hell");
         Generator::addGenerator(Nether::class, "nether");
         foreach ((array) $this->getProperty("worlds", []) as $name => $worldSetting) {
             if ($this->loadLevel($name) === false) {
                 $seed = $this->getProperty("worlds.{$name}.seed", time());
                 $options = explode(":", $this->getProperty("worlds.{$name}.generator", Generator::getGenerator("default")));
                 $generator = Generator::getGenerator(array_shift($options));
                 if (count($options) > 0) {
                     $options = ["preset" => implode(":", $options)];
                 } else {
                     $options = [];
                 }
                 $this->generateLevel($name, $seed, $generator, $options);
             }
         }
         if ($this->getDefaultLevel() === null) {
             $default = $this->getConfigString("level-name", "world");
             if (trim($default) == "") {
                 $this->getLogger()->warning("level-name cannot be null, using default");
                 $default = "world";
                 $this->setConfigString("level-name", "world");
             }
             if ($this->loadLevel($default) === false) {
                 $seed = $this->getConfigInt("level-seed", time());
                 $this->generateLevel($default, $seed === 0 ? time() : $seed);
             }
             $this->setDefaultLevel($this->getLevelByName($default));
         }
         $this->properties->save(true);
         if (!$this->getDefaultLevel() instanceof Level) {
             $this->getLogger()->emergency($this->getLanguage()->translateString("pocketmine.level.defaultError"));
             $this->forceShutdown();
             return;
         }
         if ($this->netherEnabled) {
             if (!$this->loadLevel($this->netherName)) {
                 //$this->logger->info("正在生成地狱 ".$this->netherName);
                 $this->generateLevel($this->netherName, time(), Generator::getGenerator("nether"));
             }
             $this->netherLevel = $this->getLevelByName($this->netherName);
         }
         if ($this->getProperty("ticks-per.autosave", 6000) > 0) {
             $this->autoSaveTicks = (int) $this->getProperty("ticks-per.autosave", 6000);
         }
         $this->enablePlugins(PluginLoadOrder::POSTWORLD);
         if ($this->aiEnabled) {
             $this->aiHolder = new AIHolder($this);
         }
         if ($this->dserverConfig["enable"] and $this->getAdvancedProperty("dserver.server-list", "") != "") {
             $this->scheduler->scheduleRepeatingTask(new CallbackTask([$this, "updateDServerInfo"]), $this->dserverConfig["timer"]);
         }
         if ($cfgVer != $advVer) {
             $this->logger->notice("Your genisys.yml needs update");
             $this->logger->notice("Current Version: {$advVer}   Latest Version: {$cfgVer}");
         }
         $this->generateRecipeList();
         $this->start();
     } catch (\Throwable $e) {
         $this->exceptionHandler($e);
     }
 }
Ejemplo n.º 5
0
 /**
  * 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($this->getLanguage()->translateString("pocketmine.level.notFound", [$name]));
         return false;
     }
     $path = $this->getDataPath() . "worlds/" . $name . "/";
     $provider = LevelProviderManager::getProvider($path);
     if ($provider === null) {
         $this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, "Unknown provider"]));
         return false;
     }
     try {
         $level = new Level($this, $name, $path, $provider);
     } catch (\Throwable $e) {
         $this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, $e->getMessage()]));
         $this->logger->logException($e);
         return false;
     }
     $this->levels[$level->getId()] = $level;
     $level->initLevel();
     $this->getPluginManager()->callEvent(new LevelLoadEvent($level));
     $level->setTickRate($this->baseTickRate);
     return true;
 }