use index from gameobject to set set temp mods

This commit is contained in:
Stanley Dimant
2023-03-23 11:17:53 +01:00
parent 814b24ebd8
commit 9a049c0d01
6 changed files with 23 additions and 73 deletions

View File

@@ -131,11 +131,6 @@ public sealed class FileCacheManager : IDisposable
}
}
public string ResolveFileReplacement(string gamePath)
{
return _ipcManager.PenumbraResolvePath(gamePath);
}
public void UpdateHash(FileCacheEntity fileCache)
{
_logger.LogTrace("Updating hash for {path}", fileCache.ResolvedFilepath);

View File

@@ -27,7 +27,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
private readonly ICallGateSubscriber<string, GameObject?, object>? _glamourerApplyOnlyCustomization;
private readonly ICallGateSubscriber<string, GameObject?, object>? _glamourerApplyOnlyEquipment;
private readonly ICallGateSubscriber<GameObject?, string>? _glamourerGetAllCustomization;
private readonly ICallGateSubscriber<GameObject?, object> _glamourerRevertCustomization;
private readonly ConcurrentQueue<Action> _gposeActionQueue = new();
private readonly ICallGateSubscriber<string> _heelsGetApiVersion;
private readonly ICallGateSubscriber<float> _heelsGetOffset;
@@ -58,8 +57,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
private readonly FuncSubscriber<string, string, int, PenumbraApiEc> _penumbraRemoveTemporaryMod;
private readonly FuncSubscriber<string> _penumbraResolveModDir;
private readonly FuncSubscriber<string[], string[], (string[], string[][])> _penumbraResolvePaths;
private readonly FuncSubscriber<string, string> _penumbraResolvePlayer;
private readonly FuncSubscriber<string, string[]> _reverseResolvePlayer;
private bool _customizePlusAvailable = false;
private CancellationTokenSource _disposalCts = new();
private bool _glamourerAvailable = false;
@@ -76,11 +73,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
_penumbraInit = Penumbra.Api.Ipc.Initialized.Subscriber(pi, PenumbraInit);
_penumbraDispose = Penumbra.Api.Ipc.Disposed.Subscriber(pi, PenumbraDispose);
_penumbraResolvePlayer = Penumbra.Api.Ipc.ResolvePlayerPath.Subscriber(pi);
_penumbraResolveModDir = Penumbra.Api.Ipc.GetModDirectory.Subscriber(pi);
_penumbraRedraw = Penumbra.Api.Ipc.RedrawObjectByName.Subscriber(pi);
_penumbraRedrawObject = Penumbra.Api.Ipc.RedrawObject.Subscriber(pi);
_reverseResolvePlayer = Penumbra.Api.Ipc.ReverseResolvePlayerPath.Subscriber(pi);
_penumbraApiVersion = Penumbra.Api.Ipc.ApiVersions.Subscriber(pi);
_penumbraObjectIsRedrawn = Penumbra.Api.Ipc.GameObjectRedrawn.Subscriber(pi, RedrawEvent);
_penumbraGetMetaManipulations = Penumbra.Api.Ipc.GetPlayerMetaManipulations.Subscriber(pi);
@@ -104,7 +99,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
_glamourerApplyAll = pi.GetIpcSubscriber<string, GameObject?, object>("Glamourer.ApplyAllToCharacter");
_glamourerApplyOnlyCustomization = pi.GetIpcSubscriber<string, GameObject?, object>("Glamourer.ApplyOnlyCustomizationToCharacter");
_glamourerApplyOnlyEquipment = pi.GetIpcSubscriber<string, GameObject?, object>("Glamourer.ApplyOnlyEquipmentToCharacter");
_glamourerRevertCustomization = pi.GetIpcSubscriber<GameObject?, object>("Glamourer.RevertCharacter");
_heelsGetApiVersion = pi.GetIpcSubscriber<string>("HeelsPlugin.ApiVersion");
_heelsGetOffset = pi.GetIpcSubscriber<float>("HeelsPlugin.GetOffset");
@@ -147,7 +141,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
public bool CheckCustomizePlusApi() => _customizePlusAvailable;
public bool CheckCustomizePlusApiInternal()
private bool CheckCustomizePlusApiInternal()
{
try
{
@@ -161,7 +155,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
public bool CheckGlamourerApi() => _glamourerAvailable;
public bool CheckGlamourerApiInternal()
private bool CheckGlamourerApiInternal()
{
bool apiAvailable = false;
try
@@ -186,7 +180,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
public bool CheckHeelsApi() => _heelsAvailable;
public bool CheckHeelsApiInternal()
private bool CheckHeelsApiInternal()
{
try
{
@@ -200,7 +194,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
public bool CheckPalettePlusApi() => _palettePlusAvailable;
public bool CheckPalettePlusApiInternal()
private bool CheckPalettePlusApiInternal()
{
try
{
@@ -214,7 +208,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
public bool CheckPenumbraApi() => _penumbraAvailable;
public bool CheckPenumbraApiInternal()
private bool CheckPenumbraApiInternal()
{
bool apiAvailable = false;
try
@@ -339,12 +333,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
}
}
public void GlamourerRevertCharacterCustomization(GameObject character)
{
if (!CheckGlamourerApi() || _dalamudUtil.IsZoning) return;
ActionQueue.Enqueue(() => _glamourerRevertCustomization!.InvokeAction(character));
}
public async Task HeelsRestoreOffsetForPlayer(IntPtr character)
{
if (!CheckHeelsApi()) return;
@@ -446,43 +434,20 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
logger.LogTrace("[{applicationId}] RemoveTemporaryCollection: {ret2}", applicationId, ret2);
}
public string PenumbraResolvePath(string path)
{
if (!CheckPenumbraApi()) return path;
var resolvedPath = _penumbraResolvePlayer!.Invoke(path);
return resolvedPath ?? path;
}
public (string[] forward, string[][] reverse) PenumbraResolvePaths(string[] forward, string[] reverse)
{
return _penumbraResolvePaths.Invoke(forward, reverse);
}
public string[] PenumbraReverseResolvePlayer(string path)
public void PenumbraSetTemporaryMods(ILogger logger, Guid applicationId, string characterName, int? idx, Dictionary<string, string> modPaths, string manipulationData)
{
if (!CheckPenumbraApi()) return new[] { path };
var resolvedPaths = _reverseResolvePlayer.Invoke(path);
if (resolvedPaths.Length == 0)
{
resolvedPaths = new[] { path };
}
return resolvedPaths;
}
if (!CheckPenumbraApi() || idx == null) return;
public void PenumbraSetTemporaryMods(ILogger logger, Guid applicationId, string characterName, Dictionary<string, string> modPaths, string manipulationData)
{
if (!CheckPenumbraApi()) return;
var idx = _dalamudUtil.GetIndexFromObjectTableByName(characterName);
if (idx == null)
{
return;
}
var collName = "Mare_" + characterName;
var ret = _penumbraCreateNamedTemporaryCollection.Invoke(collName);
logger.LogTrace("[{applicationId}] Creating Temp Collection {collName}, Success: {ret}", applicationId, collName, ret);
var retAssign = _penumbraAssignTemporaryCollection.Invoke(collName, idx.Value, c: true);
logger.LogTrace("[{applicationId}] Assigning Temp Collection {collName} to index {idx}", applicationId, collName, idx.Value);
logger.LogTrace("[{applicationId}] Assigning Temp Collection {collName} to index {idx}, Success: {ret}", applicationId, collName, idx, retAssign);
foreach (var mod in modPaths)
{
logger.LogTrace("[{applicationId}] Change: {from} => {to}", applicationId, mod.Key, mod.Value);
@@ -497,16 +462,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
_inGposeQueueMode = on;
}
internal bool RequestedRedraw(nint address)
{
if (_penumbraRedrawRequests.TryGetValue(address, out var requested))
{
return requested;
}
return false;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);

View File

@@ -8,6 +8,7 @@ using Microsoft.Extensions.Logging;
using MareSynchronos.PlayerData.Handlers;
using MareSynchronos.Interop;
using MareSynchronos.Services;
using MareSynchronos.Utils;
namespace MareSynchronos.PlayerData.Export;
@@ -64,7 +65,7 @@ public class MareCharaFileManager
var applicationId = Guid.NewGuid();
_ipcManager.ToggleGposeQueueMode(on: true);
_ipcManager.PenumbraRemoveTemporaryCollection(_logger, applicationId, charaTarget.Name.TextValue);
_ipcManager.PenumbraSetTemporaryMods(_logger, applicationId, charaTarget.Name.TextValue,
_ipcManager.PenumbraSetTemporaryMods(_logger, applicationId, charaTarget.Name.TextValue, charaTarget.ObjectTableIndex(),
extractedFiles.Union(fileSwaps).ToDictionary(d => d.Key, d => d.Value, StringComparer.Ordinal),
LoadedCharaFile.CharaFileData.ManipulationData);
using GameObjectHandler tempHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => charaTarget.Address, false);

View File

@@ -206,7 +206,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase
{
await _dalamudUtil.RunOnFrameworkThread(() => _ipcManager.PenumbraRemoveTemporaryCollection(Logger, applicationId, PlayerName!)).ConfigureAwait(false);
token.ThrowIfCancellationRequested();
await _dalamudUtil.RunOnFrameworkThread(() => _ipcManager.PenumbraSetTemporaryMods(Logger, applicationId, PlayerName!, moddedPaths, manipulationData)).ConfigureAwait(false);
await _dalamudUtil.RunOnFrameworkThread(() => _ipcManager.PenumbraSetTemporaryMods(Logger, applicationId, PlayerName!, _charaHandler?.GameObjectLazy?.Value.ObjectTableIndex(), moddedPaths, manipulationData)).ConfigureAwait(false);
token.ThrowIfCancellationRequested();
}

View File

@@ -92,18 +92,6 @@ public class DalamudUtilService : IHostedService
return (IntPtr)mgr->LookupBuddyByOwnerObject((BattleChara*)playerPointer);
}
public int? GetIndexFromObjectTableByName(string characterName)
{
for (int i = 0; i < _objectTable.Length; i++)
{
if (_objectTable[i] == null) continue;
if (_objectTable[i]!.ObjectKind != Dalamud.Game.ClientState.Objects.Enums.ObjectKind.Player) continue;
if (string.Equals(_objectTable[i]!.Name.ToString(), characterName, StringComparison.Ordinal)) return i;
}
return null;
}
public unsafe IntPtr GetMinion(IntPtr? playerPointer = null)
{
playerPointer ??= PlayerPointer;

View File

@@ -1,4 +1,5 @@
using System.Text.Json;
using Dalamud.Game.ClientState.Objects.Types;
using System.Text.Json;
namespace MareSynchronos.Utils;
@@ -8,4 +9,14 @@ public static class VariousExtensions
{
return JsonSerializer.Deserialize<T>(JsonSerializer.Serialize(obj))!;
}
public static unsafe int? ObjectTableIndex(this GameObject? gameObject)
{
if (gameObject == null || gameObject.Address == IntPtr.Zero)
{
return null;
}
return ((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)gameObject.Address)->ObjectIndex;
}
}