예제 #1
0
        public void Initialize(string file = "", Stream[] stream = null !)
        {
            var ext = file.SubstringAfter('.');

            if (string.IsNullOrEmpty(ext))
            {
                return;
            }

            if (ext.Equals("pak", StringComparison.OrdinalIgnoreCase))
            {
                try
                {
                    var reader = new PakFileReader(file, stream[0], Versions)
                    {
                        IsConcurrent = true
                    };
                    if (reader.IsEncrypted && !_requiredKeys.ContainsKey(reader.Info.EncryptionKeyGuid))
                    {
                        _requiredKeys[reader.Info.EncryptionKeyGuid] = null;
                    }
                    _unloadedVfs[reader] = null;
                }
                catch (Exception e)
                {
                    Log.Warning(e.ToString());
                }
            }
            else if (ext.Equals("utoc", StringComparison.OrdinalIgnoreCase))
            {
                try
                {
                    var reader = new IoStoreReader(file, stream[0], stream[1], EIoStoreTocReadOptions.ReadDirectoryIndex, Versions)
                    {
                        IsConcurrent = true
                    };
                    if (reader.IsEncrypted && !_requiredKeys.ContainsKey(reader.Info.EncryptionKeyGuid))
                    {
                        _requiredKeys[reader.Info.EncryptionKeyGuid] = null;
                    }
                    _unloadedVfs[reader] = null;
                }
                catch (Exception e)
                {
                    Log.Warning(e.ToString());
                }
            }
        }
예제 #2
0
        public void Initialize()
        {
            if (!_workingDirectory.Exists)
            {
                throw new ArgumentException("Given directory must exist", nameof(_workingDirectory));
            }

            var osFiles = new Dictionary <string, GameFile>();

            foreach (var file in _workingDirectory.EnumerateFiles("*.*", _searchOption))
            {
                var ext = file.Extension.SubstringAfter('.');
                if (!file.Exists || string.IsNullOrEmpty(ext))
                {
                    return;
                }

                if (ext.Equals("pak", StringComparison.OrdinalIgnoreCase))
                {
                    try
                    {
                        var reader = new PakFileReader(file, Game, Ver)
                        {
                            IsConcurrent = true
                        };
                        if (reader.IsEncrypted && !_requiredKeys.ContainsKey(reader.Info.EncryptionKeyGuid))
                        {
                            _requiredKeys[reader.Info.EncryptionKeyGuid] = null;
                        }
                        _unloadedVfs[reader] = null;
                    }
                    catch (Exception e)
                    {
                        Log.Warning(e.ToString());
                    }
                }
                else if (ext.Equals("utoc", StringComparison.OrdinalIgnoreCase))
                {
                    try
                    {
                        var reader = new IoStoreReader(file, EIoStoreTocReadOptions.ReadDirectoryIndex, Game, Ver)
                        {
                            IsConcurrent = true
                        };
                        if (reader.IsEncrypted && !_requiredKeys.ContainsKey(reader.Info.EncryptionKeyGuid))
                        {
                            _requiredKeys[reader.Info.EncryptionKeyGuid] = null;
                        }
                        _unloadedVfs[reader] = null;
                    }
                    catch (Exception e)
                    {
                        Log.Warning(e.ToString());
                    }
                }
                else
                {
                    // Register local file only if it has a known extension, we don't need every file
                    if (!GameFile.Ue4KnownExtensions.Contains(ext, StringComparer.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    var osFile = new OsGameFile(_workingDirectory, file, Game, Ver);
                    if (IsCaseInsensitive)
                    {
                        osFiles[osFile.Path.ToLowerInvariant()] = osFile;
                    }
                    else
                    {
                        osFiles[osFile.Path] = osFile;
                    }
                }
            }

            _files.AddFiles(osFiles);
        }
예제 #3
0
 public FIoStoreEntry(IoStoreReader reader, string path, uint userData) : base(reader)
 {
     Path     = path;
     UserData = userData;
     ChunkId  = reader.TocResource.ChunkIds[userData];
     ref var offsetLength = ref reader.TocResource.ChunkOffsetLengths[userData];
예제 #4
0
 public FIoStoreEntry(IoStoreReader reader, string path, uint tocEntryIndex) : base(reader)
 {
     Path          = path;
     TocEntryIndex = tocEntryIndex;
     ref var offsetLength = ref reader.TocResource.ChunkOffsetLengths[tocEntryIndex];