Example #1
0
        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);
                }
            }
        }
Example #2
0
            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);
            }
Example #3
0
 public FileEntry(PacNode node)
 {
     Name     = node.Name;
     FileData = node.Data;
     if (node.Name == null)
     {
         Name = "File Node";
     }
     if (FileData == null)
     {
         FileData = new byte[0];
     }
 }
Example #4
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);
            }
        }
Example #5
0
            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);
                    }
                }
            }