Add currently visible unaccepted quest markers to /qst zone (only for unknown/not...
authorLiza Carvelli <liza@carvel.li>
Tue, 16 Jul 2024 09:15:28 +0000 (11:15 +0200)
committerLiza Carvelli <liza@carvel.li>
Tue, 16 Jul 2024 09:15:28 +0000 (11:15 +0200)
Questionable/Controller/CommandHandler.cs
Questionable/Windows/QuestSelectionWindow.cs

index 33ccf29a6fd64d27213683310490f64056b3d6dd..e7fa9767fc6c79c2432968b52ffa26d7caa5ae5e 100644 (file)
@@ -1,10 +1,8 @@
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using Dalamud.Game.ClientState.Objects;
 using Dalamud.Game.Command;
 using Dalamud.Plugin.Services;
-using Questionable.Data;
 using Questionable.Model;
 using Questionable.Windows;
 
@@ -23,13 +21,11 @@ internal sealed class CommandHandler : IDisposable
     private readonly QuestSelectionWindow _questSelectionWindow;
     private readonly ITargetManager _targetManager;
     private readonly GameFunctions _gameFunctions;
-    private readonly IClientState _clientState;
 
     public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController,
         MovementController movementController, QuestRegistry questRegistry,
         ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow,
-        QuestSelectionWindow questSelectionWindow, ITargetManager targetManager, GameFunctions gameFunctions,
-        IClientState clientState)
+        QuestSelectionWindow questSelectionWindow, ITargetManager targetManager, GameFunctions gameFunctions)
     {
         _commandManager = commandManager;
         _chatGui = chatGui;
@@ -42,7 +38,6 @@ internal sealed class CommandHandler : IDisposable
         _questSelectionWindow = questSelectionWindow;
         _targetManager = targetManager;
         _gameFunctions = gameFunctions;
-        _clientState = clientState;
 
         _commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand)
         {
@@ -87,7 +82,7 @@ internal sealed class CommandHandler : IDisposable
 
             case "z":
             case "zone":
-                _questSelectionWindow.OpenForZone(_clientState.TerritoryType);
+                _questSelectionWindow.OpenForCurrentZone();
                 break;
 
             default:
index 164f03b62af436cfbd41f2ce9fd041a521df7771..569fd28bcb2539a785a5a7af5f9cebf39f1e760e 100644 (file)
@@ -9,6 +9,7 @@ using Dalamud.Interface.Components;
 using Dalamud.Interface.Utility.Raii;
 using Dalamud.Plugin;
 using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game.UI;
 using FFXIVClientStructs.FFXIV.Client.UI;
 using ImGuiNET;
 using LLib.GameUI;
@@ -30,6 +31,7 @@ internal sealed class QuestSelectionWindow : LWindow
     private readonly QuestRegistry _questRegistry;
     private readonly IDalamudPluginInterface _pluginInterface;
     private readonly TerritoryData _territoryData;
+    private readonly IClientState _clientState;
 
     private List<QuestInfo> _quests = [];
     private List<QuestInfo> _offeredQuests = [];
@@ -37,7 +39,7 @@ internal sealed class QuestSelectionWindow : LWindow
 
     public QuestSelectionWindow(QuestData questData, IGameGui gameGui, IChatGui chatGui, GameFunctions gameFunctions,
         QuestController questController, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface,
-        TerritoryData territoryData)
+        TerritoryData territoryData, IClientState clientState)
         : base($"Quest Selection{WindowId}")
     {
         _questData = questData;
@@ -48,6 +50,7 @@ internal sealed class QuestSelectionWindow : LWindow
         _questRegistry = questRegistry;
         _pluginInterface = pluginInterface;
         _territoryData = territoryData;
+        _clientState = clientState;
 
         Size = new Vector2(500, 200);
         SizeCondition = ImGuiCond.Once;
@@ -57,18 +60,15 @@ internal sealed class QuestSelectionWindow : LWindow
         };
     }
 
-    public uint TargetId { get; private set; }
-    public string TargetName { get; private set; } = string.Empty;
-
     public unsafe void OpenForTarget(IGameObject? gameObject)
     {
         if (gameObject != null)
         {
-            TargetId = gameObject.DataId;
-            TargetName = gameObject.Name.ToString();
-            WindowName = $"Quests starting with {TargetName} [{TargetId}]{WindowId}";
+            var targetId = gameObject.DataId;
+            var targetName = gameObject.Name.ToString();
+            WindowName = $"Quests starting with {targetName} [{targetId}]{WindowId}";
 
-            _quests = _questData.GetAllByIssuerDataId(TargetId);
+            _quests = _questData.GetAllByIssuerDataId(targetId);
             if (_gameGui.TryGetAddonByName<AddonSelectIconString>("SelectIconString", out var addonSelectIconString))
             {
                 var answers = GameUiController.GetChoices(addonSelectIconString);
@@ -88,24 +88,30 @@ internal sealed class QuestSelectionWindow : LWindow
         IsOpen = _quests.Count > 0;
     }
 
-    public void OpenForZone(ushort territoryId)
+    public unsafe void OpenForCurrentZone()
     {
-        TargetId = territoryId;
-        TargetName = _territoryData.GetNameAndId(territoryId);
-        WindowName = $"Quests starting in {TargetName}{WindowId}";
+        var territoryId = _clientState.TerritoryType;
+        var territoryName = _territoryData.GetNameAndId(territoryId);
+        WindowName = $"Quests starting in {territoryName}{WindowId}";
 
         _quests = _questRegistry.AllQuests
             .Where(x => x.FindSequence(0)?.FindStep(0)?.TerritoryId == territoryId)
             .Select(x => _questData.GetQuestInfo(x.QuestId))
             .ToList();
+
+        foreach (var unacceptedQuest in Map.Instance()->UnacceptedQuestMarkers)
+        {
+            ushort questId = (ushort)(unacceptedQuest.ObjectiveId & 0xFFFF);
+            if (_quests.All(q => q.QuestId != questId))
+                _quests.Add(_questData.GetQuestInfo(questId));
+        }
+
         _offeredQuests = [];
         IsOpen = true;
     }
 
     public override void OnClose()
     {
-        TargetId = default;
-        TargetName = string.Empty;
         _quests = [];
         _offeredQuests = [];
     }