Add Pair Character Analysis for funsies

This commit is contained in:
Loporrit
2025-02-22 11:59:22 +00:00
parent def13858f4
commit eaaded1ed5
19 changed files with 701 additions and 32 deletions

View File

@@ -0,0 +1,30 @@
using MareSynchronos.FileCache;
using MareSynchronos.PlayerData.Pairs;
using MareSynchronos.Services;
using MareSynchronos.Services.Mediator;
using Microsoft.Extensions.Logging;
namespace MareSynchronos.PlayerData.Factories;
public class PairAnalyzerFactory
{
private readonly ILoggerFactory _loggerFactory;
private readonly MareMediator _mareMediator;
private readonly FileCacheManager _fileCacheManager;
private readonly XivDataAnalyzer _modelAnalyzer;
public PairAnalyzerFactory(ILoggerFactory loggerFactory, MareMediator mareMediator,
FileCacheManager fileCacheManager, XivDataAnalyzer modelAnalyzer)
{
_loggerFactory = loggerFactory;
_fileCacheManager = fileCacheManager;
_mareMediator = mareMediator;
_modelAnalyzer = modelAnalyzer;
}
public PairAnalyzer Create(Pair pair)
{
return new PairAnalyzer(_loggerFactory.CreateLogger<PairAnalyzer>(), pair, _mareMediator,
_fileCacheManager, _modelAnalyzer);
}
}

View File

@@ -23,12 +23,13 @@ public class PairHandlerFactory
private readonly PlayerPerformanceService _playerPerformanceService;
private readonly ServerConfigurationManager _serverConfigManager;
private readonly PluginWarningNotificationService _pluginWarningNotificationManager;
private readonly PairAnalyzerFactory _pairAnalyzerFactory;
public PairHandlerFactory(ILoggerFactory loggerFactory, GameObjectHandlerFactory gameObjectHandlerFactory, IpcManager ipcManager,
FileDownloadManagerFactory fileDownloadManagerFactory, DalamudUtilService dalamudUtilService,
PluginWarningNotificationService pluginWarningNotificationManager, IHostApplicationLifetime hostApplicationLifetime,
FileCacheManager fileCacheManager, MareMediator mareMediator, PlayerPerformanceService playerPerformanceService,
ServerConfigurationManager serverConfigManager)
ServerConfigurationManager serverConfigManager, PairAnalyzerFactory pairAnalyzerFactory)
{
_loggerFactory = loggerFactory;
_gameObjectHandlerFactory = gameObjectHandlerFactory;
@@ -41,11 +42,12 @@ public class PairHandlerFactory
_mareMediator = mareMediator;
_playerPerformanceService = playerPerformanceService;
_serverConfigManager = serverConfigManager;
_pairAnalyzerFactory = pairAnalyzerFactory;
}
public PairHandler Create(Pair pair)
{
return new PairHandler(_loggerFactory.CreateLogger<PairHandler>(), pair, _gameObjectHandlerFactory,
return new PairHandler(_loggerFactory.CreateLogger<PairHandler>(), pair, _pairAnalyzerFactory.Create(pair), _gameObjectHandlerFactory,
_ipcManager, _fileDownloadManagerFactory.Create(), _pluginWarningNotificationManager, _dalamudUtilService, _hostApplicationLifetime,
_fileCacheManager, _mareMediator, _playerPerformanceService, _serverConfigManager);
}

View File

@@ -43,7 +43,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
private Guid _penumbraCollection = Guid.Empty;
private bool _redrawOnNextApplication = false;
public PairHandler(ILogger<PairHandler> logger, Pair pair,
public PairHandler(ILogger<PairHandler> logger, Pair pair, PairAnalyzer pairAnalyzer,
GameObjectHandlerFactory gameObjectHandlerFactory,
IpcManager ipcManager, FileDownloadManager transferManager,
PluginWarningNotificationService pluginWarningNotificationManager,
@@ -53,6 +53,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
ServerConfigurationManager serverConfigManager) : base(logger, mediator)
{
Pair = pair;
PairAnalyzer = pairAnalyzer;
_gameObjectHandlerFactory = gameObjectHandlerFactory;
_ipcManager = ipcManager;
_downloadManager = transferManager;
@@ -129,6 +130,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
public long LastAppliedDataBytes { get; private set; }
public Pair Pair { get; private set; }
public PairAnalyzer PairAnalyzer { get; private init; }
public nint PlayerCharacter => _charaHandler?.Address ?? nint.Zero;
public unsafe uint PlayerCharacterId => (_charaHandler?.Address ?? nint.Zero) == nint.Zero
? uint.MaxValue
@@ -159,6 +161,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
.Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles));
_forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null);
_cachedData = characterData;
Mediator.Publish(new PairDataAppliedMessage(Pair.UserData.UID, characterData));
Logger.LogDebug("[BASE-{appBase}] Setting data: {hash}, forceApplyMods: {force}", applicationBase, _cachedData.DataHash.Value, _forceApplyMods);
return;
}
@@ -176,6 +179,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
.Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles));
_forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null);
_cachedData = characterData;
Mediator.Publish(new PairDataAppliedMessage(Pair.UserData.UID, characterData));
Logger.LogDebug("[BASE-{appBase}] Setting data: {hash}, forceApplyMods: {force}", applicationBase, _cachedData.DataHash.Value, _forceApplyMods);
return;
}
@@ -274,6 +278,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
{
PlayerName = null;
_cachedData = null;
Mediator.Publish(new PairDataAppliedMessage(Pair.UserData.UID, null));
Logger.LogDebug("Disposing {name} complete", name);
}
}
@@ -581,6 +586,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
}
_cachedData = charaData;
Mediator.Publish(new PairDataAppliedMessage(Pair.UserData.UID, charaData));
Logger.LogDebug("[{applicationId}] Application finished", _applicationId);
}
@@ -591,6 +597,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
IsVisible = false;
_forceApplyMods = true;
_cachedData = charaData;
Mediator.Publish(new PairDataAppliedMessage(Pair.UserData.UID, charaData));
Logger.LogDebug("[{applicationId}] Cancelled, player turned null during application", _applicationId);
}
else

View File

@@ -9,6 +9,7 @@ using MareSynchronos.API.Dto.User;
using MareSynchronos.MareConfiguration;
using MareSynchronos.PlayerData.Factories;
using MareSynchronos.PlayerData.Handlers;
using MareSynchronos.Services;
using MareSynchronos.Services.Mediator;
using MareSynchronos.Services.ServerConfiguration;
using MareSynchronos.Utils;
@@ -67,6 +68,7 @@ public class Pair : DisposableMediatorSubscriberBase
public long LastAppliedDataTris { get; set; } = -1;
public long LastAppliedApproximateVRAMBytes { get; set; } = -1;
public string Ident => _onlineUserIdentDto?.Ident ?? string.Empty;
public PairAnalyzer? PairAnalyzer => CachedPlayer?.PairAnalyzer;
public UserData UserData { get; init; }