diff --git a/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs b/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs index a202f48f..6aca14b5 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/QuestController.cs @@ -5,14 +5,11 @@ using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Eft.ItemEvent; using SPTarkov.Server.Core.Models.Eft.Quests; using SPTarkov.Server.Core.Models.Enums; -using SPTarkov.Server.Core.Models.Spt.Config; using SPTarkov.Server.Core.Models.Utils; using SPTarkov.Server.Core.Routers; -using SPTarkov.Server.Core.Servers; using SPTarkov.Server.Core.Services; using SPTarkov.Server.Core.Utils; using SPTarkov.Server.Core.Utils.Cloners; -using LogLevel = SPTarkov.Server.Core.Models.Spt.Logging.LogLevel; namespace SPTarkov.Server.Core.Controllers; @@ -22,24 +19,14 @@ public class QuestController( TimeUtil _timeUtil, HttpResponseUtil _httpResponseUtil, EventOutputHolder _eventOutputHolder, - DatabaseService _databaseService, ItemHelper _itemHelper, - DialogueHelper _dialogueHelper, MailSendService _mailSendService, - ProfileHelper _profileHelper, - TraderHelper _traderHelper, QuestHelper _questHelper, QuestRewardHelper _questRewardHelper, - QuestConditionHelper _questConditionHelper, - PlayerService _playerService, - LocaleService _localeService, LocalisationService _localisationService, - ConfigServer _configServer, ICloner _cloner ) { - protected QuestConfig _questConfig = _configServer.GetConfig(); - /// /// Handle client/quest/list /// Get all quests visible to player diff --git a/Libraries/SPTarkov.Server.Core/Extensions/ItemEventRouterResponseExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/ItemEventRouterResponseExtensions.cs new file mode 100644 index 00000000..6654f063 --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Extensions/ItemEventRouterResponseExtensions.cs @@ -0,0 +1,35 @@ +using SPTarkov.Server.Core.Models.Eft.Common.Tables; +using SPTarkov.Server.Core.Models.Eft.ItemEvent; + +namespace SPTarkov.Server.Core.Extensions +{ + public static class ItemEventRouterResponseExtensions + { + /// + /// Add item stack change object into output route event response + /// + /// Response to add item change event into + /// Session id + /// Item that was adjusted + public static void AddItemStackSizeChangeIntoEventResponse( + this ItemEventRouterResponse output, + string sessionId, + Item item + ) + { + output + .ProfileChanges[sessionId] + .Items.ChangedItems.Add( + new Item + { + Id = item.Id, + Template = item.Template, + ParentId = item.ParentId, + SlotId = item.SlotId, + Location = item.Location, + Upd = new Upd { StackObjectsCount = item.Upd.StackObjectsCount }, + } + ); + } + } +} diff --git a/Libraries/SPTarkov.Server.Core/Extensions/QuestConditionExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/QuestConditionExtensions.cs new file mode 100644 index 00000000..2edfa902 --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Extensions/QuestConditionExtensions.cs @@ -0,0 +1,67 @@ +using SPTarkov.Server.Core.Models.Eft.Common.Tables; + +namespace SPTarkov.Server.Core.Extensions +{ + public static class QuestConditionExtensions + { + /// + /// Get all quest conditions from provided list + /// + /// Input conditions + /// OPTIONAL - Additional filter code to run + /// + public static List GetQuestConditions( + this List questConditions, + Func>? furtherFilter = null + ) + { + return FilterConditions(questConditions, "Quest", furtherFilter); + } + + public static List GetLevelConditions( + this List questConditions, + Func>? furtherFilter = null + ) + { + return FilterConditions(questConditions, "Level", furtherFilter); + } + + public static List GetLoyaltyConditions( + this List questConditions, + Func>? furtherFilter = null + ) + { + return FilterConditions(questConditions, "TraderLoyalty", furtherFilter); + } + + public static List GetStandingConditions( + this List questConditions, + Func>? furtherFilter = null + ) + { + return FilterConditions(questConditions, "TraderStanding", furtherFilter); + } + + private static List FilterConditions( + List questConditions, + string questType, + Func>? furtherFilter = null + ) + { + var filteredQuests = questConditions + .Where(c => + { + if (c.ConditionType == questType) + // return true or run the passed in function + { + return furtherFilter is null || furtherFilter(c).Any(); + } + + return false; + }) + .ToList(); + + return filteredQuests; + } + } +} diff --git a/Libraries/SPTarkov.Server.Core/Helpers/QuestConditionHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/QuestConditionHelper.cs deleted file mode 100644 index e72fcf64..00000000 --- a/Libraries/SPTarkov.Server.Core/Helpers/QuestConditionHelper.cs +++ /dev/null @@ -1,62 +0,0 @@ -using SPTarkov.DI.Annotations; -using SPTarkov.Server.Core.Models.Eft.Common.Tables; - -namespace SPTarkov.Server.Core.Helpers; - -[Injectable] -public class QuestConditionHelper -{ - public List GetQuestConditions( - List questConditions, - Func>? furtherFilter = null - ) - { - return FilterConditions(questConditions, "Quest", furtherFilter); - } - - public List GetLevelConditions( - List questConditions, - Func>? furtherFilter = null - ) - { - return FilterConditions(questConditions, "Level", furtherFilter); - } - - public List GetLoyaltyConditions( - List questConditions, - Func>? furtherFilter = null - ) - { - return FilterConditions(questConditions, "TraderLoyalty", furtherFilter); - } - - public List GetStandingConditions( - List questConditions, - Func>? furtherFilter = null - ) - { - return FilterConditions(questConditions, "TraderStanding", furtherFilter); - } - - protected List FilterConditions( - List questConditions, - string questType, - Func>? furtherFilter = null - ) - { - var filteredQuests = questConditions - .Where(c => - { - if (c.ConditionType == questType) - // return true or run the passed in function - { - return furtherFilter is null || furtherFilter(c).Any(); - } - - return false; - }) - .ToList(); - - return filteredQuests; - } -} diff --git a/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs index 8d8fd3b6..08d1a4f6 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs @@ -1,6 +1,7 @@ using System.Globalization; using SPTarkov.Common.Extensions; using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Extensions; using SPTarkov.Server.Core.Models.Eft.Common; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Eft.ItemEvent; @@ -24,7 +25,6 @@ public class QuestHelper( TimeUtil _timeUtil, ItemHelper _itemHelper, DatabaseService _databaseService, - QuestConditionHelper _questConditionHelper, EventOutputHolder _eventOutputHolder, LocaleService _localeService, ProfileHelper _profileHelper, @@ -51,7 +51,10 @@ public class QuestHelper( /// protected virtual Dictionary> SellToTraderQuestConditionCache { - get { return _sellToTraderQuestConditionCache ??= GetSellToTraderQuests(); } + get + { + return _sellToTraderQuestConditionCache ??= GetSellToTraderQuests(GetQuestsFromDb()); + } } /// @@ -451,9 +454,8 @@ public class QuestHelper( return false; } - var standingRequirements = _questConditionHelper.GetStandingConditions( - quest.Conditions.AvailableForStart - ); + var standingRequirements = + quest.Conditions.AvailableForStart.GetStandingConditions(); foreach (var condition in standingRequirements) { if (!TraderStandingRequirementCheck(condition, profile)) @@ -462,9 +464,7 @@ public class QuestHelper( } } - var loyaltyRequirements = _questConditionHelper.GetLoyaltyConditions( - quest.Conditions.AvailableForStart - ); + var loyaltyRequirements = quest.Conditions.AvailableForStart.GetLoyaltyConditions(); foreach (var condition in loyaltyRequirements) { if (!TraderLoyaltyLevelRequirementCheck(condition, profile)) @@ -480,7 +480,7 @@ public class QuestHelper( ); }); - return GetQuestsWithOnlyLevelRequirementStartCondition(eligibleQuests); + return GetQuestsWithOnlyLevelRequirementStartCondition(eligibleQuests).ToList(); } /// @@ -620,7 +620,7 @@ public class QuestHelper( return quests; } - return GetQuestsWithOnlyLevelRequirementStartCondition(quests); + return GetQuestsWithOnlyLevelRequirementStartCondition(quests).ToList(); } /// @@ -657,7 +657,7 @@ public class QuestHelper( item.Upd.StackObjectsCount = newStackSize; - AddItemStackSizeChangeIntoEventResponse(output, sessionID, item); + output.AddItemStackSizeChangeIntoEventResponse(sessionID, item); } else { @@ -668,41 +668,16 @@ public class QuestHelper( } } - /// - /// Add item stack change object into output route event response - /// - /// Response to add item change event into - /// Session id - /// Item that was adjusted - protected void AddItemStackSizeChangeIntoEventResponse( - ItemEventRouterResponse output, - string sessionId, - Item item - ) - { - output - .ProfileChanges[sessionId] - .Items.ChangedItems.Add( - new Item - { - Id = item.Id, - Template = item.Template, - ParentId = item.ParentId, - SlotId = item.SlotId, - Location = item.Location, - Upd = new Upd { StackObjectsCount = item.Upd.StackObjectsCount }, - } - ); - } - /// /// Get quests, strip all requirement conditions except level /// /// quests to process /// quest list without conditions - protected List GetQuestsWithOnlyLevelRequirementStartCondition(IEnumerable quests) + protected IEnumerable GetQuestsWithOnlyLevelRequirementStartCondition( + IEnumerable quests + ) { - return quests.Select(GetQuestWithOnlyLevelRequirementStartCondition).ToList(); + return quests.Select(RemoveQuestConditionsExceptLevel); } /// @@ -710,7 +685,7 @@ public class QuestHelper( /// /// quest to clean /// Quest - public Quest GetQuestWithOnlyLevelRequirementStartCondition(Quest quest) + public Quest RemoveQuestConditionsExceptLevel(Quest quest) { var updatedQuest = _cloner.Clone(quest); updatedQuest.Conditions.AvailableForStart = updatedQuest @@ -724,12 +699,13 @@ public class QuestHelper( /// Get all quests with finish condition `SellItemToTrader`. /// The first time this method is called it will cache the conditions by quest id in ` and return that thereafter. /// + /// Quests to process /// List of quests with `SellItemToTrader` finish condition(s) - protected Dictionary> GetSellToTraderQuests() + protected Dictionary> GetSellToTraderQuests(List quests) { // Create cache var result = new Dictionary>(); - foreach (var quest in GetQuestsFromDb()) + foreach (var quest in quests) { foreach (var cond in quest.Conditions.AvailableForFinish) { @@ -1334,15 +1310,9 @@ public class QuestHelper( continue; } - var questRequirements = _questConditionHelper.GetQuestConditions( - quest.Conditions.AvailableForStart - ); - var loyaltyRequirements = _questConditionHelper.GetLoyaltyConditions( - quest.Conditions.AvailableForStart - ); - var standingRequirements = _questConditionHelper.GetStandingConditions( - quest.Conditions.AvailableForStart - ); + var questRequirements = quest.Conditions.AvailableForStart.GetQuestConditions(); + var loyaltyRequirements = quest.Conditions.AvailableForStart.GetLoyaltyConditions(); + var standingRequirements = quest.Conditions.AvailableForStart.GetStandingConditions(); // Quest has no conditions, standing or loyalty conditions, add to visible quest list if ( @@ -1756,9 +1726,7 @@ public class QuestHelper( return true; } - var levelConditions = _questConditionHelper.GetLevelConditions( - quest.Conditions.AvailableForStart - ); + var levelConditions = quest.Conditions.AvailableForStart.GetLevelConditions(); if (levelConditions is not null) { foreach (var levelCondition in levelConditions)