示例#1
0
        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);
        }
示例#2
0
        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);
        }