From 22168b37c938027f95824eed674029f602b4119d Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Sun, 11 May 2025 09:39:50 -0400 Subject: [PATCH 01/21] AthenaHatItemDefinition (tested on a custom asset) --- FModel/Creator/CreatorPackage.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FModel/Creator/CreatorPackage.cs b/FModel/Creator/CreatorPackage.cs index ad80b17b..0a0ad68c 100644 --- a/FModel/Creator/CreatorPackage.cs +++ b/FModel/Creator/CreatorPackage.cs @@ -49,7 +49,8 @@ public class CreatorPackage : IDisposable case "CosmeticShoesItemDefinition": case "AthenaPickaxeItemDefinition": case "AthenaGadgetItemDefinition": - case "AthenaGliderItemDefinition": + case "AthenaGliderItemDefinition": + case "AthenaHatItemDefinition": case "AthenaSprayItemDefinition": case "AthenaDanceItemDefinition": case "AthenaEmojiItemDefinition": From 4d3d43c7042f3755ef110a62673ef164fce40db6 Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Sun, 11 May 2025 09:40:18 -0400 Subject: [PATCH 02/21] slight rewrite and fixes item stats --- FModel/Creator/Bases/FN/BaseIconStats.cs | 27 +++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseIconStats.cs b/FModel/Creator/Bases/FN/BaseIconStats.cs index 5db374fb..35a04550 100644 --- a/FModel/Creator/Bases/FN/BaseIconStats.cs +++ b/FModel/Creator/Bases/FN/BaseIconStats.cs @@ -84,40 +84,47 @@ public class BaseIconStats : BaseIcon weaponStatHandle.TryGetValue(out UDataTable dataTable, "DataTable") && dataTable.TryGetDataTableRow(weaponRowName.Text, StringComparison.OrdinalIgnoreCase, out var weaponRowValue)) { - if (weaponRowValue.TryGetValue(out int bpc, "BulletsPerCartridge")) + weaponRowValue.TryGetValue(out float dmgPb, "DmgPB"); //Damage at point blank + weaponRowValue.TryGetValue(out float mdpc, "MaxDamagePerCartridge"); //Max damage a weapon can do in a single hit, usually used for shotguns + weaponRowValue.TryGetValue(out float dmgCritical, "DamageZone_Critical"); //Headshot multiplier + weaponRowValue.TryGetValue(out int clipSize, "ClipSize"); //Item magazine size + weaponRowValue.TryGetValue(out float firingRate, "FiringRate"); //Item firing rate, value is shots per second + weaponRowValue.TryGetValue(out float armTime, "ArmTime"); //Time it takes for traps to be able to be set off + weaponRowValue.TryGetValue(out float reloadTime, "ReloadTime"); //Time it takes for a weapon to reload + weaponRowValue.TryGetValue(out int bpc, "BulletsPerCartridge"); //Amount of pellets shot by a weapon at once, usually for shotguns { var multiplier = bpc != 0f ? bpc : 1; - if (weaponRowValue.TryGetValue(out float dmgPb, "DmgPB") && dmgPb != 0f) + if (dmgPb != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "35D04D1B45737BEA25B69686D9E085B9", "Damage"), dmgPb * multiplier, 200)); } - if (weaponRowValue.TryGetValue(out float mdpc, "MaxDamagePerCartridge") && mdpc >= 0f) + if (mdpc > 0f && dmgPb * dmgCritical * multiplier > mdpc) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), mdpc, 200)); } - else if (weaponRowValue.TryGetValue(out float dmgCritical, "DamageZone_Critical")) + + else if (dmgCritical != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), dmgPb * dmgCritical * multiplier, 200)); } } - - if (weaponRowValue.TryGetValue(out int clipSize, "ClipSize") && clipSize != 0) + if (clipSize != 0) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "068239DD4327B36124498C9C5F61C038", "Magazine Size"), clipSize, 50)); } - if (weaponRowValue.TryGetValue(out float firingRate, "FiringRate") && firingRate != 0f) + if (firingRate != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "27B80BA44805ABD5A2D2BAB2902B250C", "Fire Rate"), firingRate, 15)); } - if (weaponRowValue.TryGetValue(out float armTime, "ArmTime") && armTime != 0f) + if (armTime != 0f) { - _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "3BFEB8BD41A677CC5F45B9A90D6EAD6F", "Arming Delay"), armTime, 125)); + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "3BFEB8BD41A677CC5F45B9A90D6EAD6F", "Arming Delay"), armTime, 5)); } - if (weaponRowValue.TryGetValue(out float reloadTime, "ReloadTime") && reloadTime != 0f) + if (reloadTime != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "6EA26D1A4252034FBD869A90F9A6E49A", "Reload Time"), reloadTime, 15)); } From a4ffb2984170bbe00d36472c157da821a2a99143 Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Sun, 11 May 2025 09:41:30 -0400 Subject: [PATCH 03/21] note edge case season names correctly (X, OG, Remix, MS1) --- FModel/Creator/Bases/FN/BaseIcon.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseIcon.cs b/FModel/Creator/Bases/FN/BaseIcon.cs index fc2fc211..2d4d4f68 100644 --- a/FModel/Creator/Bases/FN/BaseIcon.cs +++ b/FModel/Creator/Bases/FN/BaseIcon.cs @@ -256,12 +256,28 @@ public class BaseIcon : UCreator (int chapterIdx, int seasonIdx) = GetInternalSID(initial); var season = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "SeasonTextFormat", "Season {0}"); - var introduced = Utils.GetLocalizedResource("Fort.Cosmetics", "CosmeticItemDescription_Season", "\nIntroduced in {0}."); + var introduced = Utils.GetLocalizedResource("Fort.Cosmetics", "CosmeticItemDescription_Season", "\nIntroduced in {0}."); + if (s == "10") + { + return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, "X"))); + } if (initial <= 10) return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, s))); var chapter = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterTextFormat", "Chapter {0}"); var chapterFormat = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterSeasonTextFormat", "{0}, {1}"); - var d = string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, seasonIdx)); + var d = string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, seasonIdx)); + if (s == "27") + { + return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, "OG")))); + } + if (s == "32") + { + return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, "Remix")))); + } + if (s == "35") + { + return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, "MS1")))); + } return Utils.RemoveHtmlTags(string.Format(introduced, d)); } From 4e43a07f8ef4abbe6625db91c12fe7f4d4bedc30 Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Sun, 11 May 2025 09:46:23 -0400 Subject: [PATCH 04/21] actual max stat values from Athena.Inventory.Stats.Max(stat) --- FModel/Creator/Bases/FN/BaseIconStats.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseIconStats.cs b/FModel/Creator/Bases/FN/BaseIconStats.cs index 35a04550..67d6b9b3 100644 --- a/FModel/Creator/Bases/FN/BaseIconStats.cs +++ b/FModel/Creator/Bases/FN/BaseIconStats.cs @@ -96,27 +96,27 @@ public class BaseIconStats : BaseIcon var multiplier = bpc != 0f ? bpc : 1; if (dmgPb != 0f) { - _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "35D04D1B45737BEA25B69686D9E085B9", "Damage"), dmgPb * multiplier, 200)); + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "35D04D1B45737BEA25B69686D9E085B9", "Damage"), dmgPb * multiplier, 160)); } if (mdpc > 0f && dmgPb * dmgCritical * multiplier > mdpc) { - _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), mdpc, 200)); + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), mdpc, 160)); } else if (dmgCritical != 0f) { - _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), dmgPb * dmgCritical * multiplier, 200)); + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), dmgPb * dmgCritical * multiplier, 160)); } } if (clipSize != 0) { - _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "068239DD4327B36124498C9C5F61C038", "Magazine Size"), clipSize, 50)); + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "068239DD4327B36124498C9C5F61C038", "Magazine Size"), clipSize, 40)); } if (firingRate != 0f) { - _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "27B80BA44805ABD5A2D2BAB2902B250C", "Fire Rate"), firingRate, 15)); + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "27B80BA44805ABD5A2D2BAB2902B250C", "Fire Rate"), firingRate, 11)); } if (armTime != 0f) @@ -126,7 +126,7 @@ public class BaseIconStats : BaseIcon if (reloadTime != 0f) { - _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "6EA26D1A4252034FBD869A90F9A6E49A", "Reload Time"), reloadTime, 15)); + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "6EA26D1A4252034FBD869A90F9A6E49A", "Reload Time"), reloadTime, 10)); } if ((Object.ExportType.Equals("FortContextTrapItemDefinition", StringComparison.OrdinalIgnoreCase) || From c8de28130c52023d94884895dd91c64c7b16cd01 Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Sun, 11 May 2025 13:51:11 -0400 Subject: [PATCH 05/21] switch --- FModel/Creator/Bases/FN/BaseIcon.cs | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseIcon.cs b/FModel/Creator/Bases/FN/BaseIcon.cs index 2d4d4f68..20ed2a65 100644 --- a/FModel/Creator/Bases/FN/BaseIcon.cs +++ b/FModel/Creator/Bases/FN/BaseIcon.cs @@ -257,28 +257,19 @@ public class BaseIcon : UCreator var season = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "SeasonTextFormat", "Season {0}"); var introduced = Utils.GetLocalizedResource("Fort.Cosmetics", "CosmeticItemDescription_Season", "\nIntroduced in {0}."); - if (s == "10") - { - return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, "X"))); - } + if (s == "10") return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, "X"))); if (initial <= 10) return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, s))); var chapter = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterTextFormat", "Chapter {0}"); var chapterFormat = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterSeasonTextFormat", "{0}, {1}"); var d = string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, seasonIdx)); - if (s == "27") - { - return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, "OG")))); - } - if (s == "32") - { - return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, "Remix")))); - } - if (s == "35") - { - return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, "MS1")))); - } - return Utils.RemoveHtmlTags(string.Format(introduced, d)); + return s switch + { + "27" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: OG"))), + "32" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: Remix"))), + "35" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format("MS1")))), + _ => Utils.RemoveHtmlTags(string.Format(introduced, d)) + }; } protected void CheckGameplayTags(FInstancedStruct[] dataList) From 7d425f61768d3d71e75d9d76839dbf1d90d423ba Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Sun, 11 May 2025 15:15:13 -0400 Subject: [PATCH 06/21] holy stats --- FModel/Creator/Bases/FN/BaseIconStats.cs | 27 +++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseIconStats.cs b/FModel/Creator/Bases/FN/BaseIconStats.cs index 67d6b9b3..5c1240c5 100644 --- a/FModel/Creator/Bases/FN/BaseIconStats.cs +++ b/FModel/Creator/Bases/FN/BaseIconStats.cs @@ -92,6 +92,9 @@ public class BaseIconStats : BaseIcon weaponRowValue.TryGetValue(out float armTime, "ArmTime"); //Time it takes for traps to be able to be set off weaponRowValue.TryGetValue(out float reloadTime, "ReloadTime"); //Time it takes for a weapon to reload weaponRowValue.TryGetValue(out int bpc, "BulletsPerCartridge"); //Amount of pellets shot by a weapon at once, usually for shotguns + weaponRowValue.TryGetValue(out float heatMax, "OverheatingMaxValue"); //Maximum heat overheating weapons can hold before they need to cool off + weaponRowValue.TryGetValue(out float heatPerShot, "OverheatHeatingValue"); //Heat generated per shot on overheat weapons + weaponRowValue.TryGetValue(out float overheatCooldown, "OverheatedCooldownDelay"); //Cooldown after a weapon reaches its maximum heat capacity { var multiplier = bpc != 0f ? bpc : 1; if (dmgPb != 0f) @@ -104,12 +107,17 @@ public class BaseIconStats : BaseIcon _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), mdpc, 160)); } - else if (dmgCritical != 0f) + else if (dmgCritical != 0f && dmgCritical != 1f && dmgPb != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "0DEF2455463B008C4499FEA03D149EDF", "Headshot Damage"), dmgPb * dmgCritical * multiplier, 160)); } } - if (clipSize != 0) + if (clipSize > 999f || clipSize == 0f) + { + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "068239DD4327B36124498C9C5F61C038", "Magazine Size"), Utils.GetLocalizedResource("", "0FAE8E5445029F2AA209ADB0FE49B23C", "Infinite"), -1)); + } + + else if (clipSize != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "068239DD4327B36124498C9C5F61C038", "Magazine Size"), clipSize, 40)); } @@ -124,11 +132,20 @@ public class BaseIconStats : BaseIcon _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "3BFEB8BD41A677CC5F45B9A90D6EAD6F", "Arming Delay"), armTime, 5)); } - if (reloadTime != 0f) + if (reloadTime != 0f && clipSize < 999f && clipSize != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "6EA26D1A4252034FBD869A90F9A6E49A", "Reload Time"), reloadTime, 10)); } + if (overheatCooldown != 0f && clipSize > 999f || clipSize == 0f) + { + _statistics.Add(new IconStat("Overheat Cooldown", overheatCooldown, 5)); + } + + if (heatMax != 0f && heatPerShot != 0f && clipSize > 999f || clipSize == 0f) + { + _statistics.Add(new IconStat("Shots to Overheat", Math.Ceiling(heatMax / heatPerShot), 80)); + } if ((Object.ExportType.Equals("FortContextTrapItemDefinition", StringComparison.OrdinalIgnoreCase) || Object.ExportType.Equals("FortTrapItemDefinition", StringComparison.OrdinalIgnoreCase)) && weaponRowValue.TryGetValue(out UDataTable durabilityTable, "Durability") && @@ -292,6 +309,10 @@ public class IconStat _statPaint.Color = SKColors.White; c.DrawText(_value.ToString(), new SKPoint(width - 50, y + 10), _statPaint); + if (_maxValue == -1) //fill bar if max value is set to -1, for things that don't return a number here but should still be represented as the maximum value + { + c.DrawRect(new SKRect(height * 2, y, Math.Min(width - height, sliderRight), y + 5), _statPaint); + } if (_maxValue < 1 || !float.TryParse(_value.ToString(), out var floatValue)) return; if (floatValue < 0) floatValue = 0; From 7785a33b5ebffeb58d3541cc0bb05850a50fa966 Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Sun, 11 May 2025 15:46:49 -0400 Subject: [PATCH 07/21] missed an edge case #fuck --- FModel/Creator/Bases/FN/BaseIconStats.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseIconStats.cs b/FModel/Creator/Bases/FN/BaseIconStats.cs index 5c1240c5..c7c1e485 100644 --- a/FModel/Creator/Bases/FN/BaseIconStats.cs +++ b/FModel/Creator/Bases/FN/BaseIconStats.cs @@ -137,12 +137,12 @@ public class BaseIconStats : BaseIcon _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "6EA26D1A4252034FBD869A90F9A6E49A", "Reload Time"), reloadTime, 10)); } - if (overheatCooldown != 0f && clipSize > 999f || clipSize == 0f) + if (overheatCooldown != 0f && clipSize > 999f || overheatCooldown != 0f && clipSize == 0f) { _statistics.Add(new IconStat("Overheat Cooldown", overheatCooldown, 5)); } - if (heatMax != 0f && heatPerShot != 0f && clipSize > 999f || clipSize == 0f) + if (heatMax != 0f && heatPerShot != 0f && clipSize > 999f || heatMax != 0f && heatPerShot != 0f && clipSize == 0f) { _statistics.Add(new IconStat("Shots to Overheat", Math.Ceiling(heatMax / heatPerShot), 80)); } From 3b24be37d2fa4f5cf9c39a3fe7b35a4f479f2155 Mon Sep 17 00:00:00 2001 From: AllyJaxx Date: Tue, 13 May 2025 09:55:51 -0400 Subject: [PATCH 08/21] support for Cataba --- FModel/Creator/Bases/FN/BaseCommunity.cs | 9 ++++++++- FModel/Creator/Bases/FN/BaseIcon.cs | 14 +++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseCommunity.cs b/FModel/Creator/Bases/FN/BaseCommunity.cs index 8ac06a9d..2492426d 100644 --- a/FModel/Creator/Bases/FN/BaseCommunity.cs +++ b/FModel/Creator/Bases/FN/BaseCommunity.cs @@ -124,7 +124,14 @@ public class BaseCommunity : BaseIcon if (!bShort) return base.GetCosmeticSeason(seasonNumber); var s = seasonNumber["Cosmetics.Filter.Season.".Length..]; (int chapterIdx, int seasonIdx) = GetInternalSID(int.Parse(s)); - return $"C{chapterIdx} S{seasonIdx}"; + return s switch + { + "10" => $"C{chapterIdx} SX", + "27" => $"Fortnite: OG", + "32" => $"Fortnite: Remix", + "35" => $"C{chapterIdx} MS1", + _ => $"C{chapterIdx} S{seasonIdx}" + }; } private new void DrawBackground(SKCanvas c) diff --git a/FModel/Creator/Bases/FN/BaseIcon.cs b/FModel/Creator/Bases/FN/BaseIcon.cs index 20ed2a65..e131f358 100644 --- a/FModel/Creator/Bases/FN/BaseIcon.cs +++ b/FModel/Creator/Bases/FN/BaseIcon.cs @@ -256,19 +256,19 @@ public class BaseIcon : UCreator (int chapterIdx, int seasonIdx) = GetInternalSID(initial); var season = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "SeasonTextFormat", "Season {0}"); - var introduced = Utils.GetLocalizedResource("Fort.Cosmetics", "CosmeticItemDescription_Season", "\nIntroduced in {0}."); + var introduced = Utils.GetLocalizedResource("Fort.Cosmetics", "CosmeticItemDescription_Season", "\nIntroduced in {0}."); if (s == "10") return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, "X"))); if (initial <= 10) return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, s))); var chapter = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterTextFormat", "Chapter {0}"); var chapterFormat = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterSeasonTextFormat", "{0}, {1}"); - var d = string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, seasonIdx)); - return s switch - { - "27" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: OG"))), - "32" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: Remix"))), + var d = string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, seasonIdx)); + return s switch + { + "27" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: OG"))), + "32" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: Remix"))), "35" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format("MS1")))), - _ => Utils.RemoveHtmlTags(string.Format(introduced, d)) + _ => Utils.RemoveHtmlTags(string.Format(introduced, d)) }; } From 99bcfb2c295146399cac2df4e17558fdc974fff7 Mon Sep 17 00:00:00 2001 From: Asval Date: Wed, 21 May 2025 14:49:15 +0200 Subject: [PATCH 09/21] random stuff --- FModel/Creator/Bases/FN/BaseBundle.cs | 2 +- FModel/Creator/Bases/FN/BaseQuest.cs | 4 ++-- FModel/FModel.csproj | 2 +- FModel/MainWindow.xaml.cs | 2 +- FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs | 10 ++++++++-- FModel/ViewModels/ApplicationViewModel.cs | 2 +- .../Views/Resources/Controls/Rtb/CustomRichTextBox.cs | 3 ++- 7 files changed, 16 insertions(+), 9 deletions(-) diff --git a/FModel/Creator/Bases/FN/BaseBundle.cs b/FModel/Creator/Bases/FN/BaseBundle.cs index ea85a775..90c9de2b 100644 --- a/FModel/Creator/Bases/FN/BaseBundle.cs +++ b/FModel/Creator/Bases/FN/BaseBundle.cs @@ -59,7 +59,7 @@ public class BaseBundle : UCreator foreach (var reward in rewards) { if (!reward.TryGetValue(out FSoftObjectPath itemDefinition, "ItemDefinition")) continue; - quest.AddCompletionRequest(itemDefinition); + quest.AddCompletionReward(itemDefinition); } _quests.Add(quest); } diff --git a/FModel/Creator/Bases/FN/BaseQuest.cs b/FModel/Creator/Bases/FN/BaseQuest.cs index 48984aff..ef3159aa 100644 --- a/FModel/Creator/Bases/FN/BaseQuest.cs +++ b/FModel/Creator/Bases/FN/BaseQuest.cs @@ -44,12 +44,12 @@ public class BaseQuest : BaseIcon DisplayName = ReformatString(description, completionCount.ToString(), completionCount < 0); } - public void AddCompletionRequest(FSoftObjectPath itemDefinition) + public void AddCompletionReward(FSoftObjectPath itemDefinition) { _rewards.Add(itemDefinition.TryLoad(out UObject uObject) ? new Reward(uObject) : new Reward()); } - public void AddCompletionRequest(int quantity, string reward) + public void AddCompletionReward(int quantity, string reward) { _rewards.Add(new Reward(quantity, reward)); } diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index dc171282..bdfee340 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -164,7 +164,7 @@ - + diff --git a/FModel/MainWindow.xaml.cs b/FModel/MainWindow.xaml.cs index 2f915233..e1d71bc3 100644 --- a/FModel/MainWindow.xaml.cs +++ b/FModel/MainWindow.xaml.cs @@ -63,7 +63,6 @@ public partial class MainWindow await ApplicationViewModel.InitOodle(); await ApplicationViewModel.InitZlib(); - await ApplicationViewModel.InitDetex(); await _applicationView.CUE4Parse.Initialize(); await _applicationView.AesManager.InitAes(); await _applicationView.UpdateProvider(true); @@ -74,6 +73,7 @@ public partial class MainWindow _applicationView.CUE4Parse.VerifyConsoleVariables(), _applicationView.CUE4Parse.VerifyOnDemandArchives(), _applicationView.CUE4Parse.InitMappings(), + ApplicationViewModel.InitDetex(), ApplicationViewModel.InitVgmStream(), ApplicationViewModel.InitImGuiSettings(newOrUpdated), Task.Run(() => diff --git a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs index aeaf42b9..47b7bd55 100644 --- a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs @@ -106,7 +106,11 @@ public class FModelApiEndpoint : AbstractApiProvider public void CheckForUpdates(bool launch = false) { - if (DateTime.Now < UserSettings.Default.NextUpdateCheck) return; + if (DateTime.Now < UserSettings.Default.NextUpdateCheck) + { + Log.Warning("Updates have been silenced until {DateTime}", UserSettings.Default.NextUpdateCheck); + return; + } if (launch) { @@ -140,7 +144,8 @@ public class FModelApiEndpoint : AbstractApiProvider { UserSettings.Default.LastUpdateCheck = DateTime.Now; - if (((CustomMandatory)args.Mandatory).CommitHash == Constants.APP_COMMIT_ID) + var targetHash = ((CustomMandatory) args.Mandatory).CommitHash; + if (targetHash == Constants.APP_COMMIT_ID) { if (UserSettings.Default.ShowChangelog) ShowChangelog(args); @@ -152,6 +157,7 @@ public class FModelApiEndpoint : AbstractApiProvider UserSettings.Default.ShowChangelog = currentVersion != args.InstalledVersion; const string message = "A new update is available!"; + Log.Warning("{message} Version {CurrentVersion} ({Hash})", message, currentVersion, targetHash); Helper.OpenWindow(message, () => new UpdateView { Title = message, ResizeMode = ResizeMode.NoResize }.ShowDialog()); } else diff --git a/FModel/ViewModels/ApplicationViewModel.cs b/FModel/ViewModels/ApplicationViewModel.cs index e3faa892..dd0806c2 100644 --- a/FModel/ViewModels/ApplicationViewModel.cs +++ b/FModel/ViewModels/ApplicationViewModel.cs @@ -260,7 +260,7 @@ public class ApplicationViewModel : ViewModel ZlibHelper.Initialize(zlibPath); } - public static async ValueTask InitDetex() + public static async Task InitDetex() { var detexPath = Path.Combine(UserSettings.Default.OutputDirectory, ".data", DetexHelper.DLL_NAME); if (File.Exists(DetexHelper.DLL_NAME)) diff --git a/FModel/Views/Resources/Controls/Rtb/CustomRichTextBox.cs b/FModel/Views/Resources/Controls/Rtb/CustomRichTextBox.cs index d8dbccfa..0c63a759 100644 --- a/FModel/Views/Resources/Controls/Rtb/CustomRichTextBox.cs +++ b/FModel/Views/Resources/Controls/Rtb/CustomRichTextBox.cs @@ -6,6 +6,7 @@ using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; +using System.Windows.Threading; namespace FModel.Views.Resources.Controls; @@ -54,7 +55,7 @@ public class FLogger : ITextFormatter } job(); - }); + }, DispatcherPriority.Background); } public static void Text(string message, string color, bool newLine = false) From 72930bcd147693df7f61490e3f61b03a9bb5b9e2 Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Sun, 25 May 2025 19:30:55 +0300 Subject: [PATCH 10/21] Splitgate2 and Spectre Divide support --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index 68dd0829..72289804 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 68dd0829949394c4a17c4639a827712c316d0b89 +Subproject commit 7228980464724ccf39b441ba080b250df26ec505 From 8ba756ade5e9eced8fe64710a86b567c4ba03cc5 Mon Sep 17 00:00:00 2001 From: Marlon Date: Thu, 29 May 2025 13:03:03 +0200 Subject: [PATCH 11/21] fix FN live --- FModel/ViewModels/CUE4ParseViewModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index 33f9495c..bf6fbaad 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -193,7 +193,7 @@ public class CUE4ParseViewModel : ViewModel { ChunkCacheDirectory = cacheDir, ManifestCacheDirectory = cacheDir, - ChunkBaseUrl = "http://epicgames-download1.akamaized.net/Builds/Fortnite/CloudDir/", + ChunkBaseUrl = "http://download.epicgames.com/Builds/Fortnite/CloudDir/", Decompressor = ManifestZlibngDotNetDecompressor.Decompress, DecompressorState = ZlibHelper.Instance, CacheChunksAsIs = false @@ -206,7 +206,7 @@ public class CUE4ParseViewModel : ViewModel { (manifest, _) = manifestInfo.DownloadAndParseAsync(manifestOptions, cancellationToken: cancellationToken, - elementManifestPredicate: static x => x.Uri.Host != "cloudflare.epicgamescdn.com" + elementManifestPredicate: static x => x.Uri.Host == "download.epicgames.com" ).GetAwaiter().GetResult(); } catch (HttpRequestException ex) From 9f4597f542196a553c22079ad5af3e41cce01277 Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Sun, 1 Jun 2025 23:06:34 +0300 Subject: [PATCH 12/21] bump --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index 72289804..107716c9 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 7228980464724ccf39b441ba080b250df26ec505 +Subproject commit 107716c9128419bbe38a8d253f2f3e84a8b4434d From 6f19cacaeb5d3ffb2f501ef45393a3ebcc9000ed Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Sun, 8 Jun 2025 22:45:43 +0300 Subject: [PATCH 13/21] EtheriaRestart and GameForPeace fix --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index 107716c9..c1631562 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 107716c9128419bbe38a8d253f2f3e84a8b4434d +Subproject commit c1631562d54aab54f3e622193d3e39c97a36d845 From aa75a8bbf20c70c39111b2f36a6849e5706618e0 Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Sun, 15 Jun 2025 16:18:28 +0300 Subject: [PATCH 14/21] Nanite Static Meshes support in UE 5.0-5.3 MindsEye and Wuthering Waves 2.4 support --- CUE4Parse | 2 +- FModel/Settings/UserSettings.cs | 9 +++++++++ FModel/ViewModels/CUE4ParseViewModel.cs | 1 + FModel/ViewModels/SettingsViewModel.cs | 15 +++++++++++++++ FModel/Views/SettingsView.xaml | 19 +++++++++++++++---- FModel/Views/Snooper/Renderer.cs | 7 ++++--- 6 files changed, 45 insertions(+), 8 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index c1631562..f9b38111 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit c1631562d54aab54f3e622193d3e39c97a36d845 +Subproject commit f9b38111279365410523de25bbd7868ec9783574 diff --git a/FModel/Settings/UserSettings.cs b/FModel/Settings/UserSettings.cs index 01418ff1..66c126bf 100644 --- a/FModel/Settings/UserSettings.cs +++ b/FModel/Settings/UserSettings.cs @@ -10,6 +10,7 @@ using CUE4Parse_Conversion.Meshes; using CUE4Parse_Conversion.Textures; using CUE4Parse_Conversion.UEFormat.Enums; using CUE4Parse.UE4.Assets.Exports.Material; +using CUE4Parse.UE4.Assets.Exports.Nanite; using FModel.Framework; using FModel.ViewModels; using FModel.ViewModels.ApiEndpoints.Models; @@ -60,6 +61,7 @@ namespace FModel.Settings { LodFormat = Default.LodExportFormat, MeshFormat = Default.MeshExportFormat, + NaniteMeshFormat = Default.NaniteMeshExportFormat, AnimFormat = Default.MeshExportFormat switch { EMeshFormat.UEFormat => EAnimFormat.UEFormat, @@ -367,6 +369,13 @@ namespace FModel.Settings set => SetProperty(ref _meshExportFormat, value); } + private ENaniteMeshFormat _naniteMeshExportFormat = ENaniteMeshFormat.OnlyNaniteLOD; + public ENaniteMeshFormat NaniteMeshExportFormat + { + get => _naniteMeshExportFormat; + set => SetProperty(ref _naniteMeshExportFormat, value); + } + private EMaterialFormat _materialExportFormat = EMaterialFormat.FirstLayer; public EMaterialFormat MaterialExportFormat { diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index bf6fbaad..c99133ba 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -163,6 +163,7 @@ public class CUE4ParseViewModel : ViewModel Provider.ReadScriptData = UserSettings.Default.ReadScriptData; Provider.ReadShaderMaps = UserSettings.Default.ReadShaderMaps; + Provider.ReadNaniteData = true; GameDirectory = new GameDirectoryViewModel(); AssetsFolder = new AssetsFolderViewModel(); diff --git a/FModel/ViewModels/SettingsViewModel.cs b/FModel/ViewModels/SettingsViewModel.cs index 15d558ea..b733fc61 100644 --- a/FModel/ViewModels/SettingsViewModel.cs +++ b/FModel/ViewModels/SettingsViewModel.cs @@ -9,6 +9,7 @@ using CUE4Parse_Conversion.Meshes; using CUE4Parse_Conversion.Textures; using CUE4Parse_Conversion.UEFormat.Enums; using CUE4Parse.UE4.Assets.Exports.Material; +using CUE4Parse.UE4.Assets.Exports.Nanite; using FModel.Framework; using FModel.Services; using FModel.Settings; @@ -143,6 +144,13 @@ public class SettingsViewModel : ViewModel set => SetProperty(ref _selectedLodExportFormat, value); } + private ENaniteMeshFormat _selectedNaniteMeshExportFormat; + public ENaniteMeshFormat SelectedNaniteMeshExportFormat + { + get => _selectedNaniteMeshExportFormat; + set => SetProperty(ref _selectedNaniteMeshExportFormat, value); + } + private EMaterialFormat _selectedMaterialExportFormat; public EMaterialFormat SelectedMaterialExportFormat { @@ -170,6 +178,7 @@ public class SettingsViewModel : ViewModel public ReadOnlyObservableCollection SocketExportFormats { get; private set; } public ReadOnlyObservableCollection CompressionFormats { get; private set; } public ReadOnlyObservableCollection LodExportFormats { get; private set; } + public ReadOnlyObservableCollection NaniteMeshExportFormats { get; private set; } public ReadOnlyObservableCollection MaterialExportFormats { get; private set; } public ReadOnlyObservableCollection TextureExportFormats { get; private set; } public ReadOnlyObservableCollection Platforms { get; private set; } @@ -193,6 +202,7 @@ public class SettingsViewModel : ViewModel private ESocketFormat _socketExportFormatSnapshot; private EFileCompressionFormat _compressionFormatSnapshot; private ELodFormat _lodExportFormatSnapshot; + private ENaniteMeshFormat _naniteMeshExportFormatSnapshot; private EMaterialFormat _materialExportFormatSnapshot; private ETextureFormat _textureExportFormatSnapshot; @@ -233,6 +243,7 @@ public class SettingsViewModel : ViewModel _socketExportFormatSnapshot = UserSettings.Default.SocketExportFormat; _compressionFormatSnapshot = UserSettings.Default.CompressionFormat; _lodExportFormatSnapshot = UserSettings.Default.LodExportFormat; + _naniteMeshExportFormatSnapshot = UserSettings.Default.NaniteMeshExportFormat; _materialExportFormatSnapshot = UserSettings.Default.MaterialExportFormat; _textureExportFormatSnapshot = UserSettings.Default.TextureExportFormat; @@ -248,6 +259,7 @@ public class SettingsViewModel : ViewModel SelectedSocketExportFormat = _socketExportFormatSnapshot; SelectedCompressionFormat = _selectedCompressionFormat; SelectedLodExportFormat = _lodExportFormatSnapshot; + SelectedNaniteMeshExportFormat = _naniteMeshExportFormatSnapshot; SelectedMaterialExportFormat = _materialExportFormatSnapshot; SelectedTextureExportFormat = _textureExportFormatSnapshot; SelectedAesReload = UserSettings.Default.AesReload; @@ -263,6 +275,7 @@ public class SettingsViewModel : ViewModel SocketExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateSocketExportFormat())); CompressionFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateCompressionFormat())); LodExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateLodExportFormat())); + NaniteMeshExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateNaniteMeshExportFormat())); MaterialExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateMaterialExportFormat())); TextureExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateTextureExportFormat())); Platforms = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateUePlatforms())); @@ -303,6 +316,7 @@ public class SettingsViewModel : ViewModel UserSettings.Default.SocketExportFormat = SelectedSocketExportFormat; UserSettings.Default.CompressionFormat = SelectedCompressionFormat; UserSettings.Default.LodExportFormat = SelectedLodExportFormat; + UserSettings.Default.NaniteMeshExportFormat = SelectedNaniteMeshExportFormat; UserSettings.Default.MaterialExportFormat = SelectedMaterialExportFormat; UserSettings.Default.TextureExportFormat = SelectedTextureExportFormat; UserSettings.Default.AesReload = SelectedAesReload; @@ -328,6 +342,7 @@ public class SettingsViewModel : ViewModel private IEnumerable EnumerateSocketExportFormat() => Enum.GetValues(); private IEnumerable EnumerateCompressionFormat() => Enum.GetValues(); private IEnumerable EnumerateLodExportFormat() => Enum.GetValues(); + private IEnumerable EnumerateNaniteMeshExportFormat() => Enum.GetValues(); private IEnumerable EnumerateMaterialExportFormat() => Enum.GetValues(); private IEnumerable EnumerateTextureExportFormat() => Enum.GetValues(); private IEnumerable EnumerateUePlatforms() => Enum.GetValues(); diff --git a/FModel/Views/SettingsView.xaml b/FModel/Views/SettingsView.xaml index 7ff12b81..d8a79e24 100644 --- a/FModel/Views/SettingsView.xaml +++ b/FModel/Views/SettingsView.xaml @@ -316,6 +316,7 @@ + @@ -459,8 +460,8 @@ - - + @@ -469,8 +470,18 @@ - - + + + + + + + + + + diff --git a/FModel/Views/Snooper/Renderer.cs b/FModel/Views/Snooper/Renderer.cs index dfa91ad3..a2317032 100644 --- a/FModel/Views/Snooper/Renderer.cs +++ b/FModel/Views/Snooper/Renderer.cs @@ -12,6 +12,7 @@ using CUE4Parse.UE4.Assets.Exports.Component.SplineMesh; using CUE4Parse.UE4.Assets.Exports.Component.StaticMesh; using CUE4Parse.UE4.Assets.Exports.GeometryCollection; using CUE4Parse.UE4.Assets.Exports.Material; +using CUE4Parse.UE4.Assets.Exports.Nanite; using CUE4Parse.UE4.Assets.Exports.SkeletalMesh; using CUE4Parse.UE4.Assets.Exports.StaticMesh; using CUE4Parse.UE4.Assets.Exports.Texture; @@ -86,7 +87,7 @@ public class Renderer : IDisposable switch (dummy) { case UStaticMesh when export.Value is UStaticMesh st: - LoadStaticMesh(st); + LoadStaticMesh(st, UserSettings.Default.NaniteMeshExportFormat); break; case USkeletalMesh when export.Value is USkeletalMesh sk: LoadSkeletalMesh(sk); @@ -343,7 +344,7 @@ public class Renderer : IDisposable wnd.WindowShouldClose(true, true); } - private void LoadStaticMesh(UStaticMesh original) + private void LoadStaticMesh(UStaticMesh original, ENaniteMeshFormat naniteFormat = ENaniteMeshFormat.OnlyNormalLODs) { var guid = original.LightingGuid; if (Options.TryGetModel(guid, out var model)) @@ -353,7 +354,7 @@ public class Renderer : IDisposable return; } - if (!original.TryConvert(out var mesh)) + if (!original.TryConvert(out var mesh, naniteFormat)) return; Options.Models[guid] = new StaticModel(original, mesh); From 2dd98d4d643cb255872a58c409949698dc6be530 Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Thu, 26 Jun 2025 23:56:59 +0300 Subject: [PATCH 15/21] full Nanite support for Static Meshes --- CUE4Parse | 2 +- FModel/Views/Snooper/Shading/Material.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index f9b38111..df6b0037 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit f9b38111279365410523de25bbd7868ec9783574 +Subproject commit df6b0037218f120419d3879b479a1c9e9102cc83 diff --git a/FModel/Views/Snooper/Shading/Material.cs b/FModel/Views/Snooper/Shading/Material.cs index 729aa766..e9f7cfa4 100644 --- a/FModel/Views/Snooper/Shading/Material.cs +++ b/FModel/Views/Snooper/Shading/Material.cs @@ -130,7 +130,8 @@ public class Material : IDisposable "EmissiveUVs_RG_UpperLeftCorner_BA_LowerRightCorner", "Emissive Texture UVs RG_TopLeft BA_BottomRight", "Emissive 2 UV Positioning (RG)UpperLeft (BA)LowerRight", - "EmissiveUVPositioning (RG)UpperLeft (BA)LowerRight")) + "EmissiveUVPositioning (RG)UpperLeft (BA)LowerRight", + "Emissive_CH")) EmissiveRegion = new Vector4(EmissiveUVs.R, EmissiveUVs.G, EmissiveUVs.B, EmissiveUVs.A); if ((Parameters.TryGetSwitch(out var swizzleRoughnessToGreen, "SwizzleRoughnessToGreen") && swizzleRoughnessToGreen) || From ba0aedba6826ebaa0bdbd650e521fbfe314b92ae Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Mon, 30 Jun 2025 13:11:25 +0300 Subject: [PATCH 16/21] Extract DNA and fixes for Crystal of Atlan and Naruto to Boruto --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index df6b0037..3f4a4fdc 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit df6b0037218f120419d3879b479a1c9e9102cc83 +Subproject commit 3f4a4fdc1a464143b1ea03fab25034c6ea4fd563 From 03a4f79c3aab3516005de92786183451e81601f5 Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Mon, 30 Jun 2025 23:14:29 +0300 Subject: [PATCH 17/21] DNAExporter Fix --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index 3f4a4fdc..56074f41 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 3f4a4fdc1a464143b1ea03fab25034c6ea4fd563 +Subproject commit 56074f412a45b24b0595c76ef383f13fa94572be From 394bcf356f4c4774ea3edba200bc13b35e4c132c Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Thu, 3 Jul 2025 17:27:32 +0300 Subject: [PATCH 18/21] Neverness to Everness and Terminull Brigade support Add new loading mode that skips patched assets --- CUE4Parse | 2 +- FModel/Enums.cs | 4 +++- FModel/ViewModels/Commands/LoadCommand.cs | 27 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index 56074f41..566bc1f7 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 56074f412a45b24b0595c76ef383f13fa94572be +Subproject commit 566bc1f731b993a09b50772fef8de4d9d5e36243 diff --git a/FModel/Enums.cs b/FModel/Enums.cs index 1412b013..59700533 100644 --- a/FModel/Enums.cs +++ b/FModel/Enums.cs @@ -60,7 +60,9 @@ public enum ELoadingMode [Description("All (New)")] AllButNew, [Description("All (Modified)")] - AllButModified + AllButModified, + [Description("All (Except Patched Assets)")] + AllButPatched, } // public enum EUpdateMode diff --git a/FModel/ViewModels/Commands/LoadCommand.cs b/FModel/ViewModels/Commands/LoadCommand.cs index 0a2683bb..4a4ea0b6 100644 --- a/FModel/ViewModels/Commands/LoadCommand.cs +++ b/FModel/ViewModels/Commands/LoadCommand.cs @@ -87,6 +87,11 @@ public class LoadCommand : ViewModelCommand FilterNewOrModifiedFilesToDisplay(cancellationToken); break; } + case ELoadingMode.AllButPatched: + { + FilterPacthedFilesToDisplay(cancellationToken); + break; + } default: throw new ArgumentOutOfRangeException(); } @@ -273,4 +278,26 @@ public class LoadCommand : ViewModelCommand entries.Add(asset); } + + private void FilterPacthedFilesToDisplay(CancellationToken cancellationToken) + { + var loaded = new Dictionary(_applicationView.CUE4Parse.Provider.PathComparer); + + foreach (var (key, asset) in _applicationView.CUE4Parse.Provider.Files) + { + cancellationToken.ThrowIfCancellationRequested(); // cancel if needed + if (asset.IsUePackagePayload) continue; + + if (asset is VfsEntry entry && loaded.TryGetValue(key, out var file) && + file is VfsEntry existingEntry && entry.Vfs.ReadOrder < existingEntry.Vfs.ReadOrder) + { + continue; + } + + loaded[key] = asset; + } + + _applicationView.Status.UpdateStatusLabel($"{loaded.Count:### ### ###} Packages"); + _applicationView.CUE4Parse.AssetsFolder.BulkPopulate(loaded.Values); + } } From 233b7ab03b24b50ab98937a82f30e392017a30a3 Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Mon, 7 Jul 2025 00:17:56 +0300 Subject: [PATCH 19/21] Need For Speed Mobile and Game For Peace fixes --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index 566bc1f7..8389f31d 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 566bc1f731b993a09b50772fef8de4d9d5e36243 +Subproject commit 8389f31d4ca4add18377ca5ba7bcd93066b13362 From 62b103f958865b2c7681ef2220c8a2ed844551b3 Mon Sep 17 00:00:00 2001 From: Chompster86 Date: Sun, 6 Jul 2025 23:10:14 -0400 Subject: [PATCH 20/21] Fixed Burst Weapon's Fire Rates (#575) * Update BaseIconStats.cs Fixed Burst Fire Rates * Hides fire rate if it = 0 Made it so if the equation = 0, it hides fire rate * Fixed if firing rate = 1 Made it so if firing rate = 1, it hides the burst firing rate equation and just shows the firing rate. * Neverness to Everness and Terminull Brigade support Add new loading mode that skips patched assets * BinaryConfig.ini support * Update CUE4Parse --------- Co-authored-by: GhostScissors <79089473+GhostScissors@users.noreply.github.com> --- CUE4Parse | 2 +- FModel/Creator/Bases/FN/BaseIconStats.cs | 9 ++++++++- FModel/ViewModels/CUE4ParseViewModel.cs | 11 +++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index 8389f31d..5a03d963 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 8389f31d4ca4add18377ca5ba7bcd93066b13362 +Subproject commit 5a03d96378c214e924e0cacfaa02969ca4a27236 diff --git a/FModel/Creator/Bases/FN/BaseIconStats.cs b/FModel/Creator/Bases/FN/BaseIconStats.cs index c7c1e485..a297b0e0 100644 --- a/FModel/Creator/Bases/FN/BaseIconStats.cs +++ b/FModel/Creator/Bases/FN/BaseIconStats.cs @@ -95,6 +95,8 @@ public class BaseIconStats : BaseIcon weaponRowValue.TryGetValue(out float heatMax, "OverheatingMaxValue"); //Maximum heat overheating weapons can hold before they need to cool off weaponRowValue.TryGetValue(out float heatPerShot, "OverheatHeatingValue"); //Heat generated per shot on overheat weapons weaponRowValue.TryGetValue(out float overheatCooldown, "OverheatedCooldownDelay"); //Cooldown after a weapon reaches its maximum heat capacity + weaponRowValue.TryGetValue(out int cartridgePerFire, "CartridgePerFire"); //Amount of bullets shot after pressing the fire button once + weaponRowValue.TryGetValue(out float burstFiringRate, "BurstFiringRate"); //Item firing rate during a burst, value is shots per second { var multiplier = bpc != 0f ? bpc : 1; if (dmgPb != 0f) @@ -122,7 +124,12 @@ public class BaseIconStats : BaseIcon _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "068239DD4327B36124498C9C5F61C038", "Magazine Size"), clipSize, 40)); } - if (firingRate != 0f) + var burstEquation = cartridgePerFire / (((cartridgePerFire - 1f) / burstFiringRate) + (1f / firingRate)); + if (burstEquation != 0f) + { + _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "27B80BA44805ABD5A2D2BAB2902B250C", "Fire Rate"), burstEquation, 11)); + } + else if (firingRate != 0f) { _statistics.Add(new IconStat(Utils.GetLocalizedResource("", "27B80BA44805ABD5A2D2BAB2902B250C", "Fire Rate"), firingRate, 11)); } diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index c99133ba..275d5b16 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -39,6 +39,7 @@ using CUE4Parse_Conversion; using CUE4Parse_Conversion.Sounds; using CUE4Parse.FileProvider.Objects; using CUE4Parse.UE4.Assets; +using CUE4Parse.UE4.BinaryConfig; using CUE4Parse.UE4.Objects.UObject; using CUE4Parse.Utils; using EpicManifestParser; @@ -580,6 +581,16 @@ public class CUE4ParseViewModel : ViewModel break; } + case "ini" when entry.Name.Contains("BinaryConfig"): + { + var ar = entry.CreateReader(); + var configCache = new FConfigCacheIni(ar); + + TabControl.SelectedTab.Highlighter = AvalonExtensions.HighlighterSelector("json"); + TabControl.SelectedTab.SetDocumentText(JsonConvert.SerializeObject(configCache, Formatting.Indented), saveProperties, updateUi); + + break; + } case "upluginmanifest": case "uproject": case "manifest": From 1f1d2ae3c2cf3a47fadfe0fefd11c0e161fa57db Mon Sep 17 00:00:00 2001 From: LongerWarrior Date: Tue, 8 Jul 2025 16:59:09 +0300 Subject: [PATCH 21/21] =?UTF-8?q?Tony=20Hawk's=E2=84=A2=20Pro=20Skater?= =?UTF-8?q?=E2=84=A2=203=20+=204=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CUE4Parse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CUE4Parse b/CUE4Parse index 5a03d963..7bf781ff 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 5a03d96378c214e924e0cacfaa02969ca4a27236 +Subproject commit 7bf781ffd8871c48fdca8be86576b313e023ce7c