private void LoadNode(PacNode node, string fullPath) { if (!string.IsNullOrEmpty(node.Name)) { fullPath += node.Name; } if (node.HasData && node.Data is byte[]) { var fileEntry = new FileEntry(node); fileEntry.FileName = $"{fullPath}.{node.Extension}"; fileEntry.Name = fileEntry.FileName; files.Add(fileEntry); } else if (node.HasData && node.Data is PacNodeTree) { LoadTree((PacNodeTree)node.Data); } else { foreach (var childNode in node.Children) { LoadNode(childNode, fullPath); } } }
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 FileEntry(PacNode node) { Name = node.Name; FileData = node.Data; if (node.Name == null) { Name = "File Node"; } if (FileData == null) { FileData = new byte[0]; } }
public void LoadTree(PacNode node, string fullPath = "") { bool IsFile = node.HasData && node.Data != null; if (IsFile) { FileEntry newNode = new FileEntry(node); newNode.FileName = $"{fullPath}.{newNode.Name}"; files.Add(newNode); } if (node.Name != "Node" && node.Name != null) { fullPath += $"/{node.Name}"; } for (int i = 0; i < node.Children.Count; i++) { LoadTree(node.Children[i], fullPath); } }
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); } } }