diff --git a/Core/Controllers/TraderController.cs b/Core/Controllers/TraderController.cs index 3bcfa3a8..ac409434 100644 --- a/Core/Controllers/TraderController.cs +++ b/Core/Controllers/TraderController.cs @@ -36,7 +36,7 @@ public class TraderController public List GetAllTraders(string sessionId) { var traders = new List(); - + return traders; } /// diff --git a/Core/Helpers/QuestHelper.cs b/Core/Helpers/QuestHelper.cs index 4234afa4..e234181e 100644 --- a/Core/Helpers/QuestHelper.cs +++ b/Core/Helpers/QuestHelper.cs @@ -496,11 +496,49 @@ public class QuestHelper /** * Add all quests to a profile with the provided statuses * @param pmcProfile profile to update - * @param statuses statuses quests should have + * @param statuses statuses quests should have added to profile */ public void AddAllQuestsToProfile(PmcData pmcProfile, List statuses) { - throw new NotImplementedException(); + // Iterate over all quests in db + var quests = _databaseService.GetQuests(); + foreach (var (key, questData) in quests) { + // Quest from db matches quests in profile, skip + if (pmcProfile.Quests.Any((x) => x.QId == questData.Id)) + { + continue; + } + + // Create dict of status to add to quest in profile + var statusesDict = new Dictionary(); + foreach (var status in statuses) + { + statusesDict.Add(status, _timeUtil.GetTimeStamp()); + } + + var questRecordToAdd = new QuestStatus { + QId = key, + StartTime = _timeUtil.GetTimeStamp(), + Status = statuses[^1], // Get last status in list as currently active status + StatusTimers = statusesDict, + CompletedConditions = [], + AvailableAfter = 0, + }; + + // Check if the quest already exists in the profile + var existingQuest = pmcProfile.Quests.FirstOrDefault(x => x.QId == key); + if (existingQuest != null) + { + // Update existing quest + existingQuest.Status = questRecordToAdd.Status; + existingQuest.StatusTimers = questRecordToAdd.StatusTimers; + } + else + { + // Add new quest to the profile + pmcProfile.Quests.Add(questRecordToAdd); + } + } } public void FindAndRemoveQuestFromArrayIfExists(string questId, List quests) @@ -623,7 +661,7 @@ public class QuestHelper if (conditionToFulfil.AvailableAfter > 0) { // Compare current time to unlock time for previous quest - prerequisiteQuest.StatusTimers.TryGetValue(prerequisiteQuest.Status.ToString(), out var previousQuestCompleteTime); + prerequisiteQuest.StatusTimers.TryGetValue(prerequisiteQuest.Status.Value, out var previousQuestCompleteTime); var unlockTime = previousQuestCompleteTime + conditionToFulfil.AvailableAfter; if (unlockTime > _timeUtil.GetTimeStamp()) { diff --git a/Core/Models/Eft/Common/Tables/BotBase.cs b/Core/Models/Eft/Common/Tables/BotBase.cs index c283291f..cc1913ce 100644 --- a/Core/Models/Eft/Common/Tables/BotBase.cs +++ b/Core/Models/Eft/Common/Tables/BotBase.cs @@ -57,7 +57,7 @@ public class BotBase public Hideout? Hideout { get; set; } [JsonPropertyName("Quests")] - public List? Quests { get; set; } + public List? Quests { get; set; } [JsonPropertyName("TradersInfo")] public Dictionary? TradersInfo { get; set; } @@ -710,7 +710,7 @@ public class Quests public QuestStatusEnum? Status { get; set; } [JsonPropertyName("statusTimers")] - public Dictionary? StatusTimers { get; set; } + public Dictionary? StatusTimers { get; set; } /** Property does not exist in live profile data, but is used by ProfileChanges.questsStatus when sent to client */ [JsonPropertyName("completedConditions")] diff --git a/Core/Models/Eft/Common/Tables/Quest.cs b/Core/Models/Eft/Common/Tables/Quest.cs index 57f70325..d72e87aa 100644 --- a/Core/Models/Eft/Common/Tables/Quest.cs +++ b/Core/Models/Eft/Common/Tables/Quest.cs @@ -130,6 +130,9 @@ public class Quest public double ChangeStandingCost { get; set; } } +/// +/// Same as BotBase.Quests +/// public class QuestStatus { [JsonPropertyName("id")] @@ -139,16 +142,16 @@ public class QuestStatus public string? Uid { get; set; } [JsonPropertyName("qid")] - public string? Qid { get; set; } + public string? QId { get; set; } [JsonPropertyName("startTime")] public double? StartTime { get; set; } [JsonPropertyName("status")] - public double? Status { get; set; } + public QuestStatusEnum? Status { get; set; } [JsonPropertyName("statusTimers")] - public Dictionary? StatusTimers { get; set; } + public Dictionary? StatusTimers { get; set; } [JsonPropertyName("completedConditions")] public List? CompletedConditions { get; set; } diff --git a/Core/Models/Eft/Common/Tables/RepeatableQuests.cs b/Core/Models/Eft/Common/Tables/RepeatableQuests.cs index 97aa009f..ad215c08 100644 --- a/Core/Models/Eft/Common/Tables/RepeatableQuests.cs +++ b/Core/Models/Eft/Common/Tables/RepeatableQuests.cs @@ -1,4 +1,4 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; namespace Core.Models.Eft.Common.Tables; @@ -56,7 +56,7 @@ public class RepeatableQuestStatus public string? Uid { get; set; } [JsonPropertyName("qid")] - public string? Qid { get; set; } + public string? QId { get; set; } [JsonPropertyName("startTime")] public long? StartTime { get; set; }