public void Read(FileReader reader, HeaderV3 pac) { uint nodeCount = reader.ReadUInt32(); uint dataNodeCount = reader.ReadUInt32(); rootNodeOffset = reader.ReadUInt64(); ulong dataNodeIndicesOffset = reader.ReadUInt64(); reader.SeekBegin(rootNodeOffset); RootNode = new PacNode(pac, this); RootNode.Read(reader); }
public void Read(FileReader reader) { ulong nameOffset = reader.ReadUInt64(); ulong dataOffset = reader.ReadUInt64(); ulong childIndicesOffset = reader.ReadUInt64(); int parentIndex = reader.ReadInt32(); int index = reader.ReadInt32(); int dataIndex = reader.ReadInt32(); ushort childCount = reader.ReadUInt16(); HasData = reader.ReadBoolean(); byte fullPathSize = reader.ReadByte(); Console.WriteLine($"nameOffset {nameOffset}"); Console.WriteLine($"dataOffset {dataOffset}"); Console.WriteLine($"childIndicesOffset {childIndicesOffset}"); Console.WriteLine($"parentIndex {parentIndex}"); Console.WriteLine($"index {index}"); Console.WriteLine($"dataIndex {dataIndex}"); Console.WriteLine($"childCount {childCount}"); Console.WriteLine($"HasData {HasData}"); if (nameOffset != 0) { reader.SeekBegin((long)nameOffset); Name = reader.ReadZeroTerminatedString(); } if (dataOffset != 0) { reader.SeekBegin((long)dataOffset); uint PacID = reader.ReadUInt32(); //Detecting data in v4 is a pain //Check if the offset is set within the data section var dataPos = 48 + PacFile.NodesSize + PacFile.SplitsInfoSize; if (PacID == PacFile.PacID || IsVersion4 && dataOffset >= dataPos) { ulong dataSize = reader.ReadUInt64(); uint padding = reader.ReadUInt32(); ulong dataBlockOffset = reader.ReadUInt64(); ulong padding2 = reader.ReadUInt64(); ulong extensionOffset = reader.ReadUInt64(); DataType = reader.ReadEnum <DataType>(false); if (extensionOffset != 0) { reader.SeekBegin((long)extensionOffset); string extension = reader.ReadZeroTerminatedString(); Name += extension; } if (dataBlockOffset != 0) { reader.SeekBegin((long)dataBlockOffset); Data = reader.ReadBytes((int)dataSize); } } else { reader.SeekBegin((long)dataOffset); PacNodeTree tree = new PacNodeTree(); tree.Read(reader, PacFile); Children.Add(tree.RootNode); } } if (childIndicesOffset != 0) { reader.SeekBegin((long)childIndicesOffset); int[] Indices = reader.ReadInt32s(childCount); for (int i = 0; i < childCount; i++) { int childIndex = Indices[i]; reader.SeekBegin((uint)ParentTree.rootNodeOffset + (childIndex * 40)); PacNode node = new PacNode(PacFile, ParentTree); node.Read(reader); Children.Add(node); } } }