diff --git a/IllusionInjector/IllusionInjector.csproj b/IllusionInjector/IllusionInjector.csproj index 47c790bd..7aa1a08f 100644 --- a/IllusionInjector/IllusionInjector.csproj +++ b/IllusionInjector/IllusionInjector.csproj @@ -82,6 +82,7 @@ + diff --git a/IllusionInjector/PluginManager.cs b/IllusionInjector/PluginManager.cs index 5ccbe5aa..39bab3da 100644 --- a/IllusionInjector/PluginManager.cs +++ b/IllusionInjector/PluginManager.cs @@ -1,4 +1,5 @@ using IllusionInjector.Logging; +using IllusionInjector.Utilities; using IllusionPlugin; using IllusionPlugin.BeatSaber; using System; @@ -11,6 +12,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using LoggerBase = IllusionPlugin.Logging.Logger; namespace IllusionInjector { @@ -182,12 +184,37 @@ namespace IllusionInjector IBeatSaberPlugin bsPlugin = OptionalGetPlugin(t); if (bsPlugin != null) { - bsPlugins.Add(new BSPluginMeta + try { - Plugin = bsPlugin, - Filename = file, - ModsaberInfo = bsPlugin.ModInfo - }); + var init = t.GetMethod("Init", BindingFlags.Instance | BindingFlags.Public); + if (init != null) + { + var initArgs = new List(); + var initParams = init.GetParameters(); + + foreach (var param in initParams) + { + var ptype = param.ParameterType; + if (ptype.IsAssignableFrom(typeof(LoggerBase))) + initArgs.Add(new StandardLogger(bsPlugin.Name)); + else + initArgs.Add(ptype.GetDefault()); + } + + init.Invoke(bsPlugin, initArgs.ToArray()); + } + + bsPlugins.Add(new BSPluginMeta + { + Plugin = bsPlugin, + Filename = file, + ModsaberInfo = bsPlugin.ModInfo + }); + } + catch (AmbiguousMatchException) + { + Logger.log.Error($"Only one Init allowed per plugin"); + } } else { diff --git a/IllusionInjector/Utilities/Extensions.cs b/IllusionInjector/Utilities/Extensions.cs new file mode 100644 index 00000000..326c675a --- /dev/null +++ b/IllusionInjector/Utilities/Extensions.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IllusionInjector.Utilities +{ + public static class Extensions + { + public static object GetDefault(this Type type) + { + if (type.IsValueType) + { + return Activator.CreateInstance(type); + } + return null; + } + } +} diff --git a/IllusionInjector/obj/Debug/IllusionInjector.csproj.CoreCompileInputs.cache b/IllusionInjector/obj/Debug/IllusionInjector.csproj.CoreCompileInputs.cache index 8446ea99..264d2538 100644 --- a/IllusionInjector/obj/Debug/IllusionInjector.csproj.CoreCompileInputs.cache +++ b/IllusionInjector/obj/Debug/IllusionInjector.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -53986b9c1e3d7933198e1551a3ec82914a34cbb2 +4fc156f3cea4b1f659732d784ceeb2b98e58bc07