Add working links.

This commit is contained in:
Ottermandias 2024-01-26 16:45:31 +01:00
parent 282d6df165
commit 5992b86e4f
9 changed files with 31 additions and 11 deletions

View file

@ -262,7 +262,8 @@ public sealed class AutoDesignApplier : IDisposable
if (!_humans.IsHuman((uint)actor.AsCharacter->CharacterData.ModelCharaId))
return;
var mergedDesign = _designMerger.Merge(set.Designs.Where(d => d.IsActive(actor)).Select(d => ((DesignBase?)d.Design, d.Type)),
var mergedDesign = _designMerger.Merge(
set.Designs.Where(d => d.IsActive(actor)).SelectMany(d => d.Design?.AllLinks ?? [(d.Design, d.Type)]),
state.ModelData, true, false);
_state.ApplyDesign(state, mergedDesign, new ApplySettings(0, StateSource.Fixed, respectManual, fromJobChange, false));
}

View file

@ -46,6 +46,9 @@ public sealed class Design : DesignBase, ISavable
public string Incognito
=> Identifier.ToString()[..8];
public IEnumerable<(DesignBase? Design, ApplicationType Flags)> AllLinks
=> LinkContainer.GetAllLinks(this).Select(t => ((DesignBase?)t.Link.Link, t.Link.Type));
#endregion
#region Serialization

View file

@ -11,7 +11,8 @@ public readonly record struct ApplySettings(
StateSource Source = StateSource.Manual,
bool RespectManual = false,
bool FromJobChange = false,
bool UseSingleSource = false)
bool UseSingleSource = false,
bool MergeLinks = false)
{
public static readonly ApplySettings Manual = new()
{
@ -20,6 +21,7 @@ public readonly record struct ApplySettings(
FromJobChange = false,
RespectManual = false,
UseSingleSource = false,
MergeLinks = false,
};
public static readonly ApplySettings Game = new()
@ -29,6 +31,7 @@ public readonly record struct ApplySettings(
FromJobChange = false,
RespectManual = false,
UseSingleSource = false,
MergeLinks = false,
};
}

View file

@ -15,6 +15,9 @@ public class DesignMerger(
ItemUnlockManager _itemUnlocks,
CustomizeUnlockManager _customizeUnlocks) : IService
{
public MergedDesign Merge(LinkContainer designs, in DesignData baseRef, bool respectOwnership, bool modAssociations)
=> Merge(designs.Select(d => ((DesignBase?) d.Link, d.Type)), baseRef, respectOwnership, modAssociations);
public MergedDesign Merge(IEnumerable<(DesignBase?, ApplicationType)> designs, in DesignData baseRef, bool respectOwnership,
bool modAssociations)
{

View file

@ -339,7 +339,7 @@ public class ActorPanel(
var text = ImGui.GetClipboardText();
var design = _converter.FromBase64(text, applyCustomize, applyGear, out _)
?? throw new Exception("The clipboard did not contain valid data.");
_stateManager.ApplyDesign(_state!, design, ApplySettings.Manual);
_stateManager.ApplyDesign(_state!, design, ApplySettings.Manual with { MergeLinks = true });
}
catch (Exception ex)
{

View file

@ -438,7 +438,7 @@ public class DesignPanel(
{
var (applyGear, applyCustomize, applyCrest, applyParameters) = UiHelpers.ConvertKeysToFlags();
using var _ = _selector.Selected!.TemporarilyRestrictApplication(applyGear, applyCustomize, applyCrest, applyParameters);
_state.ApplyDesign(state, _selector.Selected!, ApplySettings.Manual);
_state.ApplyDesign(state, _selector.Selected!, ApplySettings.Manual with { MergeLinks = true });
}
}
@ -457,7 +457,7 @@ public class DesignPanel(
{
var (applyGear, applyCustomize, applyCrest, applyParameters) = UiHelpers.ConvertKeysToFlags();
using var _ = _selector.Selected!.TemporarilyRestrictApplication(applyGear, applyCustomize, applyCrest, applyParameters);
_state.ApplyDesign(state, _selector.Selected!, ApplySettings.Manual);
_state.ApplyDesign(state, _selector.Selected!, ApplySettings.Manual with {MergeLinks = true});
}
}

View file

@ -419,7 +419,7 @@ public class CommandService : IDisposable
if (!_objects.TryGetValue(identifier, out var actors))
{
if (_stateManager.TryGetValue(identifier, out var state))
_stateManager.ApplyDesign(state, design, ApplySettings.Manual);
_stateManager.ApplyDesign(state, design, ApplySettings.Manual with { MergeLinks = true });
}
else
{
@ -428,7 +428,7 @@ public class CommandService : IDisposable
if (_stateManager.GetOrCreate(actor.GetIdentifier(_actors), actor, out var state))
{
ApplyModSettings(design, actor, applyMods);
_stateManager.ApplyDesign(state, design, ApplySettings.Manual);
_stateManager.ApplyDesign(state, design, ApplySettings.Manual with { MergeLinks = true });
}
}
}

View file

@ -15,7 +15,8 @@ public class StateEditor(
StateChanged stateChanged,
JobChangeState jobChange,
Configuration config,
ItemManager items) : IDesignEditor
ItemManager items,
DesignMerger merger) : IDesignEditor
{
protected readonly InternalStateEditor Editor = editor;
protected readonly StateApplier Applier = applier;
@ -293,12 +294,19 @@ public class StateEditor(
}
public void ApplyDesign(object data, DesignBase design, ApplySettings settings)
=> ApplyDesign(data, new MergedDesign(design), settings with
{
var merged = settings.MergeLinks && design is Design d
? merger.Merge(d.AllLinks, ((ActorState)data).ModelData, false, false)
: new MergedDesign(design);
ApplyDesign(data, merged, settings with
{
FromJobChange = false,
RespectManual = false,
UseSingleSource = true,
});
}
/// <summary> Apply offhand item and potentially gauntlets if configured. </summary>
private void ApplyMainhandPeriphery(ActorState state, EquipItem? newMainhand, ApplySettings settings)

View file

@ -1,5 +1,6 @@
using Dalamud.Plugin.Services;
using Glamourer.Designs;
using Glamourer.Designs.Links;
using Glamourer.Events;
using Glamourer.GameData;
using Glamourer.Interop;
@ -21,8 +22,9 @@ public sealed class StateManager(
HumanModelList _humans,
IClientState _clientState,
Configuration config,
JobChangeState jobChange)
: StateEditor(editor, applier, @event, jobChange, config, items), IReadOnlyDictionary<ActorIdentifier, ActorState>
JobChangeState jobChange,
DesignMerger merger)
: StateEditor(editor, applier, @event, jobChange, config, items, merger), IReadOnlyDictionary<ActorIdentifier, ActorState>
{
private readonly Dictionary<ActorIdentifier, ActorState> _states = [];