Пример #1
0
        private static void PackPC(string sourcePath, string saveFileName, bool useCryptography, bool updateSng)
        {
            foreach (var namesBlock in Directory.EnumerateFiles(sourcePath, "NamesBlock.bin", SearchOption.AllDirectories))
            {
                if (File.Exists(namesBlock))
                {
                    File.Delete(namesBlock);
                }
            }

            using (var psarcStream = new MemoryStream())
                using (var streamCollection = new DisposableCollection <Stream>())
                {
                    var psarc = new PSARC.PSARC();
                    foreach (var x in Directory.EnumerateFiles(sourcePath))
                    {
                        var fileStream = File.OpenRead(x);
                        streamCollection.Add(fileStream);
                        var entry = new PSARC.Entry
                        {
                            Name   = Path.GetFileName(x),
                            Data   = fileStream,
                            Length = (ulong)fileStream.Length
                        };
                        psarc.AddEntry(entry);
                    }

                    foreach (var directory in Directory.EnumerateDirectories(sourcePath))
                    {
                        var innerPsarcStream = new MemoryStream();
                        streamCollection.Add(innerPsarcStream);
                        var directoryName = Path.GetFileName(directory);

                        // Recreate SNG
                        if (updateSng)
                        {
                            if (directory.ToLower().IndexOf("dlc_tone_") < 0)
                            {
                                UpdateSng(directory, new Platform(GamePlatform.Pc, GameVersion.RS2012));
                            }
                        }

                        PackInnerPC(innerPsarcStream, directory);
                        psarc.AddEntry(directoryName + ".psarc", innerPsarcStream);
                    }

                    psarc.Write(psarcStream, false);
                    psarcStream.Flush();
                    psarcStream.Seek(0, SeekOrigin.Begin);

                    if (Path.GetExtension(saveFileName) != ".dat")
                    {
                        saveFileName += ".dat";
                    }

                    using (var outputFileStream = File.Create(saveFileName))
                    {
                        if (useCryptography)
                        {
                            RijndaelEncryptor.EncryptFile(psarcStream, outputFileStream, RijndaelEncryptor.DLCKey);
                        }
                        else
                        {
                            psarcStream.CopyTo(outputFileStream);
                        }
                    }
                }
        }
        private static void PackPC(string sourcePath, string saveFileName, bool useCryptography, bool updateSng)
        {
            string[] namesBlock = Directory.GetFiles(sourcePath, "NamesBlock.bin", SearchOption.AllDirectories);
            foreach (var nb in namesBlock) {
                if (File.Exists(nb))
                    File.Delete(nb);
            }

            using (var psarcStream = new MemoryStream())
            using (var streamCollection = new DisposableCollection<Stream>())
            {
                var psarc = new PSARC.PSARC();

                foreach (var x in Directory.EnumerateFiles(sourcePath))
                {
                    var fileStream = File.OpenRead(x);
                    streamCollection.Add(fileStream);
                    var entry = new PSARC.Entry
                    {
                        Name = Path.GetFileName(x),
                        Data = fileStream,
                        Length = (ulong)fileStream.Length
                    };
                    psarc.AddEntry(entry);
                }

                foreach (var directory in Directory.EnumerateDirectories(sourcePath))
                {
                    var innerPsarcStream = new MemoryStream();
                    streamCollection.Add(innerPsarcStream);
                    var directoryName = Path.GetFileName(directory);

                    // Recreate SNG
                    if (updateSng)
                        if (directory.ToLower().IndexOf("dlc_tone_") < 0)
                            UpdateSng(directory, new Platform(GamePlatform.Pc, GameVersion.RS2012));

                    PackInnerPC(innerPsarcStream, directory);
                    psarc.AddEntry(directoryName + ".psarc", innerPsarcStream);
                }

                psarc.Write(psarcStream, false);
                psarcStream.Flush();
                psarcStream.Seek(0, SeekOrigin.Begin);

                if (Path.GetExtension(saveFileName) != ".dat")
                    saveFileName += ".dat";

                using (var outputFileStream = File.Create(saveFileName))
                {
                    if (useCryptography)
                        RijndaelEncryptor.EncryptFile(psarcStream, outputFileStream, RijndaelEncryptor.DLCKey);
                    else
                        psarcStream.CopyTo(outputFileStream);
                }
            }
        }