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); } } }