Updated Pelupelu quests to allow for multiple quests to be turned in at once
authorLiza Carvelli <liza@carvel.li>
Mon, 18 Nov 2024 17:21:36 +0000 (18:21 +0100)
committerLiza Carvelli <liza@carvel.li>
Mon, 18 Nov 2024 17:21:36 +0000 (18:21 +0100)
QuestPaths/7.x - Dawntrail/Allied Societies/Pelupelu/Dailies/5201_Ferocious Foliage, Fearful Tourists.json
QuestPaths/7.x - Dawntrail/Allied Societies/Pelupelu/Dailies/5202_Community Outreach in Kozanuakiy.json
QuestPaths/7.x - Dawntrail/Allied Societies/Pelupelu/Dailies/5203_Preventative Measures.json
QuestPaths/7.x - Dawntrail/Allied Societies/Pelupelu/Dailies/5204_Burden of Beasts.json
QuestPaths/7.x - Dawntrail/Allied Societies/Pelupelu/Dailies/5210_The Rudiments of Fiend Removal.json
QuestPaths/7.x - Dawntrail/Allied Societies/Pelupelu/Dailies/5212_Starting from Scrap.json
QuestPaths/7.x - Dawntrail/Allied Societies/Pelupelu/Dailies/5218_The Hand That Feeds.json
Questionable/Functions/QuestFunctions.cs

index 056eab0b4f2924581554d39681afa87a9540c850..933c123da7198f74455bda79a77e24e6cb722e7d 100644 (file)
             null,
             null,
             null
-          ]
+          ],
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         },
         {
           "DataId": 2014481,
index 87cadfa6ccf24d17f32f9325819ab771bb1bd7d6..eb50d2c343e35aba1e9b6c29c929c167a28bae61 100644 (file)
           },
           "TerritoryId": 1188,
           "InteractionType": "Interact",
-          "Fly": true
+          "Fly": true,
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         }
       ]
     },
index 262ce23eb5b5db1303e3dd08e50cd83736f42cbd..cb54fe5972c0398814d8152dc3be4981c5b783f3 100644 (file)
             null,
             null,
             64
-          ]
+          ],
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         },
         {
           "DataId": 2014485,
           },
           "TerritoryId": 1188,
           "InteractionType": "WalkTo",
-          "Fly": true
+          "Fly": true,
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         },
         {
           "DataId": 1051711,
index 549951cf2dc81040900d57c86ffa4ac06a446a38..f5bcdb6f2ad8f0db4726f3a3d6e81014697c97ee 100644 (file)
           },
           "TerritoryId": 1188,
           "InteractionType": "Interact",
-          "Fly": true
+          "Fly": true,
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         }
       ]
     },
           },
           "TerritoryId": 1188,
           "InteractionType": "WalkTo",
-          "Fly": true
+          "Fly": true,
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         },
         {
           "DataId": 1051711,
index 1203c94c91c86e33437b78be70e2863819a95ac0..eb5c727ec05a77467a230b8d41788d2987e114d9 100644 (file)
           },
           "TerritoryId": 1188,
           "InteractionType": "Interact",
-          "Fly": true
+          "Fly": true,
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         }
       ]
     },
index f4add8305fd824b425732255972951f8cf95a919..264ed7569967c00e2e2dad1afd06a29fd06e431b 100644 (file)
             null,
             null,
             128
-          ]
+          ],
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         },
         {
           "DataId": 2014495,
index 1b751760de04e03033549969f99e3246fef8718c..744e96ea04586c32ab35eedf3c55af70dd3d7d19 100644 (file)
           },
           "TerritoryId": 1188,
           "InteractionType": "WalkTo",
-          "Fly": true
+          "Fly": true,
+          "AetheryteShortcut": "Kozama'uka - Dock Poga",
+          "SkipConditions": {
+            "AetheryteShortcutIf": {
+              "NearPosition": {
+                "Position": {
+                  "X": 770.7179,
+                  "Y": 12.84657,
+                  "Z": -263.99634
+                },
+                "TerritoryId": 1188,
+                "MaximumDistance": 300
+              }
+            }
+          }
         },
         {
           "DataId": 1052331,
index 9211514dc5968630e5b90ed806ab6d65839e1408..fa837cac8221b1d54f19e465402fc0ba22e5cb37 100644 (file)
@@ -122,6 +122,7 @@ internal sealed unsafe class QuestFunctions
             // do the MSQ; if a side quest is the first item do that side quest.
             //
             // If no quests are marked as 'priority', accepting a new quest adds it to the top of the list.
+            List<(ElementId Quest, byte Sequence)> trackedQuests = [];
             for (int i = questManager->TrackedQuests.Length - 1; i >= 0; --i)
             {
                 ElementId currentQuest;
@@ -129,22 +130,40 @@ internal sealed unsafe class QuestFunctions
                 switch (trackedQuest.QuestType)
                 {
                     default:
-                        continue;
+                        break;
 
                     case 1: // normal quest
                         currentQuest = new QuestId(questManager->NormalQuests[trackedQuest.Index].QuestId);
                         if (_questRegistry.IsKnownQuest(currentQuest))
-                            return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value));
-                        continue;
+                            trackedQuests.Add((currentQuest, QuestManager.GetQuestSequence(currentQuest.Value)));
+                        break;
 
                     case 2: // leve
                         currentQuest = new LeveId(questManager->LeveQuests[trackedQuest.Index].LeveId);
                         if (_questRegistry.IsKnownQuest(currentQuest))
-                            return (currentQuest, questManager->GetLeveQuestById(currentQuest.Value)->Sequence);
-                        continue;
+                            trackedQuests.Add((currentQuest, questManager->GetLeveQuestById(currentQuest.Value)->Sequence));
+                        break;
                 }
             }
 
+            if (trackedQuests.Count > 0)
+            {
+                // if we have multiple quests to turn in for an allied society, try and complete all of them
+                var (firstTrackedQuest, firstTrackedSequence) = trackedQuests.First();
+                EAlliedSociety firstTrackedAlliedSociety = GetCommonAlliedSocietyTurnIn(firstTrackedQuest);
+                if (firstTrackedAlliedSociety != EAlliedSociety.None && firstTrackedSequence == 255)
+                {
+                    foreach (var (quest, sequence) in trackedQuests.Skip(1))
+                    {
+                        // only if the other quest isn't ready to be turned in
+                        if (GetCommonAlliedSocietyTurnIn(quest) == firstTrackedAlliedSociety && sequence != 255)
+                            return (quest, sequence);
+                    }
+                }
+
+                return (firstTrackedQuest, firstTrackedSequence);
+            }
+
             ElementId? priorityQuest = GetNextPriorityQuestThatCanBeAccepted();
             if (priorityQuest != null)
             {
@@ -221,6 +240,20 @@ internal sealed unsafe class QuestFunctions
         return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value));
     }
 
+    private static EAlliedSociety GetCommonAlliedSocietyTurnIn(ElementId elementId)
+    {
+        if (elementId is QuestId questId)
+        {
+            return questId.Value switch
+            {
+                >= 5199 and <= 5226 => EAlliedSociety.Pelupelu,
+                _ => EAlliedSociety.None,
+            };
+        }
+
+        return EAlliedSociety.None;
+    }
+
     public QuestProgressInfo? GetQuestProgressInfo(ElementId elementId)
     {
         if (elementId is QuestId questId)