freeze mare synced characters on gpose

This commit is contained in:
Stanley Dimant
2022-07-20 19:07:42 +02:00
parent ccfb314337
commit 627efdd012
5 changed files with 54 additions and 4 deletions

View File

@@ -130,6 +130,16 @@ public class CachedPlayer
} }
} }
if (_dalamudUtil.IsInGpose)
{
Logger.Verbose("Player is in GPose, waiting");
while (_dalamudUtil.IsInGpose)
{
await Task.Delay(TimeSpan.FromSeconds(0.5));
downloadToken.ThrowIfCancellationRequested();
}
}
ApplyCharacterData(_cache[_lastAppliedEquipmentHash], moddedPaths); ApplyCharacterData(_cache[_lastAppliedEquipmentHash], moddedPaths);
}, downloadToken).ContinueWith(task => }, downloadToken).ContinueWith(task =>
{ {
@@ -221,10 +231,10 @@ public class CachedPlayer
public void InitializePlayer(PlayerCharacter character, CharacterCacheDto? cache) public void InitializePlayer(PlayerCharacter character, CharacterCacheDto? cache)
{ {
Logger.Debug("Initializing Player " + this);
IsVisible = true; IsVisible = true;
PlayerName = character.Name.ToString(); PlayerName = character.Name.ToString();
PlayerCharacter = character; PlayerCharacter = character;
Logger.Debug("Initializing Player " + this);
_dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate; _dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate;
_ipcManager.PenumbraRedrawEvent += IpcManagerOnPenumbraRedrawEvent; _ipcManager.PenumbraRedrawEvent += IpcManagerOnPenumbraRedrawEvent;
_originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter); _originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter);

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Dalamud.Game; using Dalamud.Game;
using MareSynchronos.API; using MareSynchronos.API;
@@ -20,6 +21,7 @@ public class OnlinePlayerManager : IDisposable
private readonly PlayerManager _playerManager; private readonly PlayerManager _playerManager;
private readonly List<CachedPlayer> _onlineCachedPlayers = new(); private readonly List<CachedPlayer> _onlineCachedPlayers = new();
private readonly Dictionary<string, CharacterCacheDto> _temporaryStoredCharacterCache = new(); private readonly Dictionary<string, CharacterCacheDto> _temporaryStoredCharacterCache = new();
private readonly Dictionary<CachedPlayer, CancellationTokenSource> _playerTokenDisposal = new();
private List<string> OnlineVisiblePlayerHashes => _onlineCachedPlayers.Where(p => p.PlayerCharacter != null) private List<string> OnlineVisiblePlayerHashes => _onlineCachedPlayers.Where(p => p.PlayerCharacter != null)
.Select(p => p.PlayerNameHash).ToList(); .Select(p => p.PlayerNameHash).ToList();
@@ -169,13 +171,43 @@ public class OnlinePlayerManager : IDisposable
private void AddPlayer(string characterNameHash) private void AddPlayer(string characterNameHash)
{ {
if (_onlineCachedPlayers.Any(p => p.PlayerNameHash == characterNameHash)) return; if (_onlineCachedPlayers.Any(p => p.PlayerNameHash == characterNameHash))
{
PushCharacterData(new List<string>() { characterNameHash });
_playerTokenDisposal.TryGetValue(_onlineCachedPlayers.Single(p => p.PlayerNameHash == characterNameHash), out var cancellationTokenSource);
cancellationTokenSource?.Cancel();
return;
}
_onlineCachedPlayers.Add(CreateCachedPlayer(characterNameHash)); _onlineCachedPlayers.Add(CreateCachedPlayer(characterNameHash));
} }
private void RemovePlayer(string characterHash) private void RemovePlayer(string characterHash)
{ {
var cachedPlayer = _onlineCachedPlayers.First(p => p.PlayerNameHash == characterHash); var cachedPlayer = _onlineCachedPlayers.First(p => p.PlayerNameHash == characterHash);
if (_dalamudUtil.IsInGpose)
{
_playerTokenDisposal.TryGetValue(cachedPlayer, out var cancellationTokenSource);
cancellationTokenSource?.Cancel();
cachedPlayer.IsVisible = false;
_playerTokenDisposal[cachedPlayer] = new CancellationTokenSource();
cancellationTokenSource = _playerTokenDisposal[cachedPlayer];
var token = cancellationTokenSource.Token;
Task.Run(async () =>
{
Logger.Verbose("Cannot dispose Player, in GPose");
while (_dalamudUtil.IsInGpose)
{
await Task.Delay(TimeSpan.FromSeconds(0.5));
if (token.IsCancellationRequested) return;
}
cachedPlayer.DisposePlayer();
_onlineCachedPlayers.RemoveAll(c => c.PlayerNameHash == cachedPlayer.PlayerNameHash);
}, token);
return;
}
cachedPlayer.DisposePlayer(); cachedPlayer.DisposePlayer();
_onlineCachedPlayers.RemoveAll(c => c.PlayerNameHash == cachedPlayer.PlayerNameHash); _onlineCachedPlayers.RemoveAll(c => c.PlayerNameHash == cachedPlayer.PlayerNameHash);
} }
@@ -207,7 +239,11 @@ public class OnlinePlayerManager : IDisposable
var newlyVisiblePlayers = _onlineCachedPlayers var newlyVisiblePlayers = _onlineCachedPlayers
.Where(p => p.PlayerCharacter != null && p.IsVisible && !p.WasVisible).Select(p => p.PlayerNameHash) .Where(p => p.PlayerCharacter != null && p.IsVisible && !p.WasVisible).Select(p => p.PlayerNameHash)
.ToList(); .ToList();
PushCharacterData(newlyVisiblePlayers); if (newlyVisiblePlayers.Any())
{
Logger.Verbose("Has new visible players, pushing character data");
PushCharacterData(newlyVisiblePlayers);
}
_lastPlayerObjectCheck = DateTime.Now; _lastPlayerObjectCheck = DateTime.Now;
} }

View File

@@ -125,6 +125,8 @@ namespace MareSynchronos.Managers
private void PlayerChanged() private void PlayerChanged()
{ {
if (_dalamudUtil.IsInGpose) return;
Logger.Debug("Player changed: " + _dalamudUtil.PlayerName); Logger.Debug("Player changed: " + _dalamudUtil.PlayerName);
_playerChangedCts?.Cancel(); _playerChangedCts?.Cancel();
_playerChangedCts = new CancellationTokenSource(); _playerChangedCts = new CancellationTokenSource();

View File

@@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<Authors></Authors> <Authors></Authors>
<Company></Company> <Company></Company>
<Version>0.1.16.0</Version> <Version>0.1.17.0</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

@@ -68,6 +68,8 @@ namespace MareSynchronos.Utils
public string PlayerNameHashed => Crypto.GetHash256(PlayerName + _clientState.LocalPlayer!.HomeWorld.Id); public string PlayerNameHashed => Crypto.GetHash256(PlayerName + _clientState.LocalPlayer!.HomeWorld.Id);
public bool IsInGpose => _objectTable[201] != null;
public List<PlayerCharacter> GetPlayerCharacters() public List<PlayerCharacter> GetPlayerCharacters()
{ {
return _objectTable.Where(obj => return _objectTable.Where(obj =>