mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2025-12-12 10:17:23 +01:00
Make this option work when applying automation.
This commit is contained in:
parent
2713e6f1f6
commit
6efd89e0ab
7 changed files with 35 additions and 32 deletions
|
|
@ -293,8 +293,8 @@ public sealed class StateApi : IGlamourerApiState, IApiService, IDisposable
|
|||
private void RevertToAutomation(Actor actor, ActorState state, uint key, ApplyFlag flags)
|
||||
{
|
||||
var source = (flags & ApplyFlag.Once) != 0 ? StateSource.IpcManual : StateSource.IpcFixed;
|
||||
_autoDesigns.ReapplyAutomation(actor, state.Identifier, state, true);
|
||||
_stateManager.ReapplyState(actor, state, source);
|
||||
_autoDesigns.ReapplyAutomation(actor, state.Identifier, state, true, out var forcedRedraw);
|
||||
_stateManager.ReapplyState(actor, state, forcedRedraw, source);
|
||||
ApiHelpers.Lock(state, key, flags);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -152,9 +152,9 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
{
|
||||
if (_state.GetOrCreate(id, data.Objects[0], out var state))
|
||||
{
|
||||
Reduce(data.Objects[0], state, newSet, _config.RespectManualOnAutomationUpdate, false);
|
||||
Reduce(data.Objects[0], state, newSet, _config.RespectManualOnAutomationUpdate, false, out var forcedRedraw);
|
||||
foreach (var actor in data.Objects)
|
||||
_state.ReapplyState(actor, StateSource.Fixed);
|
||||
_state.ReapplyState(actor, forcedRedraw,StateSource.Fixed);
|
||||
}
|
||||
}
|
||||
else if (_objects.TryGetValueAllWorld(id, out data) || _objects.TryGetValueNonOwned(id, out data))
|
||||
|
|
@ -164,8 +164,8 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
var specificId = actor.GetIdentifier(_actors);
|
||||
if (_state.GetOrCreate(specificId, actor, out var state))
|
||||
{
|
||||
Reduce(actor, state, newSet, _config.RespectManualOnAutomationUpdate, false);
|
||||
_state.ReapplyState(actor, StateSource.Fixed);
|
||||
Reduce(actor, state, newSet, _config.RespectManualOnAutomationUpdate, false, out var forcedRedraw);
|
||||
_state.ReapplyState(actor, forcedRedraw, StateSource.Fixed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -212,12 +212,13 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
|
||||
var respectManual = state.LastJob == newJob.Id;
|
||||
state.LastJob = actor.Job;
|
||||
Reduce(actor, state, set, respectManual, true);
|
||||
_state.ReapplyState(actor, StateSource.Fixed);
|
||||
Reduce(actor, state, set, respectManual, true, out var forcedRedraw);
|
||||
_state.ReapplyState(actor, forcedRedraw, StateSource.Fixed);
|
||||
}
|
||||
|
||||
public void ReapplyAutomation(Actor actor, ActorIdentifier identifier, ActorState state, bool reset)
|
||||
public void ReapplyAutomation(Actor actor, ActorIdentifier identifier, ActorState state, bool reset, out bool forcedRedraw)
|
||||
{
|
||||
forcedRedraw = false;
|
||||
if (!_config.EnableAutoDesigns)
|
||||
return;
|
||||
|
||||
|
|
@ -226,7 +227,7 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
|
||||
if (reset)
|
||||
_state.ResetState(state, StateSource.Game);
|
||||
Reduce(actor, state, set, false, false);
|
||||
Reduce(actor, state, set, false, false, out forcedRedraw);
|
||||
}
|
||||
|
||||
public bool Reduce(Actor actor, ActorIdentifier identifier, [NotNullWhen(true)] out ActorState? state)
|
||||
|
|
@ -253,11 +254,11 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
var respectManual = !state.UpdateTerritory(_clientState.TerritoryType) || !_config.RevertManualChangesOnZoneChange;
|
||||
if (!respectManual)
|
||||
_state.ResetState(state, StateSource.Game);
|
||||
Reduce(actor, state, set, respectManual, false);
|
||||
Reduce(actor, state, set, respectManual, false, out _);
|
||||
return true;
|
||||
}
|
||||
|
||||
private unsafe void Reduce(Actor actor, ActorState state, AutoDesignSet set, bool respectManual, bool fromJobChange)
|
||||
private unsafe void Reduce(Actor actor, ActorState state, AutoDesignSet set, bool respectManual, bool fromJobChange, out bool forcedRedraw)
|
||||
{
|
||||
if (set.BaseState is AutoDesignSet.Base.Game)
|
||||
{
|
||||
|
|
@ -275,6 +276,7 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
}
|
||||
}
|
||||
|
||||
forcedRedraw = false;
|
||||
if (!_humans.IsHuman((uint)actor.AsCharacter->CharacterData.ModelCharaId))
|
||||
return;
|
||||
|
||||
|
|
@ -282,6 +284,7 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
set.Designs.Where(d => d.IsActive(actor)).SelectMany(d => d.Design.AllLinks.Select(l => (l.Design, l.Flags & d.Type, d.Jobs.Flags))),
|
||||
state.ModelData.Customize, state.BaseData, true, _config.AlwaysApplyAssociatedMods);
|
||||
_state.ApplyDesign(state, mergedDesign, new ApplySettings(0, StateSource.Fixed, respectManual, fromJobChange, false, false, false));
|
||||
forcedRedraw = mergedDesign.ForcedRedraw;
|
||||
}
|
||||
|
||||
/// <summary> Get world-specific first and all-world afterward. </summary>
|
||||
|
|
@ -323,10 +326,10 @@ public sealed class AutoDesignApplier : IDisposable
|
|||
|
||||
var respectManual = prior == id;
|
||||
NewGearsetId = id;
|
||||
Reduce(data.Objects[0], state, set, respectManual, job != state.LastJob);
|
||||
Reduce(data.Objects[0], state, set, respectManual, job != state.LastJob, out var forcedRedraw);
|
||||
NewGearsetId = -1;
|
||||
foreach (var actor in data.Objects)
|
||||
_state.ReapplyState(actor, StateSource.Fixed);
|
||||
_state.ReapplyState(actor, forcedRedraw, StateSource.Fixed);
|
||||
}
|
||||
|
||||
public static unsafe bool CheckGearset(short check)
|
||||
|
|
|
|||
|
|
@ -251,8 +251,8 @@ public sealed class DesignQuickBar : Window, IDisposable
|
|||
|
||||
foreach (var actor in data.Objects)
|
||||
{
|
||||
_autoDesignApplier.ReapplyAutomation(actor, id, state!, true);
|
||||
_stateManager.ReapplyState(actor, StateSource.Manual);
|
||||
_autoDesignApplier.ReapplyAutomation(actor, id, state!, true, out var forcedRedraw);
|
||||
_stateManager.ReapplyState(actor, forcedRedraw, StateSource.Manual);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -291,8 +291,8 @@ public sealed class DesignQuickBar : Window, IDisposable
|
|||
|
||||
foreach (var actor in data.Objects)
|
||||
{
|
||||
_autoDesignApplier.ReapplyAutomation(actor, id, state!, false);
|
||||
_stateManager.ReapplyState(actor, StateSource.Manual);
|
||||
_autoDesignApplier.ReapplyAutomation(actor, id, state!, false, out var forcedRedraw);
|
||||
_stateManager.ReapplyState(actor, forcedRedraw, StateSource.Manual);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -341,8 +341,8 @@ public class ActorPanel
|
|||
"Reapply the current automation state for the character on top of its current state..",
|
||||
!_config.EnableAutoDesigns || _state!.IsLocked))
|
||||
{
|
||||
_autoDesignApplier.ReapplyAutomation(_actor, _identifier, _state!, false);
|
||||
_stateManager.ReapplyState(_actor, StateSource.Manual);
|
||||
_autoDesignApplier.ReapplyAutomation(_actor, _identifier, _state!, false, out var forcedRedraw);
|
||||
_stateManager.ReapplyState(_actor, forcedRedraw, StateSource.Manual);
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
|
|
@ -350,15 +350,15 @@ public class ActorPanel
|
|||
"Try to revert the character to the state it would have using automated designs.",
|
||||
!_config.EnableAutoDesigns || _state!.IsLocked))
|
||||
{
|
||||
_autoDesignApplier.ReapplyAutomation(_actor, _identifier, _state!, true);
|
||||
_stateManager.ReapplyState(_actor, StateSource.Manual);
|
||||
_autoDesignApplier.ReapplyAutomation(_actor, _identifier, _state!, true, out var forcedRedraw);
|
||||
_stateManager.ReapplyState(_actor, forcedRedraw, StateSource.Manual);
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
if (ImGuiUtil.DrawDisabledButton("Reapply", Vector2.Zero,
|
||||
"Try to reapply the configured state if something went wrong. Should generally not be necessary.",
|
||||
_state!.IsLocked))
|
||||
_stateManager.ReapplyState(_actor, StateSource.Manual);
|
||||
_stateManager.ReapplyState(_actor, false, StateSource.Manual);
|
||||
}
|
||||
|
||||
private void DrawApplyToSelf()
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ public class PenumbraAutoRedraw : IDisposable, IRequiredService
|
|||
_actions.Enqueue((state, () =>
|
||||
{
|
||||
foreach (var actor in actors.Objects)
|
||||
_state.ReapplyState(actor, state, StateSource.IpcManual);
|
||||
_state.ReapplyState(actor, state, false, StateSource.IpcManual);
|
||||
Glamourer.Log.Debug($"Automatically applied mod settings of type {type} to {id.Incognito(null)}.");
|
||||
}, WaitFrames));
|
||||
}
|
||||
|
|
@ -106,7 +106,7 @@ public class PenumbraAutoRedraw : IDisposable, IRequiredService
|
|||
_frame = currentFrame;
|
||||
_framework.RunOnFrameworkThread(() =>
|
||||
{
|
||||
_state.ReapplyState(_objects.Player, StateSource.IpcManual);
|
||||
_state.ReapplyState(_objects.Player, false, StateSource.IpcManual);
|
||||
Glamourer.Log.Debug(
|
||||
$"Automatically applied mod settings of type {type} to {_objects.PlayerData.Identifier.Incognito(null)} (Local Player).");
|
||||
});
|
||||
|
|
|
|||
|
|
@ -329,8 +329,8 @@ public class CommandService : IDisposable, IApiService
|
|||
{
|
||||
if (_stateManager.GetOrCreate(identifier, actor, out var state))
|
||||
{
|
||||
_autoDesignApplier.ReapplyAutomation(actor, identifier, state, revert);
|
||||
_stateManager.ReapplyState(actor, StateSource.Manual);
|
||||
_autoDesignApplier.ReapplyAutomation(actor, identifier, state, revert, out var forcedRedraw);
|
||||
_stateManager.ReapplyState(actor, forcedRedraw, StateSource.Manual);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -379,7 +379,7 @@ public class CommandService : IDisposable, IApiService
|
|||
return true;
|
||||
|
||||
foreach (var actor in data.Objects)
|
||||
_stateManager.ReapplyState(actor, StateSource.Manual);
|
||||
_stateManager.ReapplyState(actor, false, StateSource.Manual);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -402,18 +402,18 @@ public sealed class StateManager(
|
|||
}
|
||||
}
|
||||
|
||||
public void ReapplyState(Actor actor, StateSource source)
|
||||
public void ReapplyState(Actor actor, bool forceRedraw, StateSource source)
|
||||
{
|
||||
if (!GetOrCreate(actor, out var state))
|
||||
return;
|
||||
|
||||
ReapplyState(actor, state, source);
|
||||
ReapplyState(actor, state, forceRedraw, source);
|
||||
}
|
||||
|
||||
public void ReapplyState(Actor actor, ActorState state, StateSource source)
|
||||
public void ReapplyState(Actor actor, ActorState state, bool forceRedraw, StateSource source)
|
||||
{
|
||||
var data = Applier.ApplyAll(state,
|
||||
!actor.Model.IsHuman || CustomizeArray.Compare(actor.Model.GetCustomize(), state.ModelData.Customize).RequiresRedraw(), false);
|
||||
forceRedraw || !actor.Model.IsHuman || CustomizeArray.Compare(actor.Model.GetCustomize(), state.ModelData.Customize).RequiresRedraw(), false);
|
||||
StateChanged.Invoke(StateChanged.Type.Reapply, source, state, data, null);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue