|
24 | 24 | using CUE4Parse.UE4.Assets; |
25 | 25 | using CUE4Parse.UE4.Assets.Exports; |
26 | 26 | using CUE4Parse.UE4.Assets.Exports.Animation; |
| 27 | +using CUE4Parse.UE4.Assets.Exports.CriWare; |
27 | 28 | using CUE4Parse.UE4.Assets.Exports.Fmod; |
28 | 29 | using CUE4Parse.UE4.Assets.Exports.Material; |
29 | 30 | using CUE4Parse.UE4.Assets.Exports.SkeletalMesh; |
|
33 | 34 | using CUE4Parse.UE4.Assets.Exports.Verse; |
34 | 35 | using CUE4Parse.UE4.Assets.Exports.Wwise; |
35 | 36 | using CUE4Parse.UE4.BinaryConfig; |
| 37 | +using CUE4Parse.UE4.CriWare; |
| 38 | +using CUE4Parse.UE4.CriWare.Readers; |
36 | 39 | using CUE4Parse.UE4.FMod; |
37 | 40 | using CUE4Parse.UE4.IO; |
38 | 41 | using CUE4Parse.UE4.Localization; |
@@ -135,6 +138,8 @@ public Snooper SnooperViewer |
135 | 138 | public WwiseProvider WwiseProvider => _wwiseProviderLazy.Value; |
136 | 139 | private Lazy<FModProvider> _fmodProviderLazy; |
137 | 140 | public FModProvider FmodProvider => _fmodProviderLazy?.Value; |
| 141 | + private Lazy<CriWareProvider> _criWareProviderLazy; |
| 142 | + public CriWareProvider CriWareProvider => _criWareProviderLazy?.Value; |
138 | 143 | public ConcurrentBag<string> UnknownExtensions = []; |
139 | 144 |
|
140 | 145 | public CUE4ParseViewModel() |
@@ -289,6 +294,7 @@ await _threadWorkerView.Begin(cancellationToken => |
289 | 294 | Provider.Initialize(); |
290 | 295 | _wwiseProviderLazy = new Lazy<WwiseProvider>(() => new WwiseProvider(Provider, UserSettings.Default.WwiseMaxBnkPrefetch)); |
291 | 296 | _fmodProviderLazy = new Lazy<FModProvider>(() => new FModProvider(Provider, UserSettings.Default.GameDirectory)); |
| 297 | + _criWareProviderLazy = new Lazy<CriWareProvider>(() => new CriWareProvider(Provider, UserSettings.Default.GameDirectory)); |
292 | 298 | Log.Information($"{Provider.Versions.Game} ({Provider.Versions.Platform}) | Archives: x{Provider.UnloadedVfs.Count} | AES: x{Provider.RequiredKeys.Count} | Loose Files: x{Provider.Files.Count}"); |
293 | 299 | }); |
294 | 300 | } |
@@ -642,6 +648,7 @@ public void Extract(CancellationToken cancellationToken, GameFile entry, bool ad |
642 | 648 | case "dnearchive": // Banishers: Ghosts of New Eden |
643 | 649 | case "gitignore": |
644 | 650 | case "LICENSE": |
| 651 | + case "playstats": // Dispatch |
645 | 652 | case "template": |
646 | 653 | case "stUMeta": // LIS: Double Exposure |
647 | 654 | case "vmodule": |
@@ -770,6 +777,38 @@ public void Extract(CancellationToken cancellationToken, GameFile entry, bool ad |
770 | 777 |
|
771 | 778 | break; |
772 | 779 | } |
| 780 | + case "awb": |
| 781 | + { |
| 782 | + var archive = entry.CreateReader(); |
| 783 | + var awbReader = new AwbReader(archive); |
| 784 | + |
| 785 | + TabControl.SelectedTab.SetDocumentText(JsonConvert.SerializeObject(awbReader, Formatting.Indented), saveProperties, updateUi); |
| 786 | + |
| 787 | + var directory = Path.GetDirectoryName(archive.Name) ?? "/Criware/"; |
| 788 | + var extractedSounds = CriWareProvider.ExtractCriWareSounds(awbReader, archive.Name); |
| 789 | + foreach (var sound in extractedSounds) |
| 790 | + { |
| 791 | + SaveAndPlaySound(Path.Combine(directory, sound.Name), sound.Extension, sound.Data, saveAudio); |
| 792 | + } |
| 793 | + |
| 794 | + break; |
| 795 | + } |
| 796 | + case "acb": |
| 797 | + { |
| 798 | + var archive = entry.CreateReader(); |
| 799 | + var acbReader = new AcbReader(archive); |
| 800 | + |
| 801 | + TabControl.SelectedTab.SetDocumentText(JsonConvert.SerializeObject(acbReader, Formatting.Indented), saveProperties, updateUi); |
| 802 | + |
| 803 | + var directory = Path.GetDirectoryName(archive.Name) ?? "/Criware/"; |
| 804 | + var extractedSounds = CriWareProvider.ExtractCriWareSounds(acbReader, archive.Name); |
| 805 | + foreach (var sound in extractedSounds) |
| 806 | + { |
| 807 | + SaveAndPlaySound(Path.Combine(directory, sound.Name), sound.Extension, sound.Data, saveAudio); |
| 808 | + } |
| 809 | + |
| 810 | + break; |
| 811 | + } |
773 | 812 | case "xvag": |
774 | 813 | case "flac": |
775 | 814 | case "at9": |
@@ -995,6 +1034,25 @@ public void ExtractAndScroll(CancellationToken cancellationToken, string fullPat |
995 | 1034 | } |
996 | 1035 | return false; |
997 | 1036 | } |
| 1037 | + case USoundAtomCueSheet or UAtomCueSheet or USoundAtomCue or UAtomWaveBank when (isNone || saveAudio) && pointer.Object.Value is UObject atomObject: |
| 1038 | + { |
| 1039 | + var extractedSounds = atomObject switch |
| 1040 | + { |
| 1041 | + USoundAtomCueSheet cueSheet => CriWareProvider.ExtractCriWareSounds(cueSheet), |
| 1042 | + UAtomCueSheet cueSheet => CriWareProvider.ExtractCriWareSounds(cueSheet), |
| 1043 | + USoundAtomCue cue => CriWareProvider.ExtractCriWareSounds(cue), |
| 1044 | + UAtomWaveBank awb => CriWareProvider.ExtractCriWareSounds(awb), |
| 1045 | + _ => [] |
| 1046 | + }; |
| 1047 | + |
| 1048 | + var directory = Path.GetDirectoryName(atomObject.Owner?.Name) ?? "/Criware/"; |
| 1049 | + directory = Path.GetDirectoryName(atomObject.Owner.Provider.FixPath(directory)); |
| 1050 | + foreach (var sound in extractedSounds) |
| 1051 | + { |
| 1052 | + SaveAndPlaySound(Path.Combine(directory, sound.Name).Replace("\\", "/"), sound.Extension, sound.Data, saveAudio); |
| 1053 | + } |
| 1054 | + return false; |
| 1055 | + } |
998 | 1056 | case UAkMediaAssetData when isNone || saveAudio: |
999 | 1057 | case USoundWave when isNone || saveAudio: |
1000 | 1058 | { |
|
0 commit comments