/// <summary> /// Loads a given plugin /// </summary> /// <param name="plugin"></param> /// <param name="waitingForAccess"></param> protected void LoadPlugin(Plugin plugin, bool waitingForAccess = false) { if (!File.Exists(plugin.Filename)) { LoadingPlugins.Remove(plugin.Name); Interface.Oxide.LogWarning("Script no longer exists: {0}", plugin.Name); return; } try { plugin.Load(); Interface.Oxide.UnloadPlugin(plugin.Name); LoadingPlugins.Remove(plugin.Name); Interface.Oxide.PluginLoaded(plugin); } catch (IOException) { if (!waitingForAccess) { Interface.Oxide.LogWarning("Waiting for another application to stop using script: {0}", plugin.Name); } Interface.Oxide.GetLibrary <Timer>().Once(.5f, () => LoadPlugin(plugin, true)); } catch (Exception ex) { LoadingPlugins.Remove(plugin.Name); Interface.Oxide.LogException($"Failed to load plugin {plugin.Name}", ex); } }
private void PluginLoadingCompleted(CompilablePlugin plugin) { LoadingPlugins.Remove(plugin.Name); plugin.IsLoading = false; foreach (var loadingName in LoadingPlugins.ToArray()) { var loadingPlugin = GetCompilablePlugin(plugin.Directory, loadingName); if (loadingPlugin.IsLoading && loadingPlugin.Requires.Contains(plugin.Name)) { Load(loadingPlugin); } } }
/// <summary> /// Attempt to asynchronously compile and load plugin /// </summary> /// <param name="directory"></param> /// <param name="name"></param> /// <returns></returns> public override Plugin Load(string directory, string name) { //if (name == "CSharpCore") return new CSharpCore(); if (LoadingPlugins.Contains(name)) { Interface.GetMod().LogInfo("Plugin is already being loaded: {0}", name); return(null); } // Let the Oxide core know that this plugin will be loading asynchronously LoadingPlugins.Add(name); var compilable_plugin = GetCompilablePlugin(extension, directory, name); compilable_plugin.Compile(compiled => { // Load the plugin assembly if it was successfully compiled if (compiled) { compilable_plugin.LoadAssembly(plugin => { LoadingPlugins.Remove(name); if (plugin != null) { LoadedPlugins.Add(plugin); } }); } else { LoadingPlugins.Remove(name); } }); return(null); }