add ipc to get handled addresses
This commit is contained in:
@@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 IDalamudPluginInterface _pi;
|
private readonly IDalamudPluginInterface _pi;
|
||||||
@@ -16,14 +18,31 @@ public class IpcProvider : IHostedService
|
|||||||
private readonly DalamudUtilService _dalamudUtil;
|
private readonly DalamudUtilService _dalamudUtil;
|
||||||
private ICallGateProvider<string, IGameObject, bool>? _loadFileProvider;
|
private ICallGateProvider<string, IGameObject, bool>? _loadFileProvider;
|
||||||
private ICallGateProvider<string, IGameObject, Task<bool>>? _loadFileAsyncProvider;
|
private ICallGateProvider<string, IGameObject, Task<bool>>? _loadFileAsyncProvider;
|
||||||
|
private ICallGateProvider<List<nint>>? _handledGameAddresses;
|
||||||
|
private readonly List<GameObjectHandler> _activeGameObjectHandlers = [];
|
||||||
|
|
||||||
|
public MareMediator Mediator { get; init; }
|
||||||
|
|
||||||
public IpcProvider(ILogger<IpcProvider> logger, IDalamudPluginInterface pi,
|
public IpcProvider(ILogger<IpcProvider> logger, IDalamudPluginInterface 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,9 @@ public class IpcProvider : IHostedService
|
|||||||
_loadFileProvider.RegisterFunc(LoadMcdf);
|
_loadFileProvider.RegisterFunc(LoadMcdf);
|
||||||
_loadFileAsyncProvider = _pi.GetIpcProvider<string, IGameObject, Task<bool>>("MareSynchronos.LoadMcdfAsync");
|
_loadFileAsyncProvider = _pi.GetIpcProvider<string, IGameObject, Task<bool>>("MareSynchronos.LoadMcdfAsync");
|
||||||
_loadFileAsyncProvider.RegisterFunc(LoadMcdfAsync);
|
_loadFileAsyncProvider.RegisterFunc(LoadMcdfAsync);
|
||||||
|
_handledGameAddresses = _pi.GetIpcProvider<List<nint>>("MareSynchronos.GetHandledAddresses");
|
||||||
|
_handledGameAddresses.RegisterFunc(GetHandledAddresses);
|
||||||
|
_logger.LogInformation("Started IpcProviderService");
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,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());
|
||||||
@@ -86,6 +85,8 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Mediator.Publish(new GameObjectHandlerCreatedMessage(this, _isOwnedObject));
|
||||||
|
|
||||||
_dalamudUtil.RunOnFrameworkThread(CheckAndUpdateObject).GetAwaiter().GetResult();
|
_dalamudUtil.RunOnFrameworkThread(CheckAndUpdateObject).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,8 +174,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()
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ public sealed class Plugin : IDalamudPlugin
|
|||||||
collection.AddSingleton<UidDisplayHandler>();
|
collection.AddSingleton<UidDisplayHandler>();
|
||||||
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<PlayerPerformanceService>();
|
collection.AddSingleton<PlayerPerformanceService>();
|
||||||
collection.AddSingleton((s) => new EventAggregator(s.GetRequiredService<MareConfigService>(),
|
collection.AddSingleton((s) => new EventAggregator(s.GetRequiredService<MareConfigService>(),
|
||||||
s.GetRequiredService<ILogger<EventAggregator>>(), s.GetRequiredService<MareMediator>()));
|
s.GetRequiredService<ILogger<EventAggregator>>(), s.GetRequiredService<MareMediator>()));
|
||||||
|
|||||||
@@ -47,8 +47,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
|
||||||
@@ -98,5 +96,7 @@ public record HoldPairDownloadsMessage(string UID, string Source) : KeyedMessage
|
|||||||
public record UnholdPairDownloadsMessage(string UID, string Source) : KeyedMessage(UID);
|
public record UnholdPairDownloadsMessage(string UID, string Source) : KeyedMessage(UID);
|
||||||
public record PairDataAppliedMessage(string UID, CharacterData? CharacterData) : KeyedMessage(UID);
|
public record PairDataAppliedMessage(string UID, CharacterData? CharacterData) : KeyedMessage(UID);
|
||||||
public record PairDataAnalyzedMessage(string UID) : KeyedMessage(UID);
|
public record PairDataAnalyzedMessage(string UID) : KeyedMessage(UID);
|
||||||
|
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
|
||||||
Reference in New Issue
Block a user