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(); } }