forked from liza/Questionable
Compare commits
No commits in common. "dcdc288b081a6779ee22d3c1da1d9b43ac417331" and "71e0b01dbce051122f95560db0a290e111883302" have entirely different histories.
dcdc288b08
...
71e0b01dbc
@ -108,7 +108,7 @@ internal static class QuestStepExtensions
|
|||||||
AssignmentList(nameof(QuestStep.ComplexCombatData), step.ComplexCombatData)
|
AssignmentList(nameof(QuestStep.ComplexCombatData), step.ComplexCombatData)
|
||||||
.AsSyntaxNodeOrToken(),
|
.AsSyntaxNodeOrToken(),
|
||||||
Assignment(nameof(QuestStep.CombatItemUse), step.CombatItemUse,
|
Assignment(nameof(QuestStep.CombatItemUse), step.CombatItemUse,
|
||||||
emptyStep.CombatItemUse)
|
emptyStep.CombatItemUse)
|
||||||
.AsSyntaxNodeOrToken(),
|
.AsSyntaxNodeOrToken(),
|
||||||
Assignment(nameof(QuestStep.CombatDelaySecondsAtStart),
|
Assignment(nameof(QuestStep.CombatDelaySecondsAtStart),
|
||||||
step.CombatDelaySecondsAtStart,
|
step.CombatDelaySecondsAtStart,
|
||||||
@ -123,8 +123,14 @@ internal static class QuestStepExtensions
|
|||||||
Assignment(nameof(QuestStep.AutoDutyEnabled),
|
Assignment(nameof(QuestStep.AutoDutyEnabled),
|
||||||
step.AutoDutyEnabled, emptyStep.AutoDutyEnabled)
|
step.AutoDutyEnabled, emptyStep.AutoDutyEnabled)
|
||||||
.AsSyntaxNodeOrToken(),
|
.AsSyntaxNodeOrToken(),
|
||||||
Assignment(nameof(QuestStep.SinglePlayerDutyOptions), step.SinglePlayerDutyOptions,
|
Assignment(nameof(QuestStep.BossModEnabled),
|
||||||
emptyStep.SinglePlayerDutyOptions)
|
step.BossModEnabled, emptyStep.BossModEnabled)
|
||||||
|
.AsSyntaxNodeOrToken(),
|
||||||
|
Assignment(nameof(QuestStep.BossModNotes),
|
||||||
|
step.BossModNotes, emptyStep.BossModNotes)
|
||||||
|
.AsSyntaxNodeOrToken(),
|
||||||
|
Assignment(nameof(QuestStep.SinglePlayerDutyIndex),
|
||||||
|
step.SinglePlayerDutyIndex, emptyStep.SinglePlayerDutyIndex)
|
||||||
.AsSyntaxNodeOrToken(),
|
.AsSyntaxNodeOrToken(),
|
||||||
Assignment(nameof(QuestStep.SkipConditions), step.SkipConditions,
|
Assignment(nameof(QuestStep.SkipConditions), step.SkipConditions,
|
||||||
emptyStep.SkipConditions)
|
emptyStep.SkipConditions)
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
using Microsoft.CodeAnalysis.CSharp;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
using Questionable.Model.Questing;
|
|
||||||
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
|
|
||||||
using static Questionable.QuestPathGenerator.RoslynShortcuts;
|
|
||||||
|
|
||||||
namespace Questionable.QuestPathGenerator.RoslynElements;
|
|
||||||
|
|
||||||
internal static class SinglePlayerDutyOptionsExtensions
|
|
||||||
{
|
|
||||||
public static ExpressionSyntax ToExpressionSyntax(this SinglePlayerDutyOptions dutyOptions)
|
|
||||||
{
|
|
||||||
var emptyOptions = new SinglePlayerDutyOptions();
|
|
||||||
return ObjectCreationExpression(
|
|
||||||
IdentifierName(nameof(SinglePlayerDutyOptions)))
|
|
||||||
.WithInitializer(
|
|
||||||
InitializerExpression(
|
|
||||||
SyntaxKind.ObjectInitializerExpression,
|
|
||||||
SeparatedList<ExpressionSyntax>(
|
|
||||||
SyntaxNodeList(
|
|
||||||
Assignment(nameof(SinglePlayerDutyOptions.Enabled),
|
|
||||||
dutyOptions.Enabled, emptyOptions.Enabled)
|
|
||||||
.AsSyntaxNodeOrToken(),
|
|
||||||
Assignment(nameof(SinglePlayerDutyOptions.Notes),
|
|
||||||
dutyOptions.Notes, emptyOptions.Notes)
|
|
||||||
.AsSyntaxNodeOrToken(),
|
|
||||||
Assignment(nameof(SinglePlayerDutyOptions.Index),
|
|
||||||
dutyOptions.Index, emptyOptions.Index)
|
|
||||||
.AsSyntaxNodeOrToken()))));
|
|
||||||
}
|
|
||||||
}
|
|
@ -62,7 +62,6 @@ public static class RoslynShortcuts
|
|||||||
ComplexCombatData complexCombatData => complexCombatData.ToExpressionSyntax(),
|
ComplexCombatData complexCombatData => complexCombatData.ToExpressionSyntax(),
|
||||||
QuestWorkValue questWorkValue => questWorkValue.ToExpressionSyntax(),
|
QuestWorkValue questWorkValue => questWorkValue.ToExpressionSyntax(),
|
||||||
List<QuestWorkValue> list => list.ToExpressionSyntax(), // TODO fix in AssignmentList
|
List<QuestWorkValue> list => list.ToExpressionSyntax(), // TODO fix in AssignmentList
|
||||||
SinglePlayerDutyOptions dutyOptions => dutyOptions.ToExpressionSyntax(),
|
|
||||||
SkipConditions skipConditions => skipConditions.ToExpressionSyntax(),
|
SkipConditions skipConditions => skipConditions.ToExpressionSyntax(),
|
||||||
SkipStepConditions skipStepConditions => skipStepConditions.ToExpressionSyntax(),
|
SkipStepConditions skipStepConditions => skipStepConditions.ToExpressionSyntax(),
|
||||||
SkipItemConditions skipItemCondition => skipItemCondition.ToExpressionSyntax(),
|
SkipItemConditions skipItemCondition => skipItemCondition.ToExpressionSyntax(),
|
||||||
|
@ -57,9 +57,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 153,
|
"TerritoryId": 153,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"SinglePlayerDutyIndex": 1,
|
||||||
"Index": 1
|
|
||||||
},
|
|
||||||
"Fly": true
|
"Fly": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -62,9 +62,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 154,
|
"TerritoryId": 154,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"SinglePlayerDutyIndex": 1,
|
||||||
"Index": 1
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "North Shroud - Fallgourd Float",
|
"AetheryteShortcut": "North Shroud - Fallgourd Float",
|
||||||
"Fly": true
|
"Fly": true
|
||||||
}
|
}
|
||||||
|
@ -120,9 +120,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"SinglePlayerDutyIndex": 1
|
||||||
"Index": 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -140,9 +140,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 141,
|
"TerritoryId": 141,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"Fly": true
|
"Fly": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -92,9 +92,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 130,
|
"TerritoryId": 130,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"SinglePlayerDutyIndex": 1,
|
||||||
"Index": 1
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Ul'dah"
|
"AetheryteShortcut": "Ul'dah"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -35,9 +35,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 137,
|
"TerritoryId": 137,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Eastern La Noscea - Wineport",
|
"AetheryteShortcut": "Eastern La Noscea - Wineport",
|
||||||
"Fly": true
|
"Fly": true
|
||||||
}
|
}
|
||||||
|
@ -116,9 +116,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"Fly": true
|
"Fly": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -65,8 +65,7 @@
|
|||||||
"AetheryteShortcut": "East Shroud - Hawthorne Hut",
|
"AetheryteShortcut": "East Shroud - Hawthorne Hut",
|
||||||
"SkipConditions": {
|
"SkipConditions": {
|
||||||
"AetheryteShortcutIf": {
|
"AetheryteShortcutIf": {
|
||||||
"InSameTerritory": true,
|
"InSameTerritory": true
|
||||||
"AetheryteLocked": "East Shroud - Hawthorne Hut"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -117,10 +116,7 @@
|
|||||||
"Z": 35.568726
|
"Z": 35.568726
|
||||||
},
|
},
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -33,39 +33,6 @@
|
|||||||
{
|
{
|
||||||
"Sequence": 1,
|
"Sequence": 1,
|
||||||
"Steps": [
|
"Steps": [
|
||||||
{
|
|
||||||
"DataId": 1001263,
|
|
||||||
"Position": {
|
|
||||||
"X": 181.41443,
|
|
||||||
"Y": -2.3519497,
|
|
||||||
"Z": -240.40594
|
|
||||||
},
|
|
||||||
"TerritoryId": 133,
|
|
||||||
"InteractionType": "Interact",
|
|
||||||
"TargetTerritoryId": 152,
|
|
||||||
"AethernetShortcut": [
|
|
||||||
"[Gridania] Conjurers' Guild",
|
|
||||||
"[Gridania] Lancers' Guild"
|
|
||||||
],
|
|
||||||
"SkipConditions": {
|
|
||||||
"StepIf": {
|
|
||||||
"AetheryteUnlocked": "East Shroud - Hawthorne Hut",
|
|
||||||
"InTerritory": [
|
|
||||||
152
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"TerritoryId": 152,
|
|
||||||
"InteractionType": "AttuneAetheryte",
|
|
||||||
"Aetheryte": "East Shroud - Hawthorne Hut",
|
|
||||||
"SkipConditions": {
|
|
||||||
"StepIf": {
|
|
||||||
"AetheryteUnlocked": "East Shroud - Hawthorne Hut"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"Position": {
|
"Position": {
|
||||||
"X": -276.804,
|
"X": -276.804,
|
||||||
@ -75,12 +42,7 @@
|
|||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"AetheryteShortcut": "East Shroud - Hawthorne Hut",
|
"AetheryteShortcut": "East Shroud - Hawthorne Hut",
|
||||||
"Fly": true,
|
"Fly": true
|
||||||
"SkipConditions": {
|
|
||||||
"AetheryteShortcutIf": {
|
|
||||||
"AetheryteLocked": "East Shroud - Hawthorne Hut"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 2000889,
|
"DataId": 2000889,
|
||||||
@ -250,9 +212,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"Fly": true
|
"Fly": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -138,10 +138,7 @@
|
|||||||
"Z": 192.2179
|
"Z": 192.2179
|
||||||
},
|
},
|
||||||
"TerritoryId": 148,
|
"TerritoryId": 148,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -111,13 +111,7 @@
|
|||||||
"Z": 295.52136
|
"Z": 295.52136
|
||||||
},
|
},
|
||||||
"TerritoryId": 148,
|
"TerritoryId": 148,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true,
|
|
||||||
"Notes": [
|
|
||||||
"Healer NPC is only killed after the boss dies; all NPCs need to be killed for the duty to complete"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -29,12 +29,10 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 148,
|
"TerritoryId": 148,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": false,
|
||||||
"Enabled": false,
|
"BossModNotes": [
|
||||||
"Notes": [
|
"AI doesn't automatically target newly spawning adds and dies until after the boss died (tested on CNJ)"
|
||||||
"AI doesn't automatically target newly spawning adds until after the boss died, and dies (tested on CNJ)"
|
]
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -77,12 +77,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 148,
|
"TerritoryId": 148,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true,
|
|
||||||
"Notes": [
|
|
||||||
"(Phase 1) Healer NPCs are only killed after the boss dies - allied NPCs will kill them eventually; all NPCs need to be killed for the duty to complete"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
|
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -69,12 +69,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 135,
|
"TerritoryId": 135,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": false,
|
|
||||||
"Notes": [
|
|
||||||
"(Phase 1, second enemy group) Stuck with enemy being out of sight -- but still able to attack you (tested on ACN)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Lower La Noscea - Moraby Drydocks"
|
"AetheryteShortcut": "Lower La Noscea - Moraby Drydocks"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -45,11 +45,8 @@
|
|||||||
"TerritoryId": 134,
|
"TerritoryId": 134,
|
||||||
"InteractionType": "Combat",
|
"InteractionType": "Combat",
|
||||||
"EnemySpawnType": "AutoOnEnterArea",
|
"EnemySpawnType": "AutoOnEnterArea",
|
||||||
"ComplexCombatData": [
|
"KillEnemyDataIds": [
|
||||||
{
|
52
|
||||||
"DataId": 52,
|
|
||||||
"IgnoreQuestMarker": true
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -73,10 +73,7 @@
|
|||||||
"Z": -432.15082
|
"Z": -432.15082
|
||||||
},
|
},
|
||||||
"TerritoryId": 134,
|
"TerritoryId": 134,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -28,13 +28,7 @@
|
|||||||
"Z": -141.7716
|
"Z": -141.7716
|
||||||
},
|
},
|
||||||
"TerritoryId": 134,
|
"TerritoryId": 134,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": false,
|
|
||||||
"Notes": [
|
|
||||||
"AI doesn't automatically target newly spawning adds until after the boss died (requires healing luck on ACN)"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -58,12 +58,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 138,
|
"TerritoryId": 138,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true,
|
|
||||||
"Notes": [
|
|
||||||
"(Phase 1) Kills PGL NPCs and then the boss - allied NPCs will kill most other NPCs eventually; all NPCs need to be killed for the duty to complete"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Western La Noscea - Swiftperch"
|
"AetheryteShortcut": "Western La Noscea - Swiftperch"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -44,10 +44,7 @@
|
|||||||
"Z": -242.51166
|
"Z": -242.51166
|
||||||
},
|
},
|
||||||
"TerritoryId": 145,
|
"TerritoryId": 145,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -79,9 +79,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 130,
|
"TerritoryId": 130,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Ul'dah",
|
"AetheryteShortcut": "Ul'dah",
|
||||||
"AethernetShortcut": [
|
"AethernetShortcut": [
|
||||||
"[Ul'dah] Aetheryte Plaza",
|
"[Ul'dah] Aetheryte Plaza",
|
||||||
@ -90,9 +87,6 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"Sequence": 5
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"Sequence": 255,
|
"Sequence": 255,
|
||||||
"Steps": [
|
"Steps": [
|
||||||
|
@ -63,22 +63,12 @@
|
|||||||
"AethernetShortcut": [
|
"AethernetShortcut": [
|
||||||
"[Gridania] Aetheryte Plaza",
|
"[Gridania] Aetheryte Plaza",
|
||||||
"[Gridania] Lancers' Guild"
|
"[Gridania] Lancers' Guild"
|
||||||
],
|
]
|
||||||
"SkipConditions": {
|
|
||||||
"StepIf": {
|
|
||||||
"AetheryteUnlocked": "East Shroud - Hawthorne Hut"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "AttuneAetheryte",
|
"InteractionType": "AttuneAetheryte",
|
||||||
"Aetheryte": "East Shroud - Hawthorne Hut",
|
"Aetheryte": "East Shroud - Hawthorne Hut"
|
||||||
"SkipConditions": {
|
|
||||||
"StepIf": {
|
|
||||||
"AetheryteUnlocked": "East Shroud - Hawthorne Hut"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 1004886,
|
"DataId": 1004886,
|
||||||
@ -88,16 +78,7 @@
|
|||||||
"Z": 475.30322
|
"Z": 475.30322
|
||||||
},
|
},
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "East Shroud - Hawthorne Hut",
|
|
||||||
"SkipConditions": {
|
|
||||||
"AetheryteShortcutIf": {
|
|
||||||
"InSameTerritory": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -64,9 +64,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 135,
|
"TerritoryId": 135,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"AethernetShortcut": [
|
"AethernetShortcut": [
|
||||||
"[Limsa Lominsa] The Aftcastle",
|
"[Limsa Lominsa] The Aftcastle",
|
||||||
"[Limsa Lominsa] Tempest Gate (Lower La Noscea)"
|
"[Limsa Lominsa] Tempest Gate (Lower La Noscea)"
|
||||||
|
@ -59,9 +59,6 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 140,
|
"TerritoryId": 140,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Western Thanalan - Horizon"
|
"AetheryteShortcut": "Western Thanalan - Horizon"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -46,8 +46,7 @@
|
|||||||
},
|
},
|
||||||
"StopDistance": 7,
|
"StopDistance": 7,
|
||||||
"TerritoryId": 141,
|
"TerritoryId": 141,
|
||||||
"InteractionType": "Interact",
|
"InteractionType": "Interact"
|
||||||
"DelaySecondsAtStart": 2
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -158,10 +158,7 @@
|
|||||||
"Z": 117.29602
|
"Z": 117.29602
|
||||||
},
|
},
|
||||||
"TerritoryId": 141,
|
"TerritoryId": 141,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -21,15 +21,6 @@
|
|||||||
{
|
{
|
||||||
"Sequence": 255,
|
"Sequence": 255,
|
||||||
"Steps": [
|
"Steps": [
|
||||||
{
|
|
||||||
"Position": {
|
|
||||||
"X": -174.73444,
|
|
||||||
"Y": 15.450659,
|
|
||||||
"Z": -266.76144
|
|
||||||
},
|
|
||||||
"TerritoryId": 140,
|
|
||||||
"InteractionType": "WalkTo"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"Position": {
|
"Position": {
|
||||||
"X": -289.1099,
|
"X": -289.1099,
|
||||||
|
@ -37,10 +37,7 @@
|
|||||||
"Z": -293.1411
|
"Z": -293.1411
|
||||||
},
|
},
|
||||||
"TerritoryId": 140,
|
"TerritoryId": 140,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 141,
|
"TerritoryId": 141,
|
||||||
"InteractionType": "Combat",
|
"InteractionType": "Combat",
|
||||||
"EnemySpawnType": "FinishCombatIfAny",
|
"EnemySpawnType": "OverworldEnemies",
|
||||||
"KillEnemyDataIds": [
|
"KillEnemyDataIds": [
|
||||||
352,
|
352,
|
||||||
353
|
353
|
||||||
@ -53,25 +53,6 @@
|
|||||||
{
|
{
|
||||||
"Sequence": 255,
|
"Sequence": 255,
|
||||||
"Steps": [
|
"Steps": [
|
||||||
{
|
|
||||||
"Position": {
|
|
||||||
"X": 131.78122,
|
|
||||||
"Y": 20.119337,
|
|
||||||
"Z": -115.27284
|
|
||||||
},
|
|
||||||
"TerritoryId": 141,
|
|
||||||
"InteractionType": "WalkTo"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Position": {
|
|
||||||
"X": 127.7017,
|
|
||||||
"Y": -0.15994573,
|
|
||||||
"Z": -161.89238
|
|
||||||
},
|
|
||||||
"TerritoryId": 141,
|
|
||||||
"InteractionType": "WalkTo",
|
|
||||||
"DisableNavmesh": true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"DataId": 1001605,
|
"DataId": 1001605,
|
||||||
"Position": {
|
"Position": {
|
||||||
|
@ -28,10 +28,7 @@
|
|||||||
"Z": 536.88855
|
"Z": 536.88855
|
||||||
},
|
},
|
||||||
"TerritoryId": 141,
|
"TerritoryId": 141,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -64,13 +64,7 @@
|
|||||||
"Z": -131.48706
|
"Z": -131.48706
|
||||||
},
|
},
|
||||||
"TerritoryId": 141,
|
"TerritoryId": 141,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "Interact",
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true,
|
|
||||||
"Notes": [
|
|
||||||
"(Phase 1) Healer NPCs are only killed after the boss dies - allied NPCs will kill them eventually; all NPCs need to be killed for the duty to complete"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"AetheryteShortcut": "Central Thanalan - Black Brush Station"
|
"AetheryteShortcut": "Central Thanalan - Black Brush Station"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -73,23 +73,13 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 133,
|
"TerritoryId": 133,
|
||||||
"InteractionType": "Interact",
|
"InteractionType": "Interact",
|
||||||
"TargetTerritoryId": 152,
|
"TargetTerritoryId": 152
|
||||||
"SkipConditions": {
|
|
||||||
"StepIf": {
|
|
||||||
"AetheryteUnlocked": "East Shroud - Hawthorne Hut"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "AttuneAetheryte",
|
"InteractionType": "AttuneAetheryte",
|
||||||
"Aetheryte": "East Shroud - Hawthorne Hut",
|
"Aetheryte": "East Shroud - Hawthorne Hut",
|
||||||
"StopDistance": 5,
|
"StopDistance": 5
|
||||||
"SkipConditions": {
|
|
||||||
"StepIf": {
|
|
||||||
"AetheryteUnlocked": "East Shroud - Hawthorne Hut"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 1006188,
|
"DataId": 1006188,
|
||||||
@ -99,13 +89,7 @@
|
|||||||
"Z": 283.4973
|
"Z": 283.4973
|
||||||
},
|
},
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "CompleteQuest",
|
"InteractionType": "CompleteQuest"
|
||||||
"AetheryteShortcut": "East Shroud - Hawthorne Hut",
|
|
||||||
"SkipConditions": {
|
|
||||||
"AetheryteShortcutIf": {
|
|
||||||
"InSameTerritory": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -64,10 +64,7 @@
|
|||||||
"Z": -39.383606
|
"Z": -39.383606
|
||||||
},
|
},
|
||||||
"TerritoryId": 152,
|
"TerritoryId": 152,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -83,13 +83,7 @@
|
|||||||
"Z": -12.985474
|
"Z": -12.985474
|
||||||
},
|
},
|
||||||
"TerritoryId": 153,
|
"TerritoryId": 153,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty"
|
||||||
"SinglePlayerDutyOptions": {
|
|
||||||
"Enabled": true,
|
|
||||||
"Notes": [
|
|
||||||
"AI will kill initial adds before the boss, but not switch target whenever new enemies spawn; all NPCs need to be killed for the duty to complete"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -104,9 +104,10 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 1053,
|
"TerritoryId": 1053,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": false,
|
||||||
"Enabled": true
|
"BossModNotes": [
|
||||||
}
|
"Doesn't handle death properly"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -96,9 +96,7 @@
|
|||||||
"TerritoryId": 138,
|
"TerritoryId": 138,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"Fly": true,
|
"Fly": true,
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -59,9 +59,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 401,
|
"TerritoryId": 401,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -79,9 +79,7 @@
|
|||||||
"[Ishgard] The Forgotten Knight",
|
"[Ishgard] The Forgotten Knight",
|
||||||
"[Ishgard] The Tribunal"
|
"[Ishgard] The Tribunal"
|
||||||
],
|
],
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -29,9 +29,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 145,
|
"TerritoryId": 145,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -79,9 +79,7 @@
|
|||||||
"TerritoryId": 397,
|
"TerritoryId": 397,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"DisableNavmesh": true,
|
"DisableNavmesh": true,
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -75,9 +75,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 418,
|
"TerritoryId": 418,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -57,9 +57,7 @@
|
|||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"Emote": "lookout",
|
"Emote": "lookout",
|
||||||
"StopDistance": 0.25,
|
"StopDistance": 0.25,
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -48,9 +48,7 @@
|
|||||||
"[Idyllshire] Aetheryte Plaza",
|
"[Idyllshire] Aetheryte Plaza",
|
||||||
"[Idyllshire] Epilogue Gate (Eastern Hinterlands)"
|
"[Idyllshire] Epilogue Gate (Eastern Hinterlands)"
|
||||||
],
|
],
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -69,9 +69,7 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 402,
|
"TerritoryId": 402,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": true
|
||||||
"Enabled": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -85,16 +85,14 @@
|
|||||||
"TerritoryId": 351,
|
"TerritoryId": 351,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"Comment": "Estinien vs. Arch Ultima",
|
"Comment": "Estinien vs. Arch Ultima",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": false,
|
||||||
"Enabled": false,
|
"BossModNotes": [
|
||||||
"Notes": [
|
"AI doesn't move automatically for the first boss",
|
||||||
"AI doesn't move automatically for the first boss",
|
"AI doesn't move automatically for the dialogue with gaius on the bridge",
|
||||||
"AI doesn't move automatically for the dialogue with gaius on the bridge",
|
"After walking downstairs automatically, AI tries to run back towards the stairs (ignoring the arena boudnary)",
|
||||||
"After walking downstairs automatically, AI tries to run back towards the stairs (ignoring the arena boudnary)",
|
"After moving from the arena boundary, AI doesn't move into melee range and stops too far away when initially attacking"
|
||||||
"After moving from the arena boundary, AI doesn't move into melee range and stops too far away when initially attacking"
|
],
|
||||||
]
|
"$.1": "This doesn't have a duty confirmation dialog, so we're treating TEXT_LUCKMG110_03682_Q1_100_125 as one"
|
||||||
},
|
|
||||||
"$": "This doesn't have a duty confirmation dialog, so we're treating TEXT_LUCKMG110_03682_Q1_100_125 as one"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -46,12 +46,10 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 817,
|
"TerritoryId": 817,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": false,
|
||||||
"Enabled": false,
|
"BossModNotes": [
|
||||||
"Notes": [
|
"Doesn't walk to the teleporter to finish the duty"
|
||||||
"Doesn't walk to the teleporter to finish the duty"
|
],
|
||||||
]
|
|
||||||
},
|
|
||||||
"Fly": true,
|
"Fly": true,
|
||||||
"Comment": "A Sleep Disturbed (Opo-Opo, Wolf, Serpent)",
|
"Comment": "A Sleep Disturbed (Opo-Opo, Wolf, Serpent)",
|
||||||
"$": "The dialogue choices and data ids here are recycled",
|
"$": "The dialogue choices and data ids here are recycled",
|
||||||
|
@ -104,9 +104,7 @@
|
|||||||
"StopDistance": 5,
|
"StopDistance": 5,
|
||||||
"TerritoryId": 829,
|
"TerritoryId": 829,
|
||||||
"InteractionType": "SinglePlayerDuty",
|
"InteractionType": "SinglePlayerDuty",
|
||||||
"SinglePlayerDutyOptions": {
|
"SinglePlayerDutyIndex": 1,
|
||||||
"Index": 1
|
|
||||||
},
|
|
||||||
"DialogueChoices": [
|
"DialogueChoices": [
|
||||||
{
|
{
|
||||||
"Type": "List",
|
"Type": "List",
|
||||||
|
@ -1267,32 +1267,20 @@
|
|||||||
},
|
},
|
||||||
"then": {
|
"then": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"SinglePlayerDutyOptions": {
|
"BossModEnabled": {
|
||||||
"type": "object",
|
"type": "boolean"
|
||||||
"properties": {
|
},
|
||||||
"Enabled": {
|
"BossModNotes": {
|
||||||
"type": "boolean"
|
"type": "array",
|
||||||
},
|
"items": {
|
||||||
"Notes": {
|
"type": "string"
|
||||||
"type": "array",
|
}
|
||||||
"items": {
|
},
|
||||||
"type": "string"
|
"SinglePlayerDutyIndex": {
|
||||||
}
|
"type": "integer",
|
||||||
},
|
"minimum": 0,
|
||||||
"Index": {
|
"maximum": 1,
|
||||||
"type": "integer",
|
"description": "If a quest has multiple solo instances (which affects 5 quests total), indicates which one this is"
|
||||||
"minimum": 0,
|
|
||||||
"maximum": 1,
|
|
||||||
"description": "If a quest has multiple solo instances (which affects 5 quests total), indicates which one this is"
|
|
||||||
},
|
|
||||||
"$": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"TODO_required": [
|
|
||||||
"Enabled"
|
|
||||||
],
|
|
||||||
"additionalProperties": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,8 +75,9 @@ public sealed class QuestStep
|
|||||||
public JumpDestination? JumpDestination { get; set; }
|
public JumpDestination? JumpDestination { get; set; }
|
||||||
public uint? ContentFinderConditionId { get; set; }
|
public uint? ContentFinderConditionId { get; set; }
|
||||||
public bool AutoDutyEnabled { get; set; }
|
public bool AutoDutyEnabled { get; set; }
|
||||||
public SinglePlayerDutyOptions? SinglePlayerDutyOptions { get; set; }
|
public bool BossModEnabled { get; set; }
|
||||||
public byte SinglePlayerDutyIndex => SinglePlayerDutyOptions?.Index ?? 0;
|
public List<string> BossModNotes { get; set; } = [];
|
||||||
|
public byte SinglePlayerDutyIndex { get; set; }
|
||||||
public SkipConditions? SkipConditions { get; set; }
|
public SkipConditions? SkipConditions { get; set; }
|
||||||
|
|
||||||
public List<List<QuestWorkValue>?> RequiredQuestVariables { get; set; } = new();
|
public List<List<QuestWorkValue>?> RequiredQuestVariables { get; set; } = new();
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Questionable.Model.Questing;
|
|
||||||
|
|
||||||
public sealed class SinglePlayerDutyOptions
|
|
||||||
{
|
|
||||||
public bool Enabled { get; set; }
|
|
||||||
public List<string> Notes { get; set; } = [];
|
|
||||||
public byte Index { get; set; }
|
|
||||||
}
|
|
@ -691,7 +691,7 @@ internal sealed class InteractionUiController : IDisposable
|
|||||||
private bool CheckSinglePlayerDutyYesNo(ElementId questId, QuestStep? step)
|
private bool CheckSinglePlayerDutyYesNo(ElementId questId, QuestStep? step)
|
||||||
{
|
{
|
||||||
if (step is { InteractionType: EInteractionType.SinglePlayerDuty } &&
|
if (step is { InteractionType: EInteractionType.SinglePlayerDuty } &&
|
||||||
_bossModIpc.IsConfiguredToRunSoloInstance(questId, step.SinglePlayerDutyOptions))
|
_bossModIpc.IsConfiguredToRunSoloInstance(questId, step.SinglePlayerDutyIndex, step.BossModEnabled))
|
||||||
{
|
{
|
||||||
// Most of these are yes/no dialogs "Duty calls, ...".
|
// Most of these are yes/no dialogs "Duty calls, ...".
|
||||||
//
|
//
|
||||||
|
@ -10,7 +10,6 @@ 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;
|
||||||
@ -201,13 +200,7 @@ internal sealed class QuestController : MiniTaskController<QuestController>
|
|||||||
|
|
||||||
if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious])
|
if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious])
|
||||||
{
|
{
|
||||||
if (_condition[ConditionFlag.Unconscious] &&
|
if (!_taskQueue.AllTasksComplete)
|
||||||
_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();
|
||||||
|
@ -27,7 +27,7 @@ internal static class SendNotification
|
|||||||
new Task(step.InteractionType, step.ContentFinderConditionId.HasValue
|
new Task(step.InteractionType, step.ContentFinderConditionId.HasValue
|
||||||
? territoryData.GetContentFinderCondition(step.ContentFinderConditionId.Value)?.Name
|
? territoryData.GetContentFinderCondition(step.ContentFinderConditionId.Value)?.Name
|
||||||
: step.Comment),
|
: step.Comment),
|
||||||
EInteractionType.SinglePlayerDuty when !bossModIpc.IsConfiguredToRunSoloInstance(quest.Id, step.SinglePlayerDutyOptions) =>
|
EInteractionType.SinglePlayerDuty when !bossModIpc.IsConfiguredToRunSoloInstance(quest.Id, step.SinglePlayerDutyIndex, step.BossModEnabled) =>
|
||||||
new Task(step.InteractionType, quest.Info.Name),
|
new Task(step.InteractionType, quest.Info.Name),
|
||||||
_ => null,
|
_ => null,
|
||||||
};
|
};
|
||||||
|
@ -1,12 +1,7 @@
|
|||||||
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;
|
||||||
@ -17,34 +12,22 @@ 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,
|
TerritoryData territoryData) : ITaskFactory
|
||||||
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)
|
||||||
{
|
{
|
||||||
if (step.InteractionType != EInteractionType.SinglePlayerDuty)
|
if (step.InteractionType != EInteractionType.SinglePlayerDuty)
|
||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
if (bossModIpc.IsConfiguredToRunSoloInstance(quest.Id, step.SinglePlayerDutyOptions))
|
if (bossModIpc.IsConfiguredToRunSoloInstance(quest.Id, step.SinglePlayerDutyIndex, step.BossModEnabled))
|
||||||
{
|
{
|
||||||
if (!territoryData.TryGetContentFinderConditionForSoloInstance(quest.Id, step.SinglePlayerDutyIndex, out var cfcData))
|
if (!territoryData.TryGetContentFinderConditionForSoloInstance(quest.Id, step.SinglePlayerDutyIndex, out var cfcData))
|
||||||
throw new TaskException("Failed to get content finder condition for solo instance");
|
throw new TaskException("Failed to get content finder condition for solo instance");
|
||||||
|
|
||||||
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();
|
||||||
@ -130,32 +113,4 @@ 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ internal static class WaitAtEnd
|
|||||||
return [new WaitNextStepOrSequence()];
|
return [new WaitNextStepOrSequence()];
|
||||||
|
|
||||||
case EInteractionType.Duty when !autoDutyIpc.IsConfiguredToRunContent(step.ContentFinderConditionId, step.AutoDutyEnabled):
|
case EInteractionType.Duty when !autoDutyIpc.IsConfiguredToRunContent(step.ContentFinderConditionId, step.AutoDutyEnabled):
|
||||||
case EInteractionType.SinglePlayerDuty when !bossModIpc.IsConfiguredToRunSoloInstance(quest.Id, step.SinglePlayerDutyOptions):
|
case EInteractionType.SinglePlayerDuty when !bossModIpc.IsConfiguredToRunSoloInstance(quest.Id, step.SinglePlayerDutyIndex, step.BossModEnabled):
|
||||||
return [new EndAutomation()];
|
return [new EndAutomation()];
|
||||||
|
|
||||||
case EInteractionType.WalkTo:
|
case EInteractionType.WalkTo:
|
||||||
|
7
Questionable/External/BossModIpc.cs
vendored
7
Questionable/External/BossModIpc.cs
vendored
@ -82,7 +82,7 @@ internal sealed class BossModIpc
|
|||||||
ClearPreset();
|
ClearPreset();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsConfiguredToRunSoloInstance(ElementId questId, SinglePlayerDutyOptions? dutyOptions)
|
public bool IsConfiguredToRunSoloInstance(ElementId questId, byte dutyIndex, bool enabledByDefault)
|
||||||
{
|
{
|
||||||
if (!IsSupported())
|
if (!IsSupported())
|
||||||
return false;
|
return false;
|
||||||
@ -90,8 +90,7 @@ internal sealed class BossModIpc
|
|||||||
if (!_configuration.SinglePlayerDuties.RunSoloInstancesWithBossMod)
|
if (!_configuration.SinglePlayerDuties.RunSoloInstancesWithBossMod)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
dutyOptions ??= new();
|
if (!_territoryData.TryGetContentFinderConditionForSoloInstance(questId, dutyIndex, out var cfcData))
|
||||||
if (!_territoryData.TryGetContentFinderConditionForSoloInstance(questId, dutyOptions.Index, out var cfcData))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (_configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Contains(cfcData.ContentFinderConditionId))
|
if (_configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Contains(cfcData.ContentFinderConditionId))
|
||||||
@ -100,6 +99,6 @@ internal sealed class BossModIpc
|
|||||||
if (_configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Contains(cfcData.ContentFinderConditionId))
|
if (_configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Contains(cfcData.ContentFinderConditionId))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return dutyOptions.Enabled;
|
return enabledByDefault;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@ 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;
|
||||||
@ -428,11 +427,6 @@ 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] ||
|
||||||
|
@ -231,7 +231,6 @@ 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>();
|
||||||
|
@ -122,24 +122,70 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
foreach (var (questId, index, cfcData) in _territoryData.GetAllQuestsWithQuestBattles())
|
foreach (var (questId, index, cfcData) in _territoryData.GetAllQuestsWithQuestBattles())
|
||||||
{
|
{
|
||||||
IQuestInfo questInfo = _questData.GetQuestInfo(questId);
|
IQuestInfo questInfo = _questData.GetQuestInfo(questId);
|
||||||
(bool enabled, SinglePlayerDutyOptions options) = FindDutyOptions(questId, index);
|
QuestStep questStep = new QuestStep
|
||||||
|
{
|
||||||
|
SinglePlayerDutyIndex = 0,
|
||||||
|
BossModEnabled = false,
|
||||||
|
};
|
||||||
|
bool enabled;
|
||||||
|
if (_questRegistry.TryGetQuest(questId, out var quest))
|
||||||
|
{
|
||||||
|
if (quest.Root.Disabled)
|
||||||
|
{
|
||||||
|
_logger.LogDebug("Disabling quest battle for quest {QuestId}, quest is disabled", questId);
|
||||||
|
enabled = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var foundStep = quest.AllSteps().FirstOrDefault(x =>
|
||||||
|
x.Step.InteractionType == EInteractionType.SinglePlayerDuty &&
|
||||||
|
x.Step.SinglePlayerDutyIndex == index);
|
||||||
|
if (foundStep == default)
|
||||||
|
{
|
||||||
|
_logger.LogWarning(
|
||||||
|
"Disabling quest battle for quest {QuestId}, no battle with index {Index} found", questId,
|
||||||
|
index);
|
||||||
|
enabled = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
questStep = foundStep.Step;
|
||||||
|
enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.LogDebug("Disabling quest battle for quest {QuestId}, unknown quest", questId);
|
||||||
|
enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
string name = $"{FormatLevel(questInfo.Level)} {questInfo.Name}";
|
string name = $"{FormatLevel(questInfo.Level)} {questInfo.Name}";
|
||||||
if (!string.IsNullOrEmpty(cfcData.Name) && !questInfo.Name.EndsWith(cfcData.Name, StringComparison.Ordinal))
|
if (!string.IsNullOrEmpty(cfcData.Name) && !questInfo.Name.EndsWith(cfcData.Name, StringComparison.Ordinal))
|
||||||
name += $" ({cfcData.Name})";
|
name += $" ({cfcData.Name})";
|
||||||
|
|
||||||
if (questsWithMultipleBattles.Contains(questId))
|
if (questsWithMultipleBattles.Contains(questId))
|
||||||
name += $" (Part {options.Index + 1})";
|
name += $" (Part {questStep.SinglePlayerDutyIndex + 1})";
|
||||||
else if (cfcData.ContentFinderConditionId is 674 or 691)
|
else if (cfcData.ContentFinderConditionId is 674 or 691)
|
||||||
name += " (Melee/Phys. Ranged)";
|
name += " (Melee/Phys. Ranged)";
|
||||||
|
|
||||||
var dutyInfo = new SinglePlayerDutyInfo(name, questInfo, cfcData, options, enabled);
|
var dutyInfo = new SinglePlayerDutyInfo(
|
||||||
|
cfcData.ContentFinderConditionId,
|
||||||
|
cfcData.TerritoryId,
|
||||||
|
name,
|
||||||
|
questInfo.Expansion,
|
||||||
|
questInfo.JournalGenre ?? uint.MaxValue,
|
||||||
|
questInfo.SortKey,
|
||||||
|
questStep.SinglePlayerDutyIndex,
|
||||||
|
enabled,
|
||||||
|
questStep.BossModEnabled,
|
||||||
|
questStep.BossModNotes);
|
||||||
|
|
||||||
if (dutyInfo.IsLimsaStart)
|
if (cfcData.ContentFinderConditionId is 332 or 333 or 313 or 334)
|
||||||
startingCityBattles[EAetheryteLocation.Limsa].Add(dutyInfo);
|
startingCityBattles[EAetheryteLocation.Limsa].Add(dutyInfo);
|
||||||
else if (dutyInfo.IsGridaniaStart)
|
else if (cfcData.ContentFinderConditionId is 296 or 297 or 299 or 298)
|
||||||
startingCityBattles[EAetheryteLocation.Gridania].Add(dutyInfo);
|
startingCityBattles[EAetheryteLocation.Gridania].Add(dutyInfo);
|
||||||
else if (dutyInfo.IsUldahStart)
|
else if (cfcData.ContentFinderConditionId is 335 or 312 or 337 or 336)
|
||||||
startingCityBattles[EAetheryteLocation.Uldah].Add(dutyInfo);
|
startingCityBattles[EAetheryteLocation.Uldah].Add(dutyInfo);
|
||||||
else if (questInfo.IsMainScenarioQuest)
|
else if (questInfo.IsMainScenarioQuest)
|
||||||
mainScenarioBattles.Add(dutyInfo);
|
mainScenarioBattles.Add(dutyInfo);
|
||||||
@ -150,7 +196,7 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
foreach (var roleClassJob in classJobs)
|
foreach (var roleClassJob in classJobs)
|
||||||
roleQuestBattles[roleClassJob].Add(dutyInfo);
|
roleQuestBattles[roleClassJob].Add(dutyInfo);
|
||||||
}
|
}
|
||||||
else if (dutyInfo.IsOtherRoleQuest)
|
else if (dutyInfo.CfcId is 845 or 1016)
|
||||||
otherRoleQuestBattles.Add(dutyInfo);
|
otherRoleQuestBattles.Add(dutyInfo);
|
||||||
else
|
else
|
||||||
otherBattles.Add(dutyInfo);
|
otherBattles.Add(dutyInfo);
|
||||||
@ -174,7 +220,7 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
x =>
|
x =>
|
||||||
x.Value
|
x.Value
|
||||||
// level 10 quests use the same quest battle for [you started as this class] and [you picked this class up later]
|
// level 10 quests use the same quest battle for [you started as this class] and [you picked this class up later]
|
||||||
.DistinctBy(y => y.ContentFinderConditionId)
|
.DistinctBy(y => y.CfcId)
|
||||||
.OrderBy(y => y.JournalGenreId)
|
.OrderBy(y => y.JournalGenreId)
|
||||||
.ThenBy(y => y.SortKey)
|
.ThenBy(y => y.SortKey)
|
||||||
.ThenBy(y => y.Index)
|
.ThenBy(y => y.Index)
|
||||||
@ -196,47 +242,6 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
.ToImmutableList();
|
.ToImmutableList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private (bool Enabled, SinglePlayerDutyOptions Options) FindDutyOptions(ElementId questId, byte index)
|
|
||||||
{
|
|
||||||
SinglePlayerDutyOptions options = new()
|
|
||||||
{
|
|
||||||
Index = 0,
|
|
||||||
Enabled = false,
|
|
||||||
};
|
|
||||||
if (_questRegistry.TryGetQuest(questId, out var quest))
|
|
||||||
{
|
|
||||||
if (quest.Root.Disabled)
|
|
||||||
{
|
|
||||||
_logger.LogDebug("Disabling quest battle for quest {QuestId}, quest is disabled", questId);
|
|
||||||
return (false, options);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var foundStep = quest.AllSteps()
|
|
||||||
.Select(x => x.Step)
|
|
||||||
.FirstOrDefault(x =>
|
|
||||||
x.InteractionType == EInteractionType.SinglePlayerDuty &&
|
|
||||||
x.SinglePlayerDutyIndex == index);
|
|
||||||
if (foundStep == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning(
|
|
||||||
"Disabling quest battle for quest {QuestId}, no battle with index {Index} found", questId,
|
|
||||||
index);
|
|
||||||
return (false, options);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return (true, foundStep.SinglePlayerDutyOptions ?? options);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_logger.LogDebug("Disabling quest battle for quest {QuestId}, unknown quest", questId);
|
|
||||||
return (false, options);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private string BuildJournalGenreLabel(uint journalGenreId)
|
private string BuildJournalGenreLabel(uint journalGenreId)
|
||||||
{
|
{
|
||||||
var journalGenre = _dataManager.GetExcelSheet<JournalGenre>().GetRow(journalGenreId);
|
var journalGenre = _dataManager.GetExcelSheet<JournalGenre>().GetRow(journalGenreId);
|
||||||
@ -245,7 +250,7 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
string genreName = journalGenre.Name.ExtractText();
|
string genreName = journalGenre.Name.ExtractText();
|
||||||
string categoryName = journalCategory.Name.ExtractText();
|
string categoryName = journalCategory.Name.ExtractText();
|
||||||
|
|
||||||
return $"{categoryName} \u203B {genreName}";
|
return $"{categoryName} {SeIconChar.ArrowRight.ToIconString()} {genreName}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DrawTab()
|
public override void DrawTab()
|
||||||
@ -418,13 +423,13 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
{
|
{
|
||||||
ImGui.TableNextRow();
|
ImGui.TableNextRow();
|
||||||
|
|
||||||
string[] labels = dutyInfo.EnabledByDefault
|
string[] labels = dutyInfo.BossModEnabledByDefault
|
||||||
? SupportedCfcOptions
|
? SupportedCfcOptions
|
||||||
: UnsupportedCfcOptions;
|
: UnsupportedCfcOptions;
|
||||||
int value = 0;
|
int value = 0;
|
||||||
if (Configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Contains(dutyInfo.ContentFinderConditionId))
|
if (Configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Contains(dutyInfo.CfcId))
|
||||||
value = 1;
|
value = 1;
|
||||||
if (Configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Contains(dutyInfo.ContentFinderConditionId))
|
if (Configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Contains(dutyInfo.CfcId))
|
||||||
value = 2;
|
value = 2;
|
||||||
|
|
||||||
if (ImGui.TableNextColumn())
|
if (ImGui.TableNextColumn())
|
||||||
@ -440,7 +445,7 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
ImGui.TextUnformatted(dutyInfo.Name);
|
ImGui.TextUnformatted(dutyInfo.Name);
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.BulletText($"TerritoryId: {dutyInfo.TerritoryId}");
|
ImGui.BulletText($"TerritoryId: {dutyInfo.TerritoryId}");
|
||||||
ImGui.BulletText($"ContentFinderConditionId: {dutyInfo.ContentFinderConditionId}");
|
ImGui.BulletText($"ContentFinderConditionId: {dutyInfo.CfcId}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,18 +457,11 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
else if (dutyInfo.Notes.Count > 0)
|
else if (dutyInfo.Notes.Count > 0)
|
||||||
{
|
{
|
||||||
using var color = new ImRaii.Color();
|
using var color = new ImRaii.Color();
|
||||||
if (!dutyInfo.EnabledByDefault)
|
color.Push(ImGuiCol.TextDisabled, ImGuiColors.DalamudYellow);
|
||||||
color.Push(ImGuiCol.TextDisabled, ImGuiColors.DalamudYellow);
|
|
||||||
else
|
|
||||||
color.Push(ImGuiCol.TextDisabled, ImGuiColors.ParsedBlue);
|
|
||||||
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
using (ImRaii.PushFont(UiBuilder.IconFont))
|
using (ImRaii.PushFont(UiBuilder.IconFont))
|
||||||
{
|
{
|
||||||
if (!dutyInfo.EnabledByDefault)
|
ImGui.TextDisabled(FontAwesomeIcon.ExclamationTriangle.ToIconString());
|
||||||
ImGui.TextDisabled(FontAwesomeIcon.ExclamationTriangle.ToIconString());
|
|
||||||
else
|
|
||||||
ImGui.TextDisabled(FontAwesomeIcon.InfoCircle.ToIconString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui.IsItemHovered())
|
if (ImGui.IsItemHovered())
|
||||||
@ -480,19 +478,19 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
|
|
||||||
if (ImGui.TableNextColumn())
|
if (ImGui.TableNextColumn())
|
||||||
{
|
{
|
||||||
using var _ = ImRaii.PushId($"##Duty{dutyInfo.ContentFinderConditionId}");
|
using var _ = ImRaii.PushId($"##Duty{dutyInfo.CfcId}");
|
||||||
using (ImRaii.Disabled(!dutyInfo.Enabled))
|
using (ImRaii.Disabled(!dutyInfo.Enabled))
|
||||||
{
|
{
|
||||||
ImGui.SetNextItemWidth(200);
|
ImGui.SetNextItemWidth(200);
|
||||||
if (ImGui.Combo(string.Empty, ref value, labels, labels.Length))
|
if (ImGui.Combo(string.Empty, ref value, labels, labels.Length))
|
||||||
{
|
{
|
||||||
Configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Remove(dutyInfo.ContentFinderConditionId);
|
Configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Remove(dutyInfo.CfcId);
|
||||||
Configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Remove(dutyInfo.ContentFinderConditionId);
|
Configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Remove(dutyInfo.CfcId);
|
||||||
|
|
||||||
if (value == 1)
|
if (value == 1)
|
||||||
Configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Add(dutyInfo.ContentFinderConditionId);
|
Configuration.SinglePlayerDuties.WhitelistedSinglePlayerDutyCfcIds.Add(dutyInfo.CfcId);
|
||||||
else if (value == 2)
|
else if (value == 2)
|
||||||
Configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Add(dutyInfo.ContentFinderConditionId);
|
Configuration.SinglePlayerDuties.BlacklistedSinglePlayerDutyCfcIds.Add(dutyInfo.CfcId);
|
||||||
|
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
@ -521,28 +519,14 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent
|
|||||||
}
|
}
|
||||||
|
|
||||||
private sealed record SinglePlayerDutyInfo(
|
private sealed record SinglePlayerDutyInfo(
|
||||||
|
uint CfcId,
|
||||||
|
uint TerritoryId,
|
||||||
string Name,
|
string Name,
|
||||||
IQuestInfo QuestInfo,
|
EExpansionVersion Expansion,
|
||||||
TerritoryData.ContentFinderConditionData ContentFinderConditionData,
|
uint JournalGenreId,
|
||||||
SinglePlayerDutyOptions Options,
|
ushort SortKey,
|
||||||
bool Enabled)
|
byte Index,
|
||||||
{
|
bool Enabled,
|
||||||
public EExpansionVersion Expansion => QuestInfo.Expansion;
|
bool BossModEnabledByDefault,
|
||||||
public uint JournalGenreId => QuestInfo.JournalGenre ?? uint.MaxValue;
|
List<string> Notes);
|
||||||
public ushort SortKey => QuestInfo.SortKey;
|
|
||||||
public uint ContentFinderConditionId => ContentFinderConditionData.ContentFinderConditionId;
|
|
||||||
public uint TerritoryId => ContentFinderConditionData.TerritoryId;
|
|
||||||
public byte Index => Options.Index;
|
|
||||||
public bool EnabledByDefault => Options.Enabled;
|
|
||||||
public IReadOnlyList<string> Notes => Options.Notes;
|
|
||||||
|
|
||||||
public bool IsLimsaStart => ContentFinderConditionId is 332 or 333 or 313 or 334;
|
|
||||||
public bool IsGridaniaStart => ContentFinderConditionId is 296 or 297 or 299 or 298;
|
|
||||||
public bool IsUldahStart => ContentFinderConditionId is 335 or 312 or 337 or 336;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 'Other' role quest is the post-EW/DT role quests.
|
|
||||||
/// </summary>
|
|
||||||
public bool IsOtherRoleQuest => ContentFinderConditionId is 845 or 1016;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user