From a91973b1ffe1b7a534ea1c85bd55f22488e5e002 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 22 May 2018 11:16:19 -0400 Subject: [PATCH] Core/Misc: Misc fixs --- Source/Framework/Collections/StringArray.cs | 2 +- .../Game/DataStorage/ClientReader/DBReader.cs | 41 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/Source/Framework/Collections/StringArray.cs b/Source/Framework/Collections/StringArray.cs index 9a9b9ce3e..05600aa53 100644 --- a/Source/Framework/Collections/StringArray.cs +++ b/Source/Framework/Collections/StringArray.cs @@ -62,7 +62,7 @@ namespace Framework.Collections return _str == null || _str.Length == 0; } - public int Length => _str.Length; + public int Length => _str != null ? _str.Length : 0; string[] _str; } diff --git a/Source/Game/DataStorage/ClientReader/DBReader.cs b/Source/Game/DataStorage/ClientReader/DBReader.cs index b0055cbb3..0eafc8f79 100644 --- a/Source/Game/DataStorage/ClientReader/DBReader.cs +++ b/Source/Game/DataStorage/ClientReader/DBReader.cs @@ -203,8 +203,11 @@ namespace Game.DataStorage Dictionary OffsetDuplicates = new Dictionary(); Dictionary> Copies = new Dictionary>(); + bool hasOffsetTable = Header.HasOffsetTable(); + bool hasIndexTable = Header.HasIndexTable(); + byte[] recordData; - if (Header.HasOffsetTable()) + if (hasOffsetTable) recordData = reader.ReadBytes((int)(Header.OffsetTableOffset - 84 - 4 * Header.FieldCount)); else { @@ -231,7 +234,7 @@ namespace Game.DataStorage int[] m_indexes = null; // OffsetTable - if (Header.HasOffsetTable() && Header.OffsetTableOffset > 0) + if (hasOffsetTable && Header.OffsetTableOffset > 0) { reader.BaseStream.Position = Header.OffsetTableOffset; for (int i = 0; i < (Header.MaxId - Header.MinId + 1); i++) @@ -256,7 +259,7 @@ namespace Game.DataStorage } // IndexTable - if (Header.HasIndexTable()) + if (hasIndexTable) m_indexes = reader.ReadArray(Header.RecordCount); // Copytable @@ -353,7 +356,7 @@ namespace Game.DataStorage { int id = 0; - if (Header.HasOffsetTable() && Header.HasIndexTable()) + if (hasOffsetTable && hasIndexTable) { id = m_indexes[CopyTable.Count]; var map = offsetmap[i]; @@ -391,8 +394,10 @@ namespace Game.DataStorage bitReader.Offset = i * (int)Header.RecordSize; List data = new List(); + MemoryStream stream = new MemoryStream(); + BinaryWriter binaryWriter = new BinaryWriter(stream); - if (Header.HasIndexTable()) + if (hasIndexTable) id = m_indexes[i]; for (int f = 0; f < Header.FieldCount; f++) @@ -403,42 +408,40 @@ namespace Game.DataStorage { case DB2ColumnCompression.None: int bitSize = FieldStructure[f].BitCount; - if (!Header.HasIndexTable() && f == Header.IdIndex) + if (!hasIndexTable && f == Header.IdIndex) { id = (int)bitReader.ReadUInt32(bitSize);// always read Ids as ints - data.AddRange(BitConverter.GetBytes(id)); + binaryWriter.Write(id); } else { for (int x = 0; x < ColumnMeta[f].ArraySize; x++) - data.AddRange(bitReader.ReadValue(bitSize)); + binaryWriter.Write(bitReader.ReadValue(bitSize)); } break; case DB2ColumnCompression.Immediate: - if (!Header.HasIndexTable() && f == Header.IdIndex) + if (!hasIndexTable && f == Header.IdIndex) { id = (int)bitReader.ReadUInt32(bitWidth);// always read Ids as ints - data.AddRange(BitConverter.GetBytes(id)); + binaryWriter.Write(id); continue; } else - { - data.AddRange(bitReader.ReadValue(bitWidth, ColumnMeta[f].BitOffset, ColumnMeta[f].Cardinality == 1)); - } + binaryWriter.Write(bitReader.ReadValue(bitWidth, ColumnMeta[f].BitOffset, ColumnMeta[f].Cardinality == 1)); break; case DB2ColumnCompression.CommonData: if (ColumnMeta[f].SparseValues.TryGetValue(id, out byte[] valBytes)) - data.AddRange(valBytes); + binaryWriter.Write(valBytes); else - data.AddRange(BitConverter.GetBytes(ColumnMeta[f].BitOffset)); + binaryWriter.Write(ColumnMeta[f].BitOffset); break; case DB2ColumnCompression.Pallet: case DB2ColumnCompression.PalletArray: uint palletIndex = bitReader.ReadUInt32(bitWidth); - data.AddRange(ColumnMeta[f].PalletValues[(int)palletIndex]); + binaryWriter.Write(ColumnMeta[f].PalletValues[(int)palletIndex]); break; default: @@ -451,12 +454,12 @@ namespace Game.DataStorage { // seen cases of missing indicies if (RelationShipData.Entries.TryGetValue((uint)i, out byte[] foreignData)) - data.AddRange(foreignData); + binaryWriter.Write(foreignData); else - data.AddRange(new byte[4]); + binaryWriter.Write(0); } - CopyTable.Add(id, data.ToArray()); + CopyTable.Add(id, stream.ToArray()); if (Copies.ContainsKey(id)) {