ME3LibWV.PCCPackage.Save C# (CSharp) Method

Save() public method

public Save ( string filePath = null ) : void
filePath string
return void
        public void Save(string filePath = null)
        {
            try
            {
                DebugLog.PrintLn("Writing Header...", true);
                MemoryStream m = new MemoryStream();
                m.Write(BitConverter.GetBytes(Header.magic), 0, 4);
                m.Write(BitConverter.GetBytes(Header.ver1), 0, 2);
                m.Write(BitConverter.GetBytes(Header.ver2), 0, 2);
                m.Write(BitConverter.GetBytes(Header.HeaderLength), 0, 4);
                WriteUString(Header.Group, m);
                if (GeneralInfo.compressed)
                    m.Write(BitConverter.GetBytes(Header.Flags ^ 0x02000000), 0, 4);
                else
                    m.Write(BitConverter.GetBytes(Header.Flags), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk1), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk2), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk3), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk4), 0, 4);
                m.Write(Header.GUID, 0, 16);
                m.Write(BitConverter.GetBytes(Header.Generations.Count), 0, 4);
                foreach (Generation g in Header.Generations)
                {
                    m.Write(BitConverter.GetBytes(g.ExportCount), 0, 4);
                    m.Write(BitConverter.GetBytes(g.ImportCount), 0, 4);
                    m.Write(BitConverter.GetBytes(g.NetObjCount), 0, 4);
                }
                m.Write(BitConverter.GetBytes(Header.EngineVersion), 0, 4);
                m.Write(BitConverter.GetBytes(Header.CookerVersion), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk5), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk6), 0, 4);
                m.Write(BitConverter.GetBytes(Header.CompressionFlag), 0, 4);
                m.Write(BitConverter.GetBytes(0), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk7), 0, 4);
                m.Write(BitConverter.GetBytes(Header.unk8), 0, 4);
                DebugLog.PrintLn("Writing Name Table...", true);
                Header.NameOffset = (uint)m.Position;
                Header.NameCount = (uint)Names.Count;
                foreach (string s in Names)
                    WriteUString(s, m);
                DebugLog.PrintLn("Writing Import Table...", true);
                Header.ImportOffset = (uint)m.Position;
                Header.ImportCount = (uint)Imports.Count;
                foreach (ImportEntry e in Imports)
                {
                    m.Write(BitConverter.GetBytes(e.idxPackage), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk1), 0, 4);
                    m.Write(BitConverter.GetBytes(e.idxClass), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk2), 0, 4);
                    m.Write(BitConverter.GetBytes(e.idxLink), 0, 4);
                    m.Write(BitConverter.GetBytes(e.idxName), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk3), 0, 4);
                }
                DebugLog.PrintLn("Writing Export Table...", true);
                Header.ExportOffset = (uint)m.Position;
                Header.ExportCount = (uint)Exports.Count;
                for (int i = 0; i < Exports.Count; i++)
                {
                    ExportEntry e = Exports[i];
                    e._infooffset = (uint)m.Position;
                    Exports[i] = e;
                    m.Write(BitConverter.GetBytes(e.idxClass), 0, 4);
                    m.Write(BitConverter.GetBytes(e.idxParent), 0, 4);
                    m.Write(BitConverter.GetBytes(e.idxLink), 0, 4);
                    m.Write(BitConverter.GetBytes(e.idxName), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Index), 0, 4);
                    m.Write(BitConverter.GetBytes(e.idxArchetype), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk1), 0, 4);
                    m.Write(BitConverter.GetBytes(e.ObjectFlags), 0, 4);
                    m.Write(BitConverter.GetBytes(0), 0, 4);
                    m.Write(BitConverter.GetBytes(0), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk2), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk3.Length), 0, 4);
                    foreach (int j in e.Unk3)
                        m.Write(BitConverter.GetBytes(j), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk4), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk5), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk6), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk7), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Unk8), 0, 4);
                }
                DebugLog.PrintLn("Writing Free Zone...", true);
                int FreeZoneSize = (int)Header.FreeZoneEnd - (int)Header.FreeZoneStart;
                Header.FreeZoneStart = (uint)m.Position;
                m.Write(new byte[FreeZoneSize], 0, FreeZoneSize);
                Header.FreeZoneEnd = Header.HeaderLength = (uint)m.Position;
                DebugLog.PrintLn("Writing Export Data...", true);
                for (int i = 0; i < Exports.Count; i++)
                {
                    ExportEntry e = Exports[i];
                    byte[] buff = GetObjectData(i);
                    e.Dataoffset = (int)m.Position;
                    e.Datasize = buff.Length;
                    m.Write(buff, 0, buff.Length);
                    long pos = m.Position;
                    m.Seek(e._infooffset + 32, 0);
                    m.Write(BitConverter.GetBytes(e.Datasize), 0, 4);
                    m.Write(BitConverter.GetBytes(e.Dataoffset), 0, 4);
                    m.Seek(pos, 0);
                }
                DebugLog.PrintLn("Updating Header...", true);
                m.Seek(8, 0);
                m.Write(BitConverter.GetBytes(Header.HeaderLength), 0, 4);
                m.Seek(24 + (Header.Group.Length + 1) * 2, 0);
                m.Write(BitConverter.GetBytes(Header.NameCount), 0, 4);
                m.Write(BitConverter.GetBytes(Header.NameOffset), 0, 4);
                m.Write(BitConverter.GetBytes(Header.ExportCount), 0, 4);
                m.Write(BitConverter.GetBytes(Header.ExportOffset), 0, 4);
                m.Write(BitConverter.GetBytes(Header.ImportCount), 0, 4);
                m.Write(BitConverter.GetBytes(Header.ImportOffset), 0, 4);
                m.Write(BitConverter.GetBytes(Header.FreeZoneStart), 0, 4);
                m.Write(BitConverter.GetBytes(Header.FreeZoneEnd), 0, 4);
                DebugLog.PrintLn("Done generating.", true);
                if (Source != null)
                    Source.Close();
                if (filePath == null)
                {
                    File.WriteAllBytes(GeneralInfo.filepath, m.ToArray()); 
                }
                else
                {
                    File.WriteAllBytes(filePath, m.ToArray());
                }
                DebugLog.PrintLn("Done.", true);
            }
            catch (Exception ex)
            {
                DebugLog.PrintLn("PCCPACKAGE::SAVE ERROR:\n" + ex.Message);
            }
        }
        public void CloneEntry(int uIndex)