Skip automatic updates from temporary settings when applied by design.

This commit is contained in:
Ottermandias 2025-02-19 23:42:05 +01:00
parent 9e7679e70f
commit 5a9e9513f4
4 changed files with 31 additions and 12 deletions

View file

@ -7,12 +7,12 @@ using Penumbra.GameData.Structs;
namespace Glamourer.Interop.Penumbra;
public class ModSettingApplier(PenumbraService penumbra, Configuration config, ObjectManager objects, CollectionOverrideService overrides)
public class ModSettingApplier(PenumbraService penumbra, PenumbraAutoRedrawSkip autoRedrawSkip, Configuration config, ObjectManager objects, CollectionOverrideService overrides)
: IService
{
private readonly HashSet<Guid> _collectionTracker = [];
public void HandleStateApplication(ActorState state, MergedDesign design)
public void HandleStateApplication(ActorState state, MergedDesign design, bool skipAutoRedraw)
{
if (!config.AlwaysApplyAssociatedMods || (design.AssociatedMods.Count == 0 && !design.ResetTemporarySettings))
return;
@ -26,6 +26,7 @@ public class ModSettingApplier(PenumbraService penumbra, Configuration config, O
}
_collectionTracker.Clear();
using var skip = autoRedrawSkip.SkipAutoUpdates(skipAutoRedraw);
foreach (var actor in data.Objects)
{
var (collection, _, overridden) = overrides.GetCollection(actor, state.Identifier);

View file

@ -19,9 +19,11 @@ public class PenumbraAutoRedraw : IDisposable, IRequiredService
private readonly ObjectManager _objects;
private readonly IFramework _framework;
private readonly StateChanged _stateChanged;
private readonly PenumbraAutoRedrawSkip _skip;
public PenumbraAutoRedraw(PenumbraService penumbra, Configuration config, StateManager state, ObjectManager objects, IFramework framework,
StateChanged stateChanged)
StateChanged stateChanged, PenumbraAutoRedrawSkip skip)
{
_penumbra = penumbra;
_config = config;
@ -29,6 +31,7 @@ public class PenumbraAutoRedraw : IDisposable, IRequiredService
_objects = objects;
_framework = framework;
_stateChanged = stateChanged;
_skip = skip;
_penumbra.ModSettingChanged += OnModSettingChange;
_framework.Update += OnFramework;
_stateChanged.Subscribe(OnStateChanged, StateChanged.Priority.PenumbraAutoRedraw);
@ -94,7 +97,7 @@ public class PenumbraAutoRedraw : IDisposable, IRequiredService
}
});
}
else if (_config.AutoRedrawEquipOnChanges)
else if (_config.AutoRedrawEquipOnChanges && !_skip.Skip)
{
// Only update once per frame.
var playerName = _penumbra.GetCurrentPlayerCollection();

View file

@ -0,0 +1,15 @@
using OtterGui.Classes;
using OtterGui.Services;
namespace Glamourer.Interop.Penumbra;
public class PenumbraAutoRedrawSkip : IService
{
private bool _skipAutoUpdates;
public BoolSetter SkipAutoUpdates(bool skip)
=> new(ref _skipAutoUpdates, skip);
public bool Skip
=> _skipAutoUpdates;
}

View file

@ -262,7 +262,7 @@ public class StateEditor(
public void ApplyDesign(object data, MergedDesign mergedDesign, ApplySettings settings)
{
var state = (ActorState)data;
modApplier.HandleStateApplication(state, mergedDesign);
modApplier.HandleStateApplication(state, mergedDesign, true);
if (!Editor.ChangeModelId(state, mergedDesign.Design.DesignData.ModelId, mergedDesign.Design.DesignData.Customize,
mergedDesign.Design.GetDesignDataRef().GetEquipmentPtr(), settings.Source, out var oldModelId, settings.Key))
return;