dispose all players on zoning

This commit is contained in:
Stanley Dimant
2022-09-17 03:40:40 +02:00
parent 574cdb0b24
commit a27fa1a13d
5 changed files with 27 additions and 13 deletions

View File

@@ -4,7 +4,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Dalamud.Game;
using MareSynchronos.API; using MareSynchronos.API;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
@@ -16,7 +15,6 @@ public class OnlinePlayerManager : IDisposable
{ {
private readonly ApiController _apiController; private readonly ApiController _apiController;
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly Framework _framework;
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
private readonly PlayerManager _playerManager; private readonly PlayerManager _playerManager;
private readonly ConcurrentDictionary<string, CachedPlayer> _onlineCachedPlayers = new(); private readonly ConcurrentDictionary<string, CachedPlayer> _onlineCachedPlayers = new();
@@ -27,11 +25,10 @@ public class OnlinePlayerManager : IDisposable
.Select(p => p.PlayerNameHash).ToList(); .Select(p => p.PlayerNameHash).ToList();
private DateTime _lastPlayerObjectCheck = DateTime.Now; 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)); Logger.Verbose("Creating " + nameof(OnlinePlayerManager));
_framework = framework;
_apiController = apiController; _apiController = apiController;
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
_ipcManager = ipcManager; _ipcManager = ipcManager;
@@ -49,6 +46,7 @@ public class OnlinePlayerManager : IDisposable
_dalamudUtil.LogIn += DalamudUtilOnLogIn; _dalamudUtil.LogIn += DalamudUtilOnLogIn;
_dalamudUtil.LogOut += DalamudUtilOnLogOut; _dalamudUtil.LogOut += DalamudUtilOnLogOut;
_dalamudUtil.ZoneSwitched += DalamudUtilOnZoneSwitched;
if (_dalamudUtil.IsLoggedIn) if (_dalamudUtil.IsLoggedIn)
{ {
@@ -56,6 +54,11 @@ public class OnlinePlayerManager : IDisposable
} }
} }
private void DalamudUtilOnZoneSwitched()
{
DisposePlayers();
}
private void ApiControllerOnCharacterReceived(object? sender, CharacterReceivedEventArgs e) private void ApiControllerOnCharacterReceived(object? sender, CharacterReceivedEventArgs e)
{ {
if (_onlineCachedPlayers.TryGetValue(e.CharacterNameHash, out var visiblePlayer) && visiblePlayer.IsVisible) if (_onlineCachedPlayers.TryGetValue(e.CharacterNameHash, out var visiblePlayer) && visiblePlayer.IsVisible)
@@ -88,12 +91,12 @@ public class OnlinePlayerManager : IDisposable
private void DalamudUtilOnLogOut() private void DalamudUtilOnLogOut()
{ {
_framework.Update -= FrameworkOnUpdate; _dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate;
} }
private void DalamudUtilOnLogIn() private void DalamudUtilOnLogIn()
{ {
_framework.Update += FrameworkOnUpdate; _dalamudUtil.DelayedFrameworkUpdate += FrameworkOnUpdate;
} }
private void IpcManagerOnPenumbraDisposed() private void IpcManagerOnPenumbraDisposed()
@@ -140,10 +143,10 @@ public class OnlinePlayerManager : IDisposable
_ipcManager.PenumbraDisposed -= ApiControllerOnDisconnected; _ipcManager.PenumbraDisposed -= ApiControllerOnDisconnected;
_framework.Update -= FrameworkOnUpdate;
_dalamudUtil.LogIn -= DalamudUtilOnLogIn; _dalamudUtil.LogIn -= DalamudUtilOnLogIn;
_dalamudUtil.LogOut -= DalamudUtilOnLogOut; _dalamudUtil.LogOut -= DalamudUtilOnLogOut;
_dalamudUtil.ZoneSwitched -= DalamudUtilOnZoneSwitched;
_dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate;
} }
private void RestoreAllCharacters() private void RestoreAllCharacters()
@@ -202,7 +205,7 @@ public class OnlinePlayerManager : IDisposable
_onlineCachedPlayers.TryRemove(characterHash, out _); _onlineCachedPlayers.TryRemove(characterHash, out _);
} }
private void FrameworkOnUpdate(Framework framework) private void FrameworkOnUpdate()
{ {
if (!_dalamudUtil.IsPlayerPresent || !_ipcManager.Initialized || !_apiController.IsConnected) return; if (!_dalamudUtil.IsPlayerPresent || !_ipcManager.Initialized || !_apiController.IsConnected) return;

View File

@@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<Authors></Authors> <Authors></Authors>
<Company></Company> <Company></Company>
<Version>0.4.6</Version> <Version>0.4.7</Version>
<Description></Description> <Description></Description>
<Copyright></Copyright> <Copyright></Copyright>
<PackageProjectUrl>https://github.com/Penumbra-Sync/client</PackageProjectUrl> <PackageProjectUrl>https://github.com/Penumbra-Sync/client</PackageProjectUrl>

View File

@@ -198,8 +198,8 @@ namespace MareSynchronos
new CharacterDataFactory(_dalamudUtil, _ipcManager, _transientResourceManager); new CharacterDataFactory(_dalamudUtil, _ipcManager, _transientResourceManager);
_playerManager = new PlayerManager(_apiController, _ipcManager, _playerManager = new PlayerManager(_apiController, _ipcManager,
characterCacheFactory, _dalamudUtil, _transientResourceManager); characterCacheFactory, _dalamudUtil, _transientResourceManager);
_characterCacheManager = new OnlinePlayerManager(_framework, _characterCacheManager = new OnlinePlayerManager(_apiController,
_apiController, _dalamudUtil, _ipcManager, _playerManager); _dalamudUtil, _ipcManager, _playerManager);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -20,6 +20,7 @@ namespace MareSynchronos.Utils
public delegate void ClassJobChanged(); public delegate void ClassJobChanged();
public delegate void FrameworkUpdate(); public delegate void FrameworkUpdate();
public delegate void VoidDelegate();
public class DalamudUtil : IDisposable public class DalamudUtil : IDisposable
{ {
@@ -34,7 +35,9 @@ namespace MareSynchronos.Utils
public event ClassJobChanged? ClassJobChanged; public event ClassJobChanged? ClassJobChanged;
private uint? classJobId = 0; private uint? classJobId = 0;
public event FrameworkUpdate? DelayedFrameworkUpdate; public event FrameworkUpdate? DelayedFrameworkUpdate;
public event VoidDelegate? ZoneSwitched;
private DateTime _delayedFrameworkUpdateCheck = DateTime.Now; private DateTime _delayedFrameworkUpdateCheck = DateTime.Now;
private bool _sentBetweenAreas = false;
public unsafe bool IsGameObjectPresent(IntPtr key) public unsafe bool IsGameObjectPresent(IntPtr key)
{ {
@@ -69,9 +72,18 @@ namespace MareSynchronos.Utils
{ {
if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51] || IsInGpose) if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51] || IsInGpose)
{ {
if (!_sentBetweenAreas)
{
Logger.Debug("Invoking between areas");
_sentBetweenAreas = true;
ZoneSwitched?.Invoke();
}
return; return;
} }
_sentBetweenAreas = false;
foreach (FrameworkUpdate? frameworkInvocation in (FrameworkUpdate?.GetInvocationList() ?? Array.Empty<FrameworkUpdate>()).Cast<FrameworkUpdate>()) foreach (FrameworkUpdate? frameworkInvocation in (FrameworkUpdate?.GetInvocationList() ?? Array.Empty<FrameworkUpdate>()).Cast<FrameworkUpdate>())
{ {
try try

View File

@@ -15,7 +15,6 @@ using Microsoft.Extensions.Logging;
namespace MareSynchronos.WebAPI namespace MareSynchronos.WebAPI
{ {
public delegate void VoidDelegate();
public delegate void SimpleStringDelegate(string str); public delegate void SimpleStringDelegate(string str);
public enum ServerState public enum ServerState
{ {