From 7c9b820a8de19234f400ddd0d774408076ea3a21 Mon Sep 17 00:00:00 2001 From: iAmAsval Date: Sat, 21 Nov 2020 21:54:30 +0100 Subject: [PATCH] some other stuff --- FModel/App.xaml.cs | 2 +- FModel/Creator/Rarities/Serie.cs | 13 +++--- FModel/MainWindow.xaml | 2 +- .../PakReader/IO/FFileIoStoreContainerFile.cs | 1 - FModel/PakReader/IO/FFileIoStoreReader.cs | 6 +-- FModel/PakReader/IO/IoPackage.cs | 12 +++-- FModel/PakReader/LocMetaReader.cs | 18 +++++--- FModel/PakReader/LocResReader.cs | 2 +- FModel/PakReader/Parsers/Class/UObject.cs | 16 +------ FModel/PakReader/Parsers/IoPackageReader.cs | 44 ++++++++----------- .../Parsers/Objects/FGameplayTagContainer.cs | 4 +- .../Parsers/Objects/FPackageIndex.cs | 2 - FModel/Utils/Assets.cs | 2 +- FModel/ViewModels/MenuItem/MenuItems.cs | 2 +- .../SoundPlayer/InputFileViewModel.cs | 1 - .../DarkMessageBox/DarkMessageBox.xaml | 5 ++- .../DarkMessageBox/DarkMessageBox.xaml.cs | 3 +- .../DarkMessageBox/DarkMessageBoxHelper.cs | 4 +- FModel/Windows/SoundPlayer/NVorbisSource.cs | 9 +++- 19 files changed, 70 insertions(+), 78 deletions(-) diff --git a/FModel/App.xaml.cs b/FModel/App.xaml.cs index 7e7f5122..62ebf361 100644 --- a/FModel/App.xaml.cs +++ b/FModel/App.xaml.cs @@ -62,7 +62,7 @@ namespace FModel { string errorMessage = string.Format(FModel.Properties.Resources.UnhandledExceptionOccured, e.Exception.Message); DebugHelper.WriteException(e.Exception, "thrown in App.xaml.cs by OnDispatcherUnhandledException"); - DarkMessageBoxHelper.Show(errorMessage, FModel.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); + DarkMessageBoxHelper.Show(errorMessage, FModel.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error, true); e.Handled = true; } diff --git a/FModel/Creator/Rarities/Serie.cs b/FModel/Creator/Rarities/Serie.cs index 3c384d52..37aa60b1 100644 --- a/FModel/Creator/Rarities/Serie.cs +++ b/FModel/Creator/Rarities/Serie.cs @@ -11,12 +11,15 @@ namespace FModel.Creator.Rarities { public static void GetRarity(BaseIcon icon, ObjectProperty o) { - Package p = Utils.GetPropertyPakPackage(o.Value.Resource.OuterIndex.Resource.ObjectName.String); - if (p.HasExport() && !p.Equals(default)) + if (o.Value.Resource != null) { - var obj = p.GetExport(); - if (obj != null) - GetRarity(icon, obj); + Package p = Utils.GetPropertyPakPackage(o.Value.Resource.OuterIndex.Resource.ObjectName.String); + if (p.HasExport() && !p.Equals(default)) + { + var obj = p.GetExport(); + if (obj != null) + GetRarity(icon, obj); + } } } diff --git a/FModel/MainWindow.xaml b/FModel/MainWindow.xaml index 524247c7..a5b595a6 100644 --- a/FModel/MainWindow.xaml +++ b/FModel/MainWindow.xaml @@ -625,7 +625,7 @@ - + diff --git a/FModel/PakReader/IO/FFileIoStoreContainerFile.cs b/FModel/PakReader/IO/FFileIoStoreContainerFile.cs index 2b8a22e0..b26b0938 100644 --- a/FModel/PakReader/IO/FFileIoStoreContainerFile.cs +++ b/FModel/PakReader/IO/FFileIoStoreContainerFile.cs @@ -6,7 +6,6 @@ namespace FModel.PakReader.IO public struct FFileIoStoreContainerFile { public Stream FileHandle; - public string FileName; public long CompressionBlockSize; public string[] CompressionMethods; public FIoStoreTocCompressedBlockEntry[] CompressionBlocks; diff --git a/FModel/PakReader/IO/FFileIoStoreReader.cs b/FModel/PakReader/IO/FFileIoStoreReader.cs index 4849ee12..e9a66b98 100644 --- a/FModel/PakReader/IO/FFileIoStoreReader.cs +++ b/FModel/PakReader/IO/FFileIoStoreReader.cs @@ -31,7 +31,7 @@ namespace FModel.PakReader.IO { if (!HasDirectoryIndex) return; if (value != null && !TestAesKey(value)) //if value not null, test but fail, throw not working - throw new ArgumentException(string.Format(FModel.Properties.Resources.AesNotWorking, value.ToStringKey(), ContainerFile.FileName)); + throw new ArgumentException(string.Format(FModel.Properties.Resources.AesNotWorking, value.ToStringKey(), FileName)); _aesKey = value; // else, even if value is null, set it // setting _aesKey to null will disable the corresponding menu item } @@ -176,9 +176,9 @@ namespace FModel.PakReader.IO var remainingSize = dst.Length; var dstOffset = 0; - for (int blockIndex = firstBlockIndex; blockIndex <= lastBlockIndex; blockIndex++) + for (int i = firstBlockIndex; i <= lastBlockIndex; i++) { - var compressionBlock = tocResource.CompressionBlocks[blockIndex]; + var compressionBlock = tocResource.CompressionBlocks[i]; var rawSize = BinaryHelper.Align(compressionBlock.CompressedSize, AESDecryptor.ALIGN); var compressedBuffer = new byte[rawSize]; diff --git a/FModel/PakReader/IO/IoPackage.cs b/FModel/PakReader/IO/IoPackage.cs index 26c51f47..a72fa257 100644 --- a/FModel/PakReader/IO/IoPackage.cs +++ b/FModel/PakReader/IO/IoPackage.cs @@ -8,17 +8,15 @@ namespace FModel.PakReader.IO { public class IoPackage : Package { - private byte[] UAsset; - private byte[] UBulk; - private FIoStoreEntry _entry; + private readonly byte[] UAsset; + private readonly byte[] UBulk; private IoPackageReader _reader; - private string _jsonData = null; + private readonly string _jsonData = null; - internal IoPackage(byte[] asset, byte[] bulk, FIoStoreEntry entry) + internal IoPackage(byte[] asset, byte[] bulk) { UAsset = asset; UBulk = bulk; - _entry = entry; } public IoPackageReader Reader @@ -33,7 +31,7 @@ namespace FModel.PakReader.IO if (bulk != null) bulk.Position = 0; - return _reader = new IoPackageReader(asset, bulk, Globals.GlobalData, _entry.ioStore, true); + return _reader = new IoPackageReader(asset, bulk, Globals.GlobalData, true); } return _reader; diff --git a/FModel/PakReader/LocMetaReader.cs b/FModel/PakReader/LocMetaReader.cs index 664aeb95..c2722add 100644 --- a/FModel/PakReader/LocMetaReader.cs +++ b/FModel/PakReader/LocMetaReader.cs @@ -8,6 +8,7 @@ namespace FModel.PakReader static readonly FGuid Magic = new FGuid(0xA14CEE4F, 0x83554868, 0xBD464C6C, 0x7C50DA70); public readonly string NativeCulture; public readonly string NativeLocRes; + public readonly string[] CompiledCultures; public LocMetaReader(Stream stream) : this(new BinaryReader(stream)) { } @@ -19,22 +20,29 @@ namespace FModel.PakReader } var VersionNumber = (Version)reader.ReadByte(); - if (VersionNumber > Version.LATEST) + if (VersionNumber > Version.Latest) { - throw new IOException($"LocMeta file is too new to be loaded! (File Version: {(byte)VersionNumber}, Loader Version: {(byte)Version.LATEST})"); + throw new IOException($"LocMeta file is too new to be loaded! (File Version: {(byte)VersionNumber}, Loader Version: {(byte)Version.Latest})"); } NativeCulture = reader.ReadFString(); NativeLocRes = reader.ReadFString(); + + if (VersionNumber >= Version.AddedCompiledCultures) + { + CompiledCultures = reader.ReadTArray(() => reader.ReadFString()); + } } public enum Version : byte { /** Initial format. */ - INITIAL = 0, + Initial = 0, + /** Added complete list of cultures compiled for the localization target. */ + AddedCompiledCultures, - LATEST_PLUS_ONE, - LATEST = LATEST_PLUS_ONE - 1 + LatestPlusOne, + Latest = LatestPlusOne - 1 } } } diff --git a/FModel/PakReader/LocResReader.cs b/FModel/PakReader/LocResReader.cs index 12360740..50e6ac24 100644 --- a/FModel/PakReader/LocResReader.cs +++ b/FModel/PakReader/LocResReader.cs @@ -29,7 +29,7 @@ namespace FModel.PakReader if (VersionNumber > Version.Latest) { - throw new IOException($"LocRes file is too new to be loaded! (File Version: {(byte)VersionNumber}, Loader Version: {(byte)LocMetaReader.Version.LATEST})"); + throw new IOException($"LocRes file is too new to be loaded! (File Version: {(byte)VersionNumber}, Loader Version: {(byte)LocMetaReader.Version.Latest})"); } // Read the localized string array diff --git a/FModel/PakReader/Parsers/Class/UObject.cs b/FModel/PakReader/Parsers/Class/UObject.cs index 3e487c6c..d44ba2ab 100644 --- a/FModel/PakReader/Parsers/Class/UObject.cs +++ b/FModel/PakReader/Parsers/Class/UObject.cs @@ -1,7 +1,6 @@ using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; -using FModel.Logger; using FModel.PakReader.IO; using FModel.PakReader.Parsers.Objects; using FModel.PakReader.Parsers.PropertyTagData; @@ -62,20 +61,7 @@ namespace FModel.PakReader.Parsers.Class Dict[key] = obj; } } - else - { - Dict[val.ToString()] = null; - if (!isNonZero) - { - // We are lucky: We don't know this property but it also has no content - DebugHelper.WriteLine($"{type ?? "Unknown"}: Unknown property for {GetType().Name} with value {val} but it's zero so we are good"); - } - else - { - DebugHelper.WriteLine($"{type ?? "Unknown"}: Unknown property for {GetType().Name} with value {val}. Can't proceed serialization (Serialized {Dict.Count} properties till now)"); - //throw new FileLoadException($"Unknown property for {GetType().Name} with value {val}. Can't proceed serialization"); - } - } + else Dict[val.ToString()] = null; } while (it.MoveNext()); if (!structFallback && reader.ReadInt32() != 0/* && reader.Position + 16 <= maxSize*/) diff --git a/FModel/PakReader/Parsers/IoPackageReader.cs b/FModel/PakReader/Parsers/IoPackageReader.cs index 5d616d41..df68e5d5 100644 --- a/FModel/PakReader/Parsers/IoPackageReader.cs +++ b/FModel/PakReader/Parsers/IoPackageReader.cs @@ -21,7 +21,7 @@ namespace FModel.PakReader.Parsers public override FNameEntrySerialized[] NameMap { get; } private IUExport[] _dataExports; - private Stream _ubulk; + private readonly Stream _ubulk; public override IUExport[] DataExports { get { @@ -42,11 +42,9 @@ namespace FModel.PakReader.Parsers } } - private Dictionary _importMappings; - - public IoPackageReader(Stream uasset, Stream ubulk, FIoGlobalData globalData, FFileIoStoreReader reader, bool onlyInfo = false) : this(new BinaryReader(uasset), - ubulk, globalData, reader, onlyInfo) { } - public IoPackageReader(BinaryReader uasset, Stream ubulk, FIoGlobalData globalData, FFileIoStoreReader reader, bool onlyInfo = false) + public IoPackageReader(Stream uasset, Stream ubulk, FIoGlobalData globalData, bool onlyInfo = false) : this(new BinaryReader(uasset), + ubulk, globalData, onlyInfo) { } + public IoPackageReader(BinaryReader uasset, Stream ubulk, FIoGlobalData globalData, bool onlyInfo = false) { Loader = uasset; _ubulk = ubulk; @@ -57,9 +55,9 @@ namespace FModel.PakReader.Parsers var nameHashes = new List(); if (Summary.NameMapNamesSize > 0) { - Loader.BaseStream.Position = Summary.NameMapNamesOffset; + Loader.BaseStream.Seek(Summary.NameMapNamesOffset, SeekOrigin.Begin); var nameMapNames = Loader.ReadBytes(Summary.NameMapNamesSize); - Loader.BaseStream.Position = Summary.NameMapHashesOffset; + Loader.BaseStream.Seek(Summary.NameMapHashesOffset, SeekOrigin.Begin); var nameMapHashes = Loader.ReadBytes(Summary.NameMapHashesSize); FNameEntrySerialized.LoadNameBatch(nameMap, nameHashes, nameMapNames, nameMapHashes); @@ -67,7 +65,7 @@ namespace FModel.PakReader.Parsers NameMap = nameMap.ToArray(); - Loader.BaseStream.Position = Summary.ImportMapOffset; + Loader.BaseStream.Seek(Summary.ImportMapOffset, SeekOrigin.Begin); var importMapCount = (Summary.ExportMapOffset - Summary.ImportMapOffset) / /*sizeof(FPackageObjectIndex)*/ sizeof(ulong); ImportMap = new FPackageObjectIndex[importMapCount]; for (int i = 0; i < importMapCount; i++) @@ -75,7 +73,7 @@ namespace FModel.PakReader.Parsers ImportMap[i] = new FPackageObjectIndex(Loader); } - Loader.BaseStream.Position = Summary.ExportMapOffset; + Loader.BaseStream.Seek(Summary.ExportMapOffset, SeekOrigin.Begin); var exportMapCount = (Summary.ExportBundlesOffset - Summary.ExportMapOffset) / FExportMapEntry.SIZE; ExportMap = new FExportMapEntry[exportMapCount]; for (int i = 0; i < exportMapCount; i++) @@ -89,10 +87,9 @@ namespace FModel.PakReader.Parsers private void ReadContent() { - Loader.BaseStream.Position = Summary.GraphDataOffset; + Loader.BaseStream.Seek(Summary.GraphDataOffset, SeekOrigin.Begin); var referencedPackagesCount = Loader.ReadInt32(); var graphData = new (FPackageId importedPackageId, FArc[] arcs)[referencedPackagesCount]; - _importMappings = new Dictionary(referencedPackagesCount); FakeImportMap = new List(); for (int i = 0; i < ImportMap.Length; i++) FakeImportMap.Add(new FObjectResource(new FName(), new FPackageIndex())); @@ -101,19 +98,15 @@ namespace FModel.PakReader.Parsers var importedPackageId = new FPackageId(Loader); var arcs = Loader.ReadTArray(() => new FArc(Loader)); graphData[i] = (importedPackageId, arcs); - var importedPackageName = Creator.Utils.GetFullPath(importedPackageId) - ?.Replace($"{Folders.GetGameName()}/Content", "Game"); - var package = Creator.Utils.GetPropertyPakPackage(importedPackageName) as IoPackage; - if (package == null) continue; + string importedPackageName = Creator.Utils.GetFullPath(importedPackageId)?.Replace($"{Folders.GetGameName()}/Content", "Game"); + if (!(Creator.Utils.GetPropertyPakPackage(importedPackageName) is IoPackage package)) continue; foreach (var export in package.Reader.ExportMap) { var realImportIndex = Array.FindIndex(ImportMap, it => it == export.GlobalImportIndex); if (realImportIndex > -1) { - var nextIndex = FakeImportMap.Count; - FakeImportMap[realImportIndex] = new FObjectResource(new FName(export.ObjectName.String), new FPackageIndex(this, -(nextIndex + 1))); - var outerResource = new FObjectResource(new FName(package.Reader.Summary.Name.String), new FPackageIndex()); - FakeImportMap.Add(outerResource); + FakeImportMap[realImportIndex] = new FObjectResource(new FName(export.ObjectName.String), new FPackageIndex(this, -(FakeImportMap.Count + 1))); + FakeImportMap.Add(new FObjectResource(new FName(package.Reader.Summary.Name.String), new FPackageIndex())); } } } @@ -143,19 +136,18 @@ namespace FModel.PakReader.Parsers exportType = new FName("Unknown"); } - Loader.BaseStream.Position = currentExportDataOffset; - + Loader.BaseStream.Seek(currentExportDataOffset, SeekOrigin.Begin); if (Globals.TypeMappings.TryGetValue(exportType.String, out var properties)) { _dataExports[i] = exportType.String switch { - "Texture2D" => new UTexture2D(this, properties, _ubulk, ExportMap.Sum(e => (long) e.CookedSerialSize) + beginExportOffset), - "TextureCube" => new UTexture2D(this, properties, _ubulk, ExportMap.Sum(e => (long) e.CookedSerialSize) + beginExportOffset), - "VirtualTexture2D" => new UTexture2D(this, properties, _ubulk, ExportMap.Sum(e => (long) e.CookedSerialSize) + beginExportOffset), + "Texture2D" => new UTexture2D(this, properties, _ubulk, ExportMap.Sum(e => (long)e.CookedSerialSize) + beginExportOffset), + "TextureCube" => new UTexture2D(this, properties, _ubulk, ExportMap.Sum(e => (long)e.CookedSerialSize) + beginExportOffset), + "VirtualTexture2D" => new UTexture2D(this, properties, _ubulk, ExportMap.Sum(e => (long)e.CookedSerialSize) + beginExportOffset), "CurveTable" => new UCurveTable(this, properties), "DataTable" => new UDataTable(this, properties, exportType.String), //"FontFace" => new UFontFace(this, ubulk), - "SoundWave" => new USoundWave(this, properties, _ubulk, ExportMap.Sum(e => (long) e.CookedSerialSize) + beginExportOffset), + "SoundWave" => new USoundWave(this, properties, _ubulk, ExportMap.Sum(e => (long)e.CookedSerialSize) + beginExportOffset), //"StringTable" => new UStringTable(this), //"AkMediaAssetData" => new UAkMediaAssetData(this, ubulk, ExportMap.Sum(e => e.SerialSize) + PackageFileSummary.TotalHeaderSize), _ => new UObject(this, properties, type: exportType.String), diff --git a/FModel/PakReader/Parsers/Objects/FGameplayTagContainer.cs b/FModel/PakReader/Parsers/Objects/FGameplayTagContainer.cs index 85c3a843..57a4a047 100644 --- a/FModel/PakReader/Parsers/Objects/FGameplayTagContainer.cs +++ b/FModel/PakReader/Parsers/Objects/FGameplayTagContainer.cs @@ -29,7 +29,7 @@ namespace FModel.PakReader.Parsers.Objects { foreach (FName gp in gpt) { - if (gp.String.StartsWith(startWith)) + if (gp.String != null && gp.String.StartsWith(startWith)) { fname = gp; return true; @@ -45,7 +45,7 @@ namespace FModel.PakReader.Parsers.Objects foreach (FName gp in gpt) { foreach (string s in startWith) - if (gp.String.StartsWith(s)) + if (gp.String != null && gp.String.StartsWith(s)) ret.Add(gp.String); } return ret; diff --git a/FModel/PakReader/Parsers/Objects/FPackageIndex.cs b/FModel/PakReader/Parsers/Objects/FPackageIndex.cs index 97749634..ad68bad5 100644 --- a/FModel/PakReader/Parsers/Objects/FPackageIndex.cs +++ b/FModel/PakReader/Parsers/Objects/FPackageIndex.cs @@ -44,8 +44,6 @@ namespace FModel.PakReader.Parsers.Objects { return new FObjectExport(ioReader, AsExport); } - - Debugger.Break(); } } return null; diff --git a/FModel/Utils/Assets.cs b/FModel/Utils/Assets.cs index 97f84ba5..147908bb 100644 --- a/FModel/Utils/Assets.cs +++ b/FModel/Utils/Assets.cs @@ -344,7 +344,7 @@ namespace FModel.Utils if (uexp != null) package = new PakPackage(uasset, uexp, ubulk); else - package = new IoPackage(uasset, ubulk, ioStoreEntry); + package = new IoPackage(uasset, ubulk); #if !DEBUG _CachedFiles[entry] = new Dictionary[]> { diff --git a/FModel/ViewModels/MenuItem/MenuItems.cs b/FModel/ViewModels/MenuItem/MenuItems.cs index 3bf6b1be..dcd41c8e 100644 --- a/FModel/ViewModels/MenuItem/MenuItems.cs +++ b/FModel/ViewModels/MenuItem/MenuItems.cs @@ -107,7 +107,7 @@ namespace FModel.ViewModels.MenuItem public static bool AtLeastOnePak(this ObservableCollection o) => Application.Current.Dispatcher.Invoke(() => o.Any(x => !x.GetType().Equals(typeof(Separator)) && x.PakFile != null)); public static bool AtLeastOnePakWithKey(this ObservableCollection o) => - Application.Current.Dispatcher.Invoke(() => o.Any(x => !x.GetType().Equals(typeof(Separator)) && x.PakFile != null && (x.PakFile.AesKey != null || !x.PakFile.Info.bEncryptedIndex))); + Application.Current.Dispatcher.Invoke(() => o.GetMenuItemsWithReaders().Any(x => x.IsEnabled)); public static IEnumerable GetMenuItemsWithReaders(this ObservableCollection o) => Application.Current.Dispatcher.Invoke(() => o.Where(x => !x.GetType().Equals(typeof(Separator)) && x.HasReader).Select(x => (PakMenuItemViewModel)x)); public static IEnumerable GetMenuItemsWithPakFiles(this ObservableCollection o) => diff --git a/FModel/ViewModels/SoundPlayer/InputFileViewModel.cs b/FModel/ViewModels/SoundPlayer/InputFileViewModel.cs index eab51094..0206e861 100644 --- a/FModel/ViewModels/SoundPlayer/InputFileViewModel.cs +++ b/FModel/ViewModels/SoundPlayer/InputFileViewModel.cs @@ -1,6 +1,5 @@ using FModel.Windows.SoundPlayer.Visualization; using System.Collections.ObjectModel; -using System.Globalization; using System.Windows; namespace FModel.ViewModels.SoundPlayer diff --git a/FModel/Windows/DarkMessageBox/DarkMessageBox.xaml b/FModel/Windows/DarkMessageBox/DarkMessageBox.xaml index c47c7205..54fd208c 100644 --- a/FModel/Windows/DarkMessageBox/DarkMessageBox.xaml +++ b/FModel/Windows/DarkMessageBox/DarkMessageBox.xaml @@ -28,9 +28,10 @@ -