public InsertRecord ( int idx, |
||
idx | int | |
br | ||
return | void |
public bool AddMaster(string masterName) { Record brcTES4 = this.Records.OfType <Record>().FirstOrDefault(x => x.Name == "TES4"); if (brcTES4 == null) { throw new ApplicationException("Plugin lacks a valid TES4 record. Cannot continue."); } // find existing if already present foreach (var mast in brcTES4.SubRecords.Where(x => x.Name == "MAST")) { var path = mast.GetStrData(); if (string.Compare(path, masterName, true) == 0) { return(false); } } int idx = brcTES4.SubRecords.IndexOf(brcTES4.SubRecords.FirstOrDefault(x => x.Name == "INTV")); if (idx < 0) { idx = brcTES4.SubRecords.Count; } var sbrMaster = new SubRecord(); sbrMaster = new SubRecord(); sbrMaster.Name = "DATA"; sbrMaster.SetData(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }); brcTES4.InsertRecord(idx, sbrMaster); sbrMaster = new SubRecord(); sbrMaster.Name = "MAST"; int intCount = Encoding.Instance.GetByteCount(masterName); var bteData = new byte[intCount + 1]; Array.Copy(Encoding.Instance.GetBytes(masterName), bteData, intCount); sbrMaster.SetData(bteData); brcTES4.InsertRecord(idx, sbrMaster); // Fix Masters // Update IDs for current record to be +1 return(true); }
public bool AddMaster(string masterName) { Record brcTES4 = this.Records.OfType <Record>().FirstOrDefault(x => x.Name.StartsWith("TES")); if (brcTES4 == null) { throw new ApplicationException("Plugin lacks a valid TES4 record. Cannot continue."); } // find existing if already present foreach (var mast in brcTES4.SubRecords.Where(x => x.Name == "MAST")) { var path = mast.GetStrData(); if (string.Compare(path, masterName, true) == 0) { return(false); } } int idx = brcTES4.SubRecords.IndexOf(brcTES4.SubRecords.FirstOrDefault(x => x.Name == "INTV")); if (idx < 0) { idx = brcTES4.SubRecords.Count; } var sbrMaster = new SubRecord(); sbrMaster.Name = "DATA"; sbrMaster.SetData(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }); brcTES4.InsertRecord(idx, sbrMaster); sbrMaster = new SubRecord(); sbrMaster.Name = "MAST"; int intCount = Encoding.Instance.GetByteCount(masterName); var bteData = new byte[intCount + 1]; Array.Copy(Encoding.Instance.GetBytes(masterName), bteData, intCount); sbrMaster.SetData(bteData); brcTES4.InsertRecord(idx, sbrMaster); int masterIdx = brcTES4.SubRecords.Count(x => x.Name == "MAST") - 1; // Update IDs for current record to be +1 // Fix FormID and references now foreach (var rec in EnumerateRecords(null).Select(x => x.Value) .SkipWhile(x => RecordLayout.NoNewCopyTypes.Contains(x.Name))) { if ((rec.FormID >> 24) >= masterIdx) { rec.FormID = (rec.FormID & 0x00FFFFFF) | (((rec.FormID >> 24) + 1) << 24); } // 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 ((value >> 24) >= masterIdx) { elem.AssignValue <uint>((value & 0x00FFFFFF) | (((value >> 24) + 1) << 24)); } } } return(true); }