From 525f65e70aa0f60d447dde2496cb74ad29b5c945 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Fri, 22 Nov 2024 14:27:14 +0100 Subject: [PATCH] Fix issues with shared weapon types. --- Glamourer/Automation/AutoDesignApplier.cs | 4 ++-- Glamourer/Designs/Links/DesignMerger.cs | 4 ++-- Glamourer/Designs/Links/MergedDesign.cs | 8 ++++---- Glamourer/Glamourer.cs | 1 + Glamourer/State/JobChangeState.cs | 5 +++-- Glamourer/State/StateEditor.cs | 2 +- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Glamourer/Automation/AutoDesignApplier.cs b/Glamourer/Automation/AutoDesignApplier.cs index 0ce34d4..ccaae21 100644 --- a/Glamourer/Automation/AutoDesignApplier.cs +++ b/Glamourer/Automation/AutoDesignApplier.cs @@ -77,7 +77,7 @@ public sealed class AutoDesignApplier : IDisposable { case EquipSlot.MainHand: { - if (_jobChangeState.TryGetValue(current.Type, actor.Job, out var data)) + if (_jobChangeState.TryGetValue(current.Type, actor.Job, false, out var data)) { Glamourer.Log.Verbose( $"Changing Mainhand from {state.ModelData.Weapon(EquipSlot.MainHand)} | {state.BaseData.Weapon(EquipSlot.MainHand)} to {data.Item1} for 0x{actor.Address:X}."); @@ -89,7 +89,7 @@ public sealed class AutoDesignApplier : IDisposable } case EquipSlot.OffHand when current.Type == state.BaseData.MainhandType.Offhand(): { - if (_jobChangeState.TryGetValue(current.Type, actor.Job, out var data)) + if (_jobChangeState.TryGetValue(current.Type, actor.Job, false, out var data)) { Glamourer.Log.Verbose( $"Changing Offhand from {state.ModelData.Weapon(EquipSlot.OffHand)} | {state.BaseData.Weapon(EquipSlot.OffHand)} to {data.Item1} for 0x{actor.Address:X}."); diff --git a/Glamourer/Designs/Links/DesignMerger.cs b/Glamourer/Designs/Links/DesignMerger.cs index 5767c7a..e0e5d95 100644 --- a/Glamourer/Designs/Links/DesignMerger.cs +++ b/Glamourer/Designs/Links/DesignMerger.cs @@ -1,4 +1,5 @@ using Glamourer.Automation; +using Glamourer.Designs.Special; using Glamourer.GameData; using Glamourer.Interop.Material; using Glamourer.Services; @@ -23,8 +24,7 @@ public class DesignMerger( modAssociations); public MergedDesign Merge(IEnumerable<(IDesignStandIn, ApplicationType, JobFlag)> designs, in CustomizeArray currentCustomize, - in DesignData baseRef, - bool respectOwnership, bool modAssociations) + in DesignData baseRef, bool respectOwnership, bool modAssociations) { var ret = new MergedDesign(designManager); ret.Design.SetCustomize(_customize, currentCustomize); diff --git a/Glamourer/Designs/Links/MergedDesign.cs b/Glamourer/Designs/Links/MergedDesign.cs index 0748633..9c9e079 100644 --- a/Glamourer/Designs/Links/MergedDesign.cs +++ b/Glamourer/Designs/Links/MergedDesign.cs @@ -23,8 +23,8 @@ public readonly struct WeaponList _list.Add(type, list); } - var remainingFlags = list.Select(t => t.Item3) - .Aggregate(flags, (current, existingFlags) => current & ~existingFlags); + var existingFlags = list.Count == 0 ? 0 : list.Select(t => t.Item3).Aggregate((t, existing) => t | existing); + var remainingFlags = flags & ~existingFlags; if (remainingFlags == 0) return false; @@ -33,7 +33,7 @@ public readonly struct WeaponList return true; } - public bool TryGet(FullEquipType type, JobId id, out (EquipItem, StateSource) ret) + public bool TryGet(FullEquipType type, JobId id, bool gameStateAllowed, out (EquipItem, StateSource) ret) { if (!_list.TryGetValue(type, out var list)) { @@ -45,7 +45,7 @@ public readonly struct WeaponList foreach (var (item, source, flags) in list) { - if (flags.HasFlag(flag)) + if (flags.HasFlag(flag) && (gameStateAllowed || source is not StateSource.Game)) { ret = (item, source); return true; diff --git a/Glamourer/Glamourer.cs b/Glamourer/Glamourer.cs index ee202d6..b4489e8 100644 --- a/Glamourer/Glamourer.cs +++ b/Glamourer/Glamourer.cs @@ -139,6 +139,7 @@ public class Glamourer : IDalamudPlugin ReadOnlySpan relevantPlugins = [ "Penumbra", "MareSynchronos", "CustomizePlus", "SimpleHeels", "VfxEditor", "heliosphere-plugin", "Ktisis", "Brio", "DynamicBridge", + "LoporritSync", ]; var plugins = _services.GetService().InstalledPlugins .GroupBy(p => p.InternalName) diff --git a/Glamourer/State/JobChangeState.cs b/Glamourer/State/JobChangeState.cs index 0fe1820..d568375 100644 --- a/Glamourer/State/JobChangeState.cs +++ b/Glamourer/State/JobChangeState.cs @@ -24,11 +24,12 @@ public sealed class JobChangeState : IService public ActorIdentifier Identifier => State?.Identifier ?? ActorIdentifier.Invalid; - public bool TryGetValue(FullEquipType slot, JobId jobId, out (EquipItem, StateSource) data) - => _weaponList.TryGet(slot, jobId, out data); + public bool TryGetValue(FullEquipType slot, JobId jobId, bool gameStateAllowed, out (EquipItem, StateSource) data) + => _weaponList.TryGet(slot, jobId, gameStateAllowed, out data); public void Set(ActorState state, IEnumerable<(EquipItem, StateSource, JobFlag)> items) { + Reset(); foreach (var (item, source, flags) in items.Where(p => p.Item1.Valid)) _weaponList.TryAdd(item.Type, item, source, flags); State = state; diff --git a/Glamourer/State/StateEditor.cs b/Glamourer/State/StateEditor.cs index 959d810..59f27a2 100644 --- a/Glamourer/State/StateEditor.cs +++ b/Glamourer/State/StateEditor.cs @@ -359,7 +359,7 @@ public class StateEditor( } var currentType = state.BaseData.Item(weaponSlot).Type; - if (mergedDesign.Weapons.TryGet(currentType, state.LastJob, out var weapon)) + if (mergedDesign.Weapons.TryGet(currentType, state.LastJob, true, out var weapon)) { var source = settings.UseSingleSource ? settings.Source : weapon.Item2 is StateSource.Game ? StateSource.Game : settings.Source;