diff --git a/Penumbra/Interop/ObjectReloader.cs b/Penumbra/Interop/ObjectReloader.cs index e2b67ff7..b8000f9e 100644 --- a/Penumbra/Interop/ObjectReloader.cs +++ b/Penumbra/Interop/ObjectReloader.cs @@ -61,13 +61,13 @@ namespace Penumbra.Interop if( _currentObjectName != null && _mods.Collections.CharacterCollection.TryGetValue( _currentObjectName, out var collection ) ) { _changedSettings = true; - _mods.Collections.ActiveCollection = collection; + _mods.Collections.SetActiveCollection( collection, _currentObjectName ); } } private void RestoreSettings() { - _mods.Collections.ActiveCollection = _mods.Collections.DefaultCollection; + _mods.Collections.ResetActiveCollection(); _changedSettings = false; } diff --git a/Penumbra/Mods/CollectionManager.cs b/Penumbra/Mods/CollectionManager.cs index 1a2ca986..960d6b0c 100644 --- a/Penumbra/Mods/CollectionManager.cs +++ b/Penumbra/Mods/CollectionManager.cs @@ -14,6 +14,7 @@ namespace Penumbra.Mods { private readonly ModManager _manager; + public string CollectionChangedTo { get; private set; }= string.Empty; public Dictionary< string, ModCollection > Collections { get; } = new(); public ModCollection CurrentCollection { get; private set; } = null!; @@ -21,7 +22,7 @@ namespace Penumbra.Mods public ModCollection ForcedCollection { get; private set; } = ModCollection.Empty; public Dictionary< string, ModCollection > CharacterCollection { get; } = new(); - public ModCollection ActiveCollection { get; set; } + public ModCollection ActiveCollection { get; private set; } public CollectionManager( ModManager manager ) { @@ -32,6 +33,27 @@ namespace Penumbra.Mods ActiveCollection = DefaultCollection; } + public bool SetActiveCollection( ModCollection newActive, string name ) + { + CollectionChangedTo = name; + if( newActive == ActiveCollection ) + { + return false; + } + + if( ActiveCollection.Cache?.MetaManipulations.Count > 0 || newActive.Cache?.MetaManipulations.Count > 0 ) + { + var resourceManager = Service.Get(); + resourceManager.ReloadPlayerResources(); + } + + ActiveCollection = newActive; + return true; + } + + public bool ResetActiveCollection() + => SetActiveCollection( DefaultCollection, string.Empty ); + public void RecreateCaches() { if( !_manager.TempWritable ) @@ -183,7 +205,7 @@ namespace Penumbra.Mods public void SetDefaultCollection( ModCollection newCollection ) => SetCollection( newCollection, DefaultCollection, c => { - if( ActiveCollection == DefaultCollection ) + if( !CollectionChangedTo.Any() ) { ActiveCollection = c; var resourceManager = Service< ResidentResources >.Get(); @@ -204,8 +226,7 @@ namespace Penumbra.Mods CharacterCollection.TryGetValue( characterName, out var oldCollection ) ? oldCollection : ModCollection.Empty, c => { - if( CharacterCollection.TryGetValue( characterName, out var collection ) - && ActiveCollection == collection ) + if( CollectionChangedTo == characterName && CharacterCollection.TryGetValue( characterName, out var collection ) ) { ActiveCollection = c; var resourceManager = Service< ResidentResources >.Get();