예제 #1
0
        private void LoadPlugin(string directory, IScriptHandler scriptHandler, string pluginDirectory)
        {
            string pluginName = directory.Substring(directory.LastIndexOf('/') + 1);

            if (!VerifyPlugin(pluginName))
            {
                return;
            }

            string entryPath = Path.Combine(directory, scriptHandler.GetEntryFileName() + scriptHandler.GetScriptExtension());

            if (File.Exists(entryPath))
            {
                var lines = GetDependencies(directory);

                foreach (var line in lines)
                {
                    if (!loadedPlugins.Contains(line))
                    {
                        var dependencies = GetDependencies("Plugins/" + scriptHandler.GetScriptDirectoryName() + "/" + line);
                        if (dependencies.Contains(pluginName))
                        {
                            Log.Error("Plugin \"" + pluginName + "\" has a dependency to itself!");
                            return;
                        }

                        if (dependencies.Contains(pluginName))
                        {
                            Log.Error("Circular dependency detected between \"" + pluginName + "\" and \"" + line + "\"!");
                            return;
                        }

                        Log.Info(pluginName + " requires " + line + ". Loading " + line + ".");
                        LoadPlugin(pluginDirectory + "/" + line, scriptHandler, pluginDirectory);
                    }
                }

                scriptHandler.LoadPlugin(pluginName, entryPath);
                loadedPlugins.Add(pluginName);
            }
            else
            {
                Log.Error("Plugin \"" + pluginName + "\" could not be loaded because it does not exist!");
                return;
            }
        }