public static function reload() { if (Server::getInstance()->getPluginManager()->useTimings()) { foreach (self::$HANDLERS as $timings) { $timings->reset(); } TimingsCommand::$timingStart = microtime(true); } }
/** * @param string $directory * @param array $newLoaders * * @return Plugin[] */ public function loadPlugins($directory, $newLoaders = null) { if (is_dir($directory)) { $plugins = []; $loadedPlugins = []; $dependencies = []; $softDependencies = []; if (is_array($newLoaders)) { $loaders = []; foreach ($newLoaders as $key) { if (isset($this->fileAssociations[$key])) { $loaders[$key] = $this->fileAssociations[$key]; } } } else { $loaders = $this->fileAssociations; } foreach ($loaders as $loader) { foreach (new \RegexIterator(new \DirectoryIterator($directory), $loader->getPluginFilters()) as $file) { if ($file === "." or $file === "..") { continue; } $file = $directory . $file; try { $description = $loader->getPluginDescription($file); if ($description instanceof PluginDescription) { $name = $description->getName(); if (stripos($name, "BukkitPE") !== false or stripos($name, "minecraft") !== false or stripos($name, "mojang") !== false) { $this->server->getLogger()->error($this->server->getLanguage()->translateString("BukkitPE.plugin.loadError", [$name, "%BukkitPE.plugin.restrictedName"])); continue; } elseif (strpos($name, " ") !== false) { $this->server->getLogger()->warning($this->server->getLanguage()->translateString("BukkitPE.plugin.spacesDiscouraged", [$name])); } if (isset($plugins[$name]) or $this->getPlugin($name) instanceof Plugin) { $this->server->getLogger()->error($this->server->getLanguage()->translateString("BukkitPE.plugin.duplicateError", [$name])); continue; } $compatible = false; //Check multiple dependencies foreach ($description->getCompatibleApis() as $version) { //Format: majorVersion.minorVersion.patch $version = array_map("intval", explode(".", $version)); $apiVersion = array_map("intval", explode(".", $this->server->getApiVersion())); //Completely different API version if ($version[0] !== $apiVersion[0]) { continue; } //If the plugin requires new API features, being backwards compatible if ($version[1] > $apiVersion[1]) { continue; } $compatible = true; break; } if ($compatible === false) { $this->server->getLogger()->error($this->server->getLanguage()->translateString("BukkitPE.plugin.loadError", [$name, "%BukkitPE.plugin.incompatibleAPI"])); continue; } $plugins[$name] = $file; $softDependencies[$name] = (array) $description->getSoftDepend(); $dependencies[$name] = (array) $description->getDepend(); foreach ($description->getLoadBefore() as $before) { if (isset($softDependencies[$before])) { $softDependencies[$before][] = $name; } else { $softDependencies[$before] = [$name]; } } } } catch (\Exception $e) { $this->server->getLogger()->error($this->server->getLanguage()->translateString("BukkitPE.plugin.fileError", [$file, $directory, $e->getMessage()])); $logger = $this->server->getLogger(); if ($logger instanceof MainLogger) { $logger->logException($e); } } } } while (count($plugins) > 0) { $missingDependency = true; foreach ($plugins as $name => $file) { if (isset($dependencies[$name])) { foreach ($dependencies[$name] as $key => $dependency) { if (isset($loadedPlugins[$dependency]) or $this->getPlugin($dependency) instanceof Plugin) { unset($dependencies[$name][$key]); } elseif (!isset($plugins[$dependency])) { $this->server->getLogger()->critical($this->server->getLanguage()->translateString("BukkitPE.plugin.loadError", [$name, "%BukkitPE.plugin.unknownDependency"])); break; } } if (count($dependencies[$name]) === 0) { unset($dependencies[$name]); } } if (isset($softDependencies[$name])) { foreach ($softDependencies[$name] as $key => $dependency) { if (isset($loadedPlugins[$dependency]) or $this->getPlugin($dependency) instanceof Plugin) { unset($softDependencies[$name][$key]); } } if (count($softDependencies[$name]) === 0) { unset($softDependencies[$name]); } } if (!isset($dependencies[$name]) and !isset($softDependencies[$name])) { unset($plugins[$name]); $missingDependency = false; if ($plugin = $this->loadPlugin($file, $loaders) and $plugin instanceof Plugin) { $loadedPlugins[$name] = $plugin; } else { $this->server->getLogger()->critical($this->server->getLanguage()->translateString("BukkitPE.plugin.genericLoadError", [$name])); } } } if ($missingDependency === true) { foreach ($plugins as $name => $file) { if (!isset($dependencies[$name])) { unset($softDependencies[$name]); unset($plugins[$name]); $missingDependency = false; if ($plugin = $this->loadPlugin($file, $loaders) and $plugin instanceof Plugin) { $loadedPlugins[$name] = $plugin; } else { $this->server->getLogger()->critical($this->server->getLanguage()->translateString("BukkitPE.plugin.genericLoadError", [$name])); } } } //No plugins loaded :( if ($missingDependency === true) { foreach ($plugins as $name => $file) { $this->server->getLogger()->critical($this->server->getLanguage()->translateString("BukkitPE.plugin.loadError", [$name, "%BukkitPE.plugin.circularDependency"])); } $plugins = []; } } } TimingsCommand::$timingStart = microtime(true); return $loadedPlugins; } else { TimingsCommand::$timingStart = microtime(true); return []; } }