From 3b2876a6e4657a025e3ed7230febbc9e48521357 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sun, 5 Jun 2022 12:33:50 +0200 Subject: [PATCH] Maybe fix migration for metadata containing mods, also fix negative values in mod collection settings causing problems. --- Penumbra/Configuration.Migration.cs | 6 ++++-- Penumbra/Interop/CharacterUtility.cs | 7 +++++++ Penumbra/Mods/Subclasses/ModSettings.cs | 7 ++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Penumbra/Configuration.Migration.cs b/Penumbra/Configuration.Migration.cs index c952e687..2b0b1586 100644 --- a/Penumbra/Configuration.Migration.cs +++ b/Penumbra/Configuration.Migration.cs @@ -70,6 +70,8 @@ public partial class Configuration return; } + // Ensure the right meta files are loaded. + Penumbra.CharacterUtility.LoadCharacterResources(); ResettleSortOrder(); ResettleCollectionSettings(); ResettleForcedCollection(); @@ -180,8 +182,8 @@ public partial class Configuration var modName = ( string )setting[ "FolderName" ]!; var enabled = ( bool )setting[ "Enabled" ]!; var priority = ( int )setting[ "Priority" ]!; - var settings = setting[ "Settings" ]!.ToObject< Dictionary< string, uint > >() - ?? setting[ "Conf" ]!.ToObject< Dictionary< string, uint > >(); + var settings = setting[ "Settings" ]!.ToObject< Dictionary< string, long > >() + ?? setting[ "Conf" ]!.ToObject< Dictionary< string, long > >(); dict[ modName ] = new ModSettings.SavedSettings() { diff --git a/Penumbra/Interop/CharacterUtility.cs b/Penumbra/Interop/CharacterUtility.cs index c57d6043..5cd71682 100644 --- a/Penumbra/Interop/CharacterUtility.cs +++ b/Penumbra/Interop/CharacterUtility.cs @@ -11,6 +11,13 @@ public unsafe class CharacterUtility : IDisposable [Signature( "48 8B 0D ?? ?? ?? ?? E8 ?? ?? ?? 00 48 8D 8E ?? ?? 00 00 E8 ?? ?? ?? 00 33 D2", ScanType = ScanType.StaticAddress )] private readonly Structs.CharacterUtility** _characterUtilityAddress = null; + // Only required for migration anymore. + [Signature( "E8 ?? ?? ?? 00 48 8D 8E ?? ?? 00 00 E8 ?? ?? ?? 00 33 D2" )] + public readonly Action< IntPtr >? LoadCharacterResourcesFunc; + + public void LoadCharacterResources() + => LoadCharacterResourcesFunc?.Invoke( ( IntPtr )_characterUtilityAddress ); + public Structs.CharacterUtility* Address => *_characterUtilityAddress; diff --git a/Penumbra/Mods/Subclasses/ModSettings.cs b/Penumbra/Mods/Subclasses/ModSettings.cs index 50341ae9..a6bd27de 100644 --- a/Penumbra/Mods/Subclasses/ModSettings.cs +++ b/Penumbra/Mods/Subclasses/ModSettings.cs @@ -149,7 +149,7 @@ public class ModSettings // A simple struct conversion to easily save settings by name instead of value. public struct SavedSettings { - public Dictionary< string, uint > Settings; + public Dictionary< string, long > Settings; public int Priority; public bool Enabled; @@ -165,7 +165,7 @@ public class ModSettings { Priority = settings.Priority; Enabled = settings.Enabled; - Settings = new Dictionary< string, uint >( mod.Groups.Count ); + Settings = new Dictionary< string, long >( mod.Groups.Count ); settings.AddMissingSettings( mod.Groups.Count ); foreach( var (group, setting) in mod.Groups.Zip( settings.Settings ) ) @@ -183,7 +183,8 @@ public class ModSettings { if( Settings.TryGetValue( group.Name, out var config ) ) { - var actualConfig = FixSetting( group, config ); + var castConfig = ( uint )Math.Clamp( config, 0, uint.MaxValue ); + var actualConfig = FixSetting( group, castConfig ); list.Add( actualConfig ); if( actualConfig != config ) {