the need for speed

This commit is contained in:
rootdarkarchon
2023-04-29 23:32:54 +02:00
parent de2cd97dbe
commit 3715ca5ce3
8 changed files with 82 additions and 102 deletions

View File

@@ -78,7 +78,6 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
: ((GameObject*)_charaHandler!.Address)->ObjectID;
public string? PlayerName { get; private set; }
public string PlayerNameHash => OnlineUser.Ident;
public uint? PlayerWorld { get; private set; }
public void ApplyCharacterData(CharacterData characterData, bool forced = false)
{
@@ -157,7 +156,6 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
SetUploading(false);
_downloadManager.Dispose();
var name = PlayerName;
var world = PlayerWorld;
Logger.LogDebug("Disposing {name} ({user})", name, OnlineUser);
try
{
@@ -180,7 +178,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
{
try
{
RevertCustomizationData(item.Key, name, world ?? 0, applicationId).GetAwaiter().GetResult();
RevertCustomizationData(item.Key, name, applicationId).GetAwaiter().GetResult();
}
catch (InvalidOperationException ex)
{
@@ -469,6 +467,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
foreach (var kind in updatedData)
{
await ApplyCustomizationData(_applicationId, kind, charaData, token).ConfigureAwait(false);
token.ThrowIfCancellationRequested();
}
Logger.LogDebug("[{applicationId}] Application finished", _applicationId);
@@ -488,7 +487,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
var pc = _dalamudUtil.FindPlayerByNameHash(OnlineUser.Ident);
if (pc == null) return;
Logger.LogDebug("One-Time Initializing {this}", this);
Initialize(pc.Name.ToString(), pc.HomeWorld.Id);
Initialize(pc.Name.ToString());
Logger.LogDebug("One-Time Initialized {this}", this);
}
@@ -498,10 +497,13 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
Mediator.Publish(new CachedPlayerVisibleMessage(this));
Logger.LogTrace("{this} visibility changed, now: {visi}", this, IsVisible);
_framesSinceNotVisible = 0;
_lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).GetAwaiter().GetResult();
if (_cachedData != null)
{
Task.Run(() => ApplyCharacterData(_cachedData, true));
Task.Run(async () =>
{
_lastGlamourerData = await _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false);
ApplyCharacterData(_cachedData, true);
});
}
}
else if (_charaHandler?.Address == IntPtr.Zero && IsVisible)
@@ -515,11 +517,10 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
}
}
private void Initialize(string name, uint worldid)
private void Initialize(string name)
{
PlayerName = name;
PlayerWorld = worldid;
_charaHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName, worldid), false);
_charaHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByIdent(OnlineUser.Ident), false);
_originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false).GetAwaiter().GetResult();
_lastGlamourerData = _originalGlamourerData;
@@ -589,13 +590,13 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
}
}
private async Task RevertCustomizationData(ObjectKind objectKind, string name, uint world, Guid applicationId)
private async Task RevertCustomizationData(ObjectKind objectKind, string name, Guid applicationId)
{
nint address = _dalamudUtil.GetPlayerCharacterFromObjectTableByName(name, world);
nint address = _dalamudUtil.GetPlayerCharacterFromObjectTableByIdent(OnlineUser.Ident);
if (address == IntPtr.Zero) return;
var cancelToken = new CancellationTokenSource();
cancelToken.CancelAfter(TimeSpan.FromSeconds(10));
cancelToken.CancelAfter(TimeSpan.FromSeconds(60));
Logger.LogDebug("[{applicationId}] Reverting all Customization for {alias}/{name} {objectKind}", applicationId, OnlineUser.User.AliasOrUID, name, objectKind);
@@ -603,11 +604,8 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
{
using GameObjectHandler tempHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => address, false);
CheckForNameAndThrow(tempHandler, name);
Logger.LogDebug("[{applicationId}] Restoring Customization for {alias}/{name}: {data}", applicationId, OnlineUser.User.AliasOrUID, name, _originalGlamourerData);
await _ipcManager.GlamourerApplyOnlyCustomization(Logger, tempHandler, _originalGlamourerData, applicationId, cancelToken.Token, fireAndForget: false).ConfigureAwait(false);
CheckForNameAndThrow(tempHandler, name);
Logger.LogDebug("[{applicationId}] Restoring Equipment for {alias}/{name}: {data}", applicationId, OnlineUser.User.AliasOrUID, name, _lastGlamourerData);
await _ipcManager.GlamourerApplyOnlyEquipment(Logger, tempHandler, _lastGlamourerData, applicationId, cancelToken.Token, fireAndForget: false).ConfigureAwait(false);
Logger.LogDebug("[{applicationId}] Restoring Customization and Equipment for {alias}/{name}: {data}", applicationId, OnlineUser.User.AliasOrUID, name, _originalGlamourerData);
await _ipcManager.GlamourerApplyCustomizationAndEquipment(Logger, tempHandler, _originalGlamourerData, _lastGlamourerData, applicationId, cancelToken.Token, fireAndForget: false).ConfigureAwait(false);
CheckForNameAndThrow(tempHandler, name);
Logger.LogDebug("[{applicationId}] Restoring Heels for {alias}/{name}", applicationId, OnlineUser.User.AliasOrUID, name);
await _ipcManager.HeelsRestoreOffsetForPlayer(address).ConfigureAwait(false);

View File

@@ -14,6 +14,7 @@ namespace MareSynchronos.PlayerData.Pairs;
public class Pair
{
private readonly Func<OnlineUserIdentDto, CachedPlayer> _cachedPlayerFactory;
private readonly SemaphoreSlim _creationSemaphore = new(1);
private readonly ILogger<Pair> _logger;
private readonly MareMediator _mediator;
private readonly ServerConfigurationManager _serverConfigurationManager;
@@ -89,19 +90,28 @@ public class Pair
public void CreateCachedPlayer(OnlineUserIdentDto? dto = null)
{
if (dto == null && _onlineUserIdentDto == null)
try
{
CachedPlayer?.Dispose();
CachedPlayer = null;
return;
}
if (dto != null)
{
_onlineUserIdentDto = dto;
}
_creationSemaphore.Wait();
CachedPlayer?.Dispose();
CachedPlayer = _cachedPlayerFactory(_onlineUserIdentDto!);
if (dto == null && _onlineUserIdentDto == null)
{
CachedPlayer?.Dispose();
CachedPlayer = null;
return;
}
if (dto != null)
{
_onlineUserIdentDto = dto;
}
CachedPlayer?.Dispose();
CachedPlayer = _cachedPlayerFactory(_onlineUserIdentDto!);
}
finally
{
_creationSemaphore.Release();
}
}
public string? GetNote()

View File

@@ -1,5 +1,4 @@
using Dalamud.ContextMenu;
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Interface.Internal.Notifications;
using MareSynchronos.API.Data;
using MareSynchronos.API.Data.Comparer;
@@ -8,7 +7,6 @@ using MareSynchronos.API.Dto.Group;
using MareSynchronos.API.Dto.User;
using MareSynchronos.MareConfiguration;
using MareSynchronos.Services.Mediator;
using MareSynchronos.Utils;
using Microsoft.Extensions.Logging;
using System.Collections.Concurrent;
@@ -20,7 +18,6 @@ public sealed class PairManager : DisposableMediatorSubscriberBase
private readonly ConcurrentDictionary<GroupData, GroupFullInfoDto> _allGroups = new(GroupDataComparer.Instance);
private readonly MareConfigService _configurationService;
private readonly DalamudContextMenu _dalamudContextMenu;
private readonly Dictionary<string, Pair> _indexedPairs = new(StringComparer.Ordinal);
private readonly Func<Pair> _pairFactory;
private Lazy<List<Pair>> _directPairsInternal;
private Lazy<Dictionary<GroupFullInfoDto, List<Pair>>> _groupPairsInternal;
@@ -32,7 +29,6 @@ public sealed class PairManager : DisposableMediatorSubscriberBase
_pairFactory = pairFactory;
_configurationService = configurationService;
_dalamudContextMenu = dalamudContextMenu;
Mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => DalamudUtilOnDelayedFrameworkUpdate());
Mediator.Subscribe<DisconnectedMessage>(this, (_) => ClearPairs());
Mediator.Subscribe<CutsceneEndMessage>(this, (_) => ReapplyPairData());
_directPairsInternal = DirectPairsLazy();
@@ -89,18 +85,6 @@ public sealed class PairManager : DisposableMediatorSubscriberBase
RecreateLazy();
}
public List<(PlayerCharacter Character, Pair Pair)> FindAllPairs(List<PlayerCharacter> playerCharacters)
{
return playerCharacters.Select(p => (p, _indexedPairs.TryGetValue(p.GetHash256(), out var pair) ? pair : null)).Where(p => p.Item2 != null).ToList()!;
}
public Pair? FindPair(PlayerCharacter? pChar)
{
if (pChar == null) return null;
var hash = pChar.GetHash256();
return _allClientPairs.Values.FirstOrDefault(f => string.Equals(hash, f.GetPlayerNameHash()));
}
public List<Pair> GetOnlineUserPairs() => _allClientPairs.Where(p => !string.IsNullOrEmpty(p.Value.GetPlayerNameHash())).Select(p => p.Value).ToList();
public List<UserData> GetVisibleUsers() => _allClientPairs.Where(p => p.Value.IsVisible).Select(p => p.Key).ToList();
@@ -341,17 +325,6 @@ public sealed class PairManager : DisposableMediatorSubscriberBase
}
}
private void DalamudUtilOnDelayedFrameworkUpdate()
{
_indexedPairs.Clear();
foreach (var pair in _allClientPairs.Values.Where(p => string.IsNullOrEmpty(p.PlayerName)))
{
var hash = pair.GetPlayerNameHash();
if (string.IsNullOrEmpty(hash)) continue;
_indexedPairs[hash] = pair;
}
}
private Lazy<List<Pair>> DirectPairsLazy() => new(() => _allClientPairs.Select(k => k.Value).Where(k => k.UserPair != null).ToList());
private void DisposePairs()