private void InstallServices() { var vanillaServices = global::Kernel.Instance.Container; var servicePatchStack = new Dictionary <Type, List <object> >(); foreach (var mod in this.LoadedMods) { var servicePatches = mod.ServicePatches; if (servicePatches.Count > 0) { using (mod.Log.Normal.OpenScope($"Installing {servicePatches.Count} service patches", "Done")) { foreach (var(service, patch) in servicePatches) { mod.Log.Log($"{service} -> {patch}"); var baseCascade = GetServicePatchStack(service); var proxyService = ServicePatcher.InstantiatePatch(patch, baseCascade); baseCascade.Insert(0, proxyService); } } } } List <object> GetServicePatchStack(Type key) { if (servicePatchStack.TryGetValue(key, out var baseCascade) == false) { baseCascade = new List <object>(); var vanilla = vanillaServices.Resolve(key); if (vanilla == null) { throw new Exception("Vanilla service not found: " + key); } baseCascade.Add(vanilla); servicePatchStack.Add(key, baseCascade); } return(baseCascade); } }
public static void InstallModServices() { try { var servicePatchStack = new Dictionary <Type, List <object> >(); foreach (var mod in PatchZone.Instance.LoadedMods) { foreach (var(service, patch) in mod.ServicePatches) { var baseCascade = GetServicePatchStack(service); var proxyService = ServicePatcher.InstantiatePatch(patch, baseCascade); baseCascade.Add(proxyService); } } List <object> GetServicePatchStack(Type key) { if (servicePatchStack.TryGetValue(key, out var baseCascade) == false) { baseCascade = new List <object>(); var vanilla = GameCore.Resolve(key); if (vanilla == null) { throw new Exception("Vanilla service not found: " + key); } baseCascade.Add(vanilla); servicePatchStack.Add(key, baseCascade); } return(baseCascade); } } catch (Exception e) { GlobalLog.Error.PrintLine("Error while installing mod services"); GlobalLog.Error.PrintLine(e.ToString()); throw; } }
private static void Install <TService, TImpl>() { //using (Log.Debug.OpenScope($"Installing {typeof(TImpl)} -> {typeof(TService)} ... ", "Done")) { var vanilla = GameCore.Resolve <TService>(); var key = typeof(TService); if (m_servicePatchStack.TryGetValue(key, out var baseCascade) == false) { baseCascade = new List <object>(); baseCascade.Add(vanilla); m_servicePatchStack.Add(key, baseCascade); } File.WriteAllText("preloader.txt", typeof(TImpl).FullName); var patch = ServicePatcher.InstantiatePatch(typeof(TImpl), baseCascade); baseCascade.Insert(0, patch); //var installMethod = typeof(TImpl).GetMethod("Install", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); //installMethod.Invoke(null, new object[] { Harmony, vanilla, typeof(TService) }); } }