From 9a0efa0a8f295ee54ee833aaaa7cb81e6c9a54eb Mon Sep 17 00:00:00 2001 From: Marlon Date: Fri, 5 Jun 2026 20:11:34 +0200 Subject: [PATCH 1/4] Upgrade to .NET 10 (#626) Co-authored-by: Asval --- .github/workflows/main.yml | 4 +- .github/workflows/qa.yml | 4 +- CUE4Parse | 2 +- FModel/FModel.csproj | 19 +++++----- FModel/FModel.sln | 37 ------------------- .../ApiEndpoints/ValorantApiEndpoint.cs | 2 +- FModel/ViewModels/ApplicationViewModel.cs | 19 +++------- 7 files changed, 20 insertions(+), 67 deletions(-) delete mode 100644 FModel/FModel.sln diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a8e8e6de..f0389930 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,10 +21,10 @@ jobs: - name: Fetch Submodules Recursively run: git submodule update --init --recursive - - name: .NET 8 Setup + - name: .NET 10 Setup uses: actions/setup-dotnet@v5 with: - dotnet-version: '8.0.x' + dotnet-version: '10.0.x' - name: .NET Restore run: dotnet restore FModel diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 140f6d92..7f44d434 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -14,10 +14,10 @@ jobs: with: submodules: 'recursive' - - name: .NET 8 Setup + - name: .NET 10 Setup uses: actions/setup-dotnet@v5 with: - dotnet-version: '8.0.x' + dotnet-version: '10.0.x' - name: .NET Restore run: dotnet restore "./FModel/FModel.slnx" -r win-x64 diff --git a/CUE4Parse b/CUE4Parse index e16842fa..3b456a3e 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit e16842fa0fd94919fcaba5bdcb361ec154be20ed +Subproject commit 3b456a3e44c64e6f560a3119f7f65b1b8c57c9c8 diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 90c2d391..861a11fe 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -1,8 +1,8 @@ - + WinExe - net8.0-windows + net10.0-windows true FModel.ico 4.4.4.0 @@ -152,27 +152,26 @@ - - + + - - + + - - - + + - + diff --git a/FModel/FModel.sln b/FModel/FModel.sln deleted file mode 100644 index 238d1b59..00000000 --- a/FModel/FModel.sln +++ /dev/null @@ -1,37 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31912.275 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FModel", "FModel.csproj", "{B1F494EA-90A6-4C24-800E-2F724A1884CA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CUE4Parse", "..\CUE4Parse\CUE4Parse\CUE4Parse.csproj", "{C4620341-BBB7-4384-AC7D-5082D3E0386E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CUE4Parse-Conversion", "..\CUE4Parse\CUE4Parse-Conversion\CUE4Parse-Conversion.csproj", "{D0E1E8F7-F56D-469A-8E24-C2439B9FFD83}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B1F494EA-90A6-4C24-800E-2F724A1884CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B1F494EA-90A6-4C24-800E-2F724A1884CA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B1F494EA-90A6-4C24-800E-2F724A1884CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B1F494EA-90A6-4C24-800E-2F724A1884CA}.Release|Any CPU.Build.0 = Release|Any CPU - {C4620341-BBB7-4384-AC7D-5082D3E0386E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4620341-BBB7-4384-AC7D-5082D3E0386E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4620341-BBB7-4384-AC7D-5082D3E0386E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4620341-BBB7-4384-AC7D-5082D3E0386E}.Release|Any CPU.Build.0 = Release|Any CPU - {D0E1E8F7-F56D-469A-8E24-C2439B9FFD83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D0E1E8F7-F56D-469A-8E24-C2439B9FFD83}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D0E1E8F7-F56D-469A-8E24-C2439B9FFD83}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D0E1E8F7-F56D-469A-8E24-C2439B9FFD83}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {53DB7A15-4E15-4575-9402-0110BDF2794E} - EndGlobalSection -EndGlobal diff --git a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs index fc0713c8..2a450517 100644 --- a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs @@ -53,7 +53,7 @@ public class VManifest Header = new VHeader(Ar); var compressedBuffer = Ar.ReadBytes((int) Header.CompressedSize); var uncompressedBuffer = new byte[(int)Header.UncompressedSize]; - ZlibHelper.Decompress(compressedBuffer, 0, compressedBuffer.Length, uncompressedBuffer, 0, uncompressedBuffer.Length); + Compression.Decompress(compressedBuffer, 0, compressedBuffer.Length, uncompressedBuffer, 0, uncompressedBuffer.Length, CompressionMethod.Zlib, Ar); var manifestAr = new FByteArchive("UncompressedValorantManifest", uncompressedBuffer); Chunks = manifestAr.ReadArray((int) Header.ChunkCount); diff --git a/FModel/ViewModels/ApplicationViewModel.cs b/FModel/ViewModels/ApplicationViewModel.cs index c16619b0..93f746c0 100644 --- a/FModel/ViewModels/ApplicationViewModel.cs +++ b/FModel/ViewModels/ApplicationViewModel.cs @@ -265,15 +265,8 @@ public class ApplicationViewModel : ViewModel { var zipDir = Path.GetDirectoryName(vgmZipFilePath)!; await using var zipFs = File.OpenRead(vgmZipFilePath); - using var zip = new ZipArchive(zipFs, ZipArchiveMode.Read); - - foreach (var entry in zip.Entries) - { - var entryPath = Path.Combine(zipDir, entry.FullName); - await using var entryFs = File.Create(entryPath); - await using var entryStream = entry.Open(); - await entryStream.CopyToAsync(entryFs); - } + await using var zip = await ZipArchive.CreateAsync(zipFs, ZipArchiveMode.Read, true, null); + await zip.ExtractToDirectoryAsync(zipDir, true); } else { @@ -305,9 +298,7 @@ public class ApplicationViewModel : ViewModel oodlePath = Path.Combine(UserSettings.Default.OutputDirectory, ".data", OodleHelper.OODLE_NAME_CURRENT); } - OodleHelper.Initialize(oodlePath); - if (OodleHelper.Instance is null) - FLogger.Append(ELog.Error, () => FLogger.Text("Failed to download Oodle", Constants.WHITE, true)); + await OodleHelper.InitializeAsync(oodlePath); } public static async Task InitZlib() @@ -319,12 +310,12 @@ public class ApplicationViewModel : ViewModel { if (!await ZlibHelper.DownloadDllAsync(zlibPath)) { - FLogger.Append(ELog.Error, () => FLogger.Text("Failed to download Zlib-ng", Constants.WHITE, true)); + zlibFileInfo.Refresh(); if (!zlibFileInfo.Exists) return; } } - ZlibHelper.Initialize(zlibPath); + await ZlibHelper.InitializeAsync(zlibPath); } public static async Task InitDetex() From 041fd4382efee8d0931dd38343b94a02dbb88a91 Mon Sep 17 00:00:00 2001 From: Valentin Date: Fri, 5 Jun 2026 20:18:50 +0200 Subject: [PATCH 2/4] Update target framework to net10.0-windows in QA workflow --- .github/workflows/qa.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 7f44d434..61b7a550 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -23,7 +23,7 @@ jobs: run: dotnet restore "./FModel/FModel.slnx" -r win-x64 - name: .NET Publish - run: dotnet publish "./FModel/FModel.csproj" -c Release --no-restore --no-self-contained -r win-x64 -f net8.0-windows -o "./FModel/bin/Publish/" -p:PublishReadyToRun=false -p:PublishSingleFile=true -p:DebugType=None -p:GenerateDocumentationFile=false -p:DebugSymbols=false + run: dotnet publish "./FModel/FModel.csproj" -c Release --no-restore --no-self-contained -r win-x64 -f net10.0-windows -o "./FModel/bin/Publish/" -p:PublishReadyToRun=false -p:PublishSingleFile=true -p:DebugType=None -p:GenerateDocumentationFile=false -p:DebugSymbols=false - name: ZIP File uses: thedoctor0/zip-release@0.7.6 From e7a6078a0ef8d54efd9111186466698d6d850a24 Mon Sep 17 00:00:00 2001 From: FLJPNews <165980251+Fortniteleakjp@users.noreply.github.com> Date: Sun, 7 Jun 2026 01:51:07 +0900 Subject: [PATCH 3/4] Adding sprites --- FModel/Creator/CreatorPackage.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/FModel/Creator/CreatorPackage.cs b/FModel/Creator/CreatorPackage.cs index b2b12284..4369fdd4 100644 --- a/FModel/Creator/CreatorPackage.cs +++ b/FModel/Creator/CreatorPackage.cs @@ -45,6 +45,7 @@ public class CreatorPackage : IDisposable case "AthenaMusicPackItemDefinition": case "AthenaBattleBusItemDefinition": case "AthenaCharacterItemDefinition": + case "ExtractableItemDefinition": case "AthenaMapMarkerItemDefinition": case "AthenaBackpackItemDefinition": case "CosmeticShoesItemDefinition": From e7b3eefd76c548f580010c083d1d40394a501be4 Mon Sep 17 00:00:00 2001 From: Marlon Date: Sat, 6 Jun 2026 19:09:07 +0200 Subject: [PATCH 4/4] use epicmanifestparser v3 preview --- CUE4Parse | 2 +- FModel/FModel.csproj | 3 +-- FModel/ViewModels/CUE4ParseViewModel.cs | 15 ++++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index 3b456a3e..86baae5c 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 3b456a3e44c64e6f560a3119f7f65b1b8c57c9c8 +Subproject commit 86baae5c47acb6fddf10294f034b69c5782c4a1d diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 861a11fe..af992309 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -156,8 +156,7 @@ - - + diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index 840afb83..f20cd939 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -66,7 +66,6 @@ using CUE4Parse_Conversion; using CUE4Parse_Conversion.Sounds; using EpicManifestParser; using EpicManifestParser.UE; -using EpicManifestParser.ZlibngDotNetDecompressor; using FModel.Creator; using FModel.Extensions; using FModel.Framework; @@ -95,6 +94,8 @@ public class CUE4ParseViewModel : ViewModel private readonly Regex _fnLiveRegex = new(@"^FortniteGame[/\\]Content[/\\]Paks[/\\]", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); + private static readonly HttpClient _chunkClient = ManifestParseOptions.CreateDefaultClient(); + private bool _modelIsOverwritingMaterial; public bool ModelIsOverwritingMaterial { @@ -225,9 +226,9 @@ public class CUE4ParseViewModel : ViewModel { Provider.OnDemandOptions = new IoStoreOnDemandOptions { - ChunkHostUri = new Uri("https://download.epicgames.com/", UriKind.Absolute), + ChunkHostUri = new Uri("https://egdownload.fastly-edge.com/", UriKind.Absolute), ChunkCacheDirectory = Directory.CreateDirectory(Path.Combine(UserSettings.Default.OutputDirectory, ".data")), - Timeout = TimeSpan.FromSeconds(30) + DownloaderClient = _chunkClient }; switch (Provider) @@ -248,9 +249,9 @@ public class CUE4ParseViewModel : ViewModel { ChunkCacheDirectory = cacheDir, ManifestCacheDirectory = cacheDir, - ChunkBaseUrl = "http://download.epicgames.com/Builds/Fortnite/CloudDir/", - Decompressor = ManifestZlibngDotNetDecompressor.Decompress, - DecompressorState = ZlibHelper.Instance, + ChunkBaseUrl = "https://egdownload.fastly-edge.com/Builds/Fortnite/CloudDir/", + Decompressor = Compression.Decompressor, + Client = _chunkClient, CacheChunksAsIs = false }; @@ -261,7 +262,7 @@ public class CUE4ParseViewModel : ViewModel { (manifest, _) = manifestInfo.DownloadAndParseAsync(manifestOptions, cancellationToken: cancellationToken, - elementManifestPredicate: static x => x.Uri.Host == "download.epicgames.com" || x.Uri.Host == "epicgames-download1.akamaized.net" + elementDownloadPredicate: static x => x.Uri.Host is "egdownload.fastly-edge.com" or "epicgames-download1.akamaized.net" or "download.epicgames.com" ).GetAwaiter().GetResult(); } catch (HttpRequestException ex)