Repeatable quest warning fixes

This commit is contained in:
Cj
2025-10-01 05:12:20 -04:00
parent b5448ccf09
commit 040b4cd618
3 changed files with 17 additions and 17 deletions
@@ -177,7 +177,7 @@ public class CompletionQuestGenerator(
/// <returns>Filtered selection, or original if null or empty</returns> /// <returns>Filtered selection, or original if null or empty</returns>
protected HashSet<MongoId> GetWhitelistedItemSelection(HashSet<MongoId> itemSelection, int pmcLevel) protected HashSet<MongoId> GetWhitelistedItemSelection(HashSet<MongoId> 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 // Whitelist doesn't exist or is empty, return original
if (itemWhitelist is null || itemWhitelist.Count == 0) if (itemWhitelist is null || itemWhitelist.Count == 0)
@@ -186,7 +186,7 @@ public class CompletionQuestGenerator(
} }
// Filter and concatenate items according to current player level // 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 var filteredSelection = itemSelection
.Where(x => .Where(x =>
@@ -211,7 +211,7 @@ public class CompletionQuestGenerator(
/// <returns>Filtered selection, or original if null or empty</returns> /// <returns>Filtered selection, or original if null or empty</returns>
protected HashSet<MongoId> GetBlacklistedItemSelection(HashSet<MongoId> itemSelection, int pmcLevel) protected HashSet<MongoId> GetBlacklistedItemSelection(HashSet<MongoId> 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 // Blacklist doesn't exist or is empty, return original
if (itemBlacklist is null || itemBlacklist.Count == 0) if (itemBlacklist is null || itemBlacklist.Count == 0)
@@ -222,7 +222,7 @@ public class CompletionQuestGenerator(
// Filter and concatenate the arrays according to current player level // Filter and concatenate the arrays according to current player level
var itemIdsBlacklisted = itemBlacklist var itemIdsBlacklisted = itemBlacklist
.Where(blacklist => blacklist.MinPlayerLevel <= pmcLevel) .Where(blacklist => blacklist.MinPlayerLevel <= pmcLevel)
.SelectMany(blacklist => blacklist.ItemIds) .SelectMany(blacklist => blacklist.ItemIds ?? [])
.ToHashSet(); //.Aggregate(List<ItemsBlacklist> , (a, p) => a.Concat(p.ItemIds) ); .ToHashSet(); //.Aggregate(List<ItemsBlacklist> , (a, p) => a.Concat(p.ItemIds) );
var filteredSelection = itemSelection var filteredSelection = itemSelection
@@ -288,7 +288,7 @@ public class CompletionQuestGenerator(
usedItemIndexes.Add(chosenItemIndex); usedItemIndexes.Add(chosenItemIndex);
var tplChosen = itemSelection[chosenItemIndex]; var tplChosen = itemSelection[chosenItemIndex];
var itemPrice = itemHelper.GetItemPrice(tplChosen).Value; var itemPrice = itemHelper.GetItemPrice(tplChosen)!.Value;
var minValue = completionConfig.MinimumRequestedAmount; var minValue = completionConfig.MinimumRequestedAmount;
var maxValue = completionConfig.MaximumRequestedAmount; 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 // Push a CompletionCondition with the item and the amount of the item into quest
chosenRequirementItemsTpls.Add(tplChosen); 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 // Is there budget left for more items
if (roublesBudget > 0) if (roublesBudget > 0)
@@ -344,7 +344,7 @@ public class RepeatableQuestRewardGenerator(
if (itemHelper.IsOfBaseclass(chosenItemFromPool.Id, BaseClasses.AMMO)) if (itemHelper.IsOfBaseclass(chosenItemFromPool.Id, BaseClasses.AMMO))
{ {
// Don't reward ammo that stacks to less than what's allowed in config // 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--; i--;
continue; continue;
@@ -441,7 +441,7 @@ public class RepeatableQuestRewardGenerator(
var rewardItemPrice = presetHelper.GetDefaultPresetOrItemPrice(item.Id); var rewardItemPrice = presetHelper.GetDefaultPresetOrItemPrice(item.Id);
// Define price tiers and corresponding stack size options // Define price tiers and corresponding stack size options
var priceTiers = new List<Tuple<int, List<int>?>> var priceTiers = new List<Tuple<int, List<int>>>
{ {
new(3000, [2, 3, 4]), new(3000, [2, 3, 4]),
new(10000, [2, 3]), new(10000, [2, 3]),
@@ -452,7 +452,7 @@ public class RepeatableQuestRewardGenerator(
var tier = priceTiers.FirstOrDefault(tier => rewardItemPrice < tier.Item1); var tier = priceTiers.FirstOrDefault(tier => rewardItemPrice < tier.Item1);
if (tier is null) 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); return randomUtil.GetArrayValue(tier.Item2);
@@ -467,15 +467,15 @@ public class RepeatableQuestRewardGenerator(
/// <returns> List of reward items that fit budget </returns> /// <returns> List of reward items that fit budget </returns>
protected List<TemplateItem> ChooseRewardItemsWithinBudget( protected List<TemplateItem> ChooseRewardItemsWithinBudget(
RepeatableQuestConfig repeatableConfig, RepeatableQuestConfig repeatableConfig,
double? roublesBudget, double roublesBudget,
MongoId traderId MongoId traderId
) )
{ {
// First filter for type and baseclass to avoid lookup in handbook for non-available items // First filter for type and baseclass to avoid lookup in handbook for non-available items
var rewardableItemPool = GetRewardableItems(repeatableConfig, traderId); 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) if (rewardableItemPoolWithinBudget.Count == 0)
{ {
@@ -533,7 +533,7 @@ public class RepeatableQuestRewardGenerator(
if (presetPrice <= roublesBudget) if (presetPrice <= roublesBudget)
{ {
logger.Debug($"Added weapon: {tpls[0]}with price: {presetPrice}"); logger.Debug($"Added weapon: {tpls[0]}with price: {presetPrice}");
var chosenPreset = cloner.Clone(randomPreset); var chosenPreset = cloner.Clone(randomPreset)!;
return new KeyValuePair<Reward, double>( return new KeyValuePair<Reward, double>(
GeneratePresetReward(chosenPreset.Encyclopedia.Value, 1, rewardIndex, chosenPreset.Items), GeneratePresetReward(chosenPreset.Encyclopedia.Value, 1, rewardIndex, chosenPreset.Items),
@@ -461,19 +461,19 @@ public record CompletionConfig : BaseQuestConfig
/// Should the supplied items be required FiR /// Should the supplied items be required FiR
/// </summary> /// </summary>
[JsonPropertyName("requiredItemsAreFiR")] [JsonPropertyName("requiredItemsAreFiR")]
public bool? RequiredItemsAreFiR { get; set; } public required bool RequiredItemsAreFiR { get; set; }
/// <summary> /// <summary>
/// Should the supplied items be required FiR /// Min/Max durability requirements for the item
/// </summary> /// </summary>
[JsonPropertyName("requiredItemMinDurabilityMinMax")] [JsonPropertyName("requiredItemMinDurabilityMinMax")]
public MinMax<double>? RequiredItemMinDurabilityMinMax { get; set; } public required MinMax<double> RequiredItemMinDurabilityMinMax { get; set; }
/// <summary> /// <summary>
/// Blacklisted item types to not collect /// Blacklisted item types to not collect
/// </summary> /// </summary>
[JsonPropertyName("requiredItemTypeBlacklist")] [JsonPropertyName("requiredItemTypeBlacklist")]
public HashSet<MongoId>? RequiredItemTypeBlacklist { get; set; } public required HashSet<MongoId> RequiredItemTypeBlacklist { get; set; }
} }
public record Pickup : BaseQuestConfig public record Pickup : BaseQuestConfig