Пример #1
0
        public void Write(DBEntry entry, string savepath)
        {
            using (var fs = new FileStream(savepath, FileMode.Create))
                using (var ms = new MemoryStream())
                    using (var bw = new BinaryWriter(ms))
                    {
                        StringTable st = new StringTable(entry.Header.ExtendedStringTable);         //Preloads null byte(s)
                        entry.Header.WriteHeader(bw, entry);

                        if (!entry.Header.IsTypeOf <WDC1>())
                        {
                            if (entry.Header.IsTypeOf <WDB5>() && !entry.Header.HasOffsetTable && entry.Header.CopyTableSize > 0)
                            {
                                WriteIntoFile(entry, bw, entry.GetUniqueRows().ToArray(), ref st);                 //Insert unique rows
                            }
                            else
                            {
                                WriteIntoFile(entry, bw, entry.Data.AsEnumerable(), ref st);                 //Insert all rows
                            }


                            //Copy StringTable and StringTable size if it doesn't have inline strings
                            if (st.Size > 0 && !entry.Header.HasOffsetTable)
                            {
                                long pos = bw.BaseStream.Position;
                                bw.Scrub(entry.Header.StringTableOffset);
                                bw.Write(st.Size);
                                bw.Scrub(pos);
                                st.CopyTo(bw.BaseStream);
                            }
                            st.Dispose();

                            //Legion+ only
                            if (entry.Header.IsLegionFile)
                            {
                                //WCH7 Map
                                if (entry.Header is WCH7 wch7)
                                {
                                    bw.WriteArray(wch7.WCH7Table);
                                }

                                //OffsetMap
                                if (entry.Header.HasOffsetTable)
                                {
                                    //Update StringTableOffset with current position
                                    long pos = bw.BaseStream.Position;
                                    bw.Scrub(entry.Header.StringTableOffset);
                                    bw.Write((int)pos);
                                    bw.Scrub(pos);

                                    entry.Header.WriteOffsetMap(bw, entry, OffsetMap);

                                    OffsetMap.Clear();                     //Cleanup
                                }

                                //Index Table
                                if (entry.Header.HasIndexTable)
                                {
                                    entry.Header.WriteIndexTable(bw, entry);
                                }

                                //CopyTable - WDB5 only
                                (entry.Header as WDB5)?.WriteCopyTable(bw, entry);

                                //CommonDataTable
                                (entry.Header as WDB6)?.WriteCommonDataTable(bw, entry);
                            }
                        }

                        //Copy data to file
                        ms.Position = 0;
                        ms.CopyTo(fs);

                        //Reset write temp data
                        entry.ResetTemp();
                    }
        }