Core/Misc: Misc fixs
This commit is contained in:
@@ -62,7 +62,7 @@ namespace Framework.Collections
|
|||||||
return _str == null || _str.Length == 0;
|
return _str == null || _str.Length == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Length => _str.Length;
|
public int Length => _str != null ? _str.Length : 0;
|
||||||
|
|
||||||
string[] _str;
|
string[] _str;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -203,8 +203,11 @@ namespace Game.DataStorage
|
|||||||
Dictionary<int, int> OffsetDuplicates = new Dictionary<int, int>();
|
Dictionary<int, int> OffsetDuplicates = new Dictionary<int, int>();
|
||||||
Dictionary<int, List<int>> Copies = new Dictionary<int, List<int>>();
|
Dictionary<int, List<int>> Copies = new Dictionary<int, List<int>>();
|
||||||
|
|
||||||
|
bool hasOffsetTable = Header.HasOffsetTable();
|
||||||
|
bool hasIndexTable = Header.HasIndexTable();
|
||||||
|
|
||||||
byte[] recordData;
|
byte[] recordData;
|
||||||
if (Header.HasOffsetTable())
|
if (hasOffsetTable)
|
||||||
recordData = reader.ReadBytes((int)(Header.OffsetTableOffset - 84 - 4 * Header.FieldCount));
|
recordData = reader.ReadBytes((int)(Header.OffsetTableOffset - 84 - 4 * Header.FieldCount));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -231,7 +234,7 @@ namespace Game.DataStorage
|
|||||||
int[] m_indexes = null;
|
int[] m_indexes = null;
|
||||||
|
|
||||||
// OffsetTable
|
// OffsetTable
|
||||||
if (Header.HasOffsetTable() && Header.OffsetTableOffset > 0)
|
if (hasOffsetTable && Header.OffsetTableOffset > 0)
|
||||||
{
|
{
|
||||||
reader.BaseStream.Position = Header.OffsetTableOffset;
|
reader.BaseStream.Position = Header.OffsetTableOffset;
|
||||||
for (int i = 0; i < (Header.MaxId - Header.MinId + 1); i++)
|
for (int i = 0; i < (Header.MaxId - Header.MinId + 1); i++)
|
||||||
@@ -256,7 +259,7 @@ namespace Game.DataStorage
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IndexTable
|
// IndexTable
|
||||||
if (Header.HasIndexTable())
|
if (hasIndexTable)
|
||||||
m_indexes = reader.ReadArray<int>(Header.RecordCount);
|
m_indexes = reader.ReadArray<int>(Header.RecordCount);
|
||||||
|
|
||||||
// Copytable
|
// Copytable
|
||||||
@@ -353,7 +356,7 @@ namespace Game.DataStorage
|
|||||||
{
|
{
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
|
||||||
if (Header.HasOffsetTable() && Header.HasIndexTable())
|
if (hasOffsetTable && hasIndexTable)
|
||||||
{
|
{
|
||||||
id = m_indexes[CopyTable.Count];
|
id = m_indexes[CopyTable.Count];
|
||||||
var map = offsetmap[i];
|
var map = offsetmap[i];
|
||||||
@@ -391,8 +394,10 @@ namespace Game.DataStorage
|
|||||||
bitReader.Offset = i * (int)Header.RecordSize;
|
bitReader.Offset = i * (int)Header.RecordSize;
|
||||||
|
|
||||||
List<byte> data = new List<byte>();
|
List<byte> data = new List<byte>();
|
||||||
|
MemoryStream stream = new MemoryStream();
|
||||||
|
BinaryWriter binaryWriter = new BinaryWriter(stream);
|
||||||
|
|
||||||
if (Header.HasIndexTable())
|
if (hasIndexTable)
|
||||||
id = m_indexes[i];
|
id = m_indexes[i];
|
||||||
|
|
||||||
for (int f = 0; f < Header.FieldCount; f++)
|
for (int f = 0; f < Header.FieldCount; f++)
|
||||||
@@ -403,42 +408,40 @@ namespace Game.DataStorage
|
|||||||
{
|
{
|
||||||
case DB2ColumnCompression.None:
|
case DB2ColumnCompression.None:
|
||||||
int bitSize = FieldStructure[f].BitCount;
|
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
|
id = (int)bitReader.ReadUInt32(bitSize);// always read Ids as ints
|
||||||
data.AddRange(BitConverter.GetBytes(id));
|
binaryWriter.Write(id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int x = 0; x < ColumnMeta[f].ArraySize; x++)
|
for (int x = 0; x < ColumnMeta[f].ArraySize; x++)
|
||||||
data.AddRange(bitReader.ReadValue(bitSize));
|
binaryWriter.Write(bitReader.ReadValue(bitSize));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DB2ColumnCompression.Immediate:
|
case DB2ColumnCompression.Immediate:
|
||||||
if (!Header.HasIndexTable() && f == Header.IdIndex)
|
if (!hasIndexTable && f == Header.IdIndex)
|
||||||
{
|
{
|
||||||
id = (int)bitReader.ReadUInt32(bitWidth);// always read Ids as ints
|
id = (int)bitReader.ReadUInt32(bitWidth);// always read Ids as ints
|
||||||
data.AddRange(BitConverter.GetBytes(id));
|
binaryWriter.Write(id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
binaryWriter.Write(bitReader.ReadValue(bitWidth, ColumnMeta[f].BitOffset, ColumnMeta[f].Cardinality == 1));
|
||||||
data.AddRange(bitReader.ReadValue(bitWidth, ColumnMeta[f].BitOffset, ColumnMeta[f].Cardinality == 1));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DB2ColumnCompression.CommonData:
|
case DB2ColumnCompression.CommonData:
|
||||||
if (ColumnMeta[f].SparseValues.TryGetValue(id, out byte[] valBytes))
|
if (ColumnMeta[f].SparseValues.TryGetValue(id, out byte[] valBytes))
|
||||||
data.AddRange(valBytes);
|
binaryWriter.Write(valBytes);
|
||||||
else
|
else
|
||||||
data.AddRange(BitConverter.GetBytes(ColumnMeta[f].BitOffset));
|
binaryWriter.Write(ColumnMeta[f].BitOffset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DB2ColumnCompression.Pallet:
|
case DB2ColumnCompression.Pallet:
|
||||||
case DB2ColumnCompression.PalletArray:
|
case DB2ColumnCompression.PalletArray:
|
||||||
uint palletIndex = bitReader.ReadUInt32(bitWidth);
|
uint palletIndex = bitReader.ReadUInt32(bitWidth);
|
||||||
data.AddRange(ColumnMeta[f].PalletValues[(int)palletIndex]);
|
binaryWriter.Write(ColumnMeta[f].PalletValues[(int)palletIndex]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -451,12 +454,12 @@ namespace Game.DataStorage
|
|||||||
{
|
{
|
||||||
// seen cases of missing indicies
|
// seen cases of missing indicies
|
||||||
if (RelationShipData.Entries.TryGetValue((uint)i, out byte[] foreignData))
|
if (RelationShipData.Entries.TryGetValue((uint)i, out byte[] foreignData))
|
||||||
data.AddRange(foreignData);
|
binaryWriter.Write(foreignData);
|
||||||
else
|
else
|
||||||
data.AddRange(new byte[4]);
|
binaryWriter.Write(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyTable.Add(id, data.ToArray());
|
CopyTable.Add(id, stream.ToArray());
|
||||||
|
|
||||||
if (Copies.ContainsKey(id))
|
if (Copies.ContainsKey(id))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user