private void EnableModule(ModuleAndAttribute module) { Logger.LogInfo($"Enabling module: {module.Attribute.Name}"); ModuleAttribute customAttr = module.Attribute; Type type = module.Module; constuctorArgumentArray[0] = customAttr.Name; constuctorArgumentArray[1] = customAttr.Description; constuctorArgumentArray[2] = customAttr.DefaultEnabled; try { var ctor = type.GetConstructor(constructorParameters); R2DSEModule loadedModule = (R2DSEModule)ctor.Invoke(constuctorArgumentArray); loadedModule.ReloadHooks(); Modules.Add(customAttr.Name, loadedModule); } catch (Exception e) { Logger.LogError($"Couldn't load module: {constuctorArgumentArray[0]}"); Logger.LogError(e); } }
private PluginEntry() { #region Not Release Message #if DEBUG Logger.LogWarning($"This is a debug build!"); #elif BLEEDING Logger.LogWarning($"This is a Bleeding-Edge build!"); #endif #endregion Instance = this; Log = Logger; Configuration = new ConfigFile(Paths.ConfigPath + "\\R2DSE.cfg", true); Modules = new Dictionary <string, R2DSEModule>(); ConvarsToAdd = new Queue <BaseConVar>(); ConCommandsToAdd = new Queue <MethodInfo>(); ModulesToLoad = new Queue <ModuleAndAttribute> [2]; ModulesToLoad[0] = new Queue <ModuleAndAttribute>(); ModulesToLoad[1] = new Queue <ModuleAndAttribute>(); var disableWhenGraphicDetected = Configuration.Bind("_R2DSE", "Disable When Graphics Detected", true, "Disable the plugin when game graphics are detected."); if (!Application.isBatchMode && disableWhenGraphicDetected.Value) { Logger.LogWarning("Detected graphics. Plugin disabled. If you want to use R2DSE in this mode please change the plugin config."); return; } var pluginInfos = BepInEx.Bootstrap.Chainloader.PluginInfos; var types = Assembly.GetExecutingAssembly().GetTypes(); foreach (Type type in types) { ModuleAttribute customAttr = (ModuleAttribute)type.GetCustomAttributes(typeof(ModuleAttribute), false).FirstOrDefault(); var dependencies = type.GetCustomAttributes <PluginDependency>(); if (customAttr != null && dependencies.All(dep => pluginInfos.ContainsKey(dep.GUID))) { foreach (FieldInfo field in type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) { if (field.FieldType.IsSubclassOf(typeof(BaseConVar))) { ConvarsToAdd.Enqueue((BaseConVar)(field.GetValue(null))); } } foreach (MethodInfo method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) { var CCattr = method.GetCustomAttribute <RoR2.ConCommandAttribute>(); if (CCattr != null) { ConCommandsToAdd.Enqueue(method); } } if (customAttr.target == ModuleAttribute.StartupTarget.Awake) { ModulesToLoad[0].Enqueue(new ModuleAndAttribute() { Module = type, Attribute = customAttr }); } else { ModulesToLoad[1].Enqueue(new ModuleAndAttribute() { Module = type, Attribute = customAttr }); } } } }