private static void GetPAKsFileInfos() { if (PAKEntries.PAKEntriesList != null && PAKEntries.PAKEntriesList.Any()) { new UpdateMyProcessEvents($"Writing {Path.GetFileName(BACKUP_FILE_PATH)}", "Waiting").Update(); Directory.CreateDirectory(Path.GetDirectoryName(BACKUP_FILE_PATH)); using (FileStream fileStream = new FileStream(BACKUP_FILE_PATH, FileMode.Create)) using (BinaryWriter writer = new BinaryWriter(fileStream)) { DebugHelper.WriteLine("Backup: Gathering info about local .PAK files"); foreach (PAKInfosEntry Pak in PAKEntries.PAKEntriesList) { byte[] AESKey = null; if (Pak.bTheDynamicPAK) { if (AESEntries.AESEntriesList != null && AESEntries.AESEntriesList.Any()) { string AESFromManager = AESEntries.AESEntriesList.Where(x => string.Equals(x.ThePAKName, Path.GetFileNameWithoutExtension(Pak.ThePAKPath))).Select(x => x.ThePAKKey).FirstOrDefault(); if (!string.IsNullOrEmpty(AESFromManager)) { AESKey = AESUtility.StringToByteArray(AESFromManager); } } } else { AESKey = AESUtility.StringToByteArray(FProp.Default.FPak_MainAES); } if (AESKey != null) { DebugHelper.WriteLine($".PAKs: Backing up {Pak.ThePAKPath} with key: {BitConverter.ToString(AESKey).Replace("-", string.Empty)}"); PakReader.PakReader reader = new PakReader.PakReader(Pak.ThePAKPath, AESKey); if (reader != null) { new UpdateMyProcessEvents($"{Path.GetFileNameWithoutExtension(Pak.ThePAKPath)} mount point: {reader.MountPoint}", "Waiting").Update(); foreach (FPakEntry entry in reader.FileInfos) { writer.Write(entry.Offset); writer.Write(entry.Size); writer.Write(entry.UncompressedSize); writer.Write(entry.Encrypted); writer.Write(entry.StructSize); writer.Write(entry.Name); writer.Write(entry.CompressionMethodIndex); } } } else { DebugHelper.WriteLine($".PAKs: Not backing up {Pak.ThePAKPath} because its key is empty"); } } } if (new FileInfo(BACKUP_FILE_PATH).Length > 0) //HENCE WE CHECK THE LENGTH { DebugHelper.WriteLine($".PAKs: \\Backups\\{Path.GetFileName(BACKUP_FILE_PATH)} successfully created"); new UpdateMyProcessEvents($"\\Backups\\{Path.GetFileName(BACKUP_FILE_PATH)} successfully created", "Success").Update(); } else { DebugHelper.WriteLine("Backup: File created is empty"); File.Delete(BACKUP_FILE_PATH); //WE DELETE THE EMPTY FILE CREATED new UpdateMyProcessEvents($"Error while creating {Path.GetFileName(BACKUP_FILE_PATH)}", "Error").Update(); } } }
private static void LoadPAKFiles(bool bAllPAKs = false) { if (PAKEntries.PAKEntriesList != null && PAKEntries.PAKEntriesList.Any()) { AssetEntries.ArraySearcher = new Dictionary <string, FPakEntry[]>(); AssetEntries.AssetEntriesDict = new Dictionary <string, PakReader.PakReader>(); //MAIN PAKs LOOP foreach (PAKInfosEntry Pak in PAKEntries.PAKEntriesList.Where(x => !x.bTheDynamicPAK)) { if (!string.IsNullOrEmpty(FProp.Default.FPak_MainAES)) { DebugHelper.WriteLine($".PAKs: Loading {Pak.ThePAKPath} with key: {FProp.Default.FPak_MainAES}"); byte[] AESKey = AESUtility.StringToByteArray(FProp.Default.FPak_MainAES); PakReader.PakReader reader = null; try { reader = new PakReader.PakReader(Pak.ThePAKPath, AESKey); } catch (Exception ex) { DebugHelper.WriteException(ex, Pak.ThePAKPath); if (string.Equals(ex.Message, "The AES key is invalid")) { UIHelper.DisplayError(); } else { new UpdateMyConsole(ex.Message, CColors.Red, true).Append(); return; } break; } if (reader != null) { PAKEntries.PAKToDisplay.Add(Path.GetFileName(Pak.ThePAKPath), reader.FileInfos); if (bAllPAKs) { new UpdateMyProcessEvents($"{Path.GetFileNameWithoutExtension(Pak.ThePAKPath)} mount point: {reader.MountPoint}", "Loading").Update(); } foreach (FPakEntry entry in reader.FileInfos) { AssetEntries.AssetEntriesDict[entry.Name] = reader; AssetEntries.ArraySearcher[entry.Name] = reader.FileInfos; } } } } //DYNAMIC PAKs LOOP foreach (PAKInfosEntry Pak in PAKEntries.PAKEntriesList.Where(x => x.bTheDynamicPAK)) { byte[] AESKey = null; string AESFromManager = string.Empty; if (AESEntries.AESEntriesList != null && AESEntries.AESEntriesList.Any()) { AESFromManager = AESEntries.AESEntriesList.Where(x => string.Equals(x.ThePAKName, Path.GetFileNameWithoutExtension(Pak.ThePAKPath))).Select(x => x.ThePAKKey).FirstOrDefault(); if (!string.IsNullOrEmpty(AESFromManager)) { DebugHelper.WriteLine($".PAKs: Loading {Pak.ThePAKPath} with key: {AESFromManager}"); AESKey = AESUtility.StringToByteArray(AESFromManager); } } if (AESKey != null) { PakReader.PakReader reader = null; try { reader = new PakReader.PakReader(Pak.ThePAKPath, AESKey); } catch (Exception ex) { DebugHelper.WriteException(ex, Pak.ThePAKPath); if (string.Equals(ex.Message, "The AES key is invalid")) { UIHelper.DisplayError(Path.GetFileNameWithoutExtension(Pak.ThePAKPath), AESFromManager); } else { new UpdateMyConsole(ex.Message, CColors.Red, true).Append(); return; } continue; } if (reader != null) { PAKEntries.PAKToDisplay.Add(Path.GetFileName(Pak.ThePAKPath), reader.FileInfos); if (bAllPAKs) { new UpdateMyProcessEvents($"{Path.GetFileNameWithoutExtension(Pak.ThePAKPath)} mount point: {reader.MountPoint}", "Loading").Update(); } foreach (FPakEntry entry in reader.FileInfos) { AssetEntries.AssetEntriesDict[entry.Name] = reader; AssetEntries.ArraySearcher[entry.Name] = reader.FileInfos; } } } else { DebugHelper.WriteLine($".PAKs: No key found for {Pak.ThePAKPath}"); } } AssetTranslations.SetAssetTranslation(FProp.Default.FLanguage); } }