185 if(is_dir($directory)){
189 $softDependencies = [];
190 if(is_array($newLoaders)){
192 foreach($newLoaders as $key){
193 if(isset($this->fileAssociations[$key])){
194 $loaders[$key] = $this->fileAssociations[$key];
200 foreach($loaders as $loader){
201 foreach(
new \RegexIterator(
new \DirectoryIterator($directory), $loader->getPluginFilters()) as $file){
202 if($file ===
"." or $file ===
".."){
205 $file = $directory . $file;
207 $description = $loader->getPluginDescription($file);
208 if($description instanceof PluginDescription){
209 $name = $description->getName();
210 if(stripos($name,
"pocketmine") !==
false or stripos($name,
"minecraft") !==
false or stripos($name,
"mojang") !==
false){
211 $this->server->getLogger()->error($this->server->getLanguage()->translateString(
"pocketmine.plugin.loadError", [$name,
"%pocketmine.plugin.restrictedName"]));
213 }elseif(strpos($name,
" ") !==
false){
214 $this->server->getLogger()->warning($this->server->getLanguage()->translateString(
"pocketmine.plugin.spacesDiscouraged", [$name]));
218 $this->server->getLogger()->error($this->server->getLanguage()->translateString(
"pocketmine.plugin.duplicateError", [$name]));
224 foreach($description->getCompatibleApis() as $version){
227 if($version !== $this->server->getApiVersion()){
228 $pluginApi = array_pad(explode(
"-", $version), 2,
"");
229 $serverApi = array_pad(explode(
"-", $this->server->getApiVersion()), 2,
"");
231 if(strtoupper($pluginApi[1]) !== strtoupper($serverApi[1])){
235 $pluginNumbers = array_map(
"intval", explode(
".", $pluginApi[0]));
236 $serverNumbers = array_map(
"intval", explode(
".", $serverApi[0]));
238 if($pluginNumbers[0] !== $serverNumbers[0]){
242 if($pluginNumbers[1] > $serverNumbers[1]){
251 $compatiblegeniapi =
false;
252 foreach($description->getCompatibleGeniApis() as $version){
254 $version = array_map(
"intval", explode(
".", $version));
255 $apiVersion = array_map(
"intval", explode(
".", $this->server->getGeniApiVersion()));
257 if($version[0] > $apiVersion[0]){
261 if($version[0] < $apiVersion[0]){
262 $compatiblegeniapi =
true;
266 if($version[1] > $apiVersion[1]){
270 if($version[1] == $apiVersion[1] and $version[2] > $apiVersion[2]){
274 $compatiblegeniapi =
true;
278 if($compatible ===
false){
279 if($this->server->loadIncompatibleAPI ===
true){
280 $this->server->getLogger()->debug(
"插件{$name}的API与服务器不符,但GenisysPro仍然加载了它");
282 $this->server->getLogger()->error($this->server->getLanguage()->translateString(
"pocketmine.plugin.loadError", [$name,
"%pocketmine.plugin.incompatibleAPI"]));
287 if($compatiblegeniapi ===
false){
288 $this->server->getLogger()->error(
"Could not load plugin '{$description->getName()}': Incompatible GeniAPI version");
294 $softDependencies[$name] = (array) $description->getSoftDepend();
295 $dependencies[$name] = (array) $description->getDepend();
297 foreach($description->getLoadBefore() as $before){
298 if(isset($softDependencies[$before])){
299 $softDependencies[$before][] = $name;
301 $softDependencies[$before] = [$name];
305 }
catch(\Throwable $e){
306 $this->server->getLogger()->error($this->server->getLanguage()->translateString(
"pocketmine.plugin.fileError", [$file, $directory, $e->getMessage()]));
307 $this->server->getLogger()->logException($e);
314 $missingDependency =
true;
315 foreach(
$plugins as $name => $file){
316 if(isset($dependencies[$name])){
317 foreach($dependencies[$name] as $key => $dependency){
318 if(isset($loadedPlugins[$dependency]) or $this->
getPlugin($dependency) instanceof Plugin){
319 unset($dependencies[$name][$key]);
320 }elseif(!isset(
$plugins[$dependency])){
321 $this->server->getLogger()->critical($this->server->getLanguage()->translateString(
"pocketmine.plugin.loadError", [$name,
"%pocketmine.plugin.unknownDependency"]));
326 if(count($dependencies[$name]) === 0){
327 unset($dependencies[$name]);
331 if(isset($softDependencies[$name])){
332 foreach($softDependencies[$name] as $key => $dependency){
333 if(isset($loadedPlugins[$dependency]) or $this->
getPlugin($dependency) instanceof Plugin){
334 unset($softDependencies[$name][$key]);
338 if(count($softDependencies[$name]) === 0){
339 unset($softDependencies[$name]);
343 if(!isset($dependencies[$name]) and !isset($softDependencies[$name])){
345 $missingDependency =
false;
346 if($plugin = $this->
loadPlugin($file, $loaders) and $plugin instanceof Plugin){
347 $loadedPlugins[$name] = $plugin;
349 $this->server->getLogger()->critical($this->server->getLanguage()->translateString(
"pocketmine.plugin.genericLoadError", [$name]));
354 if($missingDependency ===
true){
355 foreach(
$plugins as $name => $file){
356 if(!isset($dependencies[$name])){
357 unset($softDependencies[$name]);
359 $missingDependency =
false;
360 if($plugin = $this->
loadPlugin($file, $loaders) and $plugin instanceof Plugin){
361 $loadedPlugins[$name] = $plugin;
363 $this->server->getLogger()->critical($this->server->getLanguage()->translateString(
"pocketmine.plugin.genericLoadError", [$name]));
369 if($missingDependency ===
true){
370 foreach(
$plugins as $name => $file){
371 $this->server->getLogger()->critical($this->server->getLanguage()->translateString(
"pocketmine.plugin.loadError", [$name,
"%pocketmine.plugin.circularDependency"]));
380 return $loadedPlugins;