add click to target in ui
This commit is contained in:
		| @@ -1,4 +1,5 @@ | |||||||
| using Dalamud.ContextMenu; | using Dalamud.ContextMenu; | ||||||
|  | using Dalamud.Game.ClientState.Objects; | ||||||
| using Dalamud.Interface.ImGuiFileDialog; | using Dalamud.Interface.ImGuiFileDialog; | ||||||
| using Dalamud.Interface.Windowing; | using Dalamud.Interface.Windowing; | ||||||
| using Dalamud.Plugin; | using Dalamud.Plugin; | ||||||
| @@ -33,7 +34,7 @@ public sealed class Plugin : IDalamudPlugin | |||||||
|  |  | ||||||
|     public Plugin(DalamudPluginInterface pluginInterface, ICommandManager commandManager, IDataManager gameData, |     public Plugin(DalamudPluginInterface pluginInterface, ICommandManager commandManager, IDataManager gameData, | ||||||
|         IFramework framework, IObjectTable objectTable, IClientState clientState, ICondition condition, IChatGui chatGui, |         IFramework framework, IObjectTable objectTable, IClientState clientState, ICondition condition, IChatGui chatGui, | ||||||
|         IGameGui gameGui, IDtrBar dtrBar, IPluginLog pluginLog) |         IGameGui gameGui, IDtrBar dtrBar, IPluginLog pluginLog, ITargetManager targetManager) | ||||||
|     { |     { | ||||||
|         _hostBuilderRunTask = new HostBuilder() |         _hostBuilderRunTask = new HostBuilder() | ||||||
|         .UseContentRoot(pluginInterface.ConfigDirectory.FullName) |         .UseContentRoot(pluginInterface.ConfigDirectory.FullName) | ||||||
| @@ -77,7 +78,7 @@ public sealed class Plugin : IDalamudPlugin | |||||||
|             collection.AddSingleton<SelectTagForPairUi>(); |             collection.AddSingleton<SelectTagForPairUi>(); | ||||||
|             collection.AddSingleton((s) => new DalamudContextMenu(pluginInterface)); |             collection.AddSingleton((s) => new DalamudContextMenu(pluginInterface)); | ||||||
|             collection.AddSingleton((s) => new DalamudUtilService(s.GetRequiredService<ILogger<DalamudUtilService>>(), |             collection.AddSingleton((s) => new DalamudUtilService(s.GetRequiredService<ILogger<DalamudUtilService>>(), | ||||||
|                 clientState, objectTable, framework, gameGui, condition, gameData, |                 clientState, objectTable, framework, gameGui, condition, gameData, targetManager, | ||||||
|                 s.GetRequiredService<MareMediator>(), s.GetRequiredService<PerformanceCollectorService>())); |                 s.GetRequiredService<MareMediator>(), s.GetRequiredService<PerformanceCollectorService>())); | ||||||
|             collection.AddSingleton((s) => new DtrEntry(s.GetRequiredService<ILogger<DtrEntry>>(), dtrBar, s.GetRequiredService<MareConfigService>(), |             collection.AddSingleton((s) => new DtrEntry(s.GetRequiredService<ILogger<DtrEntry>>(), dtrBar, s.GetRequiredService<MareConfigService>(), | ||||||
|                 s.GetRequiredService<MareMediator>(), s.GetRequiredService<PairManager>(), s.GetRequiredService<ApiController>())); |                 s.GetRequiredService<MareMediator>(), s.GetRequiredService<PairManager>(), s.GetRequiredService<ApiController>())); | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| using Dalamud.Game.ClientState.Conditions; | using Dalamud.Game.ClientState.Conditions; | ||||||
|  | using Dalamud.Game.ClientState.Objects; | ||||||
| using Dalamud.Game.ClientState.Objects.SubKinds; | using Dalamud.Game.ClientState.Objects.SubKinds; | ||||||
| using Dalamud.Plugin.Services; | using Dalamud.Plugin.Services; | ||||||
| using FFXIVClientStructs.FFXIV.Client.Game.Character; | using FFXIVClientStructs.FFXIV.Client.Game.Character; | ||||||
| @@ -15,7 +16,7 @@ using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject; | |||||||
|  |  | ||||||
| namespace MareSynchronos.Services; | namespace MareSynchronos.Services; | ||||||
|  |  | ||||||
| public class DalamudUtilService : IHostedService | public class DalamudUtilService : IHostedService, IMediatorSubscriber | ||||||
| { | { | ||||||
|     private readonly List<uint> _classJobIdsIgnoredForPets = [30]; |     private readonly List<uint> _classJobIdsIgnoredForPets = [30]; | ||||||
|     private readonly IClientState _clientState; |     private readonly IClientState _clientState; | ||||||
| @@ -23,7 +24,6 @@ public class DalamudUtilService : IHostedService | |||||||
|     private readonly IFramework _framework; |     private readonly IFramework _framework; | ||||||
|     private readonly IGameGui _gameGui; |     private readonly IGameGui _gameGui; | ||||||
|     private readonly ILogger<DalamudUtilService> _logger; |     private readonly ILogger<DalamudUtilService> _logger; | ||||||
|     private readonly MareMediator _mediator; |  | ||||||
|     private readonly IObjectTable _objectTable; |     private readonly IObjectTable _objectTable; | ||||||
|     private readonly PerformanceCollectorService _performanceCollector; |     private readonly PerformanceCollectorService _performanceCollector; | ||||||
|     private uint? _classJobId = 0; |     private uint? _classJobId = 0; | ||||||
| @@ -35,7 +35,7 @@ public class DalamudUtilService : IHostedService | |||||||
|     private bool _sentBetweenAreas = false; |     private bool _sentBetweenAreas = false; | ||||||
|  |  | ||||||
|     public DalamudUtilService(ILogger<DalamudUtilService> logger, IClientState clientState, IObjectTable objectTable, IFramework framework, |     public DalamudUtilService(ILogger<DalamudUtilService> logger, IClientState clientState, IObjectTable objectTable, IFramework framework, | ||||||
|         IGameGui gameGui, ICondition condition, IDataManager gameData, MareMediator mediator, PerformanceCollectorService performanceCollector) |         IGameGui gameGui, ICondition condition, IDataManager gameData, ITargetManager targetManager, MareMediator mediator, PerformanceCollectorService performanceCollector) | ||||||
|     { |     { | ||||||
|         _logger = logger; |         _logger = logger; | ||||||
|         _clientState = clientState; |         _clientState = clientState; | ||||||
| @@ -43,7 +43,7 @@ public class DalamudUtilService : IHostedService | |||||||
|         _framework = framework; |         _framework = framework; | ||||||
|         _gameGui = gameGui; |         _gameGui = gameGui; | ||||||
|         _condition = condition; |         _condition = condition; | ||||||
|         _mediator = mediator; |         Mediator = mediator; | ||||||
|         _performanceCollector = performanceCollector; |         _performanceCollector = performanceCollector; | ||||||
|         WorldData = new(() => |         WorldData = new(() => | ||||||
|         { |         { | ||||||
| @@ -51,6 +51,17 @@ public class DalamudUtilService : IHostedService | |||||||
|                 .Where(w => w.IsPublic && !w.Name.RawData.IsEmpty) |                 .Where(w => w.IsPublic && !w.Name.RawData.IsEmpty) | ||||||
|                 .ToDictionary(w => (ushort)w.RowId, w => w.Name.ToString()); |                 .ToDictionary(w => (ushort)w.RowId, w => w.Name.ToString()); | ||||||
|         }); |         }); | ||||||
|  |         mediator.Subscribe<TargetPairMessage>(this, async (msg) => | ||||||
|  |         { | ||||||
|  |             var name = msg.Pair.PlayerName; | ||||||
|  |             if (string.IsNullOrEmpty(name)) return; | ||||||
|  |             var addr = _playerCharas.FirstOrDefault(f => string.Equals(f.Value.Name, name, StringComparison.Ordinal)).Value.Address; | ||||||
|  |             if (addr == nint.Zero) return; | ||||||
|  |             await RunOnFrameworkThread(() => | ||||||
|  |             { | ||||||
|  |                 targetManager.Target = CreateGameObject(addr); | ||||||
|  |             }).ConfigureAwait(false); | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public unsafe GameObject* GposeTarget => TargetSystem.Instance()->GPoseTarget; |     public unsafe GameObject* GposeTarget => TargetSystem.Instance()->GPoseTarget; | ||||||
| @@ -64,6 +75,8 @@ public class DalamudUtilService : IHostedService | |||||||
|  |  | ||||||
|     public Lazy<Dictionary<ushort, string>> WorldData { get; private set; } |     public Lazy<Dictionary<ushort, string>> WorldData { get; private set; } | ||||||
|  |  | ||||||
|  |     public MareMediator Mediator { get; } | ||||||
|  |  | ||||||
|     public Dalamud.Game.ClientState.Objects.Types.GameObject? CreateGameObject(IntPtr reference) |     public Dalamud.Game.ClientState.Objects.Types.GameObject? CreateGameObject(IntPtr reference) | ||||||
|     { |     { | ||||||
|         EnsureIsOnFramework(); |         EnsureIsOnFramework(); | ||||||
| @@ -279,6 +292,7 @@ public class DalamudUtilService : IHostedService | |||||||
|     { |     { | ||||||
|         _logger.LogTrace("Stopping {type}", GetType()); |         _logger.LogTrace("Stopping {type}", GetType()); | ||||||
|  |  | ||||||
|  |         Mediator.UnsubscribeAll(this); | ||||||
|         _framework.Update -= FrameworkOnUpdate; |         _framework.Update -= FrameworkOnUpdate; | ||||||
|         return Task.CompletedTask; |         return Task.CompletedTask; | ||||||
|     } |     } | ||||||
| @@ -433,31 +447,31 @@ public class DalamudUtilService : IHostedService | |||||||
|         { |         { | ||||||
|             _logger.LogDebug("Gpose start"); |             _logger.LogDebug("Gpose start"); | ||||||
|             IsInGpose = true; |             IsInGpose = true; | ||||||
|             _mediator.Publish(new GposeStartMessage()); |             Mediator.Publish(new GposeStartMessage()); | ||||||
|         } |         } | ||||||
|         else if (GposeTarget == null && IsInGpose) |         else if (GposeTarget == null && IsInGpose) | ||||||
|         { |         { | ||||||
|             _logger.LogDebug("Gpose end"); |             _logger.LogDebug("Gpose end"); | ||||||
|             IsInGpose = false; |             IsInGpose = false; | ||||||
|             _mediator.Publish(new GposeEndMessage()); |             Mediator.Publish(new GposeEndMessage()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (_condition[ConditionFlag.WatchingCutscene] && !IsInCutscene) |         if (_condition[ConditionFlag.WatchingCutscene] && !IsInCutscene) | ||||||
|         { |         { | ||||||
|             _logger.LogDebug("Cutscene start"); |             _logger.LogDebug("Cutscene start"); | ||||||
|             IsInCutscene = true; |             IsInCutscene = true; | ||||||
|             _mediator.Publish(new CutsceneStartMessage()); |             Mediator.Publish(new CutsceneStartMessage()); | ||||||
|             _mediator.Publish(new HaltScanMessage("Cutscene")); |             Mediator.Publish(new HaltScanMessage("Cutscene")); | ||||||
|         } |         } | ||||||
|         else if (!_condition[ConditionFlag.WatchingCutscene] && IsInCutscene) |         else if (!_condition[ConditionFlag.WatchingCutscene] && IsInCutscene) | ||||||
|         { |         { | ||||||
|             _logger.LogDebug("Cutscene end"); |             _logger.LogDebug("Cutscene end"); | ||||||
|             IsInCutscene = false; |             IsInCutscene = false; | ||||||
|             _mediator.Publish(new CutsceneEndMessage()); |             Mediator.Publish(new CutsceneEndMessage()); | ||||||
|             _mediator.Publish(new ResumeScanMessage("Cutscene")); |             Mediator.Publish(new ResumeScanMessage("Cutscene")); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (IsInCutscene) { _mediator.Publish(new CutsceneFrameworkUpdateMessage()); return; } |         if (IsInCutscene) { Mediator.Publish(new CutsceneFrameworkUpdateMessage()); return; } | ||||||
|  |  | ||||||
|         if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51]) |         if (_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51]) | ||||||
|         { |         { | ||||||
| @@ -469,8 +483,8 @@ public class DalamudUtilService : IHostedService | |||||||
|                 { |                 { | ||||||
|                     _logger.LogDebug("Zone switch/Gpose start"); |                     _logger.LogDebug("Zone switch/Gpose start"); | ||||||
|                     _sentBetweenAreas = true; |                     _sentBetweenAreas = true; | ||||||
|                     _mediator.Publish(new ZoneSwitchStartMessage()); |                     Mediator.Publish(new ZoneSwitchStartMessage()); | ||||||
|                     _mediator.Publish(new HaltScanMessage("Zone switch")); |                     Mediator.Publish(new HaltScanMessage("Zone switch")); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -481,11 +495,11 @@ public class DalamudUtilService : IHostedService | |||||||
|         { |         { | ||||||
|             _logger.LogDebug("Zone switch/Gpose end"); |             _logger.LogDebug("Zone switch/Gpose end"); | ||||||
|             _sentBetweenAreas = false; |             _sentBetweenAreas = false; | ||||||
|             _mediator.Publish(new ZoneSwitchEndMessage()); |             Mediator.Publish(new ZoneSwitchEndMessage()); | ||||||
|             _mediator.Publish(new ResumeScanMessage("Zone switch")); |             Mediator.Publish(new ResumeScanMessage("Zone switch")); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         _mediator.Publish(new FrameworkUpdateMessage()); |         Mediator.Publish(new FrameworkUpdateMessage()); | ||||||
|  |  | ||||||
|         if (DateTime.Now < _delayedFrameworkUpdateCheck.AddSeconds(1)) return; |         if (DateTime.Now < _delayedFrameworkUpdateCheck.AddSeconds(1)) return; | ||||||
|  |  | ||||||
| @@ -496,16 +510,16 @@ public class DalamudUtilService : IHostedService | |||||||
|             _logger.LogDebug("Logged in"); |             _logger.LogDebug("Logged in"); | ||||||
|             IsLoggedIn = true; |             IsLoggedIn = true; | ||||||
|             _lastZone = _clientState.TerritoryType; |             _lastZone = _clientState.TerritoryType; | ||||||
|             _mediator.Publish(new DalamudLoginMessage()); |             Mediator.Publish(new DalamudLoginMessage()); | ||||||
|         } |         } | ||||||
|         else if (localPlayer == null && IsLoggedIn) |         else if (localPlayer == null && IsLoggedIn) | ||||||
|         { |         { | ||||||
|             _logger.LogDebug("Logged out"); |             _logger.LogDebug("Logged out"); | ||||||
|             IsLoggedIn = false; |             IsLoggedIn = false; | ||||||
|             _mediator.Publish(new DalamudLogoutMessage()); |             Mediator.Publish(new DalamudLogoutMessage()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         _mediator.Publish(new DelayedFrameworkUpdateMessage()); |         Mediator.Publish(new DelayedFrameworkUpdateMessage()); | ||||||
|  |  | ||||||
|         _delayedFrameworkUpdateCheck = DateTime.Now; |         _delayedFrameworkUpdateCheck = DateTime.Now; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -77,6 +77,7 @@ public record OpenSyncshellAdminPanel(GroupFullInfoDto GroupInfo) : MessageBase; | |||||||
| public record OpenPermissionWindow(Pair Pair) : MessageBase; | public record OpenPermissionWindow(Pair Pair) : MessageBase; | ||||||
| public record DownloadLimitChangedMessage() : SameThreadMessage; | public record DownloadLimitChangedMessage() : SameThreadMessage; | ||||||
| public record CensusUpdateMessage(byte Gender, byte RaceId, byte TribeId) : MessageBase; | public record CensusUpdateMessage(byte Gender, byte RaceId, byte TribeId) : MessageBase; | ||||||
|  | public record TargetPairMessage(Pair Pair) : 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 | ||||||
| @@ -208,7 +208,11 @@ public class DrawUserPair | |||||||
|         else if (_pair.IsVisible) |         else if (_pair.IsVisible) | ||||||
|         { |         { | ||||||
|             UiSharedService.NormalizedIcon(FontAwesomeIcon.Eye, ImGuiColors.ParsedGreen); |             UiSharedService.NormalizedIcon(FontAwesomeIcon.Eye, ImGuiColors.ParsedGreen); | ||||||
|             userPairText = _pair.UserData.AliasOrUID + " is visible: " + _pair.PlayerName; |             userPairText = _pair.UserData.AliasOrUID + " is visible: " + _pair.PlayerName + Environment.NewLine + "Click to target this player"; | ||||||
|  |             if (ImGui.IsItemClicked()) | ||||||
|  |             { | ||||||
|  |                 _mediator.Publish(new TargetPairMessage(_pair)); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
| @@ -243,6 +247,7 @@ public class DrawUserPair | |||||||
|                     return "Paired through " + groupString; |                     return "Paired through " + groupString; | ||||||
|                 })); |                 })); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         UiSharedService.AttachToolTip(userPairText); |         UiSharedService.AttachToolTip(userPairText); | ||||||
|  |  | ||||||
|         ImGui.SameLine(); |         ImGui.SameLine(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 rootdarkarchon
					rootdarkarchon