Handle specific dialogue interactions while in a duty
authorLiza Carvelli <liza@carvel.li>
Mon, 26 Aug 2024 09:11:44 +0000 (11:11 +0200)
committerLiza Carvelli <liza@carvel.li>
Mon, 26 Aug 2024 09:11:44 +0000 (11:11 +0200)
Questionable/Controller/GameUi/InteractionUiController.cs
Questionable/Data/TerritoryData.cs

index 64c178328a49f94806013689c74cff0b03f43eb0..e630d7d6d24f2150b840f3837b534085bf4d2b91 100644 (file)
@@ -42,6 +42,7 @@ internal sealed class InteractionUiController : IDisposable
     private readonly GatheringPointRegistry _gatheringPointRegistry;
     private readonly QuestRegistry _questRegistry;
     private readonly QuestData _questData;
+    private readonly TerritoryData _territoryData;
     private readonly IGameGui _gameGui;
     private readonly ITargetManager _targetManager;
     private readonly IClientState _clientState;
@@ -61,6 +62,7 @@ internal sealed class InteractionUiController : IDisposable
         GatheringPointRegistry gatheringPointRegistry,
         QuestRegistry questRegistry,
         QuestData questData,
+        TerritoryData territoryData,
         IGameGui gameGui,
         ITargetManager targetManager,
         IPluginLog pluginLog,
@@ -77,6 +79,7 @@ internal sealed class InteractionUiController : IDisposable
         _gatheringPointRegistry = gatheringPointRegistry;
         _questRegistry = questRegistry;
         _questData = questData;
+        _territoryData = territoryData;
         _gameGui = gameGui;
         _targetManager = targetManager;
         _clientState = clientState;
@@ -101,7 +104,9 @@ internal sealed class InteractionUiController : IDisposable
         }
     }
 
-    private bool ShouldHandleUiInteractions => _isInitialCheck || _questController.IsRunning;
+    private bool ShouldHandleUiInteractions => _isInitialCheck ||
+                                               _questController.IsRunning ||
+                                               _territoryData.IsQuestBattleInstance(_clientState.TerritoryType);
 
     internal unsafe void HandleCurrentDialogueChoices()
     {
index 0175cf6de18af8fef0b376b80626ad1118265f52..0b20d9a9ecca426f95821a15c8618ee84db5afc4 100644 (file)
@@ -12,7 +12,7 @@ internal sealed class TerritoryData
 {
     private readonly ImmutableDictionary<uint, string> _territoryNames;
     private readonly ImmutableHashSet<ushort> _territoriesWithMount;
-    private readonly ImmutableHashSet<ushort> _dutyTerritories;
+    private readonly ImmutableDictionary<ushort, uint> _dutyTerritories;
     private readonly ImmutableDictionary<ushort, string> _instanceNames;
 
     public TerritoryData(IDataManager dataManager)
@@ -35,8 +35,7 @@ internal sealed class TerritoryData
 
         _dutyTerritories = dataManager.GetExcelSheet<TerritoryType>()!
             .Where(x => x.RowId > 0 && x.ContentFinderCondition.Row != 0)
-            .Select(x => (ushort)x.RowId)
-            .ToImmutableHashSet();
+            .ToImmutableDictionary(x => (ushort)x.RowId, x => x.ContentFinderCondition.Value!.ContentType.Row);
 
         _instanceNames = dataManager.GetExcelSheet<ContentFinderCondition>()!
             .Where(x => x.RowId > 0 && x.Content != 0 && x.ContentLinkType == 1 && x.ContentType.Row != 6)
@@ -56,7 +55,10 @@ internal sealed class TerritoryData
 
     public bool CanUseMount(ushort territoryId) => _territoriesWithMount.Contains(territoryId);
 
-    public bool IsDutyInstance(ushort territoryId) => _dutyTerritories.Contains(territoryId);
+    public bool IsDutyInstance(ushort territoryId) => _dutyTerritories.ContainsKey(territoryId);
+
+    public bool IsQuestBattleInstance(ushort territoryId) =>
+        _dutyTerritories.TryGetValue(territoryId, out uint contentType) && contentType == 7;
 
     public string? GetInstanceName(ushort instanceId) => _instanceNames.GetValueOrDefault(instanceId);
 }