add ipc to get handled addresses

This commit is contained in:
rootdarkarchon
2024-03-03 12:55:42 +01:00
parent 504e1003f4
commit 3bf5cf21ed
5 changed files with 46 additions and 15 deletions

View File

@@ -35,13 +35,15 @@ public sealed class TransientResourceManager : DisposableMediatorSubscriberBase
DalamudUtil_ClassJobChanged(); DalamudUtil_ClassJobChanged();
} }
}); });
Mediator.Subscribe<AddWatchedGameObjectHandler>(this, (msg) => Mediator.Subscribe<GameObjectHandlerCreatedMessage>(this, (msg) =>
{ {
_playerRelatedPointers.Add(msg.Handler); if (!msg.OwnedObject) return;
_playerRelatedPointers.Add(msg.GameObjectHandler);
}); });
Mediator.Subscribe<RemoveWatchedGameObjectHandler>(this, (msg) => Mediator.Subscribe<GameObjectHandlerDestroyedMessage>(this, (msg) =>
{ {
_playerRelatedPointers.Remove(msg.Handler); if (!msg.OwnedObject) return;
_playerRelatedPointers.Remove(msg.GameObjectHandler);
}); });
} }

View File

@@ -2,13 +2,15 @@
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Ipc;
using MareSynchronos.PlayerData.Export; using MareSynchronos.PlayerData.Export;
using MareSynchronos.PlayerData.Handlers;
using MareSynchronos.Services; using MareSynchronos.Services;
using MareSynchronos.Services.Mediator;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace MareSynchronos.Interop.Ipc; namespace MareSynchronos.Interop.Ipc;
public class IpcProvider : IHostedService public class IpcProvider : IHostedService, IMediatorSubscriber
{ {
private readonly ILogger<IpcProvider> _logger; private readonly ILogger<IpcProvider> _logger;
private readonly DalamudPluginInterface _pi; private readonly DalamudPluginInterface _pi;
@@ -16,14 +18,31 @@ public class IpcProvider : IHostedService
private readonly DalamudUtilService _dalamudUtil; private readonly DalamudUtilService _dalamudUtil;
private ICallGateProvider<string, GameObject, bool>? _loadFileProvider; private ICallGateProvider<string, GameObject, bool>? _loadFileProvider;
private ICallGateProvider<string, GameObject, Task<bool>>? _loadFileAsyncProvider; private ICallGateProvider<string, GameObject, Task<bool>>? _loadFileAsyncProvider;
private ICallGateProvider<List<nint>>? _handledGameAddresses;
private readonly List<GameObjectHandler> _activeGameObjectHandlers = [];
public MareMediator Mediator { get; init; }
public IpcProvider(ILogger<IpcProvider> logger, DalamudPluginInterface pi, public IpcProvider(ILogger<IpcProvider> logger, DalamudPluginInterface pi,
MareCharaFileManager mareCharaFileManager, DalamudUtilService dalamudUtil) MareCharaFileManager mareCharaFileManager, DalamudUtilService dalamudUtil,
MareMediator mareMediator)
{ {
_logger = logger; _logger = logger;
_pi = pi; _pi = pi;
_mareCharaFileManager = mareCharaFileManager; _mareCharaFileManager = mareCharaFileManager;
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
Mediator = mareMediator;
Mediator.Subscribe<GameObjectHandlerCreatedMessage>(this, (msg) =>
{
if (msg.OwnedObject) return;
_activeGameObjectHandlers.Add(msg.GameObjectHandler);
});
Mediator.Subscribe<GameObjectHandlerDestroyedMessage>(this, (msg) =>
{
if (msg.OwnedObject) return;
_activeGameObjectHandlers.Remove(msg.GameObjectHandler);
});
} }
public Task StartAsync(CancellationToken cancellationToken) public Task StartAsync(CancellationToken cancellationToken)
@@ -33,6 +52,8 @@ public class IpcProvider : IHostedService
_loadFileProvider.RegisterFunc(LoadMcdf); _loadFileProvider.RegisterFunc(LoadMcdf);
_loadFileAsyncProvider = _pi.GetIpcProvider<string, GameObject, Task<bool>>("MareSynchronos.LoadMcdfAsync"); _loadFileAsyncProvider = _pi.GetIpcProvider<string, GameObject, Task<bool>>("MareSynchronos.LoadMcdfAsync");
_loadFileAsyncProvider.RegisterFunc(LoadMcdfAsync); _loadFileAsyncProvider.RegisterFunc(LoadMcdfAsync);
_handledGameAddresses = _pi.GetIpcProvider<List<nint>>("MareSynchronos.GetHandledAddresses");
_handledGameAddresses.RegisterFunc(GetHandledAddresses);
_logger.LogInformation("Started IpcProviderService"); _logger.LogInformation("Started IpcProviderService");
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -42,6 +63,8 @@ public class IpcProvider : IHostedService
_logger.LogDebug("Stopping IpcProvider Service"); _logger.LogDebug("Stopping IpcProvider Service");
_loadFileProvider?.UnregisterFunc(); _loadFileProvider?.UnregisterFunc();
_loadFileAsyncProvider?.UnregisterFunc(); _loadFileAsyncProvider?.UnregisterFunc();
_handledGameAddresses?.UnregisterFunc();
Mediator.UnsubscribeAll(this);
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -77,4 +100,9 @@ public class IpcProvider : IHostedService
_mareCharaFileManager.ClearMareCharaFile(); _mareCharaFileManager.ClearMareCharaFile();
} }
} }
private List<nint> GetHandledAddresses()
{
return _activeGameObjectHandlers.Where(g => g.Address != nint.Zero).Select(g => g.Address).Distinct().ToList();
}
} }

View File

@@ -26,7 +26,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
private CancellationTokenSource _zoningCts = new(); private CancellationTokenSource _zoningCts = new();
public GameObjectHandler(ILogger<GameObjectHandler> logger, PerformanceCollectorService performanceCollector, public GameObjectHandler(ILogger<GameObjectHandler> logger, PerformanceCollectorService performanceCollector,
MareMediator mediator, DalamudUtilService dalamudUtil, ObjectKind objectKind, Func<IntPtr> getAddress, bool watchedObject = true) : base(logger, mediator) MareMediator mediator, DalamudUtilService dalamudUtil, ObjectKind objectKind, Func<IntPtr> getAddress, bool ownedObject = true) : base(logger, mediator)
{ {
_performanceCollector = performanceCollector; _performanceCollector = performanceCollector;
ObjectKind = objectKind; ObjectKind = objectKind;
@@ -36,10 +36,10 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
_dalamudUtil.EnsureIsOnFramework(); _dalamudUtil.EnsureIsOnFramework();
return getAddress.Invoke(); return getAddress.Invoke();
}; };
_isOwnedObject = watchedObject; _isOwnedObject = ownedObject;
Name = string.Empty; Name = string.Empty;
if (watchedObject) if (ownedObject)
{ {
Mediator.Subscribe<TransientResourceChangedMessage>(this, (msg) => Mediator.Subscribe<TransientResourceChangedMessage>(this, (msg) =>
{ {
@@ -49,7 +49,6 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
Mediator.Publish(new CreateCacheForObjectMessage(this)); Mediator.Publish(new CreateCacheForObjectMessage(this));
} }
}); });
Mediator.Publish(new AddWatchedGameObjectHandler(this));
} }
Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => FrameworkUpdate()); Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => FrameworkUpdate());
@@ -87,6 +86,8 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
} }
}); });
Mediator.Publish(new GameObjectHandlerCreatedMessage(this, _isOwnedObject));
_dalamudUtil.RunOnFrameworkThread(CheckAndUpdateObject).GetAwaiter().GetResult(); _dalamudUtil.RunOnFrameworkThread(CheckAndUpdateObject).GetAwaiter().GetResult();
} }
@@ -174,8 +175,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
{ {
base.Dispose(disposing); base.Dispose(disposing);
if (_isOwnedObject) Mediator.Publish(new GameObjectHandlerDestroyedMessage(this, _isOwnedObject));
Mediator.Publish(new RemoveWatchedGameObjectHandler(this));
} }
private unsafe void CheckAndUpdateObject() private unsafe void CheckAndUpdateObject()

View File

@@ -78,7 +78,8 @@ public sealed class Plugin : IDalamudPlugin
collection.AddSingleton<DrawEntityFactory>(); collection.AddSingleton<DrawEntityFactory>();
collection.AddSingleton((s) => new IpcProvider(s.GetRequiredService<ILogger<IpcProvider>>(), collection.AddSingleton((s) => new IpcProvider(s.GetRequiredService<ILogger<IpcProvider>>(),
pluginInterface, pluginInterface,
s.GetRequiredService<MareCharaFileManager>(), s.GetRequiredService<DalamudUtilService>())); s.GetRequiredService<MareCharaFileManager>(), s.GetRequiredService<DalamudUtilService>(),
s.GetRequiredService<MareMediator>()));
collection.AddSingleton<SelectPairForTagUi>(); collection.AddSingleton<SelectPairForTagUi>();
collection.AddSingleton((s) => new EventAggregator(pluginInterface.ConfigDirectory.FullName, collection.AddSingleton((s) => new EventAggregator(pluginInterface.ConfigDirectory.FullName,
s.GetRequiredService<ILogger<EventAggregator>>(), s.GetRequiredService<MareMediator>())); s.GetRequiredService<ILogger<EventAggregator>>(), s.GetRequiredService<MareMediator>()));

View File

@@ -45,8 +45,6 @@ public record HonorificReadyMessage : MessageBase;
public record PlayerChangedMessage(CharacterData Data) : MessageBase; public record PlayerChangedMessage(CharacterData Data) : MessageBase;
public record CharacterChangedMessage(GameObjectHandler GameObjectHandler) : MessageBase; public record CharacterChangedMessage(GameObjectHandler GameObjectHandler) : MessageBase;
public record TransientResourceChangedMessage(IntPtr Address) : MessageBase; public record TransientResourceChangedMessage(IntPtr Address) : MessageBase;
public record AddWatchedGameObjectHandler(GameObjectHandler Handler) : MessageBase;
public record RemoveWatchedGameObjectHandler(GameObjectHandler Handler) : MessageBase;
public record HaltScanMessage(string Source) : MessageBase; public record HaltScanMessage(string Source) : MessageBase;
public record ResumeScanMessage(string Source) : MessageBase; public record ResumeScanMessage(string Source) : MessageBase;
public record NotificationMessage public record NotificationMessage
@@ -86,5 +84,7 @@ public record CombatOrPerformanceEndMessage : MessageBase;
public record EventMessage(Event Event) : MessageBase; public record EventMessage(Event Event) : MessageBase;
public record PenumbraDirectoryChangedMessage(string? ModDirectory) : MessageBase; public record PenumbraDirectoryChangedMessage(string? ModDirectory) : MessageBase;
public record PenumbraRedrawCharacterMessage(Character Character) : SameThreadMessage; public record PenumbraRedrawCharacterMessage(Character Character) : SameThreadMessage;
public record GameObjectHandlerCreatedMessage(GameObjectHandler GameObjectHandler, bool OwnedObject) : MessageBase;
public record GameObjectHandlerDestroyedMessage(GameObjectHandler GameObjectHandler, bool OwnedObject) : MessageBase;
#pragma warning restore S2094 #pragma warning restore S2094
#pragma warning restore MA0048 // File name must match type name #pragma warning restore MA0048 // File name must match type name