1
0
forked from liza/Questionable

Combat + Skip updates

This commit is contained in:
Liza 2024-07-27 17:37:08 +02:00
parent e40084ada1
commit 377b5501b6
Signed by: liza
GPG Key ID: 7199F8D727D55F67
6 changed files with 41 additions and 17 deletions

View File

@ -21,6 +21,8 @@ public sealed class SkipStepConditions
public bool HasSkipConditions() public bool HasSkipConditions()
{ {
return Never || Flying != null || Chocobo != null || InTerritory.Count > 0 || NotInTerritory.Count > 0 || Item != null; if (Never)
return false;
return Flying != null || Chocobo != null || InTerritory.Count > 0 || NotInTerritory.Count > 0 || Item != null;
} }
} }

View File

@ -9,6 +9,7 @@ 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 FFXIVClientStructs.FFXIV.Client.Game.Object; using FFXIVClientStructs.FFXIV.Client.Game.Object;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using FFXIVClientStructs.FFXIV.Common.Math; using FFXIVClientStructs.FFXIV.Common.Math;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.CombatModules; using Questionable.Controller.CombatModules;
@ -211,24 +212,43 @@ internal sealed class CombatController : IDisposable
if (battleNpc.BattleNpcKind is BattleNpcSubKind.BattleNpcPart or BattleNpcSubKind.Enemy) if (battleNpc.BattleNpcKind is BattleNpcSubKind.BattleNpcPart or BattleNpcSubKind.Enemy)
{ {
var gameObjectStruct = (GameObject*)gameObject.Address; var gameObjectStruct = (GameObject*)gameObject.Address;
if (gameObjectStruct->NamePlateIconId is 60093 or 60732) // npc that starts a fate or does turn-ins; not sure why they're marked as hostile
// npc that starts a fate or does turn-ins; not sure why they're marked as hostile
if (gameObjectStruct->NamePlateIconId is 60093 or 60732)
return 0; return 0;
var enemyData = _currentFight?.Data.ComplexCombatDatas.FirstOrDefault(x => x.DataId == battleNpc.DataId); var enemyData =
_currentFight?.Data.ComplexCombatDatas.FirstOrDefault(x => x.DataId == battleNpc.DataId);
if (enemyData is { IgnoreQuestMarker: true }) if (enemyData is { IgnoreQuestMarker: true })
return battleNpc.StatusFlags.HasFlag(StatusFlags.InCombat) ? 20 : 0; {
if (battleNpc.StatusFlags.HasFlag(StatusFlags.InCombat))
return 20;
}
else else
return gameObjectStruct->NamePlateIconId != 0 ? 30 : 0; {
if (gameObjectStruct->NamePlateIconId != 0)
return 30;
}
} }
// stuff trying to kill us // stuff trying to kill us
if (battleNpc.TargetObjectId == _clientState.LocalPlayer?.GameObjectId) if (battleNpc.TargetObjectId == _clientState.LocalPlayer?.GameObjectId)
return 10; return 10;
// stuff on our enmity list that's not necessarily targeting us
var haters = UIState.Instance()->Hater;
for (int i = 0; i < haters.HaterCount; ++i)
{
var hater = haters.Haters[i];
if (hater.EntityId == battleNpc.GameObjectId)
return 5;
} }
return 0; return 0;
} }
else
return 0;
}
public void Stop() public void Stop()
{ {

View File

@ -113,7 +113,9 @@ internal static class Combat
if (questWork == null) if (questWork == null)
return ETaskResult.StillRunning; return ETaskResult.StillRunning;
if (!QuestWorkUtils.MatchesQuestWork(_completionQuestVariableFlags, questWork.Value, false)) if (QuestWorkUtils.MatchesQuestWork(_completionQuestVariableFlags, questWork.Value, false))
return ETaskResult.TaskComplete;
else
return ETaskResult.StillRunning; return ETaskResult.StillRunning;
} }

View File

@ -22,23 +22,23 @@ internal static class SkipCondition
public ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step) public ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
{ {
var skipConditions = step.SkipConditions?.StepIf; var skipConditions = step.SkipConditions?.StepIf;
if (skipConditions == null || skipConditions.Never) if (skipConditions is { Never: true })
return null; return null;
if (skipConditions.HasSkipConditions() && if ((skipConditions == null || !skipConditions.HasSkipConditions()) &&
step.CompletionQuestVariablesFlags.Count == 0 && !QuestWorkUtils.HasCompletionFlags(step.CompletionQuestVariablesFlags) &&
step.RequiredQuestVariables.Count == 0 && step.RequiredQuestVariables.Count == 0 &&
step.PickUpQuestId == null && step.PickUpQuestId == null &&
step.NextQuestId == null) step.NextQuestId == null)
return null; return null;
return serviceProvider.GetRequiredService<CheckTask>() return serviceProvider.GetRequiredService<CheckSkip>()
.With(step, skipConditions, quest.QuestId); .With(step, skipConditions ?? new(), quest.QuestId);
} }
} }
internal sealed class CheckTask( internal sealed class CheckSkip(
ILogger<CheckTask> logger, ILogger<CheckSkip> logger,
GameFunctions gameFunctions, GameFunctions gameFunctions,
IClientState clientState) : ITask IClientState clientState) : ITask
{ {

View File

@ -50,7 +50,7 @@ internal static class QuestWorkUtils
} }
public static bool MatchesRequiredQuestWorkConfig(List<List<QuestWorkValue>?> requiredQuestVariables, public static bool MatchesRequiredQuestWorkConfig(List<List<QuestWorkValue>?> requiredQuestVariables,
QuestWork questWork, ILogger<SkipCondition.CheckTask> logger) QuestWork questWork, ILogger<SkipCondition.CheckSkip> logger)
{ {
if (requiredQuestVariables.Count != 6 || requiredQuestVariables.All(x => x == null || x.Count == 0)) if (requiredQuestVariables.Count != 6 || requiredQuestVariables.All(x => x == null || x.Count == 0))
{ {

View File

@ -105,7 +105,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
// task factories // task factories
serviceCollection.AddTaskWithFactory<StepDisabled.Factory, StepDisabled.Task>(); serviceCollection.AddTaskWithFactory<StepDisabled.Factory, StepDisabled.Task>();
serviceCollection.AddTaskWithFactory<AetheryteShortcut.Factory, AetheryteShortcut.UseAetheryteShortcut>(); serviceCollection.AddTaskWithFactory<AetheryteShortcut.Factory, AetheryteShortcut.UseAetheryteShortcut>();
serviceCollection.AddTaskWithFactory<SkipCondition.Factory, SkipCondition.CheckTask>(); serviceCollection.AddTaskWithFactory<SkipCondition.Factory, SkipCondition.CheckSkip>();
serviceCollection.AddTaskWithFactory<AethernetShortcut.Factory, AethernetShortcut.UseAethernetShortcut>(); serviceCollection.AddTaskWithFactory<AethernetShortcut.Factory, AethernetShortcut.UseAethernetShortcut>();
serviceCollection.AddTaskWithFactory<WaitAtStart.Factory, WaitAtStart.WaitDelay>(); serviceCollection.AddTaskWithFactory<WaitAtStart.Factory, WaitAtStart.WaitDelay>();
serviceCollection.AddTaskWithFactory<Move.Factory, Move.MoveInternal, Move.ExpectToBeNearDataId, Move.Land>(); serviceCollection.AddTaskWithFactory<Move.Factory, Move.MoveInternal, Move.ExpectToBeNearDataId, Move.Land>();