public static int InternalizeStrings(Plugin plugin) { bool anyModified = false; int count = 0; foreach (var record in plugin.Enumerate().OfType<Record>()) { record.MatchRecordStructureToRecord(); foreach (var sr in record.SubRecords) { var elements = record.EnumerateElements(sr, rawData: true).ToList(); foreach (var elem in elements) { if (elem.Structure != null && elem.Structure.type == ElementValueType.LString) { var data = elem.Data; uint id = TypeConverter.h2i(data); if (id == 0) { continue; } if (data.Count == 4) { var str = plugin.LookupFormStrings(id); if (!string.IsNullOrEmpty(str)) { elem.AssignValue<ArraySegment<byte>>(new ArraySegment<byte>(TypeConverter.str2h(str))); ++count; } } } } if (elements.Any(x => x.Changed)) { // need to repack the structure using (var ms = new MemoryStream(sr.GetReadonlyData().Length)) { foreach (var seg in elements.Select(elem => elem.Data)) { ms.Write(seg.Array, seg.Offset, seg.Count); } sr.SetData(ms.ToArray()); } anyModified = true; } } } if (anyModified) { var tes4 = plugin.Records.OfType<Record>().FirstOrDefault(x => x.Name .StartsWith("TES")); if (tes4 != null) { tes4.Flags1 &= ~0x00000080U; } } return count; }