BaseRecord Clone(BaseRecord record, bool bRecursive) { var p = GetPluginFromNode(record); PluginInfo info; if (!pluginMap.TryGetValue(p, out info)) pluginMap.Add(p, info = new PluginInfo() { Masters = p.GetMasters() }); var result = record.Clone(recursive: bRecursive); foreach (var rec in result.Enumerate().OfType<Record>()) { uint newid; if (info.References.TryGetValue(rec.FormID, out newid) && rec.FormID != newid) rec.FormID = newid; // now handle child references rec.MatchRecordStructureToRecord(); foreach (var elem in rec.SubRecords .SelectMany(sr => sr.EnumerateElements()) .Where(elem => elem.Structure != null && elem.Structure.type == ElementValueType.FormID) ) { var value = elem.GetValue<uint>(); if (info.References.TryGetValue(value, out newid) && value != newid) elem.AssignValue<uint>(newid); } } return result; }