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 [];
     }
 }