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 bool UseAlternativeFileUpload { get; set; } = false;
|
||||
public bool UseCompactor { get; set; } = false;
|
||||
public bool ExperimentalUsePenumbraResourceTree { get; set; } = false;
|
||||
public int Version { get; set; } = 1;
|
||||
public NotificationLocation WarningNotification { get; set; } = NotificationLocation.Both;
|
||||
}
|
||||
@@ -5,6 +5,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Resource;
|
||||
using MareSynchronos.API.Data.Enum;
|
||||
using MareSynchronos.FileCache;
|
||||
using MareSynchronos.Interop;
|
||||
using MareSynchronos.MareConfiguration;
|
||||
using MareSynchronos.PlayerData.Data;
|
||||
using MareSynchronos.PlayerData.Handlers;
|
||||
using MareSynchronos.Services;
|
||||
@@ -25,11 +26,12 @@ public class PlayerDataFactory
|
||||
private readonly IpcManager _ipcManager;
|
||||
private readonly ILogger<PlayerDataFactory> _logger;
|
||||
private readonly PerformanceCollectorService _performanceCollector;
|
||||
private readonly MareConfigService _mareConfigService;
|
||||
private readonly TransientResourceManager _transientResourceManager;
|
||||
|
||||
public PlayerDataFactory(ILogger<PlayerDataFactory> logger, DalamudUtilService dalamudUtil, IpcManager ipcManager,
|
||||
TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory,
|
||||
PerformanceCollectorService performanceCollector)
|
||||
PerformanceCollectorService performanceCollector, MareConfigService mareConfigService)
|
||||
{
|
||||
_logger = logger;
|
||||
_dalamudUtil = dalamudUtil;
|
||||
@@ -37,7 +39,7 @@ public class PlayerDataFactory
|
||||
_transientResourceManager = transientResourceManager;
|
||||
_fileCacheManager = fileReplacementFactory;
|
||||
_performanceCollector = performanceCollector;
|
||||
|
||||
_mareConfigService = mareConfigService;
|
||||
_logger.LogTrace("Creating " + nameof(PlayerDataFactory));
|
||||
}
|
||||
|
||||
@@ -281,7 +283,7 @@ public class PlayerDataFactory
|
||||
AddReplacementsFromRenderModel(mdl, forwardResolve, reverseResolve);
|
||||
}
|
||||
|
||||
if (objectKind == ObjectKind.Player)
|
||||
if (objectKind == ObjectKind.Player && human->CharacterBase.GetModelType() == CharacterBase.ModelType.Human)
|
||||
{
|
||||
AddPlayerSpecificReplacements(human, forwardResolve, reverseResolve);
|
||||
}
|
||||
@@ -330,12 +332,18 @@ public class PlayerDataFactory
|
||||
Stopwatch st = Stopwatch.StartNew();
|
||||
|
||||
// penumbra call, it's currently broken
|
||||
// var data = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0];
|
||||
// if (data == null) throw new InvalidOperationException("Penumbra returned null data");
|
||||
|
||||
IReadOnlyDictionary<string, string[]>? resolvedPaths;
|
||||
if (_mareConfigService.Current.ExperimentalUsePenumbraResourceTree)
|
||||
{
|
||||
resolvedPaths = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0];
|
||||
if (resolvedPaths == null) throw new InvalidOperationException("Penumbra returned null data");
|
||||
}
|
||||
else
|
||||
{
|
||||
// gather static replacements from render model
|
||||
var (forwardResolve, reverseResolve) = await _dalamudUtil.RunOnFrameworkThread(() => BuildDataFromModel(objectKind, charaPointer, token)).ConfigureAwait(false);
|
||||
Dictionary<string, List<string>> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
|
||||
resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false);
|
||||
}
|
||||
previousData.FileReplacements[objectKind] =
|
||||
new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement([.. c.Value], c.Key)), FileReplacementComparer.Instance)
|
||||
.Where(p => p.HasFileReplacement).ToHashSet();
|
||||
@@ -425,7 +433,7 @@ public class PlayerDataFactory
|
||||
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 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)
|
||||
|
||||
@@ -549,6 +549,16 @@ public class SettingsUi : WindowMediatorSubscriberBase
|
||||
}
|
||||
|
||||
_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);
|
||||
if (UiSharedService.NormalizedIconTextButton(FontAwesomeIcon.StickyNote, "Export all your user notes to clipboard"))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user