From 320b6b72a37341d49011c766e6ca1c8864edc79f Mon Sep 17 00:00:00 2001 From: iAmAsval Date: Thu, 21 May 2020 16:33:05 +0200 Subject: [PATCH] fixed pakreader <-> pakentry connection + fixed compressed ini --- FModel/PakReader/LocResReader.cs | 12 ++++--- FModel/PakReader/Parsers/Objects/FPakEntry.cs | 12 +++++-- FModel/Utils/Assets.cs | 33 +++++++++---------- FModel/Utils/Localizations.cs | 5 +-- .../Treeview/SortedTreeviewViewModel.cs | 5 +-- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/FModel/PakReader/LocResReader.cs b/FModel/PakReader/LocResReader.cs index e08ebabf..a5fc54fe 100644 --- a/FModel/PakReader/LocResReader.cs +++ b/FModel/PakReader/LocResReader.cs @@ -101,11 +101,11 @@ namespace PakReader { reader.ReadUInt32(); // StrHash } - var Key = reader.ReadFString(); + string Key = reader.ReadFString(); reader.ReadUInt32(); // SourceStringHash - string EntryLocalizedString; + string EntryLocalizedString = string.Empty; if (VersionNumber >= Version.COMPACT) { int LocalizedStringIndex = reader.ReadInt32(); @@ -130,16 +130,18 @@ namespace PakReader } else { - throw new IOException($"LocRes has an invalid localized string index for namespace '{Namespace}' and key '{Key}'. This entry will have no translation."); + //throw new IOException($"LocRes has an invalid localized string index for namespace '{Namespace}' and key '{Key}'. This entry will have no translation."); } } else { EntryLocalizedString = reader.ReadFString(); } - Entries.Add(Key, EntryLocalizedString); + + if (Key != null) Entries.Add(Key, EntryLocalizedString); } - this.Entries.Add(Namespace, Entries); + + if (Namespace != null) this.Entries.Add(Namespace, Entries); } } diff --git a/FModel/PakReader/Parsers/Objects/FPakEntry.cs b/FModel/PakReader/Parsers/Objects/FPakEntry.cs index 8fa8583c..e19ab17f 100644 --- a/FModel/PakReader/Parsers/Objects/FPakEntry.cs +++ b/FModel/PakReader/Parsers/Objects/FPakEntry.cs @@ -143,8 +143,16 @@ namespace PakReader.Parsers.Objects stream.Read(data, 0, data.Length); byte[] decrypted = AESDecryptor.DecryptAES(data, key); - if (CompressionMethodIndex != 0U) Decompress(stream, compressionMethods, decrypted); - return new ArraySegment(decrypted, 0, (int)UncompressedSize); + if (CompressionMethodIndex != 0U) + { + using var m = new MemoryStream(decrypted, 0, decrypted.Length) + { + Position = 0 + }; + Decompress(m, compressionMethods, decrypted); + } + + return new ArraySegment(decrypted, 0, decrypted.Length <= (int)UncompressedSize ? decrypted.Length : (int)UncompressedSize); } else { diff --git a/FModel/Utils/Assets.cs b/FModel/Utils/Assets.cs index 01ba98f5..ebff5a49 100644 --- a/FModel/Utils/Assets.cs +++ b/FModel/Utils/Assets.cs @@ -72,7 +72,7 @@ namespace FModel.Utils { case ".ini": { - using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension()); + using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension()); asset.Position = 0; using var reader = new StreamReader(asset); AvalonEditVm.avalonEditViewModel.Set(reader.ReadToEnd(), selected.PakEntry.GetNameWithExtension(), AvalonEditVm.IniHighlighter); @@ -82,7 +82,7 @@ namespace FModel.Utils case ".uplugin": case ".upluginmanifest": { - using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension()); + using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension()); asset.Position = 0; using var reader = new StreamReader(asset); AvalonEditVm.avalonEditViewModel.Set(reader.ReadToEnd(), selected.PakEntry.GetNameWithExtension()); @@ -90,21 +90,21 @@ namespace FModel.Utils } case ".locmeta": { - using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension()); + using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension()); asset.Position = 0; AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new LocMetaReader(asset), Formatting.Indented), selected.PakEntry.GetNameWithExtension()); break; } case ".locres": { - using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension()); + using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension()); asset.Position = 0; AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new LocResReader(asset).Entries, Formatting.Indented), selected.PakEntry.GetNameWithExtension()); break; } case ".udic": { - using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension()); + using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension()); asset.Position = 0; AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new FOodleDictionaryArchive(asset).Header, Formatting.Indented), selected.PakEntry.GetNameWithExtension()); break; @@ -115,7 +115,7 @@ namespace FModel.Utils !selected.PakEntry.Name.Equals("FortniteGame/AssetRegistry.bin") && // this file is 85mb... selected.PakEntry.Name.Contains("AssetRegistry")) // only parse AssetRegistry (basically the ones in dynamic paks) { - using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension()); + using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension()); asset.Position = 0; AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new FAssetRegistryState(asset), Formatting.Indented), selected.PakEntry.GetNameWithExtension()); } @@ -123,7 +123,7 @@ namespace FModel.Utils } case ".png": { - using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension()); + using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension()); asset.Position = 0; ImageBoxVm.imageBoxViewModel.Set(SKBitmap.Decode(asset), selected.PakEntry.GetNameWithExtension()); break; @@ -153,12 +153,11 @@ namespace FModel.Utils TaskScheduler.FromCurrentSynchronizationContext()); } - public static MemoryStream GetMemoryStream(string pathWithoutExtension) + public static MemoryStream GetMemoryStream(string pakName, string pathWithoutExtension) { - foreach (PakFileReader pak in Globals.CachedPakFiles.Values) + if (Globals.CachedPakFiles.TryGetValue(pakName, out PakFileReader pak)) { - if (!pak.Initialized) continue; // this should never happen because he can't be cached if not initialized - if (!pak.TryGetFile(pathWithoutExtension, out ArraySegment uasset, out _, out _)) + if (pak.Initialized && !pak.TryGetFile(pathWithoutExtension, out ArraySegment uasset, out _, out _)) { if (uasset != null) { @@ -255,10 +254,9 @@ namespace FModel.Utils return true; } - foreach (PakFileReader pak in Globals.CachedPakFiles.Values) + if (Globals.CachedPakFiles.TryGetValue(entry.PakFileName, out PakFileReader pak)) { - if (!pak.Initialized) continue; // this should never happen because he can't be cached if not initialized - if (pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment uasset, out ArraySegment uexp, out ArraySegment ubulk)) + if (pak.Initialized && pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment uasset, out ArraySegment uexp, out ArraySegment ubulk)) { package = new PakPackage(uasset, uexp, ubulk); _CachedFiles[entry] = new Dictionary[]> @@ -288,10 +286,9 @@ namespace FModel.Utils return true; } - foreach (PakFileReader pak in Globals.CachedPakFiles.Values) + if (Globals.CachedPakFiles.TryGetValue(entry.PakFileName, out PakFileReader pak)) { - if (!pak.Initialized) continue; // this should never happen because he can't be cached if not initialized - if (pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment uasset, out ArraySegment uexp, out ArraySegment ubulk)) + if (pak.Initialized && pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment uasset, out ArraySegment uexp, out ArraySegment ubulk)) { arraySegment = new ArraySegment[] { uasset, uexp, ubulk }; return true; @@ -363,7 +360,7 @@ namespace FModel.Utils string name = Path.GetFileName(fullPath); Directory.CreateDirectory(basePath + entry.GetPathWithoutFile()); - using var data = GetMemoryStream(r.MountPoint + entry.GetPathWithoutExtension()); + using var data = GetMemoryStream(entry.PakFileName, r.MountPoint + entry.GetPathWithoutExtension()); using var stream = new FileStream(fullPath, FileMode.Create, FileAccess.Write); data.WriteTo(stream); diff --git a/FModel/Utils/Localizations.cs b/FModel/Utils/Localizations.cs index 69dec3e3..6f15be36 100644 --- a/FModel/Utils/Localizations.cs +++ b/FModel/Utils/Localizations.cs @@ -53,7 +53,7 @@ namespace FModel.Utils { DebugHelper.WriteLine("{0} {1} {2} {3}", "[FModel]", "[Localizations]", "[GameDict]", $"Feeding with {KvP.Value.Name} from {KvP.Value.PakFileName} Miam Miam!"); - using var asset = Assets.GetMemoryStream(mount + KvP.Value.GetPathWithoutExtension()); + using var asset = Assets.GetMemoryStream(fileReader.FileName, mount + KvP.Value.GetPathWithoutExtension()); asset.Position = 0; foreach (var namespac in new LocResReader(asset).Entries) { @@ -61,7 +61,8 @@ namespace FModel.Utils _fortniteLocalizationDict[namespac.Key] = new Dictionary(); foreach (var key in namespac.Value) - _fortniteLocalizationDict[namespac.Key][key.Key] = key.Value; + if (!string.IsNullOrEmpty(key.Value)) + _fortniteLocalizationDict[namespac.Key][key.Key] = key.Value; } } } diff --git a/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs b/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs index 1db0f4a0..bec504d4 100644 --- a/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs +++ b/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs @@ -1,6 +1,7 @@ using FModel.Utils; using FModel.ViewModels.DataGrid; using FModel.ViewModels.ListBox; +using PakReader.Pak; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; @@ -70,9 +71,9 @@ namespace FModel.ViewModels.Treeview var m = Regex.Match(entry.Name, $"{fullPath}/*", RegexOptions.IgnoreCase); if (m.Success) { - foreach (var entries in Globals.CachedPakFiles.Values) + if (Globals.CachedPakFiles.TryGetValue(entry.PakFile, out PakFileReader pak)) { - if (entries.TryGetValue("/" + entry.Name.Substring(0, entry.Name.LastIndexOf(".")), out var pakEntry)) // remove the extension to get the entry + if (pak.TryGetValue("/" + entry.Name.Substring(0, entry.Name.LastIndexOf(".")), out var pakEntry)) // remove the extension to get the entry { entriesToExtract.Add(new ListBoxViewModel {