freeze mare synced characters on gpose
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
if (newlyVisiblePlayers.Any())
|
||||||
|
{
|
||||||
|
Logger.Verbose("Has new visible players, pushing character data");
|
||||||
PushCharacterData(newlyVisiblePlayers);
|
PushCharacterData(newlyVisiblePlayers);
|
||||||
|
}
|
||||||
|
|
||||||
_lastPlayerObjectCheck = DateTime.Now;
|
_lastPlayerObjectCheck = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 =>
|
||||||
|
|||||||
Reference in New Issue
Block a user