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); } }
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); }
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; }
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); }
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); }