Revert non-actor gposers as well

This commit is contained in:
Loporrit
2025-07-31 23:46:38 +00:00
parent b5d5892ec3
commit 72224c46b5
4 changed files with 90 additions and 19 deletions

View File

@@ -211,6 +211,13 @@ public sealed class IpcCallerGlamourer : DisposableMediatorSubscriberBase, IIpcC
_glamourerRevert.Invoke(objectIndex, LockCode); _glamourerRevert.Invoke(objectIndex, LockCode);
} }
public void RevertByNameNow(ILogger logger, Guid applicationId, string name)
{
if ((!APIAvailable) || _dalamudUtil.IsZoning) return;
logger.LogTrace("[{applicationId}] Immediately reverting {name}", applicationId, name);
_glamourerRevertByName.Invoke(name, LockCode);
}
public async Task RevertByNameAsync(ILogger logger, string name, Guid applicationId) public async Task RevertByNameAsync(ILogger logger, string name, Guid applicationId)
{ {
if ((!APIAvailable) || _dalamudUtil.IsZoning) return; if ((!APIAvailable) || _dalamudUtil.IsZoning) return;

View File

@@ -385,6 +385,10 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
} }
} }
} }
else if (_dalamudUtil.IsInCutscene && !string.IsNullOrEmpty(name))
{
_noSnapService.AddGposerNamed(name);
}
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -284,6 +284,16 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
return _clientState.LocalPlayer!; return _clientState.LocalPlayer!;
} }
public IntPtr GetPlayerCharacterFromCachedTableByName(string characterName)
{
foreach (var c in _playerCharas.Values)
{
if (c.Name.Equals(characterName, StringComparison.Ordinal))
return c.Address;
}
return 0;
}
public IntPtr GetPlayerCharacterFromCachedTableByIdent(string characterName) public IntPtr GetPlayerCharacterFromCachedTableByIdent(string characterName)
{ {
if (_playerCharas.TryGetValue(characterName, out var pchar)) return pchar.Address; if (_playerCharas.TryGetValue(characterName, out var pchar)) return pchar.Address;

View File

@@ -17,6 +17,7 @@ public class NoSnapService : IHostedService, IMediatorSubscriber
["Meddle.Plugin"] = false ["Meddle.Plugin"] = false
}; };
private static readonly HashSet<int> _gposers = new(); private static readonly HashSet<int> _gposers = new();
private static readonly HashSet<string> _gposersNamed = new(StringComparer.Ordinal);
private readonly IHostApplicationLifetime _hostApplicationLifetime; private readonly IHostApplicationLifetime _hostApplicationLifetime;
private readonly DalamudUtilService _dalamudUtilService; private readonly DalamudUtilService _dalamudUtilService;
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
@@ -57,13 +58,7 @@ public class NoSnapService : IHostedService, IMediatorSubscriber
if (AnyLoaded || _hostApplicationLifetime.ApplicationStopping.IsCancellationRequested) if (AnyLoaded || _hostApplicationLifetime.ApplicationStopping.IsCancellationRequested)
{ {
_logger.LogInformation("Immediately reverting object index {id}", objectIndex); _logger.LogInformation("Immediately reverting object index {id}", objectIndex);
try RevertAndRedraw(objectIndex);
{
Guid applicationId = Guid.NewGuid();
_ipcManager.Glamourer.RevertNow(_logger, applicationId, objectIndex);
_ipcManager.Penumbra.RedrawNow(_logger, applicationId, objectIndex);
}
catch { }
return; return;
} }
@@ -79,44 +74,99 @@ public class NoSnapService : IHostedService, IMediatorSubscriber
_gposers.Remove(objectIndex); _gposers.Remove(objectIndex);
} }
public void AddGposerNamed(string name)
{
if (AnyLoaded || _hostApplicationLifetime.ApplicationStopping.IsCancellationRequested)
{
_logger.LogInformation("Immediately reverting {name}", name);
RevertAndRedraw(name);
return;
}
_logger.LogInformation("Registering gposer {name}", name);
lock (_gposers)
_gposersNamed.Add(name);
}
private void ClearGposeList() private void ClearGposeList()
{ {
if (_gposers.Count > 0) if (_gposers.Count > 0 || _gposersNamed.Count > 0)
_logger.LogInformation("Clearing gposer list"); _logger.LogInformation("Clearing gposer list");
lock (_gposers) lock (_gposers)
_gposers.Clear(); _gposers.Clear();
lock (_gposersNamed)
_gposersNamed.Clear();
}
private void RevertAndRedraw(int objIndex, Guid applicationId = default)
{
if (applicationId == default)
applicationId = Guid.NewGuid();
try
{
_ipcManager.Glamourer.RevertNow(_logger, applicationId, objIndex);
_ipcManager.Penumbra.RedrawNow(_logger, applicationId, objIndex);
}
catch { }
}
private void RevertAndRedraw(string name, Guid applicationId = default)
{
if (applicationId == default)
applicationId = Guid.NewGuid();
try
{
_ipcManager.Glamourer.RevertByNameNow(_logger, applicationId, name);
var addr = _dalamudUtilService.GetPlayerCharacterFromCachedTableByName(name);
if (addr != 0)
{
var obj = _dalamudUtilService.CreateGameObject(addr);
if (obj != null)
_ipcManager.Penumbra.RedrawNow(_logger, applicationId, obj.ObjectIndex);
}
}
catch { }
} }
private void RevertGposers() private void RevertGposers()
{ {
List<int>? gposersList = null; List<int>? gposersList = null;
List<string>? gposersList2 = null;
lock (_gposers) lock (_gposers)
{ {
if (_gposers.Count > 0) if (_gposers.Count > 0)
{ {
_logger.LogInformation("Reverting gposers");
gposersList = _gposers.ToList(); gposersList = _gposers.ToList();
_gposers.Clear(); _gposers.Clear();
} }
} }
if (gposersList == null) lock (_gposersNamed)
{
if (_gposersNamed.Count > 0)
{
gposersList2 = _gposersNamed.ToList();
_gposersNamed.Clear();
}
}
if (gposersList == null && gposersList2 == null)
return; return;
_logger.LogInformation("Reverting gposers");
_dalamudUtilService.RunOnFrameworkThread(() => _dalamudUtilService.RunOnFrameworkThread(() =>
{ {
Guid applicationId = Guid.NewGuid(); Guid applicationId = Guid.NewGuid();
foreach (var gposer in gposersList) foreach (var gposer in gposersList ?? [])
{ RevertAndRedraw(gposer, applicationId);
try
{ foreach (var gposerName in gposersList2 ?? [])
_ipcManager.Glamourer.RevertNow(_logger, applicationId, gposer); RevertAndRedraw(gposerName, applicationId);
_ipcManager.Penumbra.RedrawNow(_logger, applicationId, gposer);
}
catch { }
}
}).GetAwaiter().GetResult(); }).GetAwaiter().GetResult();
} }