diff --git a/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs b/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs index 6868ec4..d815c5c 100644 --- a/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs +++ b/MareSynchronos/PlayerData/Pairs/OnlinePlayerManager.cs @@ -47,7 +47,7 @@ public class OnlinePlayerManager : DisposableMediatorSubscriberBase var playerCharacters = _dalamudUtil.GetPlayerCharacters(); var chars = _pairManager.FindAllPairs(playerCharacters); - var newVisiblePlayers = (from pChar in chars.Where(p => p.Pair != null && p.Pair.InitializePair(p.Character.Name.ToString())) + var newVisiblePlayers = (from pChar in chars.Where(p => p.Pair.InitializePair(p.Character.Name.ToString())) select pChar.Pair.UserData).ToList(); if (newVisiblePlayers.Any()) diff --git a/MareSynchronos/PlayerData/Pairs/PairManager.cs b/MareSynchronos/PlayerData/Pairs/PairManager.cs index d95d756..5a943de 100644 --- a/MareSynchronos/PlayerData/Pairs/PairManager.cs +++ b/MareSynchronos/PlayerData/Pairs/PairManager.cs @@ -21,9 +21,9 @@ public sealed class PairManager : DisposableMediatorSubscriberBase private readonly ConcurrentDictionary _allGroups = new(GroupDataComparer.Instance); private readonly MareConfigService _configurationService; private readonly DalamudContextMenu _dalamudContextMenu; + private readonly Dictionary _indexedPairs = new(StringComparer.Ordinal); private readonly Func _pairFactory; private Lazy> _directPairsInternal; - private Lazy>> _groupPairsInternal; public PairManager(ILogger logger, Func pairFactory, @@ -91,14 +91,9 @@ public sealed class PairManager : DisposableMediatorSubscriberBase RecreateLazy(); } - public List<(PlayerCharacter Character, Pair? Pair)> FindAllPairs(List playerCharacters) + public List<(PlayerCharacter Character, Pair Pair)> FindAllPairs(List playerCharacters) { - var indexedPairs = new Dictionary(StringComparer.Ordinal); - foreach (var pair in _allClientPairs.Values) - { - indexedPairs[pair.GetPlayerNameHash()] = pair; - } - return playerCharacters.Select(p => (p, indexedPairs.TryGetValue(p.GetHash256(), out var pair) ? pair : null)).ToList(); + return playerCharacters.Select(p => (p, _indexedPairs.TryGetValue(p.GetHash256(), out var pair) ? pair : null)).Where(p => p.Item2 != null).ToList()!; } public Pair? FindPair(PlayerCharacter? pChar) @@ -353,6 +348,14 @@ public sealed class PairManager : DisposableMediatorSubscriberBase private void DalamudUtilOnDelayedFrameworkUpdate() { + _indexedPairs.Clear(); + foreach (var pair in _allClientPairs.Values.Where(p => string.IsNullOrEmpty(p.PlayerName))) + { + var hash = pair.GetPlayerNameHash(); + if (string.IsNullOrEmpty(hash)) continue; + _indexedPairs[hash] = pair; + } + foreach (Pair pair in _allClientPairs.Select(p => p.Value).Where(p => p.HasCachedPlayer).ToList()) { if (!pair.CachedPlayerExists)