Add special handling for Lahabrea fight

This commit is contained in:
Liza 2025-02-22 01:06:41 +01:00
parent a70e195a93
commit dcdc288b08
Signed by: liza
GPG Key ID: 2C41B84815CF6445
5 changed files with 62 additions and 6 deletions

View File

@ -105,10 +105,7 @@
"TerritoryId": 1053, "TerritoryId": 1053,
"InteractionType": "SinglePlayerDuty", "InteractionType": "SinglePlayerDuty",
"SinglePlayerDutyOptions": { "SinglePlayerDutyOptions": {
"Enabled": false, "Enabled": true
"Notes": [
"Doesn't handle death properly"
]
} }
} }
] ]

View File

@ -10,6 +10,7 @@ using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps; using Questionable.Controller.Steps;
using Questionable.Controller.Steps.Interactions;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
using Questionable.External; using Questionable.External;
using Questionable.Functions; using Questionable.Functions;
@ -200,7 +201,13 @@ internal sealed class QuestController : MiniTaskController<QuestController>
if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious]) if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious])
{ {
if (!_taskQueue.AllTasksComplete) if (_condition[ConditionFlag.Unconscious] &&
_condition[ConditionFlag.SufferingStatusAffliction63] &&
_clientState.TerritoryType == SinglePlayerDuty.LahabreaTerritoryId)
{
// ignore, we're in the lahabrea fight
}
else if (!_taskQueue.AllTasksComplete)
{ {
Stop("HP = 0"); Stop("HP = 0");
_movementController.Stop(); _movementController.Stop();

View File

@ -1,7 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game;
using Questionable.Controller.Steps.Common;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
using Questionable.Data; using Questionable.Data;
using Questionable.External; using Questionable.External;
@ -12,9 +17,13 @@ namespace Questionable.Controller.Steps.Interactions;
internal static class SinglePlayerDuty internal static class SinglePlayerDuty
{ {
public const int LahabreaTerritoryId = 1052;
internal sealed class Factory( internal sealed class Factory(
BossModIpc bossModIpc, BossModIpc bossModIpc,
TerritoryData territoryData) : ITaskFactory TerritoryData territoryData,
ICondition condition,
IClientState clientState) : ITaskFactory
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{ {
@ -28,6 +37,14 @@ internal static class SinglePlayerDuty
yield return new StartSinglePlayerDuty(cfcData.ContentFinderConditionId); yield return new StartSinglePlayerDuty(cfcData.ContentFinderConditionId);
yield return new EnableAi(); yield return new EnableAi();
if (cfcData.TerritoryId == LahabreaTerritoryId)
{
yield return new SetTarget(14643);
yield return new WaitCondition.Task(() => condition[ConditionFlag.Unconscious] || clientState.TerritoryType != LahabreaTerritoryId, "Wait(death)");
yield return new DisableAi();
yield return new WaitCondition.Task(() => !condition[ConditionFlag.Unconscious] || clientState.TerritoryType != LahabreaTerritoryId, "Wait(resurrection)");
yield return new EnableAi();
}
yield return new WaitSinglePlayerDuty(cfcData.ContentFinderConditionId); yield return new WaitSinglePlayerDuty(cfcData.ContentFinderConditionId);
yield return new DisableAi(); yield return new DisableAi();
yield return new WaitAtEnd.WaitNextStepOrSequence(); yield return new WaitAtEnd.WaitNextStepOrSequence();
@ -113,4 +130,32 @@ internal static class SinglePlayerDuty
public override bool ShouldInterruptOnDamage() => false; public override bool ShouldInterruptOnDamage() => false;
} }
// TODO this should be handled in VBM
internal sealed record SetTarget(uint DataId) : ITask
{
public override string ToString() => $"SetTarget({DataId})";
}
internal sealed class SetTargetExecutor(
ITargetManager targetManager,
IObjectTable objectTable) : TaskExecutor<SetTarget>
{
protected override bool Start() => true;
public override ETaskResult Update()
{
if (targetManager.Target?.DataId == Task.DataId)
return ETaskResult.TaskComplete;
IGameObject? gameObject = objectTable.FirstOrDefault(x => x.DataId == Task.DataId);
if (gameObject == null)
return ETaskResult.StillRunning;
targetManager.Target = gameObject;
return ETaskResult.StillRunning;
}
public override bool ShouldInterruptOnDamage() => false;
}
} }

View File

@ -16,6 +16,7 @@ using FFXIVClientStructs.FFXIV.Component.GUI;
using LLib.GameUI; using LLib.GameUI;
using Lumina.Excel.Sheets; using Lumina.Excel.Sheets;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Interactions;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.Questing; using Questionable.Model.Questing;
using Action = Lumina.Excel.Sheets.Action; using Action = Lumina.Excel.Sheets.Action;
@ -427,6 +428,11 @@ internal sealed unsafe class GameFunctions
return true; return true;
} }
if (_condition[ConditionFlag.Unconscious] &&
_condition[ConditionFlag.SufferingStatusAffliction63] &&
_clientState.TerritoryType == SinglePlayerDuty.LahabreaTerritoryId)
return false; // needed to process the tasks
return _condition[ConditionFlag.Occupied] || _condition[ConditionFlag.Occupied30] || return _condition[ConditionFlag.Occupied] || _condition[ConditionFlag.Occupied30] ||
_condition[ConditionFlag.Occupied33] || _condition[ConditionFlag.Occupied38] || _condition[ConditionFlag.Occupied33] || _condition[ConditionFlag.Occupied38] ||
_condition[ConditionFlag.Occupied39] || _condition[ConditionFlag.OccupiedInEvent] || _condition[ConditionFlag.Occupied39] || _condition[ConditionFlag.OccupiedInEvent] ||

View File

@ -231,6 +231,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection serviceCollection
.AddTaskExecutor<SinglePlayerDuty.WaitSinglePlayerDuty, SinglePlayerDuty.WaitSinglePlayerDutyExecutor>(); .AddTaskExecutor<SinglePlayerDuty.WaitSinglePlayerDuty, SinglePlayerDuty.WaitSinglePlayerDutyExecutor>();
serviceCollection.AddTaskExecutor<SinglePlayerDuty.DisableAi, SinglePlayerDuty.DisableAiExecutor>(); serviceCollection.AddTaskExecutor<SinglePlayerDuty.DisableAi, SinglePlayerDuty.DisableAiExecutor>();
serviceCollection.AddTaskExecutor<SinglePlayerDuty.SetTarget, SinglePlayerDuty.SetTargetExecutor>();
serviceCollection.AddTaskExecutor<WaitCondition.Task, WaitCondition.WaitConditionExecutor>(); serviceCollection.AddTaskExecutor<WaitCondition.Task, WaitCondition.WaitConditionExecutor>();
serviceCollection.AddTaskFactory<WaitAtEnd.Factory>(); serviceCollection.AddTaskFactory<WaitAtEnd.Factory>();