Added QuestConditionExtensions removed questConditionHelper

This commit is contained in:
Chomp
2025-06-28 10:29:33 +01:00
parent d2d119f3b4
commit 4babdb59ab
5 changed files with 125 additions and 130 deletions
@@ -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<QuestConfig>();
/// <summary>
/// Handle client/quest/list
/// Get all quests visible to player
@@ -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
{
/// <summary>
/// Add item stack change object into output route event response
/// </summary>
/// <param name="output">Response to add item change event into</param>
/// <param name="sessionId">Session id</param>
/// <param name="item">Item that was adjusted</param>
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 },
}
);
}
}
}
@@ -0,0 +1,67 @@
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
namespace SPTarkov.Server.Core.Extensions
{
public static class QuestConditionExtensions
{
/// <summary>
/// Get all quest conditions from provided list
/// </summary>
/// <param name="questConditions">Input conditions</param>
/// <param name="furtherFilter">OPTIONAL - Additional filter code to run</param>
/// <returns></returns>
public static List<QuestCondition> GetQuestConditions(
this List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "Quest", furtherFilter);
}
public static List<QuestCondition> GetLevelConditions(
this List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "Level", furtherFilter);
}
public static List<QuestCondition> GetLoyaltyConditions(
this List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "TraderLoyalty", furtherFilter);
}
public static List<QuestCondition> GetStandingConditions(
this List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "TraderStanding", furtherFilter);
}
private static List<QuestCondition> FilterConditions(
List<QuestCondition> questConditions,
string questType,
Func<QuestCondition, List<QuestCondition>>? 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;
}
}
}
@@ -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<QuestCondition> GetQuestConditions(
List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "Quest", furtherFilter);
}
public List<QuestCondition> GetLevelConditions(
List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "Level", furtherFilter);
}
public List<QuestCondition> GetLoyaltyConditions(
List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "TraderLoyalty", furtherFilter);
}
public List<QuestCondition> GetStandingConditions(
List<QuestCondition> questConditions,
Func<QuestCondition, List<QuestCondition>>? furtherFilter = null
)
{
return FilterConditions(questConditions, "TraderStanding", furtherFilter);
}
protected List<QuestCondition> FilterConditions(
List<QuestCondition> questConditions,
string questType,
Func<QuestCondition, List<QuestCondition>>? 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;
}
}
@@ -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(
/// </summary>
protected virtual Dictionary<string, List<QuestCondition>> SellToTraderQuestConditionCache
{
get { return _sellToTraderQuestConditionCache ??= GetSellToTraderQuests(); }
get
{
return _sellToTraderQuestConditionCache ??= GetSellToTraderQuests(GetQuestsFromDb());
}
}
/// <summary>
@@ -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();
}
/// <summary>
@@ -620,7 +620,7 @@ public class QuestHelper(
return quests;
}
return GetQuestsWithOnlyLevelRequirementStartCondition(quests);
return GetQuestsWithOnlyLevelRequirementStartCondition(quests).ToList();
}
/// <summary>
@@ -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(
}
}
/// <summary>
/// Add item stack change object into output route event response
/// </summary>
/// <param name="output">Response to add item change event into</param>
/// <param name="sessionId">Session id</param>
/// <param name="item">Item that was adjusted</param>
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 },
}
);
}
/// <summary>
/// Get quests, strip all requirement conditions except level
/// </summary>
/// <param name="quests">quests to process</param>
/// <returns>quest list without conditions</returns>
protected List<Quest> GetQuestsWithOnlyLevelRequirementStartCondition(IEnumerable<Quest> quests)
protected IEnumerable<Quest> GetQuestsWithOnlyLevelRequirementStartCondition(
IEnumerable<Quest> quests
)
{
return quests.Select(GetQuestWithOnlyLevelRequirementStartCondition).ToList();
return quests.Select(RemoveQuestConditionsExceptLevel);
}
/// <summary>
@@ -710,7 +685,7 @@ public class QuestHelper(
/// </summary>
/// <param name="quest">quest to clean</param>
/// <returns>Quest</returns>
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 <see cref="SellToTraderQuestConditionCache"/>` and return that thereafter.
/// </summary>
/// <param name="quests">Quests to process</param>
/// <returns>List of quests with `SellItemToTrader` finish condition(s)</returns>
protected Dictionary<string, List<QuestCondition>> GetSellToTraderQuests()
protected Dictionary<string, List<QuestCondition>> GetSellToTraderQuests(List<Quest> quests)
{
// Create cache
var result = new Dictionary<string, List<QuestCondition>>();
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)