From 86ec2a931ed5515c7ceef8644a539aeae964d42c Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Mon, 19 Jan 2026 19:21:58 +0200 Subject: [PATCH 1/5] Assault Fire Future support Ace Combat 7 wwise fixes --- CUE4Parse | 2 +- FModel/Views/Snooper/Renderer.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index af1207f8..36c3f644 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit af1207f8a099062e48255db4e5cf45ba3c21311d +Subproject commit 36c3f6447ea48c80789ee5ac96e8d429cbd98c34 diff --git a/FModel/Views/Snooper/Renderer.cs b/FModel/Views/Snooper/Renderer.cs index 0a3a6795..ab9a47b4 100644 --- a/FModel/Views/Snooper/Renderer.cs +++ b/FModel/Views/Snooper/Renderer.cs @@ -598,7 +598,7 @@ public class Renderer : IDisposable if (bSpline && model is SplineModel splineModel) splineModel.AddComponent((USplineMeshComponent)staticMeshComp); } - else if (m.TryConvert(out var mesh)) + else if (m.TryConvert(out var mesh, UserSettings.Default.NaniteMeshExportFormat)) { model = bSpline ? new SplineModel(m, mesh, (USplineMeshComponent)staticMeshComp, transform) : new StaticModel(m, mesh, transform); model.IsTwoSided = actor.GetOrDefault("bMirrored", staticMeshComp.GetOrDefault("bDisallowMeshPaintPerInstance", model.IsTwoSided)); From b9315cc29813f95a195462311351832e625dc10e Mon Sep 17 00:00:00 2001 From: Masusder <59669685+Masusder@users.noreply.github.com> Date: Mon, 19 Jan 2026 20:33:32 +0100 Subject: [PATCH 2/5] 'The Dark Pictures Anthology: House of Ashes' Wwise support (#632) * 'The Dark Pictures Anthology: House of Ashes' Wwise support * AnyItemMeetsConditionConverter.ConditionMode --------- Co-authored-by: Asval --- FModel/ViewModels/CUE4ParseViewModel.cs | 8 +++++ FModel/ViewModels/GameFileViewModel.cs | 4 ++- .../ContextMenus/FileContextMenu.xaml | 3 +- .../AnyItemMeetsConditionConverter.cs | 31 +++++++++++++++++-- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index aeba0307..c189aeff 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -19,6 +19,7 @@ using CUE4Parse.FileProvider.Objects; using CUE4Parse.FileProvider.Vfs; using CUE4Parse.GameTypes.Aion2.Objects; using CUE4Parse.GameTypes.AshEchoes.FileProvider; +using CUE4Parse.GameTypes.DPA.UE4.Assets.Exports.Wwise; using CUE4Parse.GameTypes.KRD.Assets.Exports; using CUE4Parse.MappingsProvider; using CUE4Parse.UE4.AssetRegistry; @@ -1060,6 +1061,13 @@ public class CUE4ParseViewModel : ViewModel TabControl.SelectedTab.AddImage(sourceFile.SubstringAfterLast('/'), false, bitmap, false, updateUi); return false; + } + // The Dark Pictures Anthology: House of Ashes + case UExternalSource when (isNone || saveAudio) && pointer.Object.Value is UExternalSource externalSource: + { + var audioName = Path.GetFileNameWithoutExtension(externalSource.ExternalSourcePath); + SaveAndPlaySound(audioName, "wem", externalSource.Data?.WemFile ?? [], saveAudio); + return false; } case UAkAudioEvent when (isNone || saveAudio) && pointer.Object.Value is UAkAudioEvent audioEvent: { diff --git a/FModel/ViewModels/GameFileViewModel.cs b/FModel/ViewModels/GameFileViewModel.cs index e0d84c7f..bc311e3e 100644 --- a/FModel/ViewModels/GameFileViewModel.cs +++ b/FModel/ViewModels/GameFileViewModel.cs @@ -6,6 +6,7 @@ using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; using CUE4Parse.FileProvider.Objects; +using CUE4Parse.GameTypes.DPA.UE4.Assets.Exports.Wwise; using CUE4Parse.GameTypes.FN.Assets.Exports.DataAssets; using CUE4Parse.UE4.Assets; using CUE4Parse.UE4.Assets.Exports.Animation; @@ -200,7 +201,8 @@ public class GameFileViewModel(GameFile asset) : ViewModel UCurveBase => EAssetCategory.CurveBase, UWwiseAssetLibrary or USoundBase or UAkMediaAssetData or UAtomWaveBank or USoundAtomCue - or UAtomCueSheet or USoundAtomCueSheet or UFMODBank or UFMODEvent or UAkAudioType => EAssetCategory.Audio, + or UAtomCueSheet or USoundAtomCueSheet or UFMODBank or UFMODEvent or UAkAudioType + or UExternalSource or UExternalSourceBank => EAssetCategory.Audio, UFileMediaSource => EAssetCategory.Video, UFont or UFontFace => EAssetCategory.Font, diff --git a/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml b/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml index 59785879..d8a7ea31 100644 --- a/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml +++ b/FModel/Views/Resources/Controls/ContextMenus/FileContextMenu.xaml @@ -157,9 +157,10 @@ - + + diff --git a/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs b/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs index eaf2de3f..c98977e9 100644 --- a/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs +++ b/FModel/Views/Resources/Converters/AnyItemMeetsConditionConverter.cs @@ -14,18 +14,36 @@ public class AnyItemMeetsConditionConverter : IValueConverter { public Collection Conditions { get; } = []; + /// + /// Determines how multiple conditions are evaluated. Default is 'And'. + /// + public EConditionMode ConditionMode { get; set; } = EConditionMode.And; + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is not IEnumerable items || Conditions.Count == 0) return false; - return items.OfType().Any(item => Conditions.All(c => c.Matches(item))); + Func predicate = ConditionMode switch + { + EConditionMode.And => item => Conditions.All(condition => condition.Matches(item)), + EConditionMode.Or => item => Conditions.Any(condition => condition.Matches(item)), + _ => throw new ArgumentOutOfRangeException() + }; + + return items.OfType().Any(predicate); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } + + public enum EConditionMode + { + And, + Or + } } public interface IItemCondition @@ -39,7 +57,16 @@ public class ItemCategoryCondition : IItemCondition public bool Matches(GameFileViewModel item) { - return item != null && item.AssetCategory.IsOfCategory(Category); + if (item == null) return false; + + // if the specified category is a base category, check if the item's category is derived from it + if (Category.IsBaseCategory()) + { + return item.AssetCategory.IsOfCategory(Category); + } + + // if the specified category is a targeted non-base category, check for exact match + return item.AssetCategory == Category; } } From 3eb4c0d4bec5d60daeb0fde52e6cd352237cf28b Mon Sep 17 00:00:00 2001 From: Marlon Date: Sat, 24 Jan 2026 18:36:31 +0100 Subject: [PATCH 3/5] update fn engine version --- FModel/ViewModels/CUE4ParseViewModel.cs | 14 +++++++------- FModel/ViewModels/GameSelectorViewModel.cs | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index c189aeff..8ffccd6b 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -1061,13 +1061,13 @@ public class CUE4ParseViewModel : ViewModel TabControl.SelectedTab.AddImage(sourceFile.SubstringAfterLast('/'), false, bitmap, false, updateUi); return false; - } - // The Dark Pictures Anthology: House of Ashes - case UExternalSource when (isNone || saveAudio) && pointer.Object.Value is UExternalSource externalSource: - { - var audioName = Path.GetFileNameWithoutExtension(externalSource.ExternalSourcePath); - SaveAndPlaySound(audioName, "wem", externalSource.Data?.WemFile ?? [], saveAudio); - return false; + } + // The Dark Pictures Anthology: House of Ashes + case UExternalSource when (isNone || saveAudio) && pointer.Object.Value is UExternalSource externalSource: + { + var audioName = Path.GetFileNameWithoutExtension(externalSource.ExternalSourcePath); + SaveAndPlaySound(audioName, "wem", externalSource.Data?.WemFile ?? [], saveAudio); + return false; } case UAkAudioEvent when (isNone || saveAudio) && pointer.Object.Value is UAkAudioEvent audioEvent: { diff --git a/FModel/ViewModels/GameSelectorViewModel.cs b/FModel/ViewModels/GameSelectorViewModel.cs index f700a507..9cd43d67 100644 --- a/FModel/ViewModels/GameSelectorViewModel.cs +++ b/FModel/ViewModels/GameSelectorViewModel.cs @@ -87,8 +87,8 @@ public class GameSelectorViewModel : ViewModel .OrderBy(value => ((int)value & 0xFF) == 0); private IEnumerable EnumerateDetectedGames() { - yield return GetUnrealEngineGame("Fortnite", "\\FortniteGame\\Content\\Paks", EGame.GAME_UE5_7); - yield return DirectorySettings.Default("Fortnite [LIVE]", Constants._FN_LIVE_TRIGGER, ue: EGame.GAME_UE5_7); + yield return GetUnrealEngineGame("Fortnite", "\\FortniteGame\\Content\\Paks", EGame.GAME_UE5_8); + yield return DirectorySettings.Default("Fortnite [LIVE]", Constants._FN_LIVE_TRIGGER, ue: EGame.GAME_UE5_8); yield return GetUnrealEngineGame("Pewee", "\\RogueCompany\\Content\\Paks", EGame.GAME_RogueCompany); yield return GetUnrealEngineGame("Rosemallow", "\\Indiana\\Content\\Paks", EGame.GAME_UE4_21); yield return GetUnrealEngineGame("Catnip", "\\OakGame\\Content\\Paks", EGame.GAME_Borderlands3); From aae182d8e44ece068a3e0a08da778473d921be0b Mon Sep 17 00:00:00 2001 From: Marlon Date: Sat, 24 Jan 2026 19:30:47 +0100 Subject: [PATCH 4/5] wwise fix --- FModel/ViewModels/CUE4ParseViewModel.cs | 16 ++++++++++++++-- FModel/ViewModels/GameFileViewModel.cs | 8 +++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index 8ffccd6b..87f3bfc3 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -10,7 +10,9 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows; + using AdonisUI.Controls; + using CUE4Parse; using CUE4Parse.Compression; using CUE4Parse.Encryption.Aes; @@ -19,8 +21,8 @@ using CUE4Parse.FileProvider.Objects; using CUE4Parse.FileProvider.Vfs; using CUE4Parse.GameTypes.Aion2.Objects; using CUE4Parse.GameTypes.AshEchoes.FileProvider; -using CUE4Parse.GameTypes.DPA.UE4.Assets.Exports.Wwise; using CUE4Parse.GameTypes.KRD.Assets.Exports; +using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise; using CUE4Parse.MappingsProvider; using CUE4Parse.UE4.AssetRegistry; using CUE4Parse.UE4.Assets; @@ -51,11 +53,14 @@ using CUE4Parse.UE4.Shaders; using CUE4Parse.UE4.Versions; using CUE4Parse.UE4.Wwise; using CUE4Parse.Utils; + using CUE4Parse_Conversion; using CUE4Parse_Conversion.Sounds; + using EpicManifestParser; using EpicManifestParser.UE; using EpicManifestParser.ZlibngDotNetDecompressor; + using FModel.Creator; using FModel.Extensions; using FModel.Framework; @@ -64,14 +69,21 @@ using FModel.Settings; using FModel.Views; using FModel.Views.Resources.Controls; using FModel.Views.Snooper; + using Newtonsoft.Json; using Newtonsoft.Json.Converters; + using OpenTK.Windowing.Common; using OpenTK.Windowing.Desktop; + using Serilog; + using SkiaSharp; + using Svg.Skia; + using UE4Config.Parsing; + using Application = System.Windows.Application; using FGuid = CUE4Parse.UE4.Objects.Core.Misc.FGuid; @@ -297,7 +309,7 @@ public class CUE4ParseViewModel : ViewModel } Provider.Initialize(); - _wwiseProviderLazy = new Lazy(() => new WwiseProvider(Provider, UserSettings.Default.WwiseMaxBnkPrefetch)); + _wwiseProviderLazy = new Lazy(() => new WwiseProvider(Provider, UserSettings.Default.GameDirectory, UserSettings.Default.WwiseMaxBnkPrefetch)); _fmodProviderLazy = new Lazy(() => new FModProvider(Provider, UserSettings.Default.GameDirectory)); _criWareProviderLazy = new Lazy(() => new CriWareProvider(Provider, UserSettings.Default.GameDirectory)); Log.Information($"{Provider.Versions.Game} ({Provider.Versions.Platform}) | Archives: x{Provider.UnloadedVfs.Count} | AES: x{Provider.RequiredKeys.Count} | Loose Files: x{Provider.Files.Count}"); diff --git a/FModel/ViewModels/GameFileViewModel.cs b/FModel/ViewModels/GameFileViewModel.cs index bc311e3e..d13390d1 100644 --- a/FModel/ViewModels/GameFileViewModel.cs +++ b/FModel/ViewModels/GameFileViewModel.cs @@ -5,9 +5,10 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; + using CUE4Parse.FileProvider.Objects; -using CUE4Parse.GameTypes.DPA.UE4.Assets.Exports.Wwise; using CUE4Parse.GameTypes.FN.Assets.Exports.DataAssets; +using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise; using CUE4Parse.UE4.Assets; using CUE4Parse.UE4.Assets.Exports.Animation; using CUE4Parse.UE4.Assets.Exports.BuildData; @@ -38,12 +39,17 @@ using CUE4Parse.UE4.Objects.RigVM; using CUE4Parse.UE4.Objects.UObject; using CUE4Parse.UE4.Objects.UObject.Editor; using CUE4Parse.Utils; + using CUE4Parse_Conversion.Textures; + using FModel.Framework; using FModel.Services; using FModel.Settings; + using Serilog; + using SkiaSharp; + using Svg.Skia; namespace FModel.ViewModels; From b4a5e05c8a0f283922fcebc8b85a5e26379584f8 Mon Sep 17 00:00:00 2001 From: Marlon Date: Sat, 24 Jan 2026 19:33:09 +0100 Subject: [PATCH 5/5] cue4parse update --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index 36c3f644..32ddcc61 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 36c3f6447ea48c80789ee5ac96e8d429cbd98c34 +Subproject commit 32ddcc61539cb8f82a92c8dc2d769ec34375aa37