diff --git a/DBCD.IO/Readers/WDC4Reader.cs b/DBCD.IO/Readers/WDC4Reader.cs index e440b6e..489f81a 100644 --- a/DBCD.IO/Readers/WDC4Reader.cs +++ b/DBCD.IO/Readers/WDC4Reader.cs @@ -283,12 +283,8 @@ public WDC4Reader(Stream stream) int palletDataSize = reader.ReadInt32(); // in bytes, sizeof(DBC2PalletValue) == 4 int sectionsCount = reader.ReadInt32(); - if (sectionsCount == 0 || RecordsCount == 0) - return; - - var sections = reader.ReadArray(sectionsCount); + var sections = (sectionsCount == 0) ? new List() : reader.ReadArray(sectionsCount).ToList(); this.m_sections = sections.OfType().ToList(); - this.m_encryptedIDs = new Dictionary(); // field meta data Meta = reader.ReadArray(FieldsCount); @@ -296,6 +292,11 @@ public WDC4Reader(Stream stream) // column meta data ColumnMeta = reader.ReadArray(FieldsCount); + if (sectionsCount == 0 || RecordsCount == 0) + return; + + this.m_encryptedIDs = new Dictionary(); + // pallet data PalletData = new Value32[ColumnMeta.Length][]; for (int i = 0; i < ColumnMeta.Length; i++) diff --git a/DBCD.IO/Readers/WDC5Reader.cs b/DBCD.IO/Readers/WDC5Reader.cs index 3199e14..d194ecc 100644 --- a/DBCD.IO/Readers/WDC5Reader.cs +++ b/DBCD.IO/Readers/WDC5Reader.cs @@ -287,12 +287,8 @@ public WDC5Reader(Stream stream) int palletDataSize = reader.ReadInt32(); // in bytes, sizeof(DBC2PalletValue) == 4 int sectionsCount = reader.ReadInt32(); - if (sectionsCount == 0 || RecordsCount == 0) - return; - - var sections = reader.ReadArray(sectionsCount); + var sections = (sectionsCount == 0) ? new List() : reader.ReadArray(sectionsCount).ToList(); this.m_sections = sections.OfType().ToList(); - this.m_encryptedIDs = new Dictionary(); // field meta data Meta = reader.ReadArray(FieldsCount); @@ -300,6 +296,11 @@ public WDC5Reader(Stream stream) // column meta data ColumnMeta = reader.ReadArray(FieldsCount); + if(sectionsCount == 0 || RecordsCount == 0) + return; + + this.m_encryptedIDs = new Dictionary(); + // pallet data PalletData = new Value32[ColumnMeta.Length][]; for (int i = 0; i < ColumnMeta.Length; i++) diff --git a/DBCD.IO/Writers/WDC4Writer.cs b/DBCD.IO/Writers/WDC4Writer.cs index 0afe6e6..01c96f9 100644 --- a/DBCD.IO/Writers/WDC4Writer.cs +++ b/DBCD.IO/Writers/WDC4Writer.cs @@ -339,7 +339,7 @@ public WDC4Writer(WDC4Reader reader, IDictionary storage, Stream stream) writer.Write(fileOffset); // FileOffset writer.Write(RecordsCount); // NumRecords writer.Write(StringTableSize); - writer.Write(0); // OffsetRecordsEndOffset + writer.Write(0); // OffsetRecordsEndOffset, this is set after writing the records for sparse tables writer.Write(Flags.HasFlagExt(DB2Flags.Index) ? RecordsCount * 4 : 0); // IndexDataSize writer.Write(referenceDataSize); // ParentLookupDataSize writer.Write(Flags.HasFlagExt(DB2Flags.Sparse) ? RecordsCount : 0); // OffsetMapIDCount @@ -404,7 +404,7 @@ public WDC4Writer(WDC4Reader reader, IDictionary storage, Stream stream) if (Flags.HasFlagExt(DB2Flags.Sparse)) { long oldPos = writer.BaseStream.Position; - writer.BaseStream.Position = 92; + writer.BaseStream.Position = HeaderSize + 20; writer.Write((uint)oldPos); writer.BaseStream.Position = oldPos; } @@ -424,6 +424,10 @@ public WDC4Writer(WDC4Reader reader, IDictionary storage, Stream stream) if (Flags.HasFlagExt(DB2Flags.Sparse)) writer.WriteArray(SparseEntries.Values.ToArray()); + // sparse data ids (if flag 0x2 is set) + if (Flags.HasFlagExt(DB2Flags.Sparse) && Flags.HasFlag(DB2Flags.SecondaryKey)) + writer.WriteArray(SparseEntries.Keys.ToArray()); + // reference data if (ReferenceData.Count > 0) { @@ -434,12 +438,15 @@ public WDC4Writer(WDC4Reader reader, IDictionary storage, Stream stream) for (int i = 0; i < ReferenceData.Count; i++) { writer.Write(ReferenceData[i]); - writer.Write(i); + if (Flags.HasFlag(DB2Flags.SecondaryKey)) + writer.Write(SparseEntries.Keys.ElementAt(i)); + else + writer.Write(i); } } - // sparse data ids - if (Flags.HasFlagExt(DB2Flags.Sparse)) + // sparse data ids (if flag 0x2 is not set) + if (Flags.HasFlagExt(DB2Flags.Sparse) && !Flags.HasFlag(DB2Flags.SecondaryKey)) writer.WriteArray(SparseEntries.Keys.ToArray()); } } diff --git a/DBCD.IO/Writers/WDC5Writer.cs b/DBCD.IO/Writers/WDC5Writer.cs index fe88421..a18e249 100644 --- a/DBCD.IO/Writers/WDC5Writer.cs +++ b/DBCD.IO/Writers/WDC5Writer.cs @@ -276,7 +276,7 @@ private static void WriteFieldValueArray(BitWriter r, FieldMetaData field class WDC5Writer : BaseWriter where T : class { - private const int HeaderSize = 200; + private const int HeaderSize = 204; private const uint WDC5FmtSig = 0x35434457; // WDC5 public WDC5Writer(WDC5Reader reader, IDictionary storage, Stream stream) : base(reader) @@ -308,9 +308,8 @@ public WDC5Writer(WDC5Reader reader, IDictionary storage, Stream stream) int maxIndex = storage.Keys.MaxOrDefault(); writer.Write(WDC5FmtSig); - writer.Write((uint)5); // numaric version + writer.Write((uint)5); // numeric version writer.Write(Encoding.ASCII.GetBytes(staticVersionString.PadRight(128, '\0'))); - writer.Write(RecordsCount); writer.Write(FieldsCount); writer.Write(RecordSize); @@ -345,7 +344,7 @@ public WDC5Writer(WDC5Reader reader, IDictionary storage, Stream stream) writer.Write(fileOffset); // FileOffset writer.Write(RecordsCount); // NumRecords writer.Write(StringTableSize); - writer.Write(0); // OffsetRecordsEndOffset + writer.Write(0); // OffsetRecordsEndOffset, this is set after writing the records for sparse tables writer.Write(Flags.HasFlagExt(DB2Flags.Index) ? RecordsCount * 4 : 0); // IndexDataSize writer.Write(referenceDataSize); // ParentLookupDataSize writer.Write(Flags.HasFlagExt(DB2Flags.Sparse) ? RecordsCount : 0); // OffsetMapIDCount @@ -410,7 +409,7 @@ public WDC5Writer(WDC5Reader reader, IDictionary storage, Stream stream) if (Flags.HasFlagExt(DB2Flags.Sparse)) { long oldPos = writer.BaseStream.Position; - writer.BaseStream.Position = 92; + writer.BaseStream.Position = HeaderSize + 20; writer.Write((uint)oldPos); writer.BaseStream.Position = oldPos; } @@ -430,6 +429,10 @@ public WDC5Writer(WDC5Reader reader, IDictionary storage, Stream stream) if (Flags.HasFlagExt(DB2Flags.Sparse)) writer.WriteArray(SparseEntries.Values.ToArray()); + // sparse data ids (if flag 0x2 is set) + if (Flags.HasFlagExt(DB2Flags.Sparse) && Flags.HasFlag(DB2Flags.SecondaryKey)) + writer.WriteArray(SparseEntries.Keys.ToArray()); + // reference data if (ReferenceData.Count > 0) { @@ -440,12 +443,15 @@ public WDC5Writer(WDC5Reader reader, IDictionary storage, Stream stream) for (int i = 0; i < ReferenceData.Count; i++) { writer.Write(ReferenceData[i]); - writer.Write(i); + if (Flags.HasFlag(DB2Flags.SecondaryKey)) + writer.Write(SparseEntries.Keys.ElementAt(i)); + else + writer.Write(i); } } - // sparse data ids - if (Flags.HasFlagExt(DB2Flags.Sparse)) + // sparse data ids (if flag 0x2 is not set) + if (Flags.HasFlagExt(DB2Flags.Sparse) && !Flags.HasFlag(DB2Flags.SecondaryKey)) writer.WriteArray(SparseEntries.Keys.ToArray()); } }