From b42de9a8a737e8dcc0890d44745ae073769d9a3f Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Sun, 26 Jun 2022 17:42:14 +0200 Subject: [PATCH] fix issue on not reloading player on zone switch, minor cleanup --- .../Managers/CachedPlayersManager.cs | 4 +-- MareSynchronos/Managers/PlayerManager.cs | 30 ++++++++----------- MareSynchronos/Models/CachedPlayer.cs | 2 ++ MareSynchronos/Plugin.cs | 14 ++++----- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/MareSynchronos/Managers/CachedPlayersManager.cs b/MareSynchronos/Managers/CachedPlayersManager.cs index 71aa249..e80ad37 100644 --- a/MareSynchronos/Managers/CachedPlayersManager.cs +++ b/MareSynchronos/Managers/CachedPlayersManager.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Dalamud.Game; @@ -155,12 +154,11 @@ public class CachedPlayersManager : IDisposable private void FrameworkOnUpdate(Framework framework) { - if (_clientState.LocalPlayer == null) return; + if (!_dalamudUtil.IsPlayerPresent || !_ipcManager.Initialized || !_apiController.IsConnected) return; if (DateTime.Now < _lastPlayerObjectCheck.AddSeconds(0.25)) return; _localVisiblePlayers.Clear(); - if (!_ipcManager.Initialized) return; string ownName = _dalamudUtil.PlayerName; var playerCharacters = _objectTable.Where(obj => obj.ObjectKind == Dalamud.Game.ClientState.Objects.Enums.ObjectKind.Player && diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index f210312..cc4ce1a 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -1,5 +1,4 @@ -using Dalamud.Game.ClientState.Objects; -using Dalamud.Logging; +using Dalamud.Logging; using MareSynchronos.Factories; using MareSynchronos.Models; using MareSynchronos.Utils; @@ -21,23 +20,31 @@ namespace MareSynchronos.Managers private readonly CharacterDataFactory _characterDataFactory; private readonly DalamudUtil _dalamudUtil; private readonly IpcManager _ipcManager; - private readonly ObjectTable _objectTable; private readonly IPlayerWatcher _watcher; private string _lastSentHash = string.Empty; private Task? _playerChangedTask; - public PlayerManager(ApiController apiController, ObjectTable objectTable, IpcManager ipcManager, + public PlayerManager(ApiController apiController, IpcManager ipcManager, CharacterDataFactory characterDataFactory, CachedPlayersManager cachedPlayersManager, DalamudUtil dalamudUtil, IPlayerWatcher watcher) { Logger.Debug("Creating " + nameof(PlayerManager)); _apiController = apiController; - _objectTable = objectTable; _ipcManager = ipcManager; _characterDataFactory = characterDataFactory; _cachedPlayersManager = cachedPlayersManager; _dalamudUtil = dalamudUtil; _watcher = watcher; + + _watcher.AddPlayerToWatch(_dalamudUtil.PlayerName); + _apiController.Connected += ApiController_Connected; + _apiController.Disconnected += ApiController_Disconnected; + + Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected); + if (_apiController.IsConnected) + { + ApiController_Connected(null, EventArgs.Empty); + } } public void Dispose() @@ -50,19 +57,6 @@ namespace MareSynchronos.Managers _watcher.PlayerChanged -= Watcher_PlayerChanged; } - internal void StartWatchingPlayer() - { - _watcher.AddPlayerToWatch(_dalamudUtil.PlayerName); - _apiController.Connected += ApiController_Connected; - _apiController.Disconnected += ApiController_Disconnected; - - Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected); - if (_apiController.IsConnected) - { - ApiController_Connected(null, EventArgs.Empty); - } - } - private void ApiController_Connected(object? sender, EventArgs args) { Logger.Debug("ApiController Connected"); diff --git a/MareSynchronos/Models/CachedPlayer.cs b/MareSynchronos/Models/CachedPlayer.cs index 5c2596e..37c052d 100644 --- a/MareSynchronos/Models/CachedPlayer.cs +++ b/MareSynchronos/Models/CachedPlayer.cs @@ -155,7 +155,9 @@ public class CachedPlayer { Logger.Debug("Restoring state for " + PlayerName); IsVisible = false; + _downloadCancellationTokenSource?.Cancel(); _downloadCancellationTokenSource?.Dispose(); + _downloadCancellationTokenSource = null; _watcher.RemovePlayerFromWatch(PlayerName); _ipcManager.PenumbraRemoveTemporaryCollection(PlayerName); _ipcManager.GlamourerRevertCharacterCustomization(PlayerName); diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 50fc1e8..ec258d6 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -31,7 +31,7 @@ namespace MareSynchronos public static DalamudPluginInterface PluginInterface { get; set; } private readonly PluginUi _pluginUi; private readonly WindowSystem _windowSystem; - private PlayerManager? _characterManager; + private PlayerManager? _playerManager; private readonly DalamudUtil _dalamudUtil; private CachedPlayersManager? _characterCacheManager; private readonly IPlayerWatcher _playerWatcher; @@ -90,7 +90,7 @@ namespace MareSynchronos _pluginUi.IsOpen = false; _introUi.IsOpen = true; _characterCacheManager?.Dispose(); - _characterManager?.Dispose(); + _playerManager?.Dispose(); } public string Name => "Mare Synchronos"; @@ -110,7 +110,7 @@ namespace MareSynchronos _fileCacheManager?.Dispose(); _ipcManager?.Dispose(); - _characterManager?.Dispose(); + _playerManager?.Dispose(); _characterCacheManager?.Dispose(); _playerWatcher.Disable(); _playerWatcher.Dispose(); @@ -141,7 +141,7 @@ namespace MareSynchronos { Logger.Debug("Client logout"); _characterCacheManager?.Dispose(); - _characterManager?.Dispose(); + _playerManager?.Dispose(); PluginInterface.UiBuilder.Draw -= Draw; PluginInterface.UiBuilder.OpenConfigUi -= OpenConfigUi; _commandManager.RemoveHandler(CommandName); @@ -149,7 +149,8 @@ namespace MareSynchronos public void ReLaunchCharacterManager() { - _characterManager?.Dispose(); + _playerManager?.Dispose(); + _characterCacheManager?.Dispose(); Task.Run(async () => { @@ -164,9 +165,8 @@ namespace MareSynchronos new CharacterDataFactory(_dalamudUtil, _ipcManager); _characterCacheManager = new CachedPlayersManager(_clientState, _framework, _objectTable, _apiController, _dalamudUtil, _ipcManager, _playerWatcher); - _characterManager = new PlayerManager(_apiController, _objectTable, _ipcManager, + _playerManager = new PlayerManager(_apiController, _ipcManager, characterCacheFactory, _characterCacheManager, _dalamudUtil, _playerWatcher); - _characterManager.StartWatchingPlayer(); } catch (Exception ex) {