diff --git a/src/pocketmine/plugin/PluginManager.php b/src/pocketmine/plugin/PluginManager.php index 6f84361bf..0906b7563 100644 --- a/src/pocketmine/plugin/PluginManager.php +++ b/src/pocketmine/plugin/PluginManager.php @@ -199,122 +199,140 @@ class PluginManager{ * @return Plugin[] */ public function loadPlugins(string $directory, array $newLoaders = null){ + if(!is_dir($directory)){ + return []; + } - 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]; - } + $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 \DirectoryIterator($directory) as $file){ - if($file === "." or $file === ".."){ + }else{ + $loaders = $this->fileAssociations; + } + foreach($loaders as $loader){ + foreach(new \DirectoryIterator($directory) as $file){ + if($file === "." or $file === ".."){ + continue; + } + $file = $directory . $file; + if(!$loader->canLoadPlugin($file)){ + continue; + } + try{ + $description = $loader->getPluginDescription($file); + if($description === null){ continue; } - $file = $directory . $file; - if(!$loader->canLoadPlugin($file)){ + + $name = $description->getName(); + if(stripos($name, "pocketmine") !== false or stripos($name, "minecraft") !== false or stripos($name, "mojang") !== false){ + $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [$name, "%pocketmine.plugin.restrictedName"])); + continue; + }elseif(strpos($name, " ") !== false){ + $this->server->getLogger()->warning($this->server->getLanguage()->translateString("pocketmine.plugin.spacesDiscouraged", [$name])); + } + + if(isset($plugins[$name]) or $this->getPlugin($name) instanceof Plugin){ + $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.duplicateError", [$name])); continue; } - try{ - $description = $loader->getPluginDescription($file); - if($description instanceof PluginDescription){ - $name = $description->getName(); - if(stripos($name, "pocketmine") !== false or stripos($name, "minecraft") !== false or stripos($name, "mojang") !== false){ - $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [$name, "%pocketmine.plugin.restrictedName"])); - continue; - }elseif(strpos($name, " ") !== false){ - $this->server->getLogger()->warning($this->server->getLanguage()->translateString("pocketmine.plugin.spacesDiscouraged", [$name])); - } - if(isset($plugins[$name]) or $this->getPlugin($name) instanceof Plugin){ - $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.duplicateError", [$name])); - continue; - } + if(!$this->isCompatibleApi(...$description->getCompatibleApis())){ + $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [ + $name, + $this->server->getLanguage()->translateString("%pocketmine.plugin.incompatibleAPI", [implode(", ", $description->getCompatibleApis())]) + ])); + continue; + } - if(!$this->isCompatibleApi(...$description->getCompatibleApis())){ - $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [ - $name, - $this->server->getLanguage()->translateString("%pocketmine.plugin.incompatibleAPI", [implode(", ", $description->getCompatibleApis())]) - ])); - continue; - } - - if(count($pluginMcpeProtocols = $description->getCompatibleMcpeProtocols()) > 0){ - $serverMcpeProtocols = [ProtocolInfo::CURRENT_PROTOCOL]; - if(count(array_intersect($pluginMcpeProtocols, $serverMcpeProtocols)) === 0){ - $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [ - $name, - $this->server->getLanguage()->translateString("%pocketmine.plugin.incompatibleProtocol", [implode(", ", $pluginMcpeProtocols)]) - ])); - continue; - } - } - - $plugins[$name] = $file; - - $softDependencies[$name] = $description->getSoftDepend(); - $dependencies[$name] = $description->getDepend(); - - foreach($description->getLoadBefore() as $before){ - if(isset($softDependencies[$before])){ - $softDependencies[$before][] = $name; - }else{ - $softDependencies[$before] = [$name]; - } - } + if(count($pluginMcpeProtocols = $description->getCompatibleMcpeProtocols()) > 0){ + $serverMcpeProtocols = [ProtocolInfo::CURRENT_PROTOCOL]; + if(count(array_intersect($pluginMcpeProtocols, $serverMcpeProtocols)) === 0){ + $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [ + $name, + $this->server->getLanguage()->translateString("%pocketmine.plugin.incompatibleProtocol", [implode(", ", $pluginMcpeProtocols)]) + ])); + continue; } - }catch(\Throwable $e){ - $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.fileError", [$file, $directory, $e->getMessage()])); - $this->server->getLogger()->logException($e); + } + + $plugins[$name] = $file; + + $softDependencies[$name] = $description->getSoftDepend(); + $dependencies[$name] = $description->getDepend(); + + foreach($description->getLoadBefore() as $before){ + if(isset($softDependencies[$before])){ + $softDependencies[$before][] = $name; + }else{ + $softDependencies[$before] = [$name]; + } + } + }catch(\Throwable $e){ + $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.fileError", [$file, $directory, $e->getMessage()])); + $this->server->getLogger()->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("pocketmine.plugin.loadError", [ + $name, + $this->server->getLanguage()->translateString("%pocketmine.plugin.unknownDependency", [$dependency]) + ])); + unset($plugins[$name]); + continue 2; + } + } + + 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("pocketmine.plugin.genericLoadError", [$name])); } } } - - while(count($plugins) > 0){ - $missingDependency = true; + if($missingDependency){ 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("pocketmine.plugin.loadError", [ - $name, - $this->server->getLanguage()->translateString("%pocketmine.plugin.unknownDependency", [$dependency]) - ])); - unset($plugins[$name]); - continue 2; - } - } - - 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])){ + if(!isset($dependencies[$name])){ + unset($softDependencies[$name]); unset($plugins[$name]); $missingDependency = false; if($plugin = $this->loadPlugin($file, $loaders) and $plugin instanceof Plugin){ @@ -325,34 +343,17 @@ class PluginManager{ } } + //No plugins loaded :( if($missingDependency){ 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("pocketmine.plugin.genericLoadError", [$name])); - } - } - } - - //No plugins loaded :( - if($missingDependency){ - foreach($plugins as $name => $file){ - $this->server->getLogger()->critical($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [$name, "%pocketmine.plugin.circularDependency"])); - } - $plugins = []; + $this->server->getLogger()->critical($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [$name, "%pocketmine.plugin.circularDependency"])); } + $plugins = []; } } - - return $loadedPlugins; - }else{ - return []; } + + return $loadedPlugins; } /**