Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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) });
            }
        }