Beispiel #1
0
        void OnIdChange(object sender, IdChangedEventArgs args)
        {
            if (sender is DialogueTopic topic)
            {
                var oldId = (string)args.OldId;
                var newId = (string)args.NewId;

                var versions = dialogueVersionsById[oldId];

                var index   = GetItemIndex(versions, topic);
                var version = versions[index];
                versions.RemoveAt(index);
                dialogueVersionsById[newId].Add(version);

                var key     = new GameItemKey(version.ModFileName, oldId);
                var current = dialogueByIdAndFile[key];
                dialogueByIdAndFile.Remove(key);
                dialogueByIdAndFile.Add(new GameItemKey(version.ModFileName, newId), current);
            }
            else
            {
                var versions = gameItemVersionsById[args.OldId];
                var item     = (TES3GameItem)sender;

                var index   = GetItemIndex(versions, item);
                var version = versions[index];
                gameItemVersionsById[args.NewId].Add(version);
                versions.RemoveAt(index);

                gameItemsByIdAndFile.Remove(new GameItemKey(version.ModFileName, args.OldId));
                gameItemsByIdAndFile.Add(new GameItemKey(version.ModFileName, args.NewId), item);
            }
        }
Beispiel #2
0
        public void RemoveItem(string modFileName, object id)
        {
            // Setup
            var gameItemKey = new GameItemKey(modFileName, id);

            if (!gameItemsByIdAndFile.ContainsKey(gameItemKey))
            {
                return;
            }

            var item = gameItemsByIdAndFile[gameItemKey];

            var tuples = recordItemRegistry[modFileName];
            var tuple  = (from t in tuples
                          where t.Item2 == item
                          select t).First();
            var record = tuple.Item1;

            var modFile = modFiles[modFileName];


            item.IdChanged -= OnIdChange;

            // Remove corresponding record from mod file.
            modFile.RemoveRecord(record);

            // Remove item from Record <-> TES3GameItem relationship.
            tuples.Remove(tuple);

            // Remove from versions caches.
            var versions = gameItemVersionsById[item.Id];
            GameItemVersion <TES3GameItem> version = null;

            for (var i = 0; i < versions.Count; ++i)
            {
                if (versions[i].ModFileName == modFileName)
                {
                    version = versions[i];
                    versions.RemoveAt(i);
                    break;
                }
            }
            gameItemVersionsByType[item.GetType()].Remove(version);

            // Remove from type registry.
            gameItemsByTypeAndFile[new TypeKey(modFileName, item.GetType())].Remove(item);

            // Remove direct key.
            gameItemsByIdAndFile.Remove(gameItemKey);
        }
Beispiel #3
0
        void HandleCommonCache(string modFileName, TES3GameItem item)
        {
            var key = new GameItemKey(modFileName, item.Id);

            if (gameItemsByIdAndFile.ContainsKey(key))
            {
                throw new InvalidOperationException($"Key already present for ModFile {modFileName}: {item.Id}({item.GetType()}); Current is {gameItemsByIdAndFile[key]}");
            }
            gameItemsByIdAndFile.Add(key, item);


            var version = new GameItemVersion <TES3GameItem>(modFileName, item);

            gameItemVersionsById[item.Id].Add(version);
            gameItemVersionsByType[item.GetType()].Add(version);
            gameItemsByTypeAndFile[new TypeKey(modFileName, item.GetType())].Add(item);

            gameItemOwnership.Add(item, modFileName);

            item.IdChanged += OnIdChange;
        }
Beispiel #4
0
            internal void Remove(string modFileName, K id)
            {
                // Setup
                var key = new GameItemKey(modFileName, id);

                if (!byIdAndFile.ContainsKey(key))
                {
                    return;
                }

                var item = byIdAndFile[key];

                var recordItems     = parent.recordItemRegistry[modFileName];
                var recordItemIndex = GetItemIndex(recordItems, item);
                var record          = recordItems[recordItemIndex].Item1;

                var modFile = parent.modFiles[modFileName];

                var versions = versionsById[id];

                // Removals
                item.IdChanged -= parent.OnIdChange;
                modFile.RemoveRecord(record);
                recordItems.RemoveAt(recordItemIndex);

                for (var i = 0; i < versions.Count; ++i)
                {
                    if (versions[i].ModFileName == modFileName)
                    {
                        versions.RemoveAt(i);
                        break;
                    }
                }

                byModFile[modFileName].Remove(item);
                byIdAndFile.Remove(key);
            }
Beispiel #5
0
        public void RemoveDialogueTopic(string modFileName, string topic)
        {
            var key = new GameItemKey(modFileName, topic);

            if (!dialogueByIdAndFile.ContainsKey(key))
            {
                return;
            }

            var dialogueTuple = dialogueByIdAndFile[key];

            var record   = dialogueTuple.Item1;
            var dialogue = dialogueTuple.Item2;

            var modFile      = modFiles[modFileName];
            var recordTuples = recordItemRegistry[modFileName];

            dialogue.Topic.IdChanged -= OnIdChange;
            foreach (var response in dialogue)
            {
                var subIndex = GetItemIndex(recordTuples, response);
                var subTuple = recordTuples[subIndex];

                recordTuples.RemoveAt(subIndex);
                modFile.RemoveRecord(subTuple.Item1);
            }

            recordTuples.RemoveAt(GetItemIndex(recordTuples, dialogue.Topic));
            modFile.RemoveRecord(record);

            dialogueByIdAndFile.Remove(key);
            var versions = dialogueVersionsById[topic];

            versions.RemoveAt(GetItemIndex(versions, dialogue));

            dialogueByModFile[modFileName].Remove(dialogue);
        }