示例#1
0
        /// <summary>
        /// 激活指定的模组,若未变化则返回false,模组发生变化则返回true;
        /// </summary>
        private static bool LoadModification()
        {
            IEnumerable <ModificationInfo> infos = GetActivatedModificationInfos();

            if (loadedModifications == null)
            {
                foreach (var info in infos)
                {
                    var modification = modificationFactory.Read(info.ModificationDirectory);
                    loadedModifications.Add(modification);
                }

                return(true);
            }
            else
            {
                bool isChanged = false;
                List <Modification> newModifications = new List <Modification>();
                int startIndex = 0;

                foreach (var info in infos)
                {
                    var modification = loadedModifications[startIndex];
                    if (Equals(modification, info))
                    {
                        loadedModifications[startIndex] = null;
                        newModifications.Add(modification);
                    }
                    else
                    {
                        isChanged = true;

                        var targetIndex = loadedModifications.FindIndex(startIndex, delegate(Modification value)
                        {
                            if (value == null)
                            {
                                return(false);
                            }

                            return(value.Description.ID == info.Description.ID);
                        });

                        if (targetIndex >= 0)
                        {
                            modification = loadedModifications[targetIndex];
                            loadedModifications[targetIndex] = null;
                            newModifications.Add(modification);
                        }
                        else
                        {
                            modification = modificationFactory.Read(info.ModificationDirectory);
                            newModifications.Add(modification);
                        }
                    }
                }

                foreach (var old in loadedModifications)
                {
                    if (old != null)
                    {
                        old.Dispose();
                    }
                }

                loadedModifications.Clear();
                loadedModifications.AddRange(newModifications);

                return(isChanged);
            }
        }