From a27fa1a13dfbed59a0852fce6e5d0a8dc4ebbc7c Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Sat, 17 Sep 2022 03:40:40 +0200 Subject: [PATCH] dispose all players on zoning --- .../Managers/OnlinePlayerManager.cs | 21 +++++++++++-------- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/Plugin.cs | 4 ++-- MareSynchronos/Utils/DalamudUtil.cs | 12 +++++++++++ .../WebAPI/ApiController.Connectivity.cs | 1 - 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/MareSynchronos/Managers/OnlinePlayerManager.cs b/MareSynchronos/Managers/OnlinePlayerManager.cs index d2671f8..5d0d02c 100644 --- a/MareSynchronos/Managers/OnlinePlayerManager.cs +++ b/MareSynchronos/Managers/OnlinePlayerManager.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Dalamud.Game; using MareSynchronos.API; using MareSynchronos.Utils; using MareSynchronos.WebAPI; @@ -16,7 +15,6 @@ public class OnlinePlayerManager : IDisposable { private readonly ApiController _apiController; private readonly DalamudUtil _dalamudUtil; - private readonly Framework _framework; private readonly IpcManager _ipcManager; private readonly PlayerManager _playerManager; private readonly ConcurrentDictionary _onlineCachedPlayers = new(); @@ -27,11 +25,10 @@ public class OnlinePlayerManager : IDisposable .Select(p => p.PlayerNameHash).ToList(); private DateTime _lastPlayerObjectCheck = DateTime.Now; - public OnlinePlayerManager(Framework framework, ApiController apiController, DalamudUtil dalamudUtil, IpcManager ipcManager, PlayerManager playerManager) + public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, IpcManager ipcManager, PlayerManager playerManager) { Logger.Verbose("Creating " + nameof(OnlinePlayerManager)); - _framework = framework; _apiController = apiController; _dalamudUtil = dalamudUtil; _ipcManager = ipcManager; @@ -49,6 +46,7 @@ public class OnlinePlayerManager : IDisposable _dalamudUtil.LogIn += DalamudUtilOnLogIn; _dalamudUtil.LogOut += DalamudUtilOnLogOut; + _dalamudUtil.ZoneSwitched += DalamudUtilOnZoneSwitched; if (_dalamudUtil.IsLoggedIn) { @@ -56,6 +54,11 @@ public class OnlinePlayerManager : IDisposable } } + private void DalamudUtilOnZoneSwitched() + { + DisposePlayers(); + } + private void ApiControllerOnCharacterReceived(object? sender, CharacterReceivedEventArgs e) { if (_onlineCachedPlayers.TryGetValue(e.CharacterNameHash, out var visiblePlayer) && visiblePlayer.IsVisible) @@ -88,12 +91,12 @@ public class OnlinePlayerManager : IDisposable private void DalamudUtilOnLogOut() { - _framework.Update -= FrameworkOnUpdate; + _dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate; } private void DalamudUtilOnLogIn() { - _framework.Update += FrameworkOnUpdate; + _dalamudUtil.DelayedFrameworkUpdate += FrameworkOnUpdate; } private void IpcManagerOnPenumbraDisposed() @@ -140,10 +143,10 @@ public class OnlinePlayerManager : IDisposable _ipcManager.PenumbraDisposed -= ApiControllerOnDisconnected; - _framework.Update -= FrameworkOnUpdate; - _dalamudUtil.LogIn -= DalamudUtilOnLogIn; _dalamudUtil.LogOut -= DalamudUtilOnLogOut; + _dalamudUtil.ZoneSwitched -= DalamudUtilOnZoneSwitched; + _dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate; } private void RestoreAllCharacters() @@ -202,7 +205,7 @@ public class OnlinePlayerManager : IDisposable _onlineCachedPlayers.TryRemove(characterHash, out _); } - private void FrameworkOnUpdate(Framework framework) + private void FrameworkOnUpdate() { if (!_dalamudUtil.IsPlayerPresent || !_ipcManager.Initialized || !_apiController.IsConnected) return; diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index db07cf2..7e7f1ba 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.4.6 + 0.4.7 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index d3b9ba8..91d80fe 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -198,8 +198,8 @@ namespace MareSynchronos new CharacterDataFactory(_dalamudUtil, _ipcManager, _transientResourceManager); _playerManager = new PlayerManager(_apiController, _ipcManager, characterCacheFactory, _dalamudUtil, _transientResourceManager); - _characterCacheManager = new OnlinePlayerManager(_framework, - _apiController, _dalamudUtil, _ipcManager, _playerManager); + _characterCacheManager = new OnlinePlayerManager(_apiController, + _dalamudUtil, _ipcManager, _playerManager); } catch (Exception ex) { diff --git a/MareSynchronos/Utils/DalamudUtil.cs b/MareSynchronos/Utils/DalamudUtil.cs index 3515728..c9d7086 100644 --- a/MareSynchronos/Utils/DalamudUtil.cs +++ b/MareSynchronos/Utils/DalamudUtil.cs @@ -20,6 +20,7 @@ namespace MareSynchronos.Utils public delegate void ClassJobChanged(); public delegate void FrameworkUpdate(); + public delegate void VoidDelegate(); public class DalamudUtil : IDisposable { @@ -34,7 +35,9 @@ namespace MareSynchronos.Utils public event ClassJobChanged? ClassJobChanged; private uint? classJobId = 0; public event FrameworkUpdate? DelayedFrameworkUpdate; + public event VoidDelegate? ZoneSwitched; private DateTime _delayedFrameworkUpdateCheck = DateTime.Now; + private bool _sentBetweenAreas = false; public unsafe bool IsGameObjectPresent(IntPtr key) { @@ -69,9 +72,18 @@ namespace MareSynchronos.Utils { if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51] || IsInGpose) { + if (!_sentBetweenAreas) + { + Logger.Debug("Invoking between areas"); + _sentBetweenAreas = true; + ZoneSwitched?.Invoke(); + } + return; } + _sentBetweenAreas = false; + foreach (FrameworkUpdate? frameworkInvocation in (FrameworkUpdate?.GetInvocationList() ?? Array.Empty()).Cast()) { try diff --git a/MareSynchronos/WebAPI/ApiController.Connectivity.cs b/MareSynchronos/WebAPI/ApiController.Connectivity.cs index af62a98..3fbb1c1 100644 --- a/MareSynchronos/WebAPI/ApiController.Connectivity.cs +++ b/MareSynchronos/WebAPI/ApiController.Connectivity.cs @@ -15,7 +15,6 @@ using Microsoft.Extensions.Logging; namespace MareSynchronos.WebAPI { - public delegate void VoidDelegate(); public delegate void SimpleStringDelegate(string str); public enum ServerState {