Use named aetherytes/aethernet shards for attuning (instead of ids)

pull/7/head
Liza 2024-07-17 12:58:08 +02:00
parent 98cca32acc
commit aa73231f38
Signed by: liza
GPG Key ID: 7199F8D727D55F67
93 changed files with 1177 additions and 1440 deletions

View File

@ -17,15 +17,15 @@
<ItemGroup>
<PackageReference Include="Json.More.Net" Version="2.0.1.2" GeneratePathProperty="true" />
<PackageReference Include="JsonPointer.Net" Version="5.0.0" GeneratePathProperty="true" />
<PackageReference Include="JsonSchema.Net" Version="7.0.4" GeneratePathProperty="true" />
<PackageReference Include="JsonPointer.Net" Version="5.0.2" GeneratePathProperty="true" />
<PackageReference Include="JsonSchema.Net" Version="7.1.2" GeneratePathProperty="true" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2"/>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.9.2"/>
<PackageReference Include="System.Text.Json" Version="8.0.3" PrivateAssets="all"/>
<PackageReference Include="System.Text.Json" Version="8.0.4" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>

View File

@ -65,7 +65,7 @@ public class QuestSourceGenerator : ISourceGenerator
continue;
var questNode = JsonNode.Parse(text.ToString());
var evaluationResult = questSchema.Evaluate(questNode, new EvaluationOptions()
var evaluationResult = questSchema.Evaluate(questNode, new EvaluationOptions
{
Culture = CultureInfo.InvariantCulture,
OutputFormat = OutputFormat.List
@ -323,6 +323,10 @@ public class QuestSourceGenerator : ISourceGenerator
.AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.Comment), step.Comment, emptyStep.Comment)
.AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.Aetheryte), step.Aetheryte, emptyStep.Aetheryte)
.AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.AethernetShard), step.AethernetShard, emptyStep.AethernetShard)
.AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.AetheryteShortcut), step.AetheryteShortcut,
emptyStep.AetheryteShortcut)
.AsSyntaxNodeOrToken(),

View File

@ -13,9 +13,9 @@
},
"JsonPointer.Net": {
"type": "Direct",
"requested": "[5.0.0, )",
"resolved": "5.0.0",
"contentHash": "fm4T5w20AY6C+p5/pJr0vrXRNGgtSfHl34I1LxC9zdPwS9S3j0GiR1Mz/CVPWKDXXGDpCt1APHpCq7kn5adCfA==",
"requested": "[5.0.2, )",
"resolved": "5.0.2",
"contentHash": "H/OtixKadr+ja1j7Fru3WG56V9zP0AKT1Bd0O7RWN/zH1bl8ZIwW9aCa4+xvzuVvt4SPmrvBu3G6NpAkNOwNAA==",
"dependencies": {
"Humanizer.Core": "2.14.1",
"Json.More.Net": "2.0.1.2"
@ -23,9 +23,9 @@
},
"JsonSchema.Net": {
"type": "Direct",
"requested": "[7.0.4, )",
"resolved": "7.0.4",
"contentHash": "R0Hk2Tr/np4Q1NO8CBjyQsoiD1iFJyEQP20Sw7JnZCNGJoaSBe+g4b+nZqnBXPQhiqY5LGZ8JZwZkRh/eKZhEQ==",
"requested": "[7.1.2, )",
"resolved": "7.1.2",
"contentHash": "tvM82Wpsyk+C5aUWkqPZLo2ANDjEfCoDa9R24k7jRkCrwxbXnSBb7NpU1pz0ufp6qw+jIekHD9xJdUkjUtnZxQ==",
"dependencies": {
"JsonPointer.Net": "5.0.0"
}
@ -68,9 +68,9 @@
},
"System.Text.Json": {
"type": "Direct",
"requested": "[8.0.3, )",
"resolved": "8.0.3",
"contentHash": "hpagS9joOwv6efWfrMmV9MjQXpiXZH72PgN067Ysfr6AWMSD1/1hEcvh/U5mUpPLezEWsOJSuVrmqDIVD958iA==",
"requested": "[8.0.4, )",
"resolved": "8.0.4",
"contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "8.0.0",
"System.Buffers": "4.5.1",
@ -264,7 +264,7 @@
"questionable.model": {
"type": "Project",
"dependencies": {
"System.Text.Json": "[8.0.3, )"
"System.Text.Json": "[8.0.4, )"
}
}
}

View File

@ -0,0 +1,30 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"Position": {
"X": -336.41187,
"Y": 12.899764,
"Z": 3.5517142
},
"TerritoryId": 129,
"InteractionType": "WalkTo"
},
{
"DataId": 1000895,
"Position": {
"X": -335.74432,
"Y": 12.899764,
"Z": 1.3884888
},
"TerritoryId": 129,
"InteractionType": "AcceptQuest"
}
]
}
]
}

View File

@ -31,15 +31,9 @@
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 2,
"Position": {
"X": 32.913696,
"Y": 2.670288,
"Z": 30.014404
},
"StopDistance": 10,
"TerritoryId": 132,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Gridania",
"CompletionQuestVariablesFlags": [
null,
null,
@ -50,15 +44,9 @@
]
},
{
"DataId": 25,
"Position": {
"X": 166.58276,
"Y": -1.7243042,
"Z": 86.13721
},
"TerritoryId": 132,
"InteractionType": "AttuneAethernetShard",
"Comment": "Archers' Guild"
"AethernetShard": "[Gridania] Archers' Guild"
},
{
"DataId": 1000197,
@ -110,41 +98,23 @@
"Sequence": 255,
"Steps": [
{
"DataId": 26,
"Position": {
"X": 101.27405,
"Y": 9.018005,
"Z": -111.31464
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Leatherworkers' Guild"
"AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
},
{
"DataId": 27,
"Position": {
"X": 121.23291,
"Y": 12.649658,
"Z": -229.63306
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Lancers' Guild"
"AethernetShard": "[Gridania] Lancers' Guild"
},
{
"DataId": 30,
"Position": {
"X": -73.92999,
"Y": 7.9804688,
"Z": -140.15417
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
"AethernetShortcut": [
"[Gridania] Lancers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower"
],
"Comment": "Mih Khetto's Amphitheatre"
]
},
{
"Position": {
@ -156,30 +126,18 @@
"InteractionType": "WalkTo"
},
{
"DataId": 29,
"Position": {
"X": -311.0857,
"Y": 7.94989,
"Z": -177.05048
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Botanists' Guild"
"AethernetShard": "[Gridania] Botanists' Guild"
},
{
"DataId": 28,
"Position": {
"X": -145.15906,
"Y": 4.9591064,
"Z": -11.7647705
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Conjurers' Guild",
"AethernetShortcut": [
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre"
],
"Comment": "Conjurers' Guild"
]
},
{
"DataId": 1000100,

View File

@ -31,15 +31,9 @@
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 2,
"Position": {
"X": 32.913696,
"Y": 2.670288,
"Z": 30.014404
},
"StopDistance": 10,
"TerritoryId": 132,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Gridania",
"CompletionQuestVariablesFlags": [
null,
null,
@ -50,15 +44,9 @@
]
},
{
"DataId": 25,
"Position": {
"X": 166.58276,
"Y": -1.7243042,
"Z": 86.13721
},
"TerritoryId": 132,
"InteractionType": "AttuneAethernetShard",
"Comment": "Archers' Guild"
"AethernetShard": "[Gridania] Archers' Guild"
},
{
"Position": {
@ -83,41 +71,23 @@
"$": "If done after aetheryte: 33 1 0 0 0 128"
},
{
"DataId": 26,
"Position": {
"X": 101.27405,
"Y": 9.018005,
"Z": -111.31464
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Leatherworkers' Guild"
"AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
},
{
"DataId": 27,
"Position": {
"X": 121.23291,
"Y": 12.649658,
"Z": -229.63306
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Lancers' Guild"
"AethernetShard": "[Gridania] Lancers' Guild"
},
{
"DataId": 30,
"Position": {
"X": -73.92999,
"Y": 7.9804688,
"Z": -140.15417
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
"AethernetShortcut": [
"[Gridania] Lancers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower"
],
"Comment": "Mih Khetto's Amphitheatre"
]
},
{
"Position": {
@ -129,30 +99,18 @@
"InteractionType": "WalkTo"
},
{
"DataId": 29,
"Position": {
"X": -311.0857,
"Y": 7.94989,
"Z": -177.05048
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Botanists' Guild"
"AethernetShard": "[Gridania] Botanists' Guild"
},
{
"DataId": 28,
"Position": {
"X": -145.15906,
"Y": 4.9591064,
"Z": -11.7647705
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Conjurers' Guild",
"AethernetShortcut": [
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre"
],
"Comment": "Conjurers' Guild"
]
},
{
"DataId": 1000323,

View File

@ -21,15 +21,9 @@
"Sequence": 255,
"Steps": [
{
"DataId": 3,
"Position": {
"X": 13.076904,
"Y": 0.56451416,
"Z": 35.90442
},
"StopDistance": 10,
"TerritoryId": 148,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Central Shroud - Bentbranch Meadows",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Blue Badger Gate (Central Shroud)"

View File

@ -162,48 +162,24 @@
"Sequence": 6,
"Steps": [
{
"DataId": 8,
"Position": {
"X": -84.00108,
"Y": 20.77683,
"Z": 0.03414845
},
"StopDistance": 10,
"TerritoryId": 129,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Limsa Lominsa"
},
{
"DataId": 49,
"Position": {
"X": -213.61108,
"Y": 16.739136,
"Z": 51.80432
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Hawkers' Alley"
"AethernetShard": "[Limsa Lominsa] Hawkers' Alley"
},
{
"DataId": 43,
"Position": {
"X": -335.1645,
"Y": 12.619202,
"Z": 56.381958
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Arcanists' Guild"
"AethernetShard": "[Limsa Lominsa] Arcanists' Guild"
},
{
"DataId": 44,
"Position": {
"X": -179.40033,
"Y": 4.8065186,
"Z": 182.97095
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Fishermens' Guild",
"AethernetShard": "[Limsa Lominsa] Fishermens' Guild",
"AethernetShortcut": [
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Hawkers' Alley"
@ -225,37 +201,19 @@
]
},
{
"DataId": 42,
"Position": {
"X": -56.50421,
"Y": 44.47998,
"Z": -131.45648
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Culinarians' Guild"
"AethernetShard": "[Limsa Lominsa] Culinarians' Guild"
},
{
"DataId": 48,
"Position": {
"X": -5.1728516,
"Y": 44.63257,
"Z": -218.06671
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Marauders' Guild"
"AethernetShard": "[Limsa Lominsa] Marauders' Guild"
},
{
"DataId": 41,
"Position": {
"X": 16.067688,
"Y": 40.787354,
"Z": 68.80286
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Aftcastle"
"AethernetShard": "[Limsa Lominsa] The Aftcastle"
},
{
"DataId": 1002695,
@ -358,14 +316,9 @@
]
},
{
"DataId": 51,
"Position": {
"X": 6.6376343,
"Y": 30.655273,
"Z": -24.826477
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Ul'dah] The Chamber of Rule"
},
{
"DataId": 1001821,

View File

@ -31,15 +31,9 @@
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 2,
"Position": {
"X": 32.913696,
"Y": 2.670288,
"Z": 30.014404
},
"StopDistance": 10,
"TerritoryId": 132,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Gridania",
"CompletionQuestVariablesFlags": [
null,
null,
@ -50,15 +44,9 @@
]
},
{
"DataId": 25,
"Position": {
"X": 166.58276,
"Y": -1.7243042,
"Z": 86.13721
},
"TerritoryId": 132,
"InteractionType": "AttuneAethernetShard",
"Comment": "Archers' Guild"
"AethernetShard": "[Gridania] Archers' Guild"
},
{
"Position": {
@ -83,26 +71,14 @@
"$": "If done after aetheryte: 33 1 0 0 0 128"
},
{
"DataId": 26,
"Position": {
"X": 101.27405,
"Y": 9.018005,
"Z": -111.31464
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Leatherworkers' Guild"
"AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
},
{
"DataId": 27,
"Position": {
"X": 121.23291,
"Y": 12.649658,
"Z": -229.63306
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Lancers' Guild"
"AethernetShard": "[Gridania] Lancers' Guild"
},
{
"DataId": 1000251,
@ -132,19 +108,13 @@
"Comment": "Pick up Class Quest"
},
{
"DataId": 30,
"Position": {
"X": -73.92999,
"Y": 7.9804688,
"Z": -140.15417
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
"AethernetShortcut": [
"[Gridania] Lancers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower"
],
"Comment": "Mih Khetto's Amphitheatre"
]
},
{
"Position": {
@ -156,38 +126,20 @@
"InteractionType": "WalkTo"
},
{
"DataId": 29,
"Position": {
"X": -311.0857,
"Y": 7.94989,
"Z": -177.05048
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Botanists' Guild"
"AethernetShard": "[Gridania] Botanists' Guild"
},
{
"DataId": 28,
"Position": {
"X": -145.15906,
"Y": 4.9591064,
"Z": -11.7647705
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Conjurers' Guild",
"AethernetShortcut": [
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre"
],
"Comment": "Conjurers' Guild"
]
},
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "CompleteQuest",
"AethernetShortcut": [

View File

@ -127,15 +127,9 @@
"Comment": "Quest Turn-In (Making a Name)"
},
{
"DataId": 8,
"Position": {
"X": -84.031494,
"Y": 20.767456,
"Z": 0.015197754
},
"StopDistance": 10,
"TerritoryId": 129,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Limsa Lominsa",
"CompletionQuestVariablesFlags": [
null,
null,
@ -164,37 +158,19 @@
]
},
{
"DataId": 49,
"Position": {
"X": -213.61108,
"Y": 16.739136,
"Z": 51.80432
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Hawkers' Alley"
"AethernetShard": "[Limsa Lominsa] Hawkers' Alley"
},
{
"DataId": 43,
"Position": {
"X": -335.1645,
"Y": 12.619202,
"Z": 56.381958
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Arcanists' Guild"
"AethernetShard": "[Limsa Lominsa] Arcanists' Guild"
},
{
"DataId": 44,
"Position": {
"X": -179.40033,
"Y": 4.8065186,
"Z": 182.97095
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Fishermens' Guild",
"AethernetShard": "[Limsa Lominsa] Fishermens' Guild",
"AethernetShortcut": [
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Hawkers' Alley"
@ -216,26 +192,14 @@
]
},
{
"DataId": 42,
"Position": {
"X": -56.50421,
"Y": 44.47998,
"Z": -131.45648
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Culinarians' Guild"
"AethernetShard": "[Limsa Lominsa] Culinarians' Guild"
},
{
"DataId": 48,
"Position": {
"X": -5.1728516,
"Y": 44.63257,
"Z": -218.06671
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Marauders' Guild"
"AethernetShard": "[Limsa Lominsa] Marauders' Guild"
},
{
"DataId": 1000926,

View File

@ -127,15 +127,9 @@
"Comment": "Quest Turn-In (Making a Name)"
},
{
"DataId": 8,
"Position": {
"X": -84.031494,
"Y": 20.767456,
"Z": 0.015197754
},
"StopDistance": 10,
"TerritoryId": 129,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Gridania",
"CompletionQuestVariablesFlags": [
null,
null,
@ -164,26 +158,14 @@
]
},
{
"DataId": 49,
"Position": {
"X": -213.61108,
"Y": 16.739136,
"Z": 51.80432
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Hawkers' Alley"
"AethernetShard": "[Limsa Lominsa] Hawkers' Alley"
},
{
"DataId": 43,
"Position": {
"X": -335.1645,
"Y": 12.619202,
"Z": 56.381958
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Arcanists' Guild"
"AethernetShard": "[Limsa Lominsa] Arcanists' Guild"
},
{
"DataId": 1000895,
@ -221,15 +203,9 @@
"Comment": "Pick up Class Quest"
},
{
"DataId": 44,
"Position": {
"X": -179.40033,
"Y": 4.8065186,
"Z": 182.97095
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Fishermens' Guild",
"AethernetShard": "[Limsa Lominsa] Fishermens' Guild",
"AethernetShortcut": [
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Hawkers' Alley"
@ -251,26 +227,14 @@
]
},
{
"DataId": 42,
"Position": {
"X": -56.50421,
"Y": 44.47998,
"Z": -131.45648
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Culinarians' Guild"
"AethernetShard": "[Limsa Lominsa] Culinarians' Guild"
},
{
"DataId": 48,
"Position": {
"X": -5.1728516,
"Y": 44.63257,
"Z": -218.06671
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Marauders' Guild"
"AethernetShard": "[Limsa Lominsa] Marauders' Guild"
},
{
"DataId": 1000972,

View File

@ -47,15 +47,9 @@
"TargetTerritoryId": 138
},
{
"DataId": 13,
"Position": {
"X": 651.5449,
"Y": 11.734131,
"Z": 513.35913
},
"StopDistance": 10,
"TerritoryId": 138,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Western La Noscea - Swiftperch"
},
{
"Position": {

View File

@ -31,15 +31,9 @@
"TargetTerritoryId": 135
},
{
"DataId": 10,
"Position": {
"X": 156.11499,
"Y": 15.518433,
"Z": 673.21277
},
"StopDistance": 10,
"TerritoryId": 135,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Lower La Noscea - Moraby Drydocks"
},
{
"DataId": 1002238,

View File

@ -21,25 +21,14 @@
"Sequence": 255,
"Steps": [
{
"DataId": 41,
"Position": {
"X": 16.067688,
"Y": 40.787354,
"Z": 68.80286
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Limsa Lominsa] The Aftcastle"
},
{
"DataId": 52,
"Position": {
"X": 227.98499,
"Y": 115.526,
"Z": -257.0382
},
"StopDistance": 10,
"TerritoryId": 134,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Middle La Noscea - Summerford Farms",
"AethernetShortcut": [
"[Limsa Lominsa] The Aftcastle",
"[Limsa Lominsa] Zephyr Gate (Middle La Noscea)"

View File

@ -162,26 +162,14 @@
"Sequence": 5,
"Steps": [
{
"DataId": 2,
"Position": {
"X": 32.913696,
"Y": 2.670288,
"Z": 30.014404
},
"StopDistance": 10,
"TerritoryId": 132,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Gridania"
},
{
"DataId": 25,
"Position": {
"X": 166.58276,
"Y": -1.7243042,
"Z": 86.13721
},
"TerritoryId": 132,
"InteractionType": "AttuneAethernetShard",
"Comment": "Archers' Guild"
"AethernetShard": "[Gridania] Archers' Guild"
},
{
"Position": {
@ -198,41 +186,23 @@
]
},
{
"DataId": 26,
"Position": {
"X": 101.27405,
"Y": 9.018005,
"Z": -111.31464
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Leatherworkers' Guild"
"AethernetShard": "[Gridania] Leatherworkers' Guild & Shaded Bower"
},
{
"DataId": 27,
"Position": {
"X": 121.23291,
"Y": 12.649658,
"Z": -229.63306
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Lancers' Guild"
"AethernetShard": "[Gridania] Lancers' Guild"
},
{
"DataId": 30,
"Position": {
"X": -73.92999,
"Y": 7.9804688,
"Z": -140.15417
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Mih Khetto's Amphitheatre",
"AethernetShortcut": [
"[Gridania] Lancers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower"
],
"Comment": "Mih Khetto's Amphitheatre"
]
},
{
"Position": {
@ -244,30 +214,18 @@
"InteractionType": "WalkTo"
},
{
"DataId": 29,
"Position": {
"X": -311.0857,
"Y": 7.94989,
"Z": -177.05048
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Botanists' Guild"
"AethernetShard": "[Gridania] Botanists' Guild"
},
{
"DataId": 28,
"Position": {
"X": -145.15906,
"Y": 4.9591064,
"Z": -11.7647705
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Gridania] Conjurers' Guild",
"AethernetShortcut": [
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre"
],
"Comment": "Conjurers' Guild"
]
},
{
"DataId": 1000460,
@ -385,14 +343,9 @@
]
},
{
"DataId": 51,
"Position": {
"X": 6.6376343,
"Y": 30.655273,
"Z": -24.826477
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Ul'dah] The Chamber of Rule"
},
{
"DataId": 1001821,

View File

@ -22,15 +22,9 @@
"Sequence": 255,
"Steps": [
{
"DataId": 37,
"Position": {
"X": -98.22869,
"Y": 42.37336,
"Z": 88.46719
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard",
"Comment": "Alchemists' Guild"
"AethernetShard": "[Ul'dah] Alchemists' Guild"
},
{
"Position": {
@ -54,59 +48,29 @@
]
},
{
"DataId": 35,
"Position": {
"X": -53.8269,
"Y": 10.72502,
"Z": 12.24082
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard",
"Comment": "Gladiators' Guild"
"AethernetShard": "[Ul'dah] Gladiators' Guild"
},
{
"DataId": 50,
"Position": {
"X": -19.31449,
"Y": 14.63075,
"Z": 72.0533
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard",
"Comment": "Goldsmiths' Guild"
"AethernetShard": "[Ul'dah] Goldsmiths' Guild"
},
{
"DataId": 36,
"Position": {
"X": 33.52188,
"Y": 13.23228,
"Z": 113.2191
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard",
"Comment": "Miners' Guild"
"AethernetShard": "[Ul'dah] Miners' Guild"
},
{
"DataId": 47,
"Position": {
"X": 89.67633,
"Y": 12.93493,
"Z": 58.2767
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard",
"Comment": "Weavers' Guild"
"AethernetShard": "[Ul'dah] Weavers' Guild"
},
{
"DataId": 125,
"Position": {
"X": 131.9447,
"Y": 4.714966,
"Z": -29.800903
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard",
"Comment": "Sapphire Avenue Exchange"
"AethernetShard": "[Ul'dah] Sapphire Avenue Exchange"
},
{
"Position": {
@ -119,36 +83,19 @@
"TargetTerritoryId": 130
},
{
"DataId": 33,
"Position": {
"X": 64.22522,
"Y": 4.5318604,
"Z": -115.31244
},
"TerritoryId": 130,
"InteractionType": "AttuneAethernetShard",
"Comment": "Adventurers' Guild"
"AethernetShard": "[Ul'dah] Adventurers' Guild"
},
{
"DataId": 9,
"Position": {
"X": -144.51825,
"Y": -1.3580933,
"Z": -169.6651
},
"StopDistance": 10,
"TerritoryId": 130,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Ul'dah"
},
{
"DataId": 34,
"Position": {
"X": -154.83331,
"Y": 14.633362,
"Z": 73.07532
},
"TerritoryId": 130,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Ul'dah] Thaumaturges' Guild"
},
{
"DataId": 1000972,

View File

@ -88,15 +88,9 @@
"TargetTerritoryId": 138
},
{
"DataId": 14,
"Position": {
"X": 260.94446,
"Y": -19.60791,
"Z": 218.52441
},
"StopDistance": 10,
"TerritoryId": 138,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Western La Noscea - Aleport"
},
{
"DataId": 1017075,

View File

@ -44,15 +44,9 @@
"Sequence": 255,
"Steps": [
{
"DataId": 53,
"Position": {
"X": -16.159302,
"Y": 0.32037354,
"Z": -166.58276
},
"StopDistance": 10,
"TerritoryId": 141,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Central Thanalan - Black Brush Station",
"AetheryteShortcut": "Ul'dah",
"AethernetShortcut": [
"[Ul'dah] Aetheryte Plaza",
@ -80,15 +74,9 @@
"$": "Camp Drybone Lantern"
},
{
"DataId": 18,
"Position": {
"X": -386.3432,
"Y": -57.1756,
"Z": 142.59558
},
"StopDistance": 10,
"TerritoryId": 145,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Eastern Thanalan - Camp Drybone"
},
{
"DataId": 1003929,

View File

@ -40,15 +40,9 @@
"Sequence": 2,
"Steps": [
{
"DataId": 17,
"Position": {
"X": 68.0094,
"Y": 48.203125,
"Z": -227.039
},
"StopDistance": 10,
"TerritoryId": 140,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Western Thanalan - Horizon",
"AethernetShortcut": [
"[Ul'dah] Adventurers' Guild",
"[Ul'dah] Gate of the Sultana (Western Thanalan)"

View File

@ -34,15 +34,9 @@
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 3,
"Position": {
"X": 13.076904,
"Y": 0.56451416,
"Z": 35.90442
},
"StopDistance": 10,
"TerritoryId": 148,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Central Shroud - Bentbranch Meadows",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Blue Badger Gate (Central Shroud)"

View File

@ -32,15 +32,10 @@
"AetheryteShortcut": "Central Thanalan - Black Brush Station"
},
{
"DataId": 21,
"Position": {
"X": 20.98108,
"Y": 8.8349,
"Z": 454.0321
},
"TerritoryId": 147,
"StopDistance": 5,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Northern Thanalan - Camp Bluefog"
},
{
"DataId": 1006638,

View File

@ -25,15 +25,10 @@
"Sequence": 1,
"Steps": [
{
"DataId": 22,
"Position": {
"X": -26.596497,
"Y": 49.881714,
"Z": -30.838562
},
"TerritoryId": 147,
"StopDistance": 5,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Northern Thanalan - Ceruleum Processing Plant"
},
{
"DataId": 1006647,

View File

@ -44,15 +44,10 @@
"Sequence": 255,
"Steps": [
{
"DataId": 23,
"Position": {
"X": 223.98718,
"Y": 315.7854,
"Z": -234.85168
},
"TerritoryId": 155,
"StopDistance": 5,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Coerthas Central Highlands - Camp Dragonhead"
},
{
"DataId": 1006384,

View File

@ -52,15 +52,10 @@
"InteractionType": "WalkTo"
},
{
"DataId": 24,
"Position": {
"X": 40.024292,
"Y": 24.002441,
"Z": -668.0247
},
"TerritoryId": 156,
"StopDistance": 5,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Mor Dhona"
},
{
"DataId": 1006530,

View File

@ -1,16 +0,0 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 1,
"Steps": [
{
"TerritoryId": 829,
"InteractionType": "Duty",
"ContentFinderConditionId": 611
}
]
}
]
}

View File

@ -0,0 +1,74 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 1,
"Steps": [
{
"TerritoryId": 829,
"InteractionType": "Duty",
"ContentFinderConditionId": 611
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1026845,
"Position": {
"X": -476.67664,
"Y": 107.63,
"Z": 103.74609
},
"StopDistance": 7,
"TerritoryId": 829,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 2002881,
"Position": {
"X": 21.133728,
"Y": 22.323914,
"Z": -631.281
},
"TerritoryId": 156,
"InteractionType": "Interact",
"TargetTerritoryId": 351,
"AetheryteShortcut": "Mor Dhona"
},
{
"DataId": 1026846,
"Position": {
"X": -1.6022339,
"Y": 0,
"Z": -9.658997
},
"TerritoryId": 351,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,73 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1026846,
"Position": {
"X": -1.6022339,
"Y": 0,
"Z": -9.658997
},
"TerritoryId": 351,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2002879,
"Position": {
"X": 0,
"Y": 3,
"Z": 27.5
},
"TerritoryId": 351,
"InteractionType": "Interact",
"TargetTerritoryId": 156
},
{
"Position": {
"X": 30.917934,
"Y": 20.495003,
"Z": -656.1909
},
"TerritoryId": 156,
"InteractionType": "WalkTo",
"Mount": true
},
{
"DataId": 1026794,
"Position": {
"X": 124.193115,
"Y": -15.239566,
"Z": -424.30762
},
"TerritoryId": 156,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1026797,
"Position": {
"X": -528.2521,
"Y": 8.691104,
"Z": -13.53479
},
"TerritoryId": 621,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,106 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"TerritoryBlacklist": [
830
],
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1026804,
"Position": {
"X": -524.55945,
"Y": 8.698304,
"Z": -15.487976
},
"StopDistance": 7,
"TerritoryId": 621,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1026804,
"Position": {
"X": -524.55945,
"Y": 8.698304,
"Z": -15.487976
},
"StopDistance": 7,
"TerritoryId": 621,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_STMBDG102_03185_Q1_000_002",
"Yes": true
}
]
},
{
"DataId": 1026845,
"Position": {
"X": -476.67664,
"Y": 107.63,
"Z": 103.74609
},
"TerritoryId": 829,
"InteractionType": "SinglePlayerDuty"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2002881,
"Position": {
"X": 21.133728,
"Y": 22.323914,
"Z": -631.281
},
"TerritoryId": 156,
"InteractionType": "Interact",
"AetheryteShortcut": "Mor Dhona",
"TargetTerritoryId": 351
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1026990,
"Position": {
"X": -2.4262085,
"Y": 0,
"Z": -9.10968
},
"StopDistance": 7,
"TerritoryId": 351,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -52,14 +52,9 @@
"Sequence": 3,
"Steps": [
{
"DataId": 189,
"Position": {
"X": 16.49812,
"Y": -16.247,
"Z": 127.753
},
"TerritoryId": 962,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Old Sharlayan] Scholar's Harbor"
},
{
"DataId": 1038578,
@ -103,15 +98,9 @@
"Sequence": 5,
"Steps": [
{
"DataId": 182,
"Position": {
"X": 0.08138847,
"Y": 4.818894,
"Z": -0.1004486
},
"StopDistance": 10,
"TerritoryId": 962,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Old Sharlayan"
},
{
"DataId": 1038578,
@ -164,14 +153,9 @@
"Sequence": 7,
"Steps": [
{
"DataId": 186,
"Position": {
"X": -36.94214,
"Y": 41.367188,
"Z": -156.6034
},
"TerritoryId": 962,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Old Sharlayan] The Rostra"
},
{
"DataId": 1038578,
@ -190,24 +174,14 @@
"Sequence": 8,
"Steps": [
{
"DataId": 187,
"Position": {
"X": 204.79126,
"Y": 21.774597,
"Z": -118.73047
},
"TerritoryId": 962,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Old Sharlayan] The Leveilleur Estate"
},
{
"DataId": 188,
"Position": {
"X": 206.22559,
"Y": 1.8463135,
"Z": 13.77887
},
"TerritoryId": 962,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Old Sharlayan] Journey's End"
},
{
"DataId": 1038578,

View File

@ -33,24 +33,14 @@
"TargetTerritoryId": 962
},
{
"DataId": 185,
"Position": {
"X": -92.21033,
"Y": 2.304016,
"Z": 29.709229
},
"TerritoryId": 962,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Old Sharlayan] The Baldesion Annex"
},
{
"DataId": 184,
"Position": {
"X": -291.1574,
"Y": 20.004517,
"Z": -74.143616
},
"TerritoryId": 962,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Old Sharlayan] The Studium"
},
{
"DataId": 1038675,

View File

@ -21,14 +21,9 @@
"Sequence": 1,
"Steps": [
{
"DataId": 166,
"Position": {
"X": 443.5338,
"Y": 170.6416,
"Z": -476.18835
},
"TerritoryId": 956,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Labyrinthos - Archeion"
},
{
"DataId": 1037475,

View File

@ -21,15 +21,10 @@
"Sequence": 1,
"Steps": [
{
"DataId": 169,
"Position": {
"X": 193.529,
"Y": 6.991216,
"Z": 629.2394
},
"StopDistance": 5,
"TerritoryId": 957,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Thavnair - Yedlihmad"
},
{
"DataId": 2011948,

View File

@ -36,15 +36,10 @@
"Sequence": 2,
"Steps": [
{
"DataId": 170,
"Position": {
"X": -527.4888,
"Y": 4.785123,
"Z": 36.76496
},
"StopDistance": 5,
"TerritoryId": 957,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Thavnair - Great Work"
},
{
"DataId": 1038631,

View File

@ -52,14 +52,9 @@
"Sequence": 3,
"Steps": [
{
"DataId": 194,
"Position": {
"X": 6.6071167,
"Y": -2.02948,
"Z": 110.55151
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] Alzadaal's Peace"
},
{
"DataId": 1040256,
@ -107,24 +102,14 @@
"Sequence": 6,
"Steps": [
{
"DataId": 193,
"Position": {
"X": -144.33508,
"Y": 27.969727,
"Z": 202.2583
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] Airship Landing"
},
{
"DataId": 191,
"Position": {
"X": -365.95715,
"Y": 44.99878,
"Z": -31.815125
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] Meghaduta"
},
{
"DataId": 1040259,

View File

@ -36,14 +36,9 @@
"Sequence": 2,
"Steps": [
{
"DataId": 192,
"Position": {
"X": -156.14563,
"Y": 35.99597,
"Z": 27.725586
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] Ruveydah Fibers"
},
{
"DataId": 1040264,

View File

@ -67,15 +67,10 @@
"Sequence": 3,
"Steps": [
{
"DataId": 172,
"Position": {
"X": -408.0791,
"Y": 24.18463,
"Z": 479.9764
},
"StopDistance": 7,
"TerritoryId": 958,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Garlemald - Camp Broken Glass"
},
{
"DataId": 1038826,

View File

@ -51,15 +51,10 @@
"Sequence": 3,
"Steps": [
{
"DataId": 173,
"Position": {
"X": 518.9136,
"Y": -35.324707,
"Z": -178.36273
},
"StopDistance": 7,
"TerritoryId": 958,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Garlemald - Tertium",
"DisableNavmesh": true
},
{

View File

@ -58,15 +58,9 @@
"Sequence": 3,
"Steps": [
{
"DataId": 174,
"Position": {
"X": -566.2438,
"Y": 134.6656,
"Z": 650.6459
},
"StopDistance": 10,
"TerritoryId": 959,
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Mare Lamentorum - Sinus Lacrimarum",
"Mount": true,
"DisableNavmesh": true
},

View File

@ -47,15 +47,9 @@
"Sequence": 2,
"Steps": [
{
"DataId": 175,
"Position": {
"X": -0.01531982,
"Y": -128.8109,
"Z": -512.0165
},
"StopDistance": 10,
"TerritoryId": 959,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Mare Lamentorum - Bestways Burrow"
},
{
"Position": {

View File

@ -149,14 +149,9 @@
"Sequence": 5,
"Steps": [
{
"DataId": 196,
"Position": {
"X": -42.61847,
"Y": -0.015319824,
"Z": -197.61963
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] Mehryde's Meyhane"
},
{
"DataId": 1039001,

View File

@ -51,14 +51,9 @@
"InteractionType": "Interact"
},
{
"DataId": 198,
"Position": {
"X": 129.59485,
"Y": 26.993164,
"Z": 13.473633
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] Kama"
},
{
"DataId": 1039540,

View File

@ -137,15 +137,9 @@
"InteractionType": "Interact"
},
{
"DataId": 171,
"Position": {
"X": 405.1422,
"Y": 5.2643433,
"Z": -244.4953
},
"StopDistance": 10,
"TerritoryId": 957,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Thavnair - Palaka's Stand"
},
{
"DataId": 1039016,

View File

@ -36,26 +36,15 @@
"Sequence": 2,
"Steps": [
{
"DataId": 183,
"Position": {
"X": 25.986084,
"Y": 3.250122,
"Z": -27.023743
},
"TerritoryId": 963,
"InteractionType": "AttuneAetheryte",
"StopDistance": 10,
"Aetheryte": "Radz-at-Han",
"DisableNavmesh": true
},
{
"DataId": 195,
"Position": {
"X": -141.3616,
"Y": 3.999954,
"Z": -98.43509
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] Hall of the Radiant Host"
},
{
"DataId": 1040374,

View File

@ -37,15 +37,10 @@
"Sequence": 2,
"Steps": [
{
"DataId": 176,
"Position": {
"X": 159.96033,
"Y": 11.703674,
"Z": 126.878784
},
"StopDistance": 6,
"TerritoryId": 961,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Elpis - Anagnorisis"
},
{
"DataId": 1040018,

View File

@ -52,14 +52,9 @@
"Sequence": 3,
"Steps": [
{
"DataId": 177,
"Position": {
"X": -633.7225,
"Y": -19.821533,
"Z": 542.56494
},
"TerritoryId": 961,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Elpis - Twelve Wonders"
},
{
"DataId": 1040081,

View File

@ -21,15 +21,10 @@
"Sequence": 1,
"Steps": [
{
"DataId": 178,
"Position": {
"X": -529.9001,
"Y": 161.24207,
"Z": -222.2782
},
"StopDistance": 7,
"TerritoryId": 961,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Elpis - Poieten Oikos"
},
{
"DataId": 1040112,

View File

@ -100,15 +100,10 @@
"Sequence": 255,
"Steps": [
{
"DataId": 167,
"Position": {
"X": 8.377136,
"Y": -27.542603,
"Z": -46.67737
},
"StopDistance": 7,
"TerritoryId": 956,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Labyrinthos - Sharlayan Hamlet"
},
{
"DataId": 1039761,

View File

@ -67,15 +67,10 @@
"Sequence": 4,
"Steps": [
{
"DataId": 168,
"Position": {
"X": -729.18286,
"Y": -27.634155,
"Z": 302.1438
},
"StopDistance": 6,
"TerritoryId": 956,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Labyrinthos - Aporia"
},
{
"DataId": 1040447,

View File

@ -64,15 +64,10 @@
"$.1": "QuestVariables if done after [1]: 2 0 0 0 0 96"
},
{
"DataId": 179,
"Position": {
"X": -544.1215,
"Y": 74.34187,
"Z": 269.6726
},
"StopDistance": 10,
"TerritoryId": 960,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Ultima Thule - Reah Tahra"
},
{
"DataId": 1038006,

View File

@ -162,15 +162,10 @@
"$.1": "QuestVariables if done after [1]: 2 0 0 0 0 192"
},
{
"DataId": 180,
"Position": {
"X": 64.286255,
"Y": 272.48022,
"Z": -657.49603
},
"StopDistance": 8,
"TerritoryId": 960,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Ultima Thule - Abode of the Ea"
},
{
"DataId": 2012356,

View File

@ -224,15 +224,10 @@
"Sequence": 255,
"Steps": [
{
"DataId": 181,
"Position": {
"X": 489.2804,
"Y": 437.5829,
"Z": 333.63843
},
"StopDistance": 5,
"TerritoryId": 960,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Ultima Thule - Base Omicron"
},
{
"DataId": 1039791,

View File

@ -21,14 +21,9 @@
"Sequence": 1,
"Steps": [
{
"DataId": 199,
"Position": {
"X": 57.91655,
"Y": -24.69344,
"Z": -210.6151
},
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] The High Crucible of Al-Kimiya"
},
{
"DataId": 1039589,

View File

@ -70,16 +70,10 @@
"Sequence": 4,
"Steps": [
{
"DataId": 216,
"Position": {
"X": -24.06776,
"Y": 0.8,
"Z": 7.599182
},
"StopDistance": 7,
"TerritoryId": 1185,
"InteractionType": "AttuneAetheryte",
"DisableNavmesh": true
"Aetheryte": "Tuliyollal"
},
{
"Position": {
@ -91,15 +85,9 @@
"InteractionType": "WalkTo"
},
{
"DataId": 224,
"Position": {
"X": 71.7937,
"Y": 47.074097,
"Z": -333.21124
},
"TerritoryId": 1185,
"InteractionType": "AttuneAethernetShard",
"Comment": "Brightploom Post"
"AethernetShard": "[Tuliyollal] Brightploom Post"
},
{
"DataId": 1046504,

View File

@ -70,15 +70,9 @@
"Sequence": 4,
"Steps": [
{
"DataId": 219,
"Position": {
"X": -187.1214,
"Y": 39.93274,
"Z": 6.088318
},
"TerritoryId": 1185,
"InteractionType": "AttuneAethernetShard",
"Comment": "The Resplendent Quarter"
"AethernetShard": "[Tuliyollal] The Resplendent Quarter"
},
{
"DataId": 1046509,
@ -97,15 +91,10 @@
"Sequence": 5,
"Steps": [
{
"DataId": 218,
"Position": {
"X": -413.68738,
"Y": 2.9754639,
"Z": -45.975464
},
"TerritoryId": 1185,
"InteractionType": "AttuneAethernetShard",
"Comment": "Dirigible Landing"
"Comment": "Dirigible Landing",
"AethernetShard": "[Tuliyollal] Dirigible Landing"
},
{
"DataId": 1046509,

View File

@ -64,14 +64,9 @@
"Sequence": 2,
"Steps": [
{
"DataId": 220,
"Position": {
"X": -149.73682,
"Y": -15.030151,
"Z": 198.90125
},
"TerritoryId": 1185,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Tuliyollal] The For'ard Cabins"
},
{
"DataId": 1046512,
@ -120,14 +115,9 @@
"Sequence": 255,
"Steps": [
{
"DataId": 221,
"Position": {
"X": -14.98317,
"Y": -10.00001,
"Z": 135.5848
},
"TerritoryId": 1185,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Tuliyollal] Bayside Bevy Marketplace"
},
{
"Position": {
@ -144,14 +134,9 @@
"Comment": "Resplentend Quarter Lamp nav"
},
{
"DataId": 222,
"Position": {
"X": -99.13794,
"Y": 100.72473,
"Z": -222.03406
},
"TerritoryId": 1185,
"InteractionType": "AttuneAethernetShard"
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Tuliyollal] Vollok Shoonsa"
},
{
"DataId": 1046517,

View File

@ -30,15 +30,9 @@
"InteractionType": "WalkTo"
},
{
"DataId": 202,
"Position": {
"X": -169.51251,
"Y": 6.576599,
"Z": -479.42322
},
"StopDistance": 11,
"TerritoryId": 1188,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Kozama'uka - Ok'hanu"
},
{
"DataId": 1046699,

View File

@ -40,15 +40,9 @@
]
},
{
"DataId": 200,
"Position": {
"X": 332.9855,
"Y": -160.0985,
"Z": -416.1924
},
"StopDistance": 10,
"TerritoryId": 1187,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Urqopacha - Wachunpelo"
},
{
"DataId": 1046559,

View File

@ -51,15 +51,9 @@
"Sequence": 3,
"Steps": [
{
"DataId": 223,
"Position": {
"X": 166.27747,
"Y": -17.990417,
"Z": 38.742676
},
"TerritoryId": 1185,
"InteractionType": "AttuneAethernetShard",
"Comment": "Wachumeqimeqi"
"AethernetShard": "[Tuliyollal] Wachumeqimeqi"
},
{
"Position": {

View File

@ -22,15 +22,9 @@
"Sequence": 1,
"Steps": [
{
"DataId": 203,
"Position": {
"X": 541.1674,
"Y": 117.4462,
"Z": 203.6108
},
"StopDistance": 10,
"TerritoryId": 1188,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Kozama'uka - Many Fires"
},
{
"Position": {
@ -110,15 +104,9 @@
"Sequence": 255,
"Steps": [
{
"DataId": 204,
"Position": {
"X": -477.53113,
"Y": 124.04053,
"Z": 311.32983
},
"StopDistance": 10,
"TerritoryId": 1188,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Kozama'uka - Earthenshire"
},
{
"DataId": 1046613,

View File

@ -62,15 +62,9 @@
"Sequence": 3,
"Steps": [
{
"DataId": 201,
"Position": {
"X": 465.62903,
"Y": 114.94617,
"Z": 634.9126
},
"StopDistance": 10,
"TerritoryId": 1187,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Urqopacha - Worlar's Echo"
},
{
"DataId": 1046819,

View File

@ -91,15 +91,9 @@
]
},
{
"DataId": 205,
"Position": {
"X": -397.0547,
"Y": 23.53558,
"Z": -431.921
},
"StopDistance": 10,
"TerritoryId": 1189,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Yak T'el - Iq Br'aax"
},
{
"DataId": 2013645,

View File

@ -21,15 +21,9 @@
"Sequence": 1,
"Steps": [
{
"DataId": 206,
"Position": {
"X": 721.40076,
"Y": -132.31104,
"Z": 526.1769
},
"StopDistance": 10,
"TerritoryId": 1189,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Yak T'el - Mamook"
},
{
"DataId": 2013953,

View File

@ -22,15 +22,10 @@
"Sequence": 1,
"Steps": [
{
"DataId": 207,
"Position": {
"X": 386.4091,
"Y": -0.1697721,
"Z": 467.6294
},
"StopDistance": 8,
"TerritoryId": 1190,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Shaaloani - Hhusatahwi"
},
{
"DataId": 1046953,
@ -70,15 +65,10 @@
"Sequence": 3,
"Steps": [
{
"DataId": 208,
"Position": {
"X": -291.70673,
"Y": 19.08899,
"Z": -114.54956
},
"StopDistance": 8,
"TerritoryId": 1190,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Shaaloani - Sheshenewezi Springs"
},
{
"Position": {

View File

@ -51,15 +51,10 @@
"Sequence": 3,
"Steps": [
{
"DataId": 209,
"Position": {
"X": 311.36023,
"Y": -14.175659,
"Z": -567.74243
},
"StopDistance": 8,
"TerritoryId": 1190,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Shaaloani - Mehwahhetsoan"
},
{
"DataId": 2013960,

View File

@ -53,15 +53,10 @@
"Sequence": 3,
"Steps": [
{
"DataId": 210,
"Position": {
"X": 514.6105,
"Y": 145.86096,
"Z": 207.56836
},
"StopDistance": 8,
"TerritoryId": 1191,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Heritage Found - Yyasulani Station"
},
{
"DataId": 2013817,

View File

@ -62,15 +62,9 @@
"Sequence": 255,
"Steps": [
{
"DataId": 211,
"Position": {
"X": -223.0173,
"Y": 31.94039,
"Z": -584.0194
},
"StopDistance": 10,
"TerritoryId": 1191,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Heritage Found - The Outskirts"
},
{
"DataId": 1047403,

View File

@ -69,15 +69,9 @@
"Sequence": 4,
"Steps": [
{
"DataId": 230,
"Position": {
"X": -30.41562,
"Y": -6.050003,
"Z": 209.3459
},
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"Comment": "Information Center"
"AethernetShard": "[Solution Nine] Information Center"
},
{
"DataId": 1048060,
@ -104,15 +98,10 @@
"InteractionType": "WalkTo"
},
{
"DataId": 217,
"Position": {
"X": -0.015319824,
"Y": 8.987488,
"Z": -0.015319824
},
"StopDistance": 11,
"TerritoryId": 1186,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Solution Nine"
},
{
"DataId": 1048061,

View File

@ -84,15 +84,9 @@
"Sequence": 4,
"Steps": [
{
"DataId": 235,
"Position": {
"X": -160.0287,
"Y": 0,
"Z": 21.5968
},
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"Comment": "Nexus Arcade"
"AethernetShard": "[Solution Nine] Nexus Arcade"
},
{
"DataId": 1048065,
@ -127,15 +121,9 @@
"Sequence": 6,
"Steps": [
{
"DataId": 236,
"Position": {
"X": -378.13385,
"Y": 13.992493,
"Z": 136.49194
},
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"Comment": "Residential Sector"
"AethernetShard": "[Solution Nine] Residential Sector"
},
{
"DataId": 1048065,

View File

@ -47,15 +47,9 @@
"InteractionType": "WalkTo"
},
{
"DataId": 234,
"Position": {
"X": -32.059265,
"Y": 38.04065,
"Z": -345.2354
},
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"Comment": "Resolution"
"AethernetShard": "[Solution Nine] Resolution"
},
{
"DataId": 1048073,

View File

@ -48,26 +48,14 @@
"TargetTerritoryId": 1186
},
{
"DataId": 232,
"Position": {
"X": 258.28943,
"Y": 50.736206,
"Z": 148.72961
},
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"Comment": "Neon Stein"
"AethernetShard": "[Solution Nine] Neon Stein"
},
{
"DataId": 231,
"Position": {
"X": 382.6809,
"Y": 59.983154,
"Z": 76.67651
},
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"Comment": "True Vue"
"AethernetShard": "[Solution Nine] True Vue"
},
{
"DataId": 1048090,
@ -116,15 +104,9 @@
"Sequence": 5,
"Steps": [
{
"DataId": 233,
"Position": {
"X": 374.77686,
"Y": 60.01367,
"Z": 325.67322
},
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"Comment": "Arcadion"
"AethernetShard": "[Solution Nine] The Arcadion"
},
{
"DataId": 1048083,

View File

@ -206,15 +206,9 @@
"Sequence": 5,
"Steps": [
{
"DataId": 212,
"Position": {
"X": -219.53156,
"Y": 32.913696,
"Z": 120.77515
},
"StopDistance": 10,
"TerritoryId": 1191,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Heritage Found - Electrope Strike"
},
{
"DataId": 2013972,

View File

@ -70,15 +70,9 @@
]
},
{
"DataId": 214,
"Position": {
"X": 657.98413,
"Y": 28.976807,
"Z": -284.01617
},
"StopDistance": 10,
"TerritoryId": 1192,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Living Memory - Leynode Pyro"
},
{
"DataId": 1047943,

View File

@ -95,15 +95,9 @@
]
},
{
"DataId": 215,
"Position": {
"X": -255.26825,
"Y": 59.433838,
"Z": -397.6654
},
"StopDistance": 10,
"TerritoryId": 1192,
"InteractionType": "AttuneAetheryte"
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Living Memory - Leynode Aero"
},
{
"DataId": 1047993,

View File

@ -1,5 +1,7 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Reflection;
using Questionable.Model.V1;
namespace Questionable.QuestPaths;
@ -13,4 +15,7 @@ public static partial class AssemblyQuestLoader
#else
new Dictionary<ushort, QuestRoot>();
#endif
public static Stream QuestSchema =>
typeof(AssemblyQuestLoader).Assembly.GetManifestResourceStream("Questionable.QuestPaths.QuestSchema")!;
}

View File

@ -18,6 +18,13 @@
ReferenceOutputAssembly="false"/>
</ItemGroup>
<ItemGroup>
<None Remove="quest-v1.json"/>
<EmbeddedResource Include="quest-v1.json">
<LogicalName>Questionable.QuestPaths.QuestSchema</LogicalName>
</EmbeddedResource>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Release'">
<None Remove="2.x - A Realm Reborn"/>
<None Remove="3.x - Heavensward"/>
@ -25,7 +32,6 @@
<None Remove="5.x - Shadowbringers"/>
<None Remove="6.x - Endwalker"/>
<None Remove="7.x - Dawntrail"/>
<None Remove="quest-v1.json"/>
<AdditionalFiles Include="2.x - A Realm Reborn\**\*.json"/>
<AdditionalFiles Include="3.x - Heavensward\**\*.json"/>
<AdditionalFiles Include="4.x - Stormblood\**\*.json"/>
@ -34,4 +40,12 @@
<AdditionalFiles Include="7.x - Dawntrail\**\*.json"/>
<AdditionalFiles Include="quest-v1.json"/>
</ItemGroup>
<ItemGroup>
<Folder Include="5.x - Shadowbringers\MSQ\A2-Kholusia1\" />
<Folder Include="5.x - Shadowbringers\MSQ\A3-AmhAreng1\" />
<Folder Include="5.x - Shadowbringers\MSQ\A4 - Crystarium 2\" />
<Folder Include="5.x - Shadowbringers\MSQ\B-Il Mheg\" />
<Folder Include="5.x - Shadowbringers\MSQ\C-Rak'tika\" />
</ItemGroup>
</Project>

View File

@ -20,6 +20,10 @@ Generally, the folder name is derived from SE's classification of quests.
### Stormblood
- `MSQ`: `StmBd@@` with `@@` being the letter/number used as part of the folder name
- `StmBdA1`: `A1 - xxx`
- `StmBdB`: `B - 4.1` (and so on for later patches)
### Shadowbringers
- `MSQ`: `LucKm@` with `@` being the letter used as part of the folder name

View File

@ -152,116 +152,8 @@
]
},
"AetheryteShortcut": {
"type": "string",
"description": "The Aetheryte to teleport to (before moving)",
"enum": [
"Gridania",
"Central Shroud - Bentbranch Meadows",
"East Shroud - Hawthorne Hut",
"South Shroud - Quarrymill",
"South Shroud - Camp Tranquil",
"North Shroud - Fallgourd Float",
"Ul'dah",
"Western Thanalan - Horizon",
"Central Thanalan - Black Brush Station",
"Eastern Thanalan - Camp Drybone",
"Southern Thanalan - Little Ala Mhigo",
"Southern Thanalan - Forgotten Springs",
"Northern Thanalan - Camp Bluefog",
"Northern Thanalan - Ceruleum Processing Plant",
"Limsa Lominsa",
"Middle La Noscea - Summerford Farms",
"Lower La Noscea - Moraby Drydocks",
"Eastern La Noscea - Costa Del Sol",
"Eastern La Noscea - Wineport",
"Western La Noscea - Swiftperch",
"Western La Noscea - Aleport",
"Upper La Noscea - Camp Bronze Lake",
"Outer La Noscea - Camp Overlook",
"Coerthas Central Highlands - Camp Dragonhead",
"Mor Dhona",
"Gold Saucer",
"Wolves' Den Pier",
"Ishgard",
"Idyllshire",
"Coerthas Western Highlands - Falcon's Nest",
"The Sea of Clouds - Camp Cloudtop",
"The Sea of Clouds - Ok' Zundu",
"Azys Lla - Helix",
"The Dravanian Forelands - Tailfeather",
"The Dravanian Forelands - Anyx Trine",
"The Churning Mists - Moghome",
"The Churning Mists - Zenith",
"Rhalgr's Reach",
"Fringes - Castrum Oriens",
"Fringes - Peering Stones",
"Peaks - Ala Gannha",
"Peaks - Ala Ghiri",
"Lochs - Porta Praetoria",
"Lochs - Ala Mhigan Quarter",
"Kugane",
"Ruby Sea - Tamamizu",
"Ruby Sea - Onokoro",
"Yanxia - Namai",
"Yanxia - House of the Fierce",
"Azim Steppe - Reunion",
"Azim Steppe - Dawn Throne",
"Azim Steppe - Dhoro Iloh",
"Doman Enclave",
"Crystarium",
"Eulmore",
"Lakeland - Fort Jobb",
"Lakeland - Ostall Imperative",
"Kholusia - Stilltide",
"Kholusia - Wright",
"Kholusia - Tomra",
"Amh Araeng - Mord Souq",
"Amh Araeng - Inn at Journey's Head",
"Amh Araeng - Twine",
"Rak'tika - Slitherbough",
"Rak'tika - Fanow",
"Il Mheg - Lydha Lran",
"Il Mheg - Pia Enni",
"Il Mheg - Wolekdorf",
"Tempest - Ondo Cups",
"Tempest - Macarenses Angle",
"Old Sharlayan",
"Radz-at-Han",
"Labyrinthos - Archeion",
"Labyrinthos - Sharlayan Hamlet",
"Labyrinthos - Aporia",
"Thavnair - Yedlihmad",
"Thavnair - Great Work",
"Thavnair - Palaka's Stand",
"Garlemald - Camp Broken Glass",
"Garlemald - Tertium",
"Mare Lamentorum - Sinus Lacrimarum",
"Mare Lamentorum - Bestways Burrow",
"Elpis - Anagnorisis",
"Elpis - Twelve Wonders",
"Elpis - Poieten Oikos",
"Ultima Thule - Reah Tahra",
"Ultima Thule - Abode of the Ea",
"Ultima Thule - Base Omicron",
"Tuliyollal",
"Solution Nine",
"Urqopacha - Wachunpelo",
"Urqopacha - Worlar's Echo",
"Kozama'uka - Ok'hanu",
"Kozama'uka - Many Fires",
"Kozama'uka - Earthenshire",
"Yak T'el - Iq Br'aax",
"Yak T'el - Mamook",
"Shaaloani - Hhusatahwi",
"Shaaloani - Sheshenewezi Springs",
"Shaaloani - Mehwahhetsoan",
"Heritage Found - Yyasulani Station",
"Heritage Found - The Outskirts",
"Heritage Found - Electrope Strike",
"Living Memory - Leynode Mnemo",
"Living Memory - Leynode Pyro",
"Living Memory - Leynode Aero"
]
"$ref": "#/$defs/Aetheryte"
},
"AethernetShortcut": {
"type": "array",
@ -269,129 +161,7 @@
"minItems": 2,
"maxItems": 2,
"items": {
"type": "string",
"enum": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Archers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower",
"[Gridania] Lancers' Guild",
"[Gridania] Conjurers' Guild",
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre",
"[Gridania] Blue Badger Gate (Central Shroud)",
"[Gridania] Yellow Serpent Gate (North Shroud)",
"[Gridania] White Wolf Gate (Central Shroud)",
"[Gridania] Airship Landing",
"[Ul'dah] Aetheryte Plaza",
"[Ul'dah] Adventurers' Guild",
"[Ul'dah] Thaumaturges' Guild",
"[Ul'dah] Gladiators' Guild",
"[Ul'dah] Miners' Guild",
"[Ul'dah] Weavers' Guild",
"[Ul'dah] Goldsmiths' Guild",
"[Ul'dah] Sapphire Avenue Exchange",
"[Ul'dah] Alchemists' Guild",
"[Ul'dah] Gate of the Sultana (Western Thanalan)",
"[Ul'dah] Gate of Nald (Central Thanalan)",
"[Ul'dah] Gate of Thal (Central Thanalan)",
"[Ul'dah] The Chamber of Rule",
"[Ul'dah] Airship Landing",
"[Limsa Lominsa] Aetheryte Plaza",
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Fishermens' Guild",
"[Limsa Lominsa] Hawkers' Alley",
"[Limsa Lominsa] The Aftcastle",
"[Limsa Lominsa] Culinarians' Guild",
"[Limsa Lominsa] Marauders' Guild",
"[Limsa Lominsa] Zephyr Gate (Middle La Noscea)",
"[Limsa Lominsa] Tempest Gate (Lower La Noscea)",
"[Limsa Lominsa] Airship Landing",
"[Ishgard] Aetheryte Plaza",
"[Ishgard] The Forgotten Knight",
"[Ishgard] Skysteel Manufactory",
"[Ishgard] The Brume",
"[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Jeweled Crozier",
"[Ishgard] Saint Reymanaud's Cathedral",
"[Ishgard] The Tribunal",
"[Ishgard] The Last Vigil",
"[Ishgard] The Gates of Judgement (Coerthas Central Highlands)",
"[Idyllshire] Aetheryte Plaza",
"[Idyllshire] West Idyllshire",
"[Idyllshire] Prologue Gate",
"[Idyllshire] Epilogue Gate",
"[Rhalgr's Reach] Aetheryte Plaza",
"[Rhalgr's Reach] Western Rhalgr's Reach",
"[Rhalgr's Reach] Northeastern Rhalgr's Reach",
"[Rhalgr's Reach] Fringes Gate",
"[Rhalgr's Reach] Peaks Gate",
"[Kugane] Aetheryte Plaza",
"[Kugane] Shiokaze Hostelry",
"[Kugane] Pier #1",
"[Kugane] Thavnairian Consulate",
"[Kugane] Kogane Dori Markets",
"[Kugane] Bokairo Inn",
"[Kugane] The Ruby Bazaar",
"[Kugane] Sekiseigumi Barracks",
"[Kugane] Rakuza District",
"[Kugane] The Ruby Price",
"[Kugane] Airship Landing",
"[Crystarium] Aetheryte Plaza",
"[Crystarium] Musica Universalis Markets",
"[Crystarium] Themenos Rookery",
"[Crystarium] The Dossal Gate",
"[Crystarium] The Pendants",
"[Crystarium] The Amaro Launch",
"[Crystarium] The Crystalline Mean",
"[Crystarium] The Cabinet of Curiosity",
"[Crystarium] Tessellation (Lakeland)",
"[Eulmore] Aetheryte Plaza",
"[Eulmore] Southeast Derelicts",
"[Eulmore] Nightsoil Pots",
"[Eulmore] The Glory Gate",
"[Eulmore] The Mainstay",
"[Eulmore] The Path to Glory (Kholusia)",
"[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium",
"[Old Sharlayan] The Baldesion Annex",
"[Old Sharlayan] The Rostra",
"[Old Sharlayan] The Leveilleur Estate",
"[Old Sharlayan] Journey's End",
"[Old Sharlayan] Scholar's Harbor",
"[Old Sharlayan] The Hall of Artifice (Labyrinthos)",
"[Radz-at-Han] Aetheryte Plaza",
"[Radz-at-Han] Meghaduta",
"[Radz-at-Han] Ruveydah Fibers",
"[Radz-at-Han] Airship Landing",
"[Radz-at-Han] Alzadaal's Peace",
"[Radz-at-Han] Hall of the Radiant Host",
"[Radz-at-Han] Mehryde's Meyhane",
"[Radz-at-Han] Kama",
"[Radz-at-Han] The High Crucible of Al-Kimiya",
"[Radz-at-Han] The Gate of First Sight (Thavnair)",
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing",
"[Tuliyollal] The Resplendent Quarter",
"[Tuliyollal] The For'ard Cabins",
"[Tuliyollal] Bayside Bevy Marketplace",
"[Tuliyollal] Vollok Shoonsa",
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] Brightploom Post",
"[Tuliyollal] Arch of the Dawn (Urqopacha)",
"[Tuliyollal] Arch of the Dawn (Kozama'uka)",
"[Tuliyollal] Ihuykatumu (Kozama'uka)",
"[Tuliyollal] Dirigible Landing (Yak T'el)",
"[Tuliyollal] Xak Tural Skygate (Shaaloani)",
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] Information Center",
"[Solution Nine] True Vue",
"[Solution Nine] Neon Stein",
"[Solution Nine] The Arcadion",
"[Solution Nine] Resolution",
"[Solution Nine] Nexus Arcade",
"[Solution Nine] Residential Sector",
"[Solution Nine] Scanning Port Nine (Heritage Found)"
]
"$ref": "#/$defs/AethernetShard"
}
},
"ItemId": {
@ -475,21 +245,49 @@
"if": {
"properties": {
"InteractionType": {
"anyOf": [
{
"const": "AttuneAethernetShard"
},
{
"const": "AttuneAetheryte"
}
]
"const": "AttuneAetheryte"
}
}
},
"then": {
"properties": {
"Aetheryte": {
"$ref": "#/$defs/Aetheryte"
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
}
},
"required": [
"DataId",
"Position"
"Aetheryte"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "AttuneAethernetShard"
}
}
},
"then": {
"properties": {
"AethernetShard": {
"$ref": "#/$defs/AethernetShard"
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
}
},
"required": [
"AethernetShard"
]
}
},
@ -952,7 +750,14 @@
"properties": {
"ContentFinderConditionId": {
"type": "integer",
"exclusiveMinimum": 0
"exclusiveMinimum": 0,
"exclusiveMaximum": 3000
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
}
},
"required": [
@ -1045,6 +850,242 @@
],
"additionalProperties": false,
"$defs": {
"Aetheryte": {
"type": "string",
"enum": [
"Gridania",
"Central Shroud - Bentbranch Meadows",
"East Shroud - Hawthorne Hut",
"South Shroud - Quarrymill",
"South Shroud - Camp Tranquil",
"North Shroud - Fallgourd Float",
"Ul'dah",
"Western Thanalan - Horizon",
"Central Thanalan - Black Brush Station",
"Eastern Thanalan - Camp Drybone",
"Southern Thanalan - Little Ala Mhigo",
"Southern Thanalan - Forgotten Springs",
"Northern Thanalan - Camp Bluefog",
"Northern Thanalan - Ceruleum Processing Plant",
"Limsa Lominsa",
"Middle La Noscea - Summerford Farms",
"Lower La Noscea - Moraby Drydocks",
"Eastern La Noscea - Costa Del Sol",
"Eastern La Noscea - Wineport",
"Western La Noscea - Swiftperch",
"Western La Noscea - Aleport",
"Upper La Noscea - Camp Bronze Lake",
"Outer La Noscea - Camp Overlook",
"Coerthas Central Highlands - Camp Dragonhead",
"Mor Dhona",
"Gold Saucer",
"Wolves' Den Pier",
"Ishgard",
"Idyllshire",
"Coerthas Western Highlands - Falcon's Nest",
"The Sea of Clouds - Camp Cloudtop",
"The Sea of Clouds - Ok' Zundu",
"Azys Lla - Helix",
"The Dravanian Forelands - Tailfeather",
"The Dravanian Forelands - Anyx Trine",
"The Churning Mists - Moghome",
"The Churning Mists - Zenith",
"Rhalgr's Reach",
"Fringes - Castrum Oriens",
"Fringes - Peering Stones",
"Peaks - Ala Gannha",
"Peaks - Ala Ghiri",
"Lochs - Porta Praetoria",
"Lochs - Ala Mhigan Quarter",
"Kugane",
"Ruby Sea - Tamamizu",
"Ruby Sea - Onokoro",
"Yanxia - Namai",
"Yanxia - House of the Fierce",
"Azim Steppe - Reunion",
"Azim Steppe - Dawn Throne",
"Azim Steppe - Dhoro Iloh",
"Doman Enclave",
"Crystarium",
"Eulmore",
"Lakeland - Fort Jobb",
"Lakeland - Ostall Imperative",
"Kholusia - Stilltide",
"Kholusia - Wright",
"Kholusia - Tomra",
"Amh Araeng - Mord Souq",
"Amh Araeng - Inn at Journey's Head",
"Amh Araeng - Twine",
"Rak'tika - Slitherbough",
"Rak'tika - Fanow",
"Il Mheg - Lydha Lran",
"Il Mheg - Pia Enni",
"Il Mheg - Wolekdorf",
"Tempest - Ondo Cups",
"Tempest - Macarenses Angle",
"Old Sharlayan",
"Radz-at-Han",
"Labyrinthos - Archeion",
"Labyrinthos - Sharlayan Hamlet",
"Labyrinthos - Aporia",
"Thavnair - Yedlihmad",
"Thavnair - Great Work",
"Thavnair - Palaka's Stand",
"Garlemald - Camp Broken Glass",
"Garlemald - Tertium",
"Mare Lamentorum - Sinus Lacrimarum",
"Mare Lamentorum - Bestways Burrow",
"Elpis - Anagnorisis",
"Elpis - Twelve Wonders",
"Elpis - Poieten Oikos",
"Ultima Thule - Reah Tahra",
"Ultima Thule - Abode of the Ea",
"Ultima Thule - Base Omicron",
"Tuliyollal",
"Solution Nine",
"Urqopacha - Wachunpelo",
"Urqopacha - Worlar's Echo",
"Kozama'uka - Ok'hanu",
"Kozama'uka - Many Fires",
"Kozama'uka - Earthenshire",
"Yak T'el - Iq Br'aax",
"Yak T'el - Mamook",
"Shaaloani - Hhusatahwi",
"Shaaloani - Sheshenewezi Springs",
"Shaaloani - Mehwahhetsoan",
"Heritage Found - Yyasulani Station",
"Heritage Found - The Outskirts",
"Heritage Found - Electrope Strike",
"Living Memory - Leynode Mnemo",
"Living Memory - Leynode Pyro",
"Living Memory - Leynode Aero"
]
},
"AethernetShard": {
"type": "string",
"enum": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Archers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower",
"[Gridania] Lancers' Guild",
"[Gridania] Conjurers' Guild",
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre",
"[Gridania] Blue Badger Gate (Central Shroud)",
"[Gridania] Yellow Serpent Gate (North Shroud)",
"[Gridania] White Wolf Gate (Central Shroud)",
"[Gridania] Airship Landing",
"[Ul'dah] Aetheryte Plaza",
"[Ul'dah] Adventurers' Guild",
"[Ul'dah] Thaumaturges' Guild",
"[Ul'dah] Gladiators' Guild",
"[Ul'dah] Miners' Guild",
"[Ul'dah] Weavers' Guild",
"[Ul'dah] Goldsmiths' Guild",
"[Ul'dah] Sapphire Avenue Exchange",
"[Ul'dah] Alchemists' Guild",
"[Ul'dah] Gate of the Sultana (Western Thanalan)",
"[Ul'dah] Gate of Nald (Central Thanalan)",
"[Ul'dah] Gate of Thal (Central Thanalan)",
"[Ul'dah] The Chamber of Rule",
"[Ul'dah] Airship Landing",
"[Limsa Lominsa] Aetheryte Plaza",
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Fishermens' Guild",
"[Limsa Lominsa] Hawkers' Alley",
"[Limsa Lominsa] The Aftcastle",
"[Limsa Lominsa] Culinarians' Guild",
"[Limsa Lominsa] Marauders' Guild",
"[Limsa Lominsa] Zephyr Gate (Middle La Noscea)",
"[Limsa Lominsa] Tempest Gate (Lower La Noscea)",
"[Limsa Lominsa] Airship Landing",
"[Ishgard] Aetheryte Plaza",
"[Ishgard] The Forgotten Knight",
"[Ishgard] Skysteel Manufactory",
"[Ishgard] The Brume",
"[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Jeweled Crozier",
"[Ishgard] Saint Reymanaud's Cathedral",
"[Ishgard] The Tribunal",
"[Ishgard] The Last Vigil",
"[Ishgard] The Gates of Judgement (Coerthas Central Highlands)",
"[Idyllshire] Aetheryte Plaza",
"[Idyllshire] West Idyllshire",
"[Idyllshire] Prologue Gate",
"[Idyllshire] Epilogue Gate",
"[Rhalgr's Reach] Aetheryte Plaza",
"[Rhalgr's Reach] Western Rhalgr's Reach",
"[Rhalgr's Reach] Northeastern Rhalgr's Reach",
"[Rhalgr's Reach] Fringes Gate",
"[Rhalgr's Reach] Peaks Gate",
"[Kugane] Aetheryte Plaza",
"[Kugane] Shiokaze Hostelry",
"[Kugane] Pier #1",
"[Kugane] Thavnairian Consulate",
"[Kugane] Kogane Dori Markets",
"[Kugane] Bokairo Inn",
"[Kugane] The Ruby Bazaar",
"[Kugane] Sekiseigumi Barracks",
"[Kugane] Rakuza District",
"[Kugane] The Ruby Price",
"[Kugane] Airship Landing",
"[Crystarium] Aetheryte Plaza",
"[Crystarium] Musica Universalis Markets",
"[Crystarium] Temenos Rookery",
"[Crystarium] The Dossal Gate",
"[Crystarium] The Pendants",
"[Crystarium] The Amaro Launch",
"[Crystarium] The Crystalline Mean",
"[Crystarium] The Cabinet of Curiosity",
"[Crystarium] Tessellation (Lakeland)",
"[Eulmore] Aetheryte Plaza",
"[Eulmore] Southeast Derelicts",
"[Eulmore] Nightsoil Pots",
"[Eulmore] The Glory Gate",
"[Eulmore] The Mainstay",
"[Eulmore] The Path to Glory (Kholusia)",
"[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium",
"[Old Sharlayan] The Baldesion Annex",
"[Old Sharlayan] The Rostra",
"[Old Sharlayan] The Leveilleur Estate",
"[Old Sharlayan] Journey's End",
"[Old Sharlayan] Scholar's Harbor",
"[Old Sharlayan] The Hall of Artifice (Labyrinthos)",
"[Radz-at-Han] Aetheryte Plaza",
"[Radz-at-Han] Meghaduta",
"[Radz-at-Han] Ruveydah Fibers",
"[Radz-at-Han] Airship Landing",
"[Radz-at-Han] Alzadaal's Peace",
"[Radz-at-Han] Hall of the Radiant Host",
"[Radz-at-Han] Mehryde's Meyhane",
"[Radz-at-Han] Kama",
"[Radz-at-Han] The High Crucible of Al-Kimiya",
"[Radz-at-Han] The Gate of First Sight (Thavnair)",
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing",
"[Tuliyollal] The Resplendent Quarter",
"[Tuliyollal] The For'ard Cabins",
"[Tuliyollal] Bayside Bevy Marketplace",
"[Tuliyollal] Vollok Shoonsa",
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] Brightploom Post",
"[Tuliyollal] Arch of the Dawn (Urqopacha)",
"[Tuliyollal] Arch of the Dawn (Kozama'uka)",
"[Tuliyollal] Ihuykatumu (Kozama'uka)",
"[Tuliyollal] Dirigible Landing (Yak T'el)",
"[Tuliyollal] Xak Tural Skygate (Shaaloani)",
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] Information Center",
"[Solution Nine] True Vue",
"[Solution Nine] Neon Stein",
"[Solution Nine] The Arcadion",
"[Solution Nine] Resolution",
"[Solution Nine] Nexus Arcade",
"[Solution Nine] Residential Sector",
"[Solution Nine] Scanning Port Nine (Heritage Found)"
]
},
"CompletionFlags": {
"type": "array",
"description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",

View File

@ -10,6 +10,6 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" Version="8.0.3"/>
<PackageReference Include="System.Text.Json" Version="8.0.4" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,142 @@
using System.Collections.Generic;
namespace Questionable.Model.V1.Converter;
public sealed class AethernetShardConverter() : EnumConverter<EAetheryteLocation>(Values)
{
public static readonly Dictionary<EAetheryteLocation, string> Values = new()
{
{ EAetheryteLocation.Gridania, "[Gridania] Aetheryte Plaza" },
{ EAetheryteLocation.GridaniaArcher, "[Gridania] Archers' Guild" },
{ EAetheryteLocation.GridaniaLeatherworker, "[Gridania] Leatherworkers' Guild & Shaded Bower" },
{ EAetheryteLocation.GridaniaLancer, "[Gridania] Lancers' Guild" },
{ EAetheryteLocation.GridaniaConjurer, "[Gridania] Conjurers' Guild" },
{ EAetheryteLocation.GridaniaBotanist, "[Gridania] Botanists' Guild" },
{ EAetheryteLocation.GridaniaAmphitheatre, "[Gridania] Mih Khetto's Amphitheatre" },
{ EAetheryteLocation.GridaniaBlueBadgerGate, "[Gridania] Blue Badger Gate (Central Shroud)" },
{ EAetheryteLocation.GridaniaYellowSerpentGate, "[Gridania] Yellow Serpent Gate (North Shroud)" },
{ EAetheryteLocation.GridaniaWhiteWolfGate, "[Gridania] White Wolf Gate (Central Shroud)" },
{ EAetheryteLocation.GridaniaAirship, "[Gridania] Airship Landing" },
{ EAetheryteLocation.Uldah, "[Ul'dah] Aetheryte Plaza" },
{ EAetheryteLocation.UldahAdventurers, "[Ul'dah] Adventurers' Guild" },
{ EAetheryteLocation.UldahThaumaturge, "[Ul'dah] Thaumaturges' Guild" },
{ EAetheryteLocation.UldahGladiator, "[Ul'dah] Gladiators' Guild" },
{ EAetheryteLocation.UldahMiner, "[Ul'dah] Miners' Guild" },
{ EAetheryteLocation.UldahWeaver, "[Ul'dah] Weavers' Guild" },
{ EAetheryteLocation.UldahGoldsmith, "[Ul'dah] Goldsmiths' Guild" },
{ EAetheryteLocation.UldahSapphireAvenue, "[Ul'dah] Sapphire Avenue Exchange" },
{ EAetheryteLocation.UldahAlchemist, "[Ul'dah] Alchemists' Guild" },
{ EAetheryteLocation.UldahChamberOfRule, "[Ul'dah] The Chamber of Rule" },
{ EAetheryteLocation.UldahGateOfTheSultana, "[Ul'dah] Gate of the Sultana (Western Thanalan)" },
{ EAetheryteLocation.UldahGateOfNald, "[Ul'dah] Gate of Nald (Central Thanalan)" },
{ EAetheryteLocation.UldahGateOfThal, "[Ul'dah] Gate of Thal (Central Thanalan)" },
{ EAetheryteLocation.UldahAirship, "[Ul'dah] Airship Landing" },
{ EAetheryteLocation.Limsa, "[Limsa Lominsa] Aetheryte Plaza" },
{ EAetheryteLocation.LimsaArcanist, "[Limsa Lominsa] Arcanists' Guild" },
{ EAetheryteLocation.LimsaFisher, "[Limsa Lominsa] Fishermens' Guild" },
{ EAetheryteLocation.LimsaHawkersAlley, "[Limsa Lominsa] Hawkers' Alley" },
{ EAetheryteLocation.LimsaAftcastle, "[Limsa Lominsa] The Aftcastle" },
{ EAetheryteLocation.LimsaCulinarian, "[Limsa Lominsa] Culinarians' Guild" },
{ EAetheryteLocation.LimsaMarauder, "[Limsa Lominsa] Marauders' Guild" },
{ EAetheryteLocation.LimsaZephyrGate, "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" },
{ EAetheryteLocation.LimsaTempestGate, "[Limsa Lominsa] Tempest Gate (Lower La Noscea)" },
{ EAetheryteLocation.LimsaAirship, "[Limsa Lominsa] Airship Landing" },
{ EAetheryteLocation.Ishgard, "[Ishgard] Aetheryte Plaza" },
{ EAetheryteLocation.IshgardForgottenKnight, "[Ishgard] The Forgotten Knight" },
{ EAetheryteLocation.IshgardSkysteelManufactory, "[Ishgard] Skysteel Manufactory" },
{ EAetheryteLocation.IshgardBrume, "[Ishgard] The Brume" },
{ EAetheryteLocation.IshgardAthenaeumAstrologicum, "[Ishgard] Athenaeum Astrologicum" },
{ EAetheryteLocation.IshgardJeweledCrozier, "[Ishgard] The Jeweled Crozier" },
{ EAetheryteLocation.IshgardSaintReymanaudsCathedral, "[Ishgard] Saint Reymanaud's Cathedral" },
{ EAetheryteLocation.IshgardTribunal, "[Ishgard] The Tribunal" },
{ EAetheryteLocation.IshgardLastVigil, "[Ishgard] The Last Vigil" },
{ EAetheryteLocation.IshgardGatesOfJudgement, "[Ishgard] The Gates of Judgement (Coerthas Central Highlands)" },
{ EAetheryteLocation.Idyllshire, "[Idyllshire] Aetheryte Plaza" },
{ EAetheryteLocation.IdyllshireWest, "[Idyllshire] West Idyllshire" },
{ EAetheryteLocation.IdyllshirePrologueGate, "[Idyllshire] Prologue Gate" },
{ EAetheryteLocation.IdyllshireEpilogueGate, "[Idyllshire] Epilogue Gate" },
{ EAetheryteLocation.RhalgrsReach, "[Rhalgr's Reach] Aetheryte Plaza" },
{ EAetheryteLocation.RhalgrsReachWest, "[Rhalgr's Reach] Western Rhalgr's Reach" },
{ EAetheryteLocation.RhalgrsReachNorthEast, "[Rhalgr's Reach] Northeastern Rhalgr's Reach" },
{ EAetheryteLocation.RhalgrsReachFringesGate, "[Rhalgr's Reach] Fringes Gate" },
{ EAetheryteLocation.RhalgrsReachPeaksGate, "[Rhalgr's Reach] Peaks Gate" },
{ EAetheryteLocation.Kugane, "[Kugane] Aetheryte Plaza" },
{ EAetheryteLocation.KuganeShiokazeHostelry, "[Kugane] Shiokaze Hostelry" },
{ EAetheryteLocation.KuganePier1, "[Kugane] Pier #1" },
{ EAetheryteLocation.KuganeThavnairianConsulate, "[Kugane] Thavnairian Consulate" },
{ EAetheryteLocation.KuganeMarkets, "[Kugane] Kogane Dori Markets" },
{ EAetheryteLocation.KuganeBokairoInn, "[Kugane] Bokairo Inn" },
{ EAetheryteLocation.KuganeRubyBazaar, "[Kugane] The Ruby Bazaar" },
{ EAetheryteLocation.KuganeSekiseigumiBarracks, "[Kugane] Sekiseigumi Barracks" },
{ EAetheryteLocation.KuganeRakuzaDistrict, "[Kugane] Rakuza District" },
{ EAetheryteLocation.KuganeRubyPrice, "[Kugane] The Ruby Price" },
{ EAetheryteLocation.KuganeAirship, "[Kugane] Airship Landing" },
{ EAetheryteLocation.Crystarium, "[Crystarium] Aetheryte Plaza" },
{ EAetheryteLocation.CrystariumMarkets, "[Crystarium] Musica Universalis Markets" },
{ EAetheryteLocation.CrystariumTemenosRookery, "[Crystarium] Temenos Rookery" },
{ EAetheryteLocation.CrystariumDossalGate, "[Crystarium] The Dossal Gate" },
{ EAetheryteLocation.CrystariumPendants, "[Crystarium] The Pendants" },
{ EAetheryteLocation.CrystariumAmaroLaunch, "[Crystarium] The Amaro Launch" },
{ EAetheryteLocation.CrystariumCrystallineMean, "[Crystarium] The Crystalline Mean" },
{ EAetheryteLocation.CrystariumCabinetOfCuriosity, "[Crystarium] The Cabinet of Curiosity" },
{ EAetheryteLocation.CrystariumTessellation, "[Crystarium] Tessellation (Lakeland)" },
{ EAetheryteLocation.Eulmore, "[Eulmore] Aetheryte Plaza" },
{ EAetheryteLocation.EulmoreSoutheastDerelict, "[Eulmore] Southeast Derelicts" },
{ EAetheryteLocation.EulmoreNightsoilPots, "[Eulmore] Nightsoil Pots" },
{ EAetheryteLocation.EulmoreGloryGate, "[Eulmore] The Glory Gate" },
{ EAetheryteLocation.EulmoreMainstay, "[Eulmore] The Mainstay" },
{ EAetheryteLocation.EulmorePathToGlory, "[Eulmore] The Path to Glory (Kholusia)" },
{ EAetheryteLocation.OldSharlayan, "[Old Sharlayan] Aetheryte Plaza" },
{ EAetheryteLocation.OldSharlayanStudium, "[Old Sharlayan] The Studium" },
{ EAetheryteLocation.OldSharlayanBaldesionAnnex, "[Old Sharlayan] The Baldesion Annex" },
{ EAetheryteLocation.OldSharlayanRostra, "[Old Sharlayan] The Rostra" },
{ EAetheryteLocation.OldSharlayanLeveilleurEstate, "[Old Sharlayan] The Leveilleur Estate" },
{ EAetheryteLocation.OldSharlayanJourneysEnd, "[Old Sharlayan] Journey's End" },
{ EAetheryteLocation.OldSharlayanScholarsHarbor, "[Old Sharlayan] Scholar's Harbor" },
{ EAetheryteLocation.OldSharlayanHallOfArtifice, "[Old Sharlayan] The Hall of Artifice (Labyrinthos)" },
{ EAetheryteLocation.RadzAtHan, "[Radz-at-Han] Aetheryte Plaza" },
{ EAetheryteLocation.RadzAtHanMeghaduta, "[Radz-at-Han] Meghaduta" },
{ EAetheryteLocation.RadzAtHanRuveydahFibers, "[Radz-at-Han] Ruveydah Fibers" },
{ EAetheryteLocation.RadzAtHanAirship, "[Radz-at-Han] Airship Landing" },
{ EAetheryteLocation.RadzAtHanAlzadaalsPeace, "[Radz-at-Han] Alzadaal's Peace" },
{ EAetheryteLocation.RadzAtHanHallOfTheRadiantHost, "[Radz-at-Han] Hall of the Radiant Host" },
{ EAetheryteLocation.RadzAtHanMehrydesMeyhane, "[Radz-at-Han] Mehryde's Meyhane" },
{ EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" },
{ EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" },
{ EAetheryteLocation.RadzAtHanGateOfFirstSight, "[Radz-at-Han] The Gate of First Sight (Thavnair)" },
{ EAetheryteLocation.Tuliyollal, "[Tuliyollal] Aetheryte Plaza" },
{ EAetheryteLocation.TuliyollalDirigibleLanding, "[Tuliyollal] Dirigible Landing" },
{ EAetheryteLocation.TuliyollalTheResplendentQuarter, "[Tuliyollal] The Resplendent Quarter" },
{ EAetheryteLocation.TuliyollalTheForardCabins, "[Tuliyollal] The For'ard Cabins" },
{ EAetheryteLocation.TuliyollalBaysideBevyMarketplace, "[Tuliyollal] Bayside Bevy Marketplace" },
{ EAetheryteLocation.TuliyollalVollokShoonsa, "[Tuliyollal] Vollok Shoonsa" },
{ EAetheryteLocation.TuliyollalWachumeqimeqi, "[Tuliyollal] Wachumeqimeqi" },
{ EAetheryteLocation.TuliyollalBrightploomPost, "[Tuliyollal] Brightploom Post" },
{ EAetheryteLocation.TuliyollalArchOfTheDawnUrqopacha, "[Tuliyollal] Arch of the Dawn (Urqopacha)" },
{ EAetheryteLocation.TuliyollalArchOfTheDawnKozamauka, "[Tuliyollal] Arch of the Dawn (Kozama'uka)" },
{ EAetheryteLocation.TuliyollalIhuykatumu, "[Tuliyollal] Ihuykatumu (Kozama'uka)" },
{ EAetheryteLocation.TuliyollalDirigibleLandingYakTel, "[Tuliyollal] Dirigible Landing (Yak T'el)" },
{ EAetheryteLocation.TuliyollalXakTuralSkygate, "[Tuliyollal] Xak Tural Skygate (Shaaloani)" },
{ EAetheryteLocation.SolutionNine, "[Solution Nine] Aetheryte Plaza" },
{ EAetheryteLocation.SolutionNineInformationCenter, "[Solution Nine] Information Center" },
{ EAetheryteLocation.SolutionNineTrueVue, "[Solution Nine] True Vue" },
{ EAetheryteLocation.SolutionNineNeonStein, "[Solution Nine] Neon Stein" },
{ EAetheryteLocation.SolutionNineTheArcadion, "[Solution Nine] The Arcadion" },
{ EAetheryteLocation.SolutionNineResolution, "[Solution Nine] Resolution" },
{ EAetheryteLocation.SolutionNineNexusArcade, "[Solution Nine] Nexus Arcade" },
{ EAetheryteLocation.SolutionNineResidentialSector, "[Solution Nine] Residential Sector" },
{ EAetheryteLocation.SolutionNineScanningPortNine, "[Solution Nine] Scanning Port Nine (Heritage Found)" },
};
}

View File

@ -8,142 +8,7 @@ namespace Questionable.Model.V1.Converter;
public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut>
{
private static readonly Dictionary<EAetheryteLocation, string> EnumToString = new()
{
{ EAetheryteLocation.Gridania, "[Gridania] Aetheryte Plaza" },
{ EAetheryteLocation.GridaniaArcher, "[Gridania] Archers' Guild" },
{ EAetheryteLocation.GridaniaLeatherworker, "[Gridania] Leatherworkers' Guild & Shaded Bower" },
{ EAetheryteLocation.GridaniaLancer, "[Gridania] Lancers' Guild" },
{ EAetheryteLocation.GridaniaConjurer, "[Gridania] Conjurers' Guild" },
{ EAetheryteLocation.GridaniaBotanist, "[Gridania] Botanists' Guild" },
{ EAetheryteLocation.GridaniaAmphitheatre, "[Gridania] Mih Khetto's Amphitheatre" },
{ EAetheryteLocation.GridaniaBlueBadgerGate, "[Gridania] Blue Badger Gate (Central Shroud)" },
{ EAetheryteLocation.GridaniaYellowSerpentGate, "[Gridania] Yellow Serpent Gate (North Shroud)" },
{ EAetheryteLocation.GridaniaWhiteWolfGate, "[Gridania] White Wolf Gate (Central Shroud)" },
{ EAetheryteLocation.GridaniaAirship, "[Gridania] Airship Landing" },
{ EAetheryteLocation.Uldah, "[Ul'dah] Aetheryte Plaza" },
{ EAetheryteLocation.UldahAdventurers, "[Ul'dah] Adventurers' Guild" },
{ EAetheryteLocation.UldahThaumaturge, "[Ul'dah] Thaumaturges' Guild" },
{ EAetheryteLocation.UldahGladiator, "[Ul'dah] Gladiators' Guild" },
{ EAetheryteLocation.UldahMiner, "[Ul'dah] Miners' Guild" },
{ EAetheryteLocation.UldahWeaver, "[Ul'dah] Weavers' Guild" },
{ EAetheryteLocation.UldahGoldsmith, "[Ul'dah] Goldsmiths' Guild" },
{ EAetheryteLocation.UldahSapphireAvenue, "[Ul'dah] Sapphire Avenue Exchange" },
{ EAetheryteLocation.UldahAlchemist, "[Ul'dah] Alchemists' Guild" },
{ EAetheryteLocation.UldahChamberOfRule, "[Ul'dah] The Chamber of Rule" },
{ EAetheryteLocation.UldahGateOfTheSultana, "[Ul'dah] Gate of the Sultana (Western Thanalan)" },
{ EAetheryteLocation.UldahGateOfNald, "[Ul'dah] Gate of Nald (Central Thanalan)" },
{ EAetheryteLocation.UldahGateOfThal, "[Ul'dah] Gate of Thal (Central Thanalan)" },
{ EAetheryteLocation.UldahAirship, "[Ul'dah] Airship Landing" },
{ EAetheryteLocation.Limsa, "[Limsa Lominsa] Aetheryte Plaza" },
{ EAetheryteLocation.LimsaArcanist, "[Limsa Lominsa] Arcanists' Guild" },
{ EAetheryteLocation.LimsaFisher, "[Limsa Lominsa] Fishermens' Guild" },
{ EAetheryteLocation.LimsaHawkersAlley, "[Limsa Lominsa] Hawkers' Alley" },
{ EAetheryteLocation.LimsaAftcastle, "[Limsa Lominsa] The Aftcastle" },
{ EAetheryteLocation.LimsaCulinarian, "[Limsa Lominsa] Culinarians' Guild" },
{ EAetheryteLocation.LimsaMarauder, "[Limsa Lominsa] Marauders' Guild" },
{ EAetheryteLocation.LimsaZephyrGate, "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" },
{ EAetheryteLocation.LimsaTempestGate, "[Limsa Lominsa] Tempest Gate (Lower La Noscea)" },
{ EAetheryteLocation.LimsaAirship, "[Limsa Lominsa] Airship Landing" },
{ EAetheryteLocation.Ishgard, "[Ishgard] Aetheryte Plaza" },
{ EAetheryteLocation.IshgardForgottenKnight, "[Ishgard] The Forgotten Knight" },
{ EAetheryteLocation.IshgardSkysteelManufactory, "[Ishgard] Skysteel Manufactory" },
{ EAetheryteLocation.IshgardBrume, "[Ishgard] The Brume" },
{ EAetheryteLocation.IshgardAthenaeumAstrologicum, "[Ishgard] Athenaeum Astrologicum" },
{ EAetheryteLocation.IshgardJeweledCrozier, "[Ishgard] The Jeweled Crozier" },
{ EAetheryteLocation.IshgardSaintReymanaudsCathedral, "[Ishgard] Saint Reymanaud's Cathedral" },
{ EAetheryteLocation.IshgardTribunal, "[Ishgard] The Tribunal" },
{ EAetheryteLocation.IshgardLastVigil, "[Ishgard] The Last Vigil" },
{ EAetheryteLocation.IshgardGatesOfJudgement, "[Ishgard] The Gates of Judgement (Coerthas Central Highlands)" },
{ EAetheryteLocation.Idyllshire, "[Idyllshire] Aetheryte Plaza" },
{ EAetheryteLocation.IdyllshireWest, "[Idyllshire] West Idyllshire" },
{ EAetheryteLocation.IdyllshirePrologueGate, "[Idyllshire] Prologue Gate" },
{ EAetheryteLocation.IdyllshireEpilogueGate, "[Idyllshire] Epilogue Gate" },
{ EAetheryteLocation.RhalgrsReach, "[Rhalgr's Reach] Aetheryte Plaza" },
{ EAetheryteLocation.RhalgrsReachWest, "[Rhalgr's Reach] Western Rhalgr's Reach" },
{ EAetheryteLocation.RhalgrsReachNorthEast, "[Rhalgr's Reach] Northeastern Rhalgr's Reach" },
{ EAetheryteLocation.RhalgrsReachFringesGate, "[Rhalgr's Reach] Fringes Gate" },
{ EAetheryteLocation.RhalgrsReachPeaksGate, "[Rhalgr's Reach] Peaks Gate" },
{ EAetheryteLocation.Kugane, "[Kugane] Aetheryte Plaza" },
{ EAetheryteLocation.KuganeShiokazeHostelry, "[Kugane] Shiokaze Hostelry" },
{ EAetheryteLocation.KuganePier1, "[Kugane] Pier #1" },
{ EAetheryteLocation.KuganeThavnairianConsulate, "[Kugane] Thavnairian Consulate" },
{ EAetheryteLocation.KuganeMarkets, "[Kugane] Kogane Dori Markets" },
{ EAetheryteLocation.KuganeBokairoInn, "[Kugane] Bokairo Inn" },
{ EAetheryteLocation.KuganeRubyBazaar, "[Kugane] The Ruby Bazaar" },
{ EAetheryteLocation.KuganeSekiseigumiBarracks, "[Kugane] Sekiseigumi Barracks" },
{ EAetheryteLocation.KuganeRakuzaDistrict, "[Kugane] Rakuza District" },
{ EAetheryteLocation.KuganeRubyPrice, "[Kugane] The Ruby Price" },
{ EAetheryteLocation.KuganeAirship, "[Kugane] Airship Landing" },
{ EAetheryteLocation.Crystarium, "[Crystarium] Aetheryte Plaza" },
{ EAetheryteLocation.CrystariumMarkets, "[Crystarium] Musica Universalis Markets" },
{ EAetheryteLocation.CrystariumThemenosRookery, "[Crystarium] Themenos Rookery" },
{ EAetheryteLocation.CrystariumDossalGate, "[Crystarium] The Dossal Gate" },
{ EAetheryteLocation.CrystariumPendants, "[Crystarium] The Pendants" },
{ EAetheryteLocation.CrystariumAmaroLaunch, "[Crystarium] The Amaro Launch" },
{ EAetheryteLocation.CrystariumCrystallineMean, "[Crystarium] The Crystalline Mean" },
{ EAetheryteLocation.CrystariumCabinetOfCuriosity, "[Crystarium] The Cabinet of Curiosity" },
{ EAetheryteLocation.CrystariumTessellation, "[Crystarium] Tessellation (Lakeland)" },
{ EAetheryteLocation.Eulmore, "[Eulmore] Aetheryte Plaza" },
{ EAetheryteLocation.EulmoreSoutheastDerelict, "[Eulmore] Southeast Derelicts" },
{ EAetheryteLocation.EulmoreNightsoilPots, "[Eulmore] Nightsoil Pots" },
{ EAetheryteLocation.EulmoreGloryGate, "[Eulmore] The Glory Gate" },
{ EAetheryteLocation.EulmoreMainstay, "[Eulmore] The Mainstay" },
{ EAetheryteLocation.EulmorePathToGlory, "[Eulmore] The Path to Glory (Kholusia)" },
{ EAetheryteLocation.OldSharlayan, "[Old Sharlayan] Aetheryte Plaza" },
{ EAetheryteLocation.OldSharlayanStudium, "[Old Sharlayan] The Studium" },
{ EAetheryteLocation.OldSharlayanBaldesionAnnex, "[Old Sharlayan] The Baldesion Annex" },
{ EAetheryteLocation.OldSharlayanRostra, "[Old Sharlayan] The Rostra" },
{ EAetheryteLocation.OldSharlayanLeveilleurEstate, "[Old Sharlayan] The Leveilleur Estate" },
{ EAetheryteLocation.OldSharlayanJourneysEnd, "[Old Sharlayan] Journey's End" },
{ EAetheryteLocation.OldSharlayanScholarsHarbor, "[Old Sharlayan] Scholar's Harbor" },
{ EAetheryteLocation.OldSharlayanHallOfArtifice, "[Old Sharlayan] The Hall of Artifice (Labyrinthos)" },
{ EAetheryteLocation.RadzAtHan, "[Radz-at-Han] Aetheryte Plaza" },
{ EAetheryteLocation.RadzAtHanMeghaduta, "[Radz-at-Han] Meghaduta" },
{ EAetheryteLocation.RadzAtHanRuveydahFibers, "[Radz-at-Han] Ruveydah Fibers" },
{ EAetheryteLocation.RadzAtHanAirship, "[Radz-at-Han] Airship Landing" },
{ EAetheryteLocation.RadzAtHanAlzadaalsPeace, "[Radz-at-Han] Alzadaal's Peace" },
{ EAetheryteLocation.RadzAtHanHallOfTheRadiantHost, "[Radz-at-Han] Hall of the Radiant Host" },
{ EAetheryteLocation.RadzAtHanMehrydesMeyhane, "[Radz-at-Han] Mehryde's Meyhane" },
{ EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" },
{ EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" },
{ EAetheryteLocation.RadzAtHanGateOfFirstSight, "[Radz-at-Han] The Gate of First Sight (Thavnair)" },
{ EAetheryteLocation.Tuliyollal, "[Tuliyollal] Aetheryte Plaza" },
{ EAetheryteLocation.TuliyollalDirigibleLanding, "[Tuliyollal] Dirigible Landing" },
{ EAetheryteLocation.TuliyollalTheResplendentQuarter, "[Tuliyollal] The Resplendent Quarter" },
{ EAetheryteLocation.TuliyollalTheForardCabins, "[Tuliyollal] The For'ard Cabins" },
{ EAetheryteLocation.TuliyollalBaysideBevyMarketplace, "[Tuliyollal] Bayside Bevy Marketplace" },
{ EAetheryteLocation.TuliyollalVollokShoonsa, "[Tuliyollal] Vollok Shoonsa" },
{ EAetheryteLocation.TuliyollalWachumeqimeqi, "[Tuliyollal] Wachumeqimeqi" },
{ EAetheryteLocation.TuliyollalBrightploomPost, "[Tuliyollal] Brightploom Post" },
{ EAetheryteLocation.TuliyollalArchOfTheDawnUrqopacha, "[Tuliyollal] Arch of the Dawn (Urqopacha)" },
{ EAetheryteLocation.TuliyollalArchOfTheDawnKozamauka, "[Tuliyollal] Arch of the Dawn (Kozama'uka)" },
{ EAetheryteLocation.TuliyollalIhuykatumu, "[Tuliyollal] Ihuykatumu (Kozama'uka)" },
{ EAetheryteLocation.TuliyollalDirigibleLandingYakTel, "[Tuliyollal] Dirigible Landing (Yak T'el)" },
{ EAetheryteLocation.TuliyollalXakTuralSkygate, "[Tuliyollal] Xak Tural Skygate (Shaaloani)" },
{ EAetheryteLocation.SolutionNine, "[Solution Nine] Aetheryte Plaza" },
{ EAetheryteLocation.SolutionNineInformationCenter, "[Solution Nine] Information Center" },
{ EAetheryteLocation.SolutionNineTrueVue, "[Solution Nine] True Vue" },
{ EAetheryteLocation.SolutionNineNeonStein, "[Solution Nine] Neon Stein" },
{ EAetheryteLocation.SolutionNineTheArcadion, "[Solution Nine] The Arcadion" },
{ EAetheryteLocation.SolutionNineResolution, "[Solution Nine] Resolution" },
{ EAetheryteLocation.SolutionNineNexusArcade, "[Solution Nine] Nexus Arcade" },
{ EAetheryteLocation.SolutionNineResidentialSector, "[Solution Nine] Residential Sector" },
{ EAetheryteLocation.SolutionNineScanningPortNine, "[Solution Nine] Scanning Port Nine (Heritage Found)" },
};
private static readonly Dictionary<EAetheryteLocation, string> EnumToString = AethernetShardConverter.Values;
private static readonly Dictionary<string, EAetheryteLocation> StringToEnum =
EnumToString.ToDictionary(x => x.Value, x => x.Key);

View File

@ -139,7 +139,7 @@ public enum EAetheryteLocation
Crystarium = 133,
CrystariumMarkets = 149,
CrystariumThemenosRookery = 150,
CrystariumTemenosRookery = 150,
CrystariumDossalGate = 151,
CrystariumPendants = 152,
CrystariumAmaroLaunch = 153,

View File

@ -33,6 +33,17 @@ public sealed class QuestStep
public bool? IgnoreDistanceToObject { get; set; }
public string? Comment { get; set; }
/// <summary>
/// Only used when attuning to an aetheryte.
/// </summary>
public EAetheryteLocation? Aetheryte { get; set; }
/// <summary>
/// Only used when attuning to an aethernet shard.
/// </summary>
[JsonConverter(typeof(AethernetShardConverter))]
public EAetheryteLocation? AethernetShard { get; set; }
public EAetheryteLocation? AetheryteShortcut { get; set; }
public AethernetShortcut? AethernetShortcut { get; set; }
@ -80,6 +91,8 @@ public sealed class QuestStep
{
if (InteractionType == EInteractionType.WalkTo)
return StopDistance ?? 0.25f;
if (InteractionType == EInteractionType.AttuneAetheryte)
return StopDistance ?? 10f;
else
return StopDistance ?? DefaultStopDistance;
}

View File

@ -13,9 +13,9 @@
},
"System.Text.Json": {
"type": "Direct",
"requested": "[8.0.3, )",
"resolved": "8.0.3",
"contentHash": "hpagS9joOwv6efWfrMmV9MjQXpiXZH72PgN067Ysfr6AWMSD1/1hEcvh/U5mUpPLezEWsOJSuVrmqDIVD958iA==",
"requested": "[8.0.4, )",
"resolved": "8.0.4",
"contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "8.0.0",
"System.Buffers": "4.5.1",

View File

@ -6,11 +6,15 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Threading.Tasks;
using Dalamud.Plugin;
using Json.Schema;
using Microsoft.Extensions.Logging;
using Questionable.Data;
using Questionable.Model;
using Questionable.Model.V1;
using Questionable.QuestPaths;
using Questionable.Validation;
namespace Questionable.Controller;
@ -21,6 +25,7 @@ internal sealed class QuestRegistry
private readonly QuestData _questData;
private readonly QuestValidator _questValidator;
private readonly ILogger<QuestRegistry> _logger;
private readonly JsonSchema _questSchema;
private readonly Dictionary<ushort, Quest> _quests = new();
@ -31,6 +36,7 @@ internal sealed class QuestRegistry
_questData = questData;
_questValidator = questValidator;
_logger = logger;
_questSchema = JsonSchema.FromStream(AssemblyQuestLoader.QuestSchema).AsTask().Result;
}
public IEnumerable<Quest> AllQuests => _quests.Values;
@ -40,6 +46,7 @@ internal sealed class QuestRegistry
public void Reload()
{
_questValidator.ClearIssues();
_quests.Clear();
LoadQuestsFromAssembly();
@ -64,7 +71,7 @@ internal sealed class QuestRegistry
{
_logger.LogInformation("Loading quests from assembly");
foreach ((ushort questId, QuestRoot questRoot) in QuestPaths.AssemblyQuestLoader.GetQuests())
foreach ((ushort questId, QuestRoot questRoot) in AssemblyQuestLoader.GetQuests())
{
Quest quest = new()
{
@ -113,7 +120,6 @@ internal sealed class QuestRegistry
private void ValidateQuests()
{
_questValidator.ClearIssues();
_questValidator.Validate(_quests.Values.Where(x => !x.ReadOnly));
}
@ -124,10 +130,31 @@ internal sealed class QuestRegistry
if (questId == null)
return;
var questNode = JsonNode.Parse(stream);
Task.Run(() =>
{
var evaluationResult = _questSchema.Evaluate(questNode, new EvaluationOptions
{
Culture = CultureInfo.InvariantCulture,
OutputFormat = OutputFormat.List
});
if (!evaluationResult.IsValid)
{
_questValidator.AddIssue(new ValidationIssue
{
QuestId = questId.Value,
Sequence = null,
Step = null,
Severity = EIssueSeverity.Error,
Description = "JSON Validation failed"
});
}
});
Quest quest = new Quest
{
QuestId = questId.Value,
Root = JsonSerializer.Deserialize<QuestRoot>(stream)!,
Root = questNode.Deserialize<QuestRoot>()!,
Info = _questData.GetQuestInfo(questId.Value),
ReadOnly = false,
};

View File

@ -17,10 +17,10 @@ internal static class AethernetShard
if (step.InteractionType != EInteractionType.AttuneAethernetShard)
return null;
ArgumentNullException.ThrowIfNull(step.DataId);
ArgumentNullException.ThrowIfNull(step.AethernetShard);
return serviceProvider.GetRequiredService<DoAttune>()
.With((EAetheryteLocation)step.DataId);
.With(step.AethernetShard.Value);
}
}

View File

@ -15,10 +15,10 @@ internal static class Aetheryte
if (step.InteractionType != EInteractionType.AttuneAetheryte)
return null;
ArgumentNullException.ThrowIfNull(step.DataId);
ArgumentNullException.ThrowIfNull(step.Aetheryte);
return serviceProvider.GetRequiredService<DoAttune>()
.With((EAetheryteLocation)step.DataId.Value);
.With(step.Aetheryte.Value);
}
}

View File

@ -19,7 +19,7 @@ namespace Questionable.Controller.Steps.Shared;
internal static class Move
{
internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory
internal sealed class Factory(IServiceProvider serviceProvider, AetheryteData aetheryteData) : ITaskFactory
{
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{
@ -37,6 +37,20 @@ internal static class Move
task.StopDistance = step.StopDistance.Value;
return [task];
}
else if (step is { InteractionType: EInteractionType.AttuneAetheryte, Aetheryte: not null })
{
var builder = serviceProvider.GetRequiredService<MoveBuilder>();
builder.Step = step;
builder.Destination = aetheryteData.Locations[step.Aetheryte.Value];
return builder.Build();
}
else if (step is { InteractionType: EInteractionType.AttuneAethernetShard, AethernetShard: not null })
{
var builder = serviceProvider.GetRequiredService<MoveBuilder>();
builder.Step = step;
builder.Destination = aetheryteData.Locations[step.AethernetShard.Value];
return builder.Build();
}
return [];
}

View File

@ -151,7 +151,7 @@ internal sealed class AetheryteData
{ EAetheryteLocation.Crystarium, new(-65.0188f, 4.5318604f, 0.015197754f) },
{ EAetheryteLocation.CrystariumMarkets, new(-6.149414f, -7.736328f, 148.72961f) },
{ EAetheryteLocation.CrystariumThemenosRookery, new(-107.37775f, -0.015319824f, -58.762512f) },
{ EAetheryteLocation.CrystariumTemenosRookery, new(-107.37775f, -0.015319824f, -58.762512f) },
{ EAetheryteLocation.CrystariumDossalGate, new(64.86609f, -0.015319824f, -18.173523f) },
{ EAetheryteLocation.CrystariumPendants, new(35.477173f, -0.015319824f, 222.58337f) },
{ EAetheryteLocation.CrystariumAmaroLaunch, new(66.60559f, 35.99597f, -131.09033f) },

View File

@ -10,9 +10,10 @@
<ItemGroup>
<PackageReference Include="Dalamud.Extensions.MicrosoftLogging" Version="4.0.1"/>
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" ExcludeAssets="runtime"/>
<PackageReference Include="JetBrains.Annotations" Version="2024.2.0" ExcludeAssets="runtime" />
<PackageReference Include="JsonSchema.Net" Version="7.1.2" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0"/>
<PackageReference Include="System.Text.Json" Version="8.0.3"/>
<PackageReference Include="System.Text.Json" Version="8.0.4" />
</ItemGroup>
<ItemGroup>

View File

@ -54,4 +54,6 @@ internal sealed class QuestValidator
.ToList();
});
}
public void AddIssue(ValidationIssue issue) => _validationIssues.Add(issue);
}

View File

@ -1,4 +1,5 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Numerics;
@ -8,6 +9,7 @@ using Dalamud.Interface.Windowing;
using Dalamud.Plugin.Services;
using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Model;
using Questionable.Model.V1;
@ -20,10 +22,11 @@ internal sealed class DebugOverlay : Window
private readonly IGameGui _gameGui;
private readonly IClientState _clientState;
private readonly ICondition _condition;
private readonly AetheryteData _aetheryteData;
private readonly Configuration _configuration;
public DebugOverlay(QuestController questController, QuestRegistry questRegistry, IGameGui gameGui,
IClientState clientState, ICondition condition, Configuration configuration)
IClientState clientState, ICondition condition, AetheryteData aetheryteData, Configuration configuration)
: base("Questionable Debug Overlay###QuestionableDebugOverlay",
ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoBackground |
ImGuiWindowFlags.NoInputs | ImGuiWindowFlags.NoSavedSettings, true)
@ -33,6 +36,7 @@ internal sealed class DebugOverlay : Window
_gameGui = gameGui;
_clientState = clientState;
_condition = condition;
_aetheryteData = aetheryteData;
_configuration = configuration;
Position = Vector2.Zero;
@ -75,14 +79,14 @@ internal sealed class DebugOverlay : Window
for (int i = currentQuest.Step; i <= sequence.Steps.Count; ++i)
{
QuestStep? step = sequence.FindStep(i);
if (step == null || step.Position == null)
continue;
DrawStep(i.ToString(CultureInfo.InvariantCulture), step,
Vector3.Distance(_clientState.LocalPlayer!.Position, step.Position.Value) <
step.CalculateActualStopDistance()
? 0xFF00FF00
: 0xFF0000FF);
if (step != null && TryGetPosition(step, out Vector3? position))
{
DrawStep(i.ToString(CultureInfo.InvariantCulture), step, position.Value,
Vector3.Distance(_clientState.LocalPlayer!.Position, position.Value) <
step.CalculateActualStopDistance()
? 0xFF00FF00
: 0xFF0000FF);
}
}
}
@ -96,25 +100,49 @@ internal sealed class DebugOverlay : Window
for (int i = 0; i < sequence.Steps.Count; ++i)
{
QuestStep? step = sequence.FindStep(i);
DrawStep($"{quest.QuestId} / {sequence.Sequence} / {i}", step, 0xFFFFFFFF);
if (step != null && TryGetPosition(step, out Vector3? position))
{
DrawStep($"{quest.QuestId} / {sequence.Sequence} / {i}", step, position.Value, 0xFFFFFFFF);
}
}
}
}
private void DrawStep(string counter, QuestStep? step, uint color)
private void DrawStep(string counter, QuestStep step, Vector3 position, uint color)
{
if (step == null ||
step.Position == null ||
step.Disabled ||
step.TerritoryId != _clientState.TerritoryType)
if (step.Disabled || step.TerritoryId != _clientState.TerritoryType)
return;
bool visible = _gameGui.WorldToScreen(step.Position.Value, out Vector2 screenPos);
bool visible = _gameGui.WorldToScreen(position, out Vector2 screenPos);
if (!visible)
return;
ImGui.GetWindowDrawList().AddCircleFilled(screenPos, 3f, color);
ImGui.GetWindowDrawList().AddText(screenPos + new Vector2(10, -8), color,
$"{counter}: {step.InteractionType}\n{step.Position.Value.ToString("G", CultureInfo.InvariantCulture)} [{(step.Position.Value - _clientState.LocalPlayer!.Position).Length():N2}]\n{step.Comment}");
$"{counter}: {step.InteractionType}\n{position.ToString("G", CultureInfo.InvariantCulture)} [{(position - _clientState.LocalPlayer!.Position).Length():N2}]\n{step.Comment}");
}
private bool TryGetPosition(QuestStep step, [NotNullWhen(true)] out Vector3? position)
{
if (step.Position != null)
{
position = step.Position;
return true;
}
else if (step.InteractionType == EInteractionType.AttuneAetheryte && step.Aetheryte != null)
{
position = _aetheryteData.Locations[step.Aetheryte.Value];
return true;
}
else if (step.InteractionType == EInteractionType.AttuneAethernetShard && step.AethernetShard != null)
{
position = _aetheryteData.Locations[step.AethernetShard.Value];
return true;
}
else
{
position = null;
return false;
}
}
}

View File

@ -9,6 +9,7 @@ using Dalamud.Game.Text;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
@ -277,7 +278,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
{
ImGui.SameLine();
if (ImGuiComponents.IconButton(FontAwesomeIcon.Atlas))
_commandManager.DispatchCommand("/questinfo", currentQuest.Quest.QuestId.ToString(CultureInfo.InvariantCulture), commandInfo);
_commandManager.DispatchCommand("/questinfo",
currentQuest.Quest.QuestId.ToString(CultureInfo.InvariantCulture), commandInfo);
}
bool autoAcceptNextQuest = _configuration.General.AutoAcceptNextQuest;
@ -596,20 +598,72 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
if (_questRegistry.ValidationIssueCount > 0)
{
ImGui.SameLine();
bool colored = _questRegistry.ValidationErrorCount > 0;
if (colored)
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed);
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Flag,
$"{_questRegistry.ValidationIssueCount}"))
if (DrawValidationIssuesButton())
_questValidationWindow.IsOpen = true;
if (colored)
ImGui.PopStyleColor();
}
}
private bool DrawValidationIssuesButton()
{
int errorCount = _questRegistry.ValidationErrorCount;
int infoCount = _questRegistry.ValidationIssueCount - _questRegistry.ValidationErrorCount;
if (errorCount == 0 && infoCount == 0)
return false;
int partsToRender = errorCount == 0 || infoCount == 0 ? 1 : 2;
using var id = ImRaii.PushId("validationissues");
ImGui.PushFont(UiBuilder.IconFont);
var icon1 = FontAwesomeIcon.TimesCircle;
var icon2 = FontAwesomeIcon.InfoCircle;
Vector2 iconSize1 = errorCount > 0 ? ImGui.CalcTextSize(icon1.ToIconString()) : Vector2.Zero;
Vector2 iconSize2 = infoCount > 0 ? ImGui.CalcTextSize(icon2.ToIconString()) : Vector2.Zero;
ImGui.PopFont();
string text1 = errorCount > 0 ? errorCount.ToString(CultureInfo.InvariantCulture) : string.Empty;
string text2 = infoCount > 0 ? infoCount.ToString(CultureInfo.InvariantCulture) : string.Empty;
Vector2 textSize1 = errorCount > 0 ? ImGui.CalcTextSize(text1) : Vector2.Zero;
Vector2 textSize2 = infoCount > 0 ? ImGui.CalcTextSize(text2) : Vector2.Zero;
var dl = ImGui.GetWindowDrawList();
var cursor = ImGui.GetCursorScreenPos();
var iconPadding = 3 * ImGuiHelpers.GlobalScale;
// Draw an ImGui button with the icon and text
var buttonWidth = iconSize1.X + iconSize2.X + textSize1.X + textSize2.X +
(ImGui.GetStyle().FramePadding.X * 2) + iconPadding * 2 * partsToRender;
var buttonHeight = ImGui.GetFrameHeight();
var button = ImGui.Button(string.Empty, new Vector2(buttonWidth, buttonHeight));
// Draw the icon on the window drawlist
Vector2 position = new Vector2(cursor.X + ImGui.GetStyle().FramePadding.X,
cursor.Y + ImGui.GetStyle().FramePadding.Y);
if (errorCount > 0)
{
ImGui.PushFont(UiBuilder.IconFont);
dl.AddText(position, ImGui.GetColorU32(ImGuiColors.DalamudRed), icon1.ToIconString());
ImGui.PopFont();
position = position with { X = position.X + iconSize1.X + iconPadding };
// Draw the text on the window drawlist
dl.AddText(position, ImGui.GetColorU32(ImGuiCol.Text), text1);
position = position with { X = position.X + textSize1.X + 2 * iconPadding };
}
if (infoCount > 0)
{
ImGui.PushFont(UiBuilder.IconFont);
dl.AddText(position, ImGui.GetColorU32(ImGuiColors.ParsedBlue), icon2.ToIconString());
ImGui.PopFont();
position = position with { X = position.X + iconSize2.X + iconPadding };
// Draw the text on the window drawlist
dl.AddText(position, ImGui.GetColorU32(ImGuiCol.Text), text2);
}
return button;
}
private void DrawRemainingTasks()
{
var remainingTasks = _questController.GetRemainingTaskNames();

View File

@ -31,9 +31,18 @@
},
"JetBrains.Annotations": {
"type": "Direct",
"requested": "[2023.3.0, )",
"resolved": "2023.3.0",
"contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA=="
"requested": "[2024.2.0, )",
"resolved": "2024.2.0",
"contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw=="
},
"JsonSchema.Net": {
"type": "Direct",
"requested": "[7.1.2, )",
"resolved": "7.1.2",
"contentHash": "tvM82Wpsyk+C5aUWkqPZLo2ANDjEfCoDa9R24k7jRkCrwxbXnSBb7NpU1pz0ufp6qw+jIekHD9xJdUkjUtnZxQ==",
"dependencies": {
"JsonPointer.Net": "5.0.0"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Direct",
@ -56,13 +65,32 @@
},
"System.Text.Json": {
"type": "Direct",
"requested": "[8.0.3, )",
"resolved": "8.0.3",
"contentHash": "hpagS9joOwv6efWfrMmV9MjQXpiXZH72PgN067Ysfr6AWMSD1/1hEcvh/U5mUpPLezEWsOJSuVrmqDIVD958iA==",
"requested": "[8.0.4, )",
"resolved": "8.0.4",
"contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
"dependencies": {
"System.Text.Encodings.Web": "8.0.0"
}
},
"Humanizer.Core": {
"type": "Transitive",
"resolved": "2.14.1",
"contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw=="
},
"Json.More.Net": {
"type": "Transitive",
"resolved": "2.0.1.2",
"contentHash": "uF3QeiaXEfH92emz0/BWUiNtMSfxIIvgynuB0Bf1vF4s8eWTcZitBx9l+g/FDaJk5XxqBv9buQXizXKQcXFG1w=="
},
"JsonPointer.Net": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "fm4T5w20AY6C+p5/pJr0vrXRNGgtSfHl34I1LxC9zdPwS9S3j0GiR1Mz/CVPWKDXXGDpCt1APHpCq7kn5adCfA==",
"dependencies": {
"Humanizer.Core": "2.14.1",
"Json.More.Net": "2.0.1.2"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
@ -160,7 +188,7 @@
"questionable.model": {
"type": "Project",
"dependencies": {
"System.Text.Json": "[8.0.3, )"
"System.Text.Json": "[8.0.4, )"
}
},
"questpaths": {