add experimental resolving of data through penumbra
This commit is contained in:
@@ -50,6 +50,7 @@ public class MareConfig : IMareConfiguration
|
|||||||
public int TransferBarsWidth { get; set; } = 250;
|
public int TransferBarsWidth { get; set; } = 250;
|
||||||
public bool UseAlternativeFileUpload { get; set; } = false;
|
public bool UseAlternativeFileUpload { get; set; } = false;
|
||||||
public bool UseCompactor { get; set; } = false;
|
public bool UseCompactor { get; set; } = false;
|
||||||
|
public bool ExperimentalUsePenumbraResourceTree { get; set; } = false;
|
||||||
public int Version { get; set; } = 1;
|
public int Version { get; set; } = 1;
|
||||||
public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both;
|
public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both;
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Resource;
|
|||||||
using MareSynchronos.API.Data.Enum;
|
using MareSynchronos.API.Data.Enum;
|
||||||
using MareSynchronos.FileCache;
|
using MareSynchronos.FileCache;
|
||||||
using MareSynchronos.Interop;
|
using MareSynchronos.Interop;
|
||||||
|
using MareSynchronos.MareConfiguration;
|
||||||
using MareSynchronos.PlayerData.Data;
|
using MareSynchronos.PlayerData.Data;
|
||||||
using MareSynchronos.PlayerData.Handlers;
|
using MareSynchronos.PlayerData.Handlers;
|
||||||
using MareSynchronos.Services;
|
using MareSynchronos.Services;
|
||||||
@@ -25,11 +26,12 @@ public class PlayerDataFactory
|
|||||||
private readonly IpcManager _ipcManager;
|
private readonly IpcManager _ipcManager;
|
||||||
private readonly ILogger<PlayerDataFactory> _logger;
|
private readonly ILogger<PlayerDataFactory> _logger;
|
||||||
private readonly PerformanceCollectorService _performanceCollector;
|
private readonly PerformanceCollectorService _performanceCollector;
|
||||||
|
private readonly MareConfigService _mareConfigService;
|
||||||
private readonly TransientResourceManager _transientResourceManager;
|
private readonly TransientResourceManager _transientResourceManager;
|
||||||
|
|
||||||
public PlayerDataFactory(ILogger<PlayerDataFactory> logger, DalamudUtilService dalamudUtil, IpcManager ipcManager,
|
public PlayerDataFactory(ILogger<PlayerDataFactory> logger, DalamudUtilService dalamudUtil, IpcManager ipcManager,
|
||||||
TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory,
|
TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory,
|
||||||
PerformanceCollectorService performanceCollector)
|
PerformanceCollectorService performanceCollector, MareConfigService mareConfigService)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_dalamudUtil = dalamudUtil;
|
_dalamudUtil = dalamudUtil;
|
||||||
@@ -37,7 +39,7 @@ public class PlayerDataFactory
|
|||||||
_transientResourceManager = transientResourceManager;
|
_transientResourceManager = transientResourceManager;
|
||||||
_fileCacheManager = fileReplacementFactory;
|
_fileCacheManager = fileReplacementFactory;
|
||||||
_performanceCollector = performanceCollector;
|
_performanceCollector = performanceCollector;
|
||||||
|
_mareConfigService = mareConfigService;
|
||||||
_logger.LogTrace("Creating " + nameof(PlayerDataFactory));
|
_logger.LogTrace("Creating " + nameof(PlayerDataFactory));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +283,7 @@ public class PlayerDataFactory
|
|||||||
AddReplacementsFromRenderModel(mdl, forwardResolve, reverseResolve);
|
AddReplacementsFromRenderModel(mdl, forwardResolve, reverseResolve);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (objectKind == ObjectKind.Player)
|
if (objectKind == ObjectKind.Player && human->CharacterBase.GetModelType() == CharacterBase.ModelType.Human)
|
||||||
{
|
{
|
||||||
AddPlayerSpecificReplacements(human, forwardResolve, reverseResolve);
|
AddPlayerSpecificReplacements(human, forwardResolve, reverseResolve);
|
||||||
}
|
}
|
||||||
@@ -330,12 +332,18 @@ public class PlayerDataFactory
|
|||||||
Stopwatch st = Stopwatch.StartNew();
|
Stopwatch st = Stopwatch.StartNew();
|
||||||
|
|
||||||
// penumbra call, it's currently broken
|
// penumbra call, it's currently broken
|
||||||
// var data = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0];
|
IReadOnlyDictionary<string, string[]>? resolvedPaths;
|
||||||
// if (data == null) throw new InvalidOperationException("Penumbra returned null data");
|
if (_mareConfigService.Current.ExperimentalUsePenumbraResourceTree)
|
||||||
|
{
|
||||||
// gather static replacements from render model
|
resolvedPaths = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0];
|
||||||
var (forwardResolve, reverseResolve) = await _dalamudUtil.RunOnFrameworkThread(() => BuildDataFromModel(objectKind, charaPointer, token)).ConfigureAwait(false);
|
if (resolvedPaths == null) throw new InvalidOperationException("Penumbra returned null data");
|
||||||
Dictionary<string, List<string>> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// gather static replacements from render model
|
||||||
|
var (forwardResolve, reverseResolve) = await _dalamudUtil.RunOnFrameworkThread(() => BuildDataFromModel(objectKind, charaPointer, token)).ConfigureAwait(false);
|
||||||
|
resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
|
||||||
|
}
|
||||||
previousData.FileReplacements[objectKind] =
|
previousData.FileReplacements[objectKind] =
|
||||||
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)), FileReplacementComparer.Instance)
|
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)), FileReplacementComparer.Instance)
|
||||||
.Where(p => p.HasFileReplacement).ToHashSet();
|
.Where(p => p.HasFileReplacement).ToHashSet();
|
||||||
@@ -425,7 +433,7 @@ public class PlayerDataFactory
|
|||||||
return previousData;
|
return previousData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Dictionary<string, List<string>>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve)
|
private async Task<IReadOnlyDictionary<string, string[]>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve)
|
||||||
{
|
{
|
||||||
var forwardPaths = forwardResolve.ToArray();
|
var forwardPaths = forwardResolve.ToArray();
|
||||||
var reversePaths = reverseResolve.ToArray();
|
var reversePaths = reverseResolve.ToArray();
|
||||||
@@ -457,7 +465,7 @@ public class PlayerDataFactory
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resolvedPaths;
|
return resolvedPaths.ToDictionary(k => k.Key, k => k.Value.ToArray(), StringComparer.OrdinalIgnoreCase).AsReadOnly();
|
||||||
}
|
}
|
||||||
|
|
||||||
private HashSet<string> ManageSemiTransientData(ObjectKind objectKind, IntPtr charaPointer)
|
private HashSet<string> ManageSemiTransientData(ObjectKind objectKind, IntPtr charaPointer)
|
||||||
|
|||||||
@@ -549,6 +549,16 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
_lastTab = "General";
|
_lastTab = "General";
|
||||||
|
UiSharedService.FontText("Experimental", _uiShared.UidFont);
|
||||||
|
var usePenumbraResolve = _configService.Current.ExperimentalUsePenumbraResourceTree;
|
||||||
|
if (ImGui.Checkbox("Use Penumbra to resolve character", ref usePenumbraResolve))
|
||||||
|
{
|
||||||
|
_configService.Current.ExperimentalUsePenumbraResourceTree = usePenumbraResolve;
|
||||||
|
_configService.Save();
|
||||||
|
}
|
||||||
|
UiSharedService.DrawHelpText("Requires Penumbra version greater equal to 0.8.1.9 - please report issues with that feature to the Penumbra Discord");
|
||||||
|
ImGui.Separator();
|
||||||
|
|
||||||
UiSharedService.FontText("Notes", _uiShared.UidFont);
|
UiSharedService.FontText("Notes", _uiShared.UidFont);
|
||||||
if (UiSharedService.NormalizedIconTextButton(FontAwesomeIcon.StickyNote, "Export all your user notes to clipboard"))
|
if (UiSharedService.NormalizedIconTextButton(FontAwesomeIcon.StickyNote, "Export all your user notes to clipboard"))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user