diff --git a/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/CompletionQuestGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/CompletionQuestGenerator.cs
index 4944215a..26eeb644 100644
--- a/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/CompletionQuestGenerator.cs
+++ b/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/CompletionQuestGenerator.cs
@@ -177,7 +177,7 @@ public class CompletionQuestGenerator(
/// Filtered selection, or original if null or empty
protected HashSet GetWhitelistedItemSelection(HashSet itemSelection, int pmcLevel)
{
- var itemWhitelist = databaseService.GetTemplates().RepeatableQuests?.Data?.Completion?.ItemsWhitelist;
+ var itemWhitelist = databaseService.GetTemplates().RepeatableQuests.Data?.Completion?.ItemsWhitelist;
// Whitelist doesn't exist or is empty, return original
if (itemWhitelist is null || itemWhitelist.Count == 0)
@@ -186,7 +186,7 @@ public class CompletionQuestGenerator(
}
// Filter and concatenate items according to current player level
- var itemIdsWhitelisted = itemWhitelist.Where(p => p.MinPlayerLevel <= pmcLevel).SelectMany(x => x.ItemIds).ToHashSet(); //.Aggregate((a, p) => a.Concat(p.ItemIds), []);
+ var itemIdsWhitelisted = itemWhitelist.Where(p => p.MinPlayerLevel <= pmcLevel).SelectMany(x => x.ItemIds ?? []).ToHashSet(); //.Aggregate((a, p) => a.Concat(p.ItemIds), []);
var filteredSelection = itemSelection
.Where(x =>
@@ -211,7 +211,7 @@ public class CompletionQuestGenerator(
/// Filtered selection, or original if null or empty
protected HashSet GetBlacklistedItemSelection(HashSet itemSelection, int pmcLevel)
{
- var itemBlacklist = databaseService.GetTemplates().RepeatableQuests?.Data?.Completion?.ItemsBlacklist;
+ var itemBlacklist = databaseService.GetTemplates().RepeatableQuests.Data?.Completion?.ItemsBlacklist;
// Blacklist doesn't exist or is empty, return original
if (itemBlacklist is null || itemBlacklist.Count == 0)
@@ -222,7 +222,7 @@ public class CompletionQuestGenerator(
// Filter and concatenate the arrays according to current player level
var itemIdsBlacklisted = itemBlacklist
.Where(blacklist => blacklist.MinPlayerLevel <= pmcLevel)
- .SelectMany(blacklist => blacklist.ItemIds)
+ .SelectMany(blacklist => blacklist.ItemIds ?? [])
.ToHashSet(); //.Aggregate(List , (a, p) => a.Concat(p.ItemIds) );
var filteredSelection = itemSelection
@@ -288,7 +288,7 @@ public class CompletionQuestGenerator(
usedItemIndexes.Add(chosenItemIndex);
var tplChosen = itemSelection[chosenItemIndex];
- var itemPrice = itemHelper.GetItemPrice(tplChosen).Value;
+ var itemPrice = itemHelper.GetItemPrice(tplChosen)!.Value;
var minValue = completionConfig.MinimumRequestedAmount;
var maxValue = completionConfig.MaximumRequestedAmount;
@@ -308,7 +308,7 @@ public class CompletionQuestGenerator(
// Push a CompletionCondition with the item and the amount of the item into quest
chosenRequirementItemsTpls.Add(tplChosen);
- quest.Conditions.AvailableForFinish.Add(GenerateCondition(tplChosen, value, repeatableConfig.QuestConfig.CompletionConfig));
+ quest.Conditions.AvailableForFinish!.Add(GenerateCondition(tplChosen, value, repeatableConfig.QuestConfig.CompletionConfig));
// Is there budget left for more items
if (roublesBudget > 0)
diff --git a/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/RepeatableQuestRewardGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/RepeatableQuestRewardGenerator.cs
index 57e71794..40f4c81e 100644
--- a/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/RepeatableQuestRewardGenerator.cs
+++ b/Libraries/SPTarkov.Server.Core/Generators/RepeatableQuestGeneration/RepeatableQuestRewardGenerator.cs
@@ -344,7 +344,7 @@ public class RepeatableQuestRewardGenerator(
if (itemHelper.IsOfBaseclass(chosenItemFromPool.Id, BaseClasses.AMMO))
{
// Don't reward ammo that stacks to less than what's allowed in config
- if (chosenItemFromPool.Properties.StackMaxSize < repeatableConfig.RewardAmmoStackMinSize)
+ if (chosenItemFromPool.Properties?.StackMaxSize < repeatableConfig.RewardAmmoStackMinSize)
{
i--;
continue;
@@ -441,7 +441,7 @@ public class RepeatableQuestRewardGenerator(
var rewardItemPrice = presetHelper.GetDefaultPresetOrItemPrice(item.Id);
// Define price tiers and corresponding stack size options
- var priceTiers = new List?>>
+ var priceTiers = new List>>
{
new(3000, [2, 3, 4]),
new(10000, [2, 3]),
@@ -452,7 +452,7 @@ public class RepeatableQuestRewardGenerator(
var tier = priceTiers.FirstOrDefault(tier => rewardItemPrice < tier.Item1);
if (tier is null)
{
- return 4; // Default to 2 if no tier matches
+ return 4; // Default to 4 if no tier matches
}
return randomUtil.GetArrayValue(tier.Item2);
@@ -467,15 +467,15 @@ public class RepeatableQuestRewardGenerator(
/// List of reward items that fit budget
protected List ChooseRewardItemsWithinBudget(
RepeatableQuestConfig repeatableConfig,
- double? roublesBudget,
+ double roublesBudget,
MongoId traderId
)
{
// First filter for type and baseclass to avoid lookup in handbook for non-available items
var rewardableItemPool = GetRewardableItems(repeatableConfig, traderId);
- var minPrice = Math.Min(25000, 0.5 * roublesBudget.Value);
+ var minPrice = Math.Min(25000, 0.5 * roublesBudget);
- var rewardableItemPoolWithinBudget = FilterRewardPoolWithinBudget(rewardableItemPool, roublesBudget.Value, minPrice);
+ var rewardableItemPoolWithinBudget = FilterRewardPoolWithinBudget(rewardableItemPool, roublesBudget, minPrice);
if (rewardableItemPoolWithinBudget.Count == 0)
{
@@ -533,7 +533,7 @@ public class RepeatableQuestRewardGenerator(
if (presetPrice <= roublesBudget)
{
logger.Debug($"Added weapon: {tpls[0]}with price: {presetPrice}");
- var chosenPreset = cloner.Clone(randomPreset);
+ var chosenPreset = cloner.Clone(randomPreset)!;
return new KeyValuePair(
GeneratePresetReward(chosenPreset.Encyclopedia.Value, 1, rewardIndex, chosenPreset.Items),
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/QuestConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/QuestConfig.cs
index 134d3d0d..b8b3d3c4 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/QuestConfig.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/QuestConfig.cs
@@ -461,19 +461,19 @@ public record CompletionConfig : BaseQuestConfig
/// Should the supplied items be required FiR
///
[JsonPropertyName("requiredItemsAreFiR")]
- public bool? RequiredItemsAreFiR { get; set; }
+ public required bool RequiredItemsAreFiR { get; set; }
///
- /// Should the supplied items be required FiR
+ /// Min/Max durability requirements for the item
///
[JsonPropertyName("requiredItemMinDurabilityMinMax")]
- public MinMax? RequiredItemMinDurabilityMinMax { get; set; }
+ public required MinMax RequiredItemMinDurabilityMinMax { get; set; }
///
/// Blacklisted item types to not collect
///
[JsonPropertyName("requiredItemTypeBlacklist")]
- public HashSet? RequiredItemTypeBlacklist { get; set; }
+ public required HashSet RequiredItemTypeBlacklist { get; set; }
}
public record Pickup : BaseQuestConfig