Added QuestConditionExtensions removed questConditionHelper
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user