Handle how required classes are configured for individual quest steps + gathering
authorLiza Carvelli <liza@carvel.li>
Mon, 4 Nov 2024 16:19:49 +0000 (17:19 +0100)
committerLiza Carvelli <liza@carvel.li>
Mon, 4 Nov 2024 16:20:11 +0000 (17:20 +0100)
63 files changed:
LLib
QuestPathGenerator/RoslynElements/GatheredItemExtensions.cs
QuestPathGenerator/RoslynElements/QuestStepExtensions.cs
QuestPaths/2.x - A Realm Reborn/MSQ-1/Ul'dah/3852_Prudence at This Junction.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3806_A Tool's Errand.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3807_Where the Sun Don't Shine.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3808_A Touch of Home.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3809_Mother's Recipe.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3811_Rational Thinking.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3812_Making Scents.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3814_Prayers and Poison.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3815_Salve Our Souls.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3816_Rings of Pattern.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3817_You Dirty Rats.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3818_If It's Broke, Fix It.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3820_The Qitari Book of Records.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3821_Meat and Greet.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3822_I Have Never Exploded.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3824_Rock 'n Ronka.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3825_There's No Clean Like Qhoterl Clean.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3827_Her Splendid Materials.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3828_Splendid Eats.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3830_Safety Is No Accident.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Dailies/3831_One Fish, Two Fish, Bread Fish, Stew Fish.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Story/3795_Wisdom of the Night.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Story/3796_Delving Deeper.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Story/3797_A Chilling Fate.json
QuestPaths/5.x - Shadowbringers/Allied Societies/Qitari/Story/3798_What Ails the Forest.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4607_Signs of the Past.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4609_Well Below Standard.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4611_Grounds for Improvement.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4612_A Fertile Blend.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4614_The Robot and the Sea.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4615_Using Their Heads.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4617_I'll Fish It Myself.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4618_Sold Out.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4620_A Taste of the Sea.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4622_Ea Epicurious.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4623_I, Omicron.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4625_Corporeal Hand to Proverbial Mouth.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4626_Mush for Miw Miisv.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4627_Corporeal Comforts.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4629_A Light in the Dark.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4630_Reclaiming the Taste of Home.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4631_Not Forgotten.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4632_Checking for Cavities.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Dailies/4634_The Lost World.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Story/4601_The Café at the End of the Universe.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Story/4602_Longing So for All the Fish.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Story/4603_And Another Question.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Story/4604_The Restaurateur's Guide to the Dragonstar.json
QuestPaths/6.x - Endwalker/Allied Societies/Omicrons/Story/4605_Mostly Heartless.json
QuestPaths/quest-v1.json
Questionable.Model/Questing/Converter/ClassJobConverter.cs [deleted file]
Questionable.Model/Questing/Converter/ExtendedClassJobConverter.cs [new file with mode: 0644]
Questionable.Model/Questing/EExtendedClassJob.cs [new file with mode: 0644]
Questionable.Model/Questing/GatheredItem.cs
Questionable.Model/Questing/QuestStep.cs
Questionable.Model/common-schema.json
Questionable/Controller/ContextMenuController.cs
Questionable/Controller/Steps/Shared/Gather.cs
Questionable/Controller/Steps/Shared/SkipCondition.cs
Questionable/Data/ClassJobUtils.cs [new file with mode: 0644]

diff --git a/LLib b/LLib
index 912a7b04ce180e337af9beeef2d1393b040c1ba8..fde09c705b648f03c287814191a554f0a4b92cc4 160000 (submodule)
--- a/LLib
+++ b/LLib
@@ -1 +1 @@
-Subproject commit 912a7b04ce180e337af9beeef2d1393b040c1ba8
+Subproject commit fde09c705b648f03c287814191a554f0a4b92cc4
index 179c7a66821973bffd4d3f2ee827fa9ea507cfd6..cad92fac54cad0ef7fd5fbd40e486372ff5de513 100644 (file)
@@ -29,10 +29,6 @@ internal static class GatheredItemExtensions
                                 .AsSyntaxNodeOrToken(),
                             Assignment(nameof(GatheredItem.Collectability), gatheredItem.Collectability,
                                     emptyItem.Collectability)
-                                .AsSyntaxNodeOrToken(),
-                            Assignment(nameof(GatheredItem.QuestAcceptedAsClass),
-                                    gatheredItem.QuestAcceptedAsClass,
-                                    emptyItem.QuestAcceptedAsClass)
                                 .AsSyntaxNodeOrToken()))));
     }
 }
index d65ca7942450d025ee424e5e50d3d059d48f4fa5..ecfea639e5a9dacba1d1e1c2f7263727a5fa60e1 100644 (file)
@@ -120,6 +120,12 @@ internal static class QuestStepExtensions
                             AssignmentList(nameof(QuestStep.RequiredQuestVariables),
                                     step.RequiredQuestVariables)
                                 .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.RequiredCurrentJob),
+                                    step.RequiredCurrentJob)
+                                .AsSyntaxNodeOrToken(),
+                            AssignmentList(nameof(QuestStep.RequiredQuestAcceptedJob),
+                                    step.RequiredQuestAcceptedJob)
+                                .AsSyntaxNodeOrToken(),
                             AssignmentList(nameof(QuestStep.ItemsToGather),
                                 step.ItemsToGather),
                             AssignmentList(nameof(QuestStep.CompletionQuestVariablesFlags),
index 50722a12f3e3f0b026f29abf276a85cac2e1972b..e2e944e95d3ff985749341218f66b3232181c40f 100644 (file)
     {
       "Sequence": 255,
       "Steps": [
+        {
+          "Position": {
+            "X": -12.223117,
+            "Y": -2.0482793,
+            "Z": -145.75566
+          },
+          "TerritoryId": 141,
+          "InteractionType": "WalkTo"
+        },
         {
           "TerritoryId": 141,
           "InteractionType": "EquipRecommended"
         },
+        {
+          "DataId": 1001564,
+          "Position": {
+            "X": -9.689575,
+            "Y": -2.0480804,
+            "Z": -145.09808
+          },
+          "TerritoryId": 141,
+          "InteractionType": "PurchaseItem",
+          "PurchaseMenu": {
+            "ExcelSheet": "GilShop",
+            "Key": 262186
+          },
+          "ItemId": 2654,
+          "ItemCount": 1,
+          "RequiredCurrentJob": [
+            "DoW"
+          ],
+          "SkipConditions": {
+            "StepIf": {
+              "Item": {
+                "NotInInventory": false
+              }
+            }
+          }
+        },
+        {
+          "DataId": 1001564,
+          "Position": {
+            "X": -9.689575,
+            "Y": -2.0480804,
+            "Z": -145.09808
+          },
+          "TerritoryId": 141,
+          "InteractionType": "PurchaseItem",
+          "PurchaseMenu": {
+            "ExcelSheet": "GilShop",
+            "Key": 262186
+          },
+          "ItemId": 2655,
+          "ItemCount": 1,
+          "RequiredCurrentJob": [
+            "DoM"
+          ]
+        },
+        {
+          "TerritoryId": 141,
+          "InteractionType": "EquipItem",
+          "ItemId": 2654,
+          "SkipConditions": {
+            "StepIf": {
+              "Item": {
+                "NotInInventory": true
+              }
+            }
+          }
+        },
+        {
+          "TerritoryId": 141,
+          "InteractionType": "EquipItem",
+          "ItemId": 2655,
+          "SkipConditions": {
+            "StepIf": {
+              "Item": {
+                "NotInInventory": true
+              }
+            }
+          }
+        },
         {
           "DataId": 1001447,
           "Position": {
             "Z": -148.51611
           },
           "TerritoryId": 141,
-          "InteractionType": "CompleteQuest",
-          "Comment": "All starting gear (except the hat) is ilvl 5 already"
+          "InteractionType": "CompleteQuest"
         }
       ]
     }
index 3a11c275ac6cc15cc4e6eadb3de40e7f8468489a..95347389363702387c58a311a7a2eecb9cabcb39 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29517,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29543,
               "ItemCount": 3
             }
index 194836db333c6f782b164547efecc105d6e73a76..88b96f9842d543be711370e024091e6bace5604d 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29518,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29544,
               "ItemCount": 3
             }
index 5fa818a8889bad19c231ac6fc1350f7273c5d2a5..8c2898f555d2d1e8ea620a75b5340100d303b7f6 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29519,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29545,
               "ItemCount": 3
             }
index e0e1def3c801bf9f316ec9680008896218f4d2c8..001da099f2abab3f3c53d4fad3fdad85932baef5 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29520,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29546,
               "ItemCount": 3
             }
index 1e420bdfafc20027f88c81850d64fad11ed15bf2..1d5c1c1261fd65bf99088d3a71c91ee5e7d9306c 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29521,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29547,
               "ItemCount": 3
             }
index 6b0ac90418152034013c6da28e9d2b6535e99763..277bd959c9c0b35f2d9f6594703ab18bb1252792 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29522,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29548,
               "ItemCount": 3
             }
index 6fa2638b184e29ecb869e40f69bc44aa7ac51e80..3805b7a9b8a76097cf3fd4a91bd36a86b7596767 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29523,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29549,
               "ItemCount": 3
             }
index 1a63219d3dd6890b0c70aab2fd96e073aa99ba49..43379d50b80eaad74685b3a0713d30bbf2a978f2 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29524,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29550,
               "ItemCount": 3
             }
index bac8bfae7e260b15718cde5cecab80b3ae0df641..dfe3de3b93bec207ba29c474b70f0d899c711ac0 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29525,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29551,
               "ItemCount": 3
             }
index f01987398aefed25d5efc008733efa94217aed3f..8d18783e0f991ee5c1c4e74ef0e55cc1bcd7bc0f 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29526,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29552,
               "ItemCount": 3
             }
index 8d0ac16d81eba5fbcf836a4de3e1032d7e4b22c6..6e2d4ab08a8b42cf80bd62cfeb00490f99a865f6 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29527,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29553,
               "ItemCount": 3
             }
index 204ea239f38faf58d29e26b4d4686903a2743d15..f3b347cbce3819ae046d6e02dde08c8ff4a87171 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29528,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29554,
               "ItemCount": 3
             }
index ffa6ff83cdc9d87144d20c4442025bd0a80a08bb..afc170ee24d2034247e16a96df10175a915cc0cf 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29529,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29555,
               "ItemCount": 3
             }
index dec082cdef163a2828a44b25e6767613547d762a..b78b3195e27c293f2328bc8c4461bb9208a5f448 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29530,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29556,
               "ItemCount": 3
             }
index 7746ab7a996c5279ef392a19c5f8dcd9bfd70935..89faa3184a04a5a5cfd04e1a317035d69cfd0de0 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29531,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29557,
               "ItemCount": 3
             }
index b5e71d0b9b35153a8669f09ec021b7b1abbbd707..02b0e4ea69aa040477ae5ebf0d277f32300db7dc 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29532,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29558,
               "ItemCount": 3
             }
index 6b71e791e8ed668f5b27be2cfd46d67aa05388d5..d694fed187adeee2d332530f6c6cb2a4ccb06e29 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29533,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29559,
               "ItemCount": 3
             }
index 9442335fa117587c8d41ec3fca721f43b79c48cd..5e2e49e4311dca92eb35b364a0eda10e37431e91 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29534,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
+
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29560,
               "ItemCount": 3
             }
index 8f3976ed99d8eb5be992821d2e32961dfa1eb426..8e05db5ec9839e9882a3a8cb5fb1b467262aaf0e 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29535,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29561,
               "ItemCount": 3
             }
index f2761f621eb863e451c66014dcb48c08de833fa3..255ac54955ba1c40a6fdace4feaaa77c9a946ee1 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29536,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29562,
               "ItemCount": 3
             }
index 84db90fd8c9348209be7f53b954024583eb21672..5cd42198862a0d0f360b7117f841a7d8e660c3cc 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29513,
               "ItemCount": 1
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29539,
               "ItemCount": 1
             }
index be8eb6d4f91f27e01340ad5df96e697ad3662307..7e573e1fdd563ee2590a2d4d6f46340db97f8795 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29514,
               "ItemCount": 1
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29540,
               "ItemCount": 1
             }
index 4118fec3ffef879e9f6812a0d5e190d67a9c3de6..1b253615c3fb1ea3459f361e5f29098f3d5656c9 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29515,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29541,
               "ItemCount": 3
             }
index e7e98bf517fb8b39cd9590acd936f00aa56c1a8f..f5f60b1b4346181b1b335ba1c2068a0847615100 100644 (file)
         {
           "TerritoryId": 817,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 29516,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 817,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 29542,
               "ItemCount": 3
             }
index e70487a8a332650d01c2beae91c479c15eefb042..8a8c5c6557355f9f26d0ccd8cac1ebb984cd2186 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38281,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38305,
               "ItemCount": 3
             }
index c50c4a58173b34228699cac92ef1d064f6d7890f..e66130f81c983a98001bf856f41b406c90c7a2a3 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38282,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38306,
               "ItemCount": 3
             }
index 9cdb099ad6e4c6032182c5010aaa45953b4ac344..a6c457b98ec58456e1f570452b076bc3ce51374f 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38284,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38308,
               "ItemCount": 3
             }
index 0635180f2c05ce7e2520bb1bc4263282adbed19e..a98f9a30efaab7cc8b55015e2476ea70e6e27c13 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38283,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38307,
               "ItemCount": 3
             }
index 71875e688c49ab41cc466eb17d8c40e463680e6e..24595739ae2cb2f22bea40dbeaecff19440ca152 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38285,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38309,
               "ItemCount": 3
             }
index dece67eb02db7d95b18e8bf07086abdf3e3a5b34..7da759d5bcb33bfdc451cf07430c0026e3d3e05d 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38286,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38310,
               "ItemCount": 3
             }
-          ],
-          "Fly": true
+          ]
         },
         {
           "DataId": 2013072,
index 513129c61eaff6a5ea2b61d49c05069ed7aadde7..0370451657745f8fb22ab44dd658130715bdbeb8 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38287,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38311,
               "ItemCount": 3
             }
index 4b83ed9dd4ba8e95d84f24d4f5c211eee4986a06..901356f3a3e5333b542aaeaa0fd4c9af7a1cef8e 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38288,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38312,
               "ItemCount": 3
             }
index 9432896100f1d7a9eaf33adfba7b0c891eae111a..75083d05c8045d80f6a289d98a216356ef036aed 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38289,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38313,
               "ItemCount": 3
             }
index 9662a58c67af03cd1ab9aaf3826ad3a97a2958e8..6bcca2ffcb6a67ab8a9837a11b63798698552c17 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38290,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38314,
               "ItemCount": 3
             }
index 6d818a499e5028a2160a08e57250a71d52b3f5d1..b3526732cb6e865d3c133d51650275fa449d2e86 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38291,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38315,
               "ItemCount": 3
             }
index b1fc3e924fa6a209f2c28cc9017ae4ec0b1684c9..547e110f143c93cf4d93881481d1dd6253ba151e 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38292,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38316,
               "ItemCount": 3
             }
index 1faf24167496b262ee7ed0415e550f2c3fe59a04..9e32671b4cc21df88b2b7b4de4367a1001ab2146 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38293,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38317,
               "ItemCount": 3
             }
index f8be57eca1206c4cbe0f3e23d102b0b0c61566a7..9be8d45fca7723cbec98a313c90342389ce2cb4e 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38294,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38318,
               "ItemCount": 3
             }
index 9ba18a23c3cfd3d0e74480473e931d0a2cd4be7e..a2599e524cc999717aa662250323afcac7433219 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38295,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38319,
               "ItemCount": 3
             }
index 6e075fa897268b77386cb6c05d341e843cdedb07..a519f509704b1f1add5d8187f97096c023564a7b 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38296,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38320,
               "ItemCount": 3
             }
index f3eca7450d4afb7a983ad3343e184ece37e47f6d..c6fcbdde5566e865095624efe2072b28d34faad1 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38297,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38321,
               "ItemCount": 3
             }
index bf7202517bf3adcebd6a4f7099e576eba7da778d..2f609cbfac33cd355490d84d9eb567864537453c 100644 (file)
           "TerritoryId": 960,
           "InteractionType": "Gather",
           "AetheryteShortcut": "Ultima Thule - Reah Tahra",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38299,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "AetheryteShortcut": "Ultima Thule - Reah Tahra",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38323,
               "ItemCount": 3
             }
index 89f6b44c10320790bd9bca3cae10cf6700516078..f74391403072a3d509e9b6920b3cbcb809d885f5 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38298,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38322,
               "ItemCount": 3
             }
index d1eb587c3f47d061178d5460f6eb76639ec4bcdc..ede9e73d6daae31474b07337e989a7a39f00160d 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38276,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38300,
               "ItemCount": 3
             }
index ffafc60f83a2b74c56a9dd74b0f7d1c0b48168a9..281566ab0c988d104dd5f43a58d741d163dfe691 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38277,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38301,
               "ItemCount": 3
             }
index 9170a9ed57057fc6a89571941852b5ce6122b6b9..9b21672ecf5e769bfbc3aceea056f0ba7b8d276d 100644 (file)
         {
           "TerritoryId": 960,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38278,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 960,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38302,
               "ItemCount": 3
             }
-          ],
-          "Fly": true
+          ]
         },
         {
           "DataId": 2013072,
index 0cdbce560846d64f868bb17fdc2e2e633c486b51..a6d019d9573e54ef2454fe67b0acda133ca9aad5 100644 (file)
         {
           "TerritoryId": 398,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38279,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 398,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38303,
               "ItemCount": 3
             }
index 32571b616fcb4bfb5b5036192463d859e1d4f4ee..b499112bb184e0fe0b2bcdee7ddb042d450ffe98 100644 (file)
         {
           "TerritoryId": 1073,
           "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Miner"
+          ],
           "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Miner",
               "ItemId": 38280,
               "ItemCount": 3
-            },
+            }
+          ]
+        },
+        {
+          "TerritoryId": 1073,
+          "InteractionType": "Gather",
+          "RequiredQuestAcceptedJob": [
+            "Botanist"
+          ],
+          "ItemsToGather": [
             {
-              "QuestAcceptedAsClass": "Botanist",
               "ItemId": 38304,
               "ItemCount": 3
             }
index a1d9aa33d16ca9e7df65d1007025d1ddce45d9da..5ef7ce77d26f7a8ae8d7f7d992ba070dc9038299 100644 (file)
             }
           }
         },
+        "RequiredCurrentJob": {
+          "description": "Which class or job you are using whenever this step gets executed",
+          "type": "array",
+          "items": {
+            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob"
+          }
+        },
+        "RequiredQuestAcceptedJob": {
+          "description": "Which class or job you were using when accepting this quest (e.g. for beast tribes)",
+          "type": "array",
+          "items": {
+            "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob"
+          }
+        },
         "DelaySecondsAtStart": {
           "description": "Time to wait before starting",
           "type": [
                       "type": "number",
                       "minimum": 0,
                       "maximum": 1000
-                    },
-                    "QuestAcceptedAsClass": {
-                      "type": "string",
-                      "enum": [
-                        "Miner",
-                        "Botanist"
-                      ]
                     }
                   },
                   "required": [
diff --git a/Questionable.Model/Questing/Converter/ClassJobConverter.cs b/Questionable.Model/Questing/Converter/ClassJobConverter.cs
deleted file mode 100644 (file)
index 4beb8e9..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-
-namespace Questionable.Model.Questing.Converter;
-
-internal sealed class ClassJobConverter : JsonConverter<uint>
-{
-    public override uint Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
-    {
-        if (reader.TokenType != JsonTokenType.String)
-            throw new JsonException();
-
-        return reader.GetString() switch
-        {
-            "Miner" => 16,
-            "Botanist" => 17,
-            _ => throw new JsonException("Unsupported value for classjob"),
-        };
-    }
-
-    public override void Write(Utf8JsonWriter writer, uint value, JsonSerializerOptions options)
-    {
-        throw new NotImplementedException();
-    }
-}
diff --git a/Questionable.Model/Questing/Converter/ExtendedClassJobConverter.cs b/Questionable.Model/Questing/Converter/ExtendedClassJobConverter.cs
new file mode 100644 (file)
index 0000000..c92ca0b
--- /dev/null
@@ -0,0 +1,57 @@
+using System.Collections.Generic;
+using Questionable.Model.Common.Converter;
+
+namespace Questionable.Model.Questing.Converter;
+
+internal sealed class ExtendedClassJobConverter() : EnumConverter<EExtendedClassJob>(Values)
+{
+    private static readonly Dictionary<EExtendedClassJob, string> Values = new()
+    {
+        { EExtendedClassJob.Gladiator, "Gladiator" },
+        { EExtendedClassJob.Pugilist, "Pugilist" },
+        { EExtendedClassJob.Marauder, "Marauder" },
+        { EExtendedClassJob.Lancer, "Lancer" },
+        { EExtendedClassJob.Archer, "Archer" },
+        { EExtendedClassJob.Conjurer, "Conjurer" },
+        { EExtendedClassJob.Thaumaturge, "Thaumaturge" },
+        { EExtendedClassJob.Carpenter, "Carpenter" },
+        { EExtendedClassJob.Blacksmith, "Blacksmith" },
+        { EExtendedClassJob.Armorer, "Armorer" },
+        { EExtendedClassJob.Goldsmith, "Goldsmith" },
+        { EExtendedClassJob.Leatherworker, "Leatherworker" },
+        { EExtendedClassJob.Weaver, "Weaver" },
+        { EExtendedClassJob.Alchemist, "Alchemist" },
+        { EExtendedClassJob.Culinarian, "Culinarian" },
+        { EExtendedClassJob.Miner, "Miner" },
+        { EExtendedClassJob.Botanist, "Botanist" },
+        { EExtendedClassJob.Fisher, "Fisher" },
+        { EExtendedClassJob.Paladin, "Paladin" },
+        { EExtendedClassJob.Monk, "Monk" },
+        { EExtendedClassJob.Warrior, "Warrior" },
+        { EExtendedClassJob.Dragoon, "Dragoon" },
+        { EExtendedClassJob.Bard, "Bard" },
+        { EExtendedClassJob.WhiteMage, "White Mage" },
+        { EExtendedClassJob.BlackMage, "Black Mage" },
+        { EExtendedClassJob.Arcanist, "Arcanist" },
+        { EExtendedClassJob.Summoner, "Summoner" },
+        { EExtendedClassJob.Scholar, "Scholar" },
+        { EExtendedClassJob.Rogue, "Rogue" },
+        { EExtendedClassJob.Ninja, "Ninja" },
+        { EExtendedClassJob.Machinist, "Machinist" },
+        { EExtendedClassJob.DarkKnight, "Dark Knight" },
+        { EExtendedClassJob.Astrologian, "Astrologian" },
+        { EExtendedClassJob.Samurai, "Samurai" },
+        { EExtendedClassJob.RedMage, "Red Mage" },
+        { EExtendedClassJob.BlueMage, "Blue Mage" },
+        { EExtendedClassJob.Gunbreaker, "Gunbreaker" },
+        { EExtendedClassJob.Dancer, "Dancer" },
+        { EExtendedClassJob.Reaper, "Reaper" },
+        { EExtendedClassJob.Sage, "Sage" },
+        { EExtendedClassJob.Viper, "Viper" },
+        { EExtendedClassJob.Pictomancer, "Pictomancer" },
+        { EExtendedClassJob.DoW, "DoW" },
+        { EExtendedClassJob.DoM, "DoM" },
+        { EExtendedClassJob.DoH, "DoH" },
+        { EExtendedClassJob.DoL, "DoL" },
+    };
+}
diff --git a/Questionable.Model/Questing/EExtendedClassJob.cs b/Questionable.Model/Questing/EExtendedClassJob.cs
new file mode 100644 (file)
index 0000000..79c771d
--- /dev/null
@@ -0,0 +1,55 @@
+using System.Text.Json.Serialization;
+using Questionable.Model.Questing.Converter;
+
+namespace Questionable.Model.Questing;
+
+[JsonConverter(typeof(ExtendedClassJobConverter))]
+public enum EExtendedClassJob
+{
+    Gladiator,
+    Pugilist,
+    Marauder,
+    Lancer,
+    Archer,
+    Conjurer,
+    Thaumaturge,
+    Carpenter,
+    Blacksmith,
+    Armorer,
+    Goldsmith,
+    Leatherworker,
+    Weaver,
+    Alchemist,
+    Culinarian,
+    Miner,
+    Botanist,
+    Fisher,
+    Paladin,
+    Monk,
+    Warrior,
+    Dragoon,
+    Bard,
+    WhiteMage,
+    BlackMage,
+    Arcanist,
+    Summoner,
+    Scholar,
+    Rogue,
+    Ninja,
+    Machinist,
+    DarkKnight,
+    Astrologian,
+    Samurai,
+    RedMage,
+    BlueMage,
+    Gunbreaker,
+    Dancer,
+    Reaper,
+    Sage,
+    Viper,
+    Pictomancer,
+    DoW,
+    DoM,
+    DoH,
+    DoL,
+}
index 8d2239ff292848990902171fe20517399b921411..8124718030735b22e49396880ecee6dfb64c436a 100644 (file)
@@ -9,10 +9,4 @@ public sealed class GatheredItem
     public uint AlternativeItemId { get; set; }
     public int ItemCount { get; set; }
     public ushort Collectability { get; set; }
-
-    /// <summary>
-    /// Either miner or botanist; null if it is irrelevant (prefers current class/job, then any unlocked ones).
-    /// </summary>
-    [JsonConverter(typeof(ClassJobConverter))]
-    public uint? QuestAcceptedAsClass { get; set; }
 }
index 5a6998188c509f9db888f057df28323a1e5a5561..df2b7b12800aa25ef79caa5de780926ea3c734cc 100644 (file)
@@ -76,6 +76,8 @@ public sealed class QuestStep
     public SkipConditions? SkipConditions { get; set; }
 
     public List<List<QuestWorkValue>?> RequiredQuestVariables { get; set; } = new();
+    public List<EExtendedClassJob> RequiredCurrentJob { get; set; } = [];
+    public List<EExtendedClassJob> RequiredQuestAcceptedJob { get; set; } = [];
     public List<GatheredItem> ItemsToGather { get; set; } = [];
     public List<QuestWorkValue?> CompletionQuestVariablesFlags { get; set; } = [];
     public List<DialogueChoice> DialogueChoices { get; set; } = [];
index d3c974ecf51cbd6b89b57e37c6928cf2472d2e5d..97d1474effdcdec5fc01610d4732b98651389553 100644 (file)
         "[Solution Nine] Scanning Port Nine (Heritage Found)"
       ]
     },
+    "ClassJob": {
+      "type": "string",
+      "enum": [
+        "Gladiator",
+        "Pugilist",
+        "Marauder",
+        "Lancer",
+        "Archer",
+        "Conjurer",
+        "Thaumaturge",
+        "Carpenter",
+        "Blacksmith",
+        "Armorer",
+        "Goldsmith",
+        "Leatherworker",
+        "Weaver",
+        "Alchemist",
+        "Culinarian",
+        "Miner",
+        "Botanist",
+        "Fisher",
+        "Paladin",
+        "Monk",
+        "Warrior",
+        "Dragoon",
+        "Bard",
+        "White Mage",
+        "Black Mage",
+        "Arcanist",
+        "Summoner",
+        "Scholar",
+        "Rogue",
+        "Ninja",
+        "Machinist",
+        "Dark Knight",
+        "Astrologian",
+        "Samurai",
+        "Red Mage",
+        "Blue Mage",
+        "Gunbreaker",
+        "Dancer",
+        "Reaper",
+        "Sage",
+        "Viper",
+        "Pictomancer",
+        "DoW",
+        "DoM",
+        "DoH",
+        "DoL"
+      ]
+    },
     "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",
index 819d8b2570da348a4e6b32e92b92d3dc9523b4fc..f35e834321dd259b084764bb822b897eae8d5fed 100644 (file)
@@ -123,12 +123,12 @@ internal sealed class ContextMenuController : IDisposable
             Prefix = SeIconChar.Hyadelyn,
             PrefixColor = 52,
             Name = name,
-            OnClicked = _ => StartGathering(npcId, itemId, quantityToGather, collectability, classJob),
+            OnClicked = _ => StartGathering(npcId, itemId, quantityToGather, collectability),
             IsEnabled = string.IsNullOrEmpty(lockedReasonn),
         });
     }
 
-    private void StartGathering(uint npcId, uint itemId, int quantity, ushort collectability, EClassJob classJob)
+    private void StartGathering(uint npcId, uint itemId, int quantity, ushort collectability)
     {
         var info = (SatisfactionSupplyInfo)_questData.GetAllByIssuerDataId(npcId)
             .Single(x => x is SatisfactionSupplyInfo);
@@ -142,7 +142,6 @@ internal sealed class ContextMenuController : IDisposable
                     ItemId = itemId,
                     ItemCount = quantity,
                     Collectability = collectability,
-                    QuestAcceptedAsClass = (uint)classJob,
                 }
             ];
             _questController.SetGatheringQuest(quest);
index ee5c50a008a874acb9682f6957edd0d1525ea448..5724a2092d622d4412e887b6ca78521fadbc5f39 100644 (file)
@@ -36,26 +36,13 @@ internal static class Gather
             foreach (var itemToGather in step.ItemsToGather)
             {
                 EClassJob currentClassJob = (EClassJob)clientState.LocalPlayer!.ClassJob.Id;
-                EClassJob classJob = currentClassJob;
-                if (itemToGather.QuestAcceptedAsClass != null)
-                {
-                    classJob = (EClassJob)itemToGather.QuestAcceptedAsClass.Value;
-                    if (!IsClassJobQuestWasAcceptedWith(quest.Id, classJob))
-                        continue;
-                }
-
-                if (!gatheringData.TryGetGatheringPointId(itemToGather.ItemId, classJob,
+                if (!gatheringData.TryGetGatheringPointId(itemToGather.ItemId, currentClassJob,
                         out GatheringPointId? gatheringPointId))
                     throw new TaskException($"No gathering point found for item {itemToGather.ItemId}");
 
                 if (!gatheringPointRegistry.TryGetGatheringPoint(gatheringPointId, out GatheringRoot? gatheringRoot))
                     throw new TaskException($"No path found for gathering point {gatheringPointId}");
 
-                if (classJob != currentClassJob)
-                {
-                    yield return new SwitchClassJob.Task(classJob);
-                }
-
                 if (HasRequiredItems(itemToGather))
                     continue;
 
@@ -89,18 +76,6 @@ internal static class Gather
             }
         }
 
-        private unsafe bool IsClassJobQuestWasAcceptedWith(ElementId questId, EClassJob expectedClassJob)
-        {
-            if (questId is not QuestId)
-                return true;
-
-            QuestWork* questWork = QuestManager.Instance()->GetQuestById(questId.Value);
-            if (questWork->AcceptClassJob != 0)
-                return (EClassJob)questWork->AcceptClassJob == expectedClassJob;
-
-            return true;
-        }
-
         private unsafe bool HasRequiredItems(GatheredItem itemToGather)
         {
             InventoryManager* inventoryManager = InventoryManager.Instance();
index c1efdbded78410387a04e941562fed593ddf3ad2..2951d8d82b93cc0478efe1e728dce457dbdc2676 100644 (file)
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using System.Numerics;
 using Dalamud.Game.ClientState.Objects.Types;
@@ -6,8 +7,10 @@ using Dalamud.Plugin.Services;
 using FFXIVClientStructs.FFXIV.Client.Game;
 using FFXIVClientStructs.FFXIV.Client.Game.Object;
 using FFXIVClientStructs.FFXIV.Client.Game.UI;
+using LLib.GameData;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller.Utils;
+using Questionable.Data;
 using Questionable.Functions;
 using Questionable.Model;
 using Questionable.Model.Common;
@@ -29,7 +32,9 @@ internal static class SkipCondition
                 !QuestWorkUtils.HasCompletionFlags(step.CompletionQuestVariablesFlags) &&
                 step.RequiredQuestVariables.Count == 0 &&
                 step.PickUpQuestId == null &&
-                step.NextQuestId == null)
+                step.NextQuestId == null &&
+                step.RequiredCurrentJob.Count == 0 &&
+                step.RequiredQuestAcceptedJob.Count == 0)
                 return null;
 
             return new SkipTask(step, skipConditions ?? new(), quest.Id);
@@ -136,7 +141,8 @@ internal static class SkipCondition
                     GameObject* gameObject = (GameObject*)target.Address;
                     if (!skipConditions.NotNamePlateIconId.Contains(gameObject->NamePlateIconId))
                     {
-                        logger.LogInformation("Skipping step, object has icon id {IconId}", gameObject->NamePlateIconId);
+                        logger.LogInformation("Skipping step, object has icon id {IconId}",
+                            gameObject->NamePlateIconId);
                         return true;
                     }
                 }
@@ -213,6 +219,34 @@ internal static class SkipCondition
                         return true;
                     }
                 }
+
+                if (step is { RequiredQuestAcceptedJob.Count: > 0 })
+                {
+                    List<EClassJob> expectedJobs = step.RequiredQuestAcceptedJob
+                        .SelectMany(ClassJobUtils.AsIndividualJobs).ToList();
+                    EClassJob questJob = questWork.ClassJob;
+                    logger.LogInformation("Checking quest job {QuestJob} against {ExpectedJobs}", questJob,
+                        string.Join(",", expectedJobs));
+                    if (questJob != EClassJob.Adventurer && !expectedJobs.Contains(questJob))
+                    {
+                        logger.LogInformation("Skipping step, as quest was accepted on a different job");
+                        return true;
+                    }
+                }
+            }
+
+            if (step is { RequiredCurrentJob.Count: > 0 })
+            {
+                List<EClassJob> expectedJobs =
+                    step.RequiredCurrentJob.SelectMany(ClassJobUtils.AsIndividualJobs).ToList();
+                EClassJob currentJob = (EClassJob)clientState.LocalPlayer!.ClassJob.Id;
+                logger.LogInformation("Checking current job {CurrentJob} against {ExpectedJobs}", currentJob,
+                    string.Join(",", expectedJobs));
+                if (!expectedJobs.Contains(currentJob))
+                {
+                    logger.LogInformation("Skipping step, as step requires a different job");
+                    return true;
+                }
             }
 
             if (skipConditions.NearPosition is { } nearPosition &&
@@ -231,7 +265,8 @@ internal static class SkipCondition
                 var position = clientState.LocalPlayer?.Position;
                 if (position != null &&
                     clientState.TerritoryType != 0 &&
-                    MatchesExtraCondition(skipConditions.ExtraCondition.Value, position.Value, clientState.TerritoryType))
+                    MatchesExtraCondition(skipConditions.ExtraCondition.Value, position.Value,
+                        clientState.TerritoryType))
                 {
                     logger.LogInformation("Skipping step, extra condition {} matches", skipConditions.ExtraCondition);
                     return true;
diff --git a/Questionable/Data/ClassJobUtils.cs b/Questionable/Data/ClassJobUtils.cs
new file mode 100644 (file)
index 0000000..8346d9e
--- /dev/null
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using LLib.GameData;
+using Questionable.Model.Questing;
+
+namespace Questionable.Data;
+
+public static class ClassJobUtils
+{
+    public static IEnumerable<EClassJob> AsIndividualJobs(EExtendedClassJob classJob)
+    {
+        return classJob switch
+        {
+            EExtendedClassJob.Gladiator => [EClassJob.Gladiator],
+            EExtendedClassJob.Pugilist => [EClassJob.Pugilist],
+            EExtendedClassJob.Marauder => [EClassJob.Marauder],
+            EExtendedClassJob.Lancer => [EClassJob.Lancer],
+            EExtendedClassJob.Archer => [EClassJob.Archer],
+            EExtendedClassJob.Conjurer => [EClassJob.Conjurer],
+            EExtendedClassJob.Thaumaturge => [EClassJob.Thaumaturge],
+            EExtendedClassJob.Carpenter => [EClassJob.Carpenter],
+            EExtendedClassJob.Blacksmith => [EClassJob.Blacksmith],
+            EExtendedClassJob.Armorer => [EClassJob.Armorer],
+            EExtendedClassJob.Goldsmith => [EClassJob.Goldsmith],
+            EExtendedClassJob.Leatherworker => [EClassJob.Leatherworker],
+            EExtendedClassJob.Weaver => [EClassJob.Weaver],
+            EExtendedClassJob.Alchemist => [EClassJob.Alchemist],
+            EExtendedClassJob.Culinarian => [EClassJob.Culinarian],
+            EExtendedClassJob.Miner => [EClassJob.Miner],
+            EExtendedClassJob.Botanist => [EClassJob.Botanist],
+            EExtendedClassJob.Fisher => [EClassJob.Fisher],
+            EExtendedClassJob.Paladin => [EClassJob.Paladin],
+            EExtendedClassJob.Monk => [EClassJob.Monk],
+            EExtendedClassJob.Warrior => [EClassJob.Warrior],
+            EExtendedClassJob.Dragoon => [EClassJob.Dragoon],
+            EExtendedClassJob.Bard => [EClassJob.Bard],
+            EExtendedClassJob.WhiteMage => [EClassJob.WhiteMage],
+            EExtendedClassJob.BlackMage => [EClassJob.BlackMage],
+            EExtendedClassJob.Arcanist => [EClassJob.Arcanist],
+            EExtendedClassJob.Summoner => [EClassJob.Summoner],
+            EExtendedClassJob.Scholar => [EClassJob.Scholar],
+            EExtendedClassJob.Rogue => [EClassJob.Rogue],
+            EExtendedClassJob.Ninja => [EClassJob.Ninja],
+            EExtendedClassJob.Machinist => [EClassJob.Machinist],
+            EExtendedClassJob.DarkKnight => [EClassJob.DarkKnight],
+            EExtendedClassJob.Astrologian => [EClassJob.Astrologian],
+            EExtendedClassJob.Samurai => [EClassJob.Samurai],
+            EExtendedClassJob.RedMage => [EClassJob.RedMage],
+            EExtendedClassJob.BlueMage => [EClassJob.BlueMage],
+            EExtendedClassJob.Gunbreaker => [EClassJob.Gunbreaker],
+            EExtendedClassJob.Dancer => [EClassJob.Dancer],
+            EExtendedClassJob.Reaper => [EClassJob.Reaper],
+            EExtendedClassJob.Sage => [EClassJob.Sage],
+            EExtendedClassJob.Viper => [EClassJob.Viper],
+            EExtendedClassJob.Pictomancer => [EClassJob.Pictomancer],
+
+            EExtendedClassJob.DoW => Enum.GetValues<EClassJob>().Where(x => x.DealsPhysicalDamage()),
+            EExtendedClassJob.DoM => Enum.GetValues<EClassJob>().Where(x => x.DealsMagicDamage()),
+            EExtendedClassJob.DoH => Enum.GetValues<EClassJob>().Where(x => x.IsCrafter()),
+            EExtendedClassJob.DoL => Enum.GetValues<EClassJob>().Where(x => x.IsGatherer()),
+
+            _ => throw new ArgumentOutOfRangeException(nameof(classJob), classJob, null)
+        };
+    }
+}