Exemplo n.º 1
0
        private void ProcessIndex(FArchive reader)
        {
            FString?mountPoint = default;
            int     entryCount = 0;

            reader.Read(ref mountPoint)
            .Read(ref entryCount);
            MountPoint    = mountPoint.ToString().Replace("../../../", null);
            AbsoluteIndex = new Dictionary <string, PakEntry>(entryCount);

            for (var i = 0; i < entryCount; i++)
            {
                FString?fileName = default;
                reader.Read(ref fileName);
                var filePath = Path.Combine(MountPoint, fileName.ToString());
                var entry    = new PakEntry(this, Path.GetFileName(filePath));
                entry.Serialize(reader);
                AbsoluteIndex.Add(filePath, entry);
            }

            // TODO: Change this to something working better
            foreach (var kv in AbsoluteIndex)
            {
                var val = kv.Value;
                if (kv.Value.IsCompressed)
                {
                    val.CompressionBlocks.OffsetBy((int)val.EntryHeaderSize);
                }

                if (kv.Key.EndsWith(".uasset"))
                {
                    var expPath = Path.ChangeExtension(kv.Key, ".uexp");
                    if (AbsoluteIndex.TryGetValue(expPath, out var exports))
                    {
                        val.LinkedEntry = exports;
                        var bulkPath = Path.ChangeExtension(kv.Key, ".ubulk");
                        if (AbsoluteIndex.TryGetValue(bulkPath, out var bulk))
                        {
                            exports.LinkedEntry = bulk;
                        }
                    }
                }
            }
        }