From d6575e6e6866c92ad404120aca9c94a0f49cfcda Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sun, 18 Feb 2024 14:45:54 +0100 Subject: [PATCH] Handle state reapplication on temporary mod changes. --- .../Interop/Penumbra/PenumbraAutoRedraw.cs | 31 +++++++++++++++---- Glamourer/State/StateManager.cs | 7 +++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Glamourer/Interop/Penumbra/PenumbraAutoRedraw.cs b/Glamourer/Interop/Penumbra/PenumbraAutoRedraw.cs index bf8fb4b..cb78c47 100644 --- a/Glamourer/Interop/Penumbra/PenumbraAutoRedraw.cs +++ b/Glamourer/Interop/Penumbra/PenumbraAutoRedraw.cs @@ -1,9 +1,10 @@ using Glamourer.State; +using OtterGui.Services; using Penumbra.Api.Enums; namespace Glamourer.Interop.Penumbra; -public class PenumbraAutoRedraw : IDisposable +public class PenumbraAutoRedraw : IDisposable, IRequiredService { private readonly Configuration _config; private readonly PenumbraService _penumbra; @@ -24,11 +25,29 @@ public class PenumbraAutoRedraw : IDisposable private void OnModSettingChange(ModSettingChange type, string name, string mod, bool inherited) { - if (!_config.AutoRedrawEquipOnChanges && type is not ModSettingChange.TemporaryMod) - return; + if (type is ModSettingChange.TemporaryMod) + { + _objects.Update(); + foreach (var (id, state) in _state) + { + if (!_objects.TryGetValue(id, out var actors) || !actors.Valid) + continue; - var playerName = _penumbra.GetCurrentPlayerCollection(); - if (playerName == name) - _state.ReapplyState(_objects.Player, StateSource.IpcManual); + var collection = _penumbra.GetActorCollection(actors.Objects[0]); + if (collection != name) + continue; + + foreach (var actor in actors.Objects) + _state.ReapplyState(actor, state, StateSource.IpcManual); + Glamourer.Log.Debug($"Automatically applied mod settings of type {type} to {id.Incognito(null)}."); + } + } + else if (_config.AutoRedrawEquipOnChanges) + { + var playerName = _penumbra.GetCurrentPlayerCollection(); + if (playerName == name) + _state.ReapplyState(_objects.Player, StateSource.IpcManual); + Glamourer.Log.Debug($"Automatically applied mod settings of type {type} to {_objects.PlayerData.Identifier.Incognito(null)} (Local Player)."); + } } } diff --git a/Glamourer/State/StateManager.cs b/Glamourer/State/StateManager.cs index b58bab9..2c0b2d2 100644 --- a/Glamourer/State/StateManager.cs +++ b/Glamourer/State/StateManager.cs @@ -344,6 +344,13 @@ public sealed class StateManager( StateChanged.Invoke(StateChanged.Type.Reapply, source, state, data, null); } + public void ReapplyState(Actor actor, ActorState state, StateSource source) + { + var data = Applier.ApplyAll(state, + !actor.Model.IsHuman || CustomizeArray.Compare(actor.Model.GetCustomize(), state.ModelData.Customize).RequiresRedraw(), false); + StateChanged.Invoke(StateChanged.Type.Reapply, source, state, data, null); + } + public void DeleteState(ActorIdentifier identifier) => _states.Remove(identifier); }