dispose all players on zoning
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user