List to ienumerable conversions

This commit is contained in:
Chomp
2025-07-24 11:36:42 +01:00
parent 6804ab7ccc
commit 6079e282f5
7 changed files with 39 additions and 44 deletions
@@ -36,9 +36,10 @@ public class LootGenerator(
/// </summary>
/// <param name="options">parameters to adjust how loot is generated</param>
/// <returns>An array of loot items</returns>
public List<List<Item>> CreateRandomLoot(LootRequest options)
public IEnumerable<List<Item>> CreateRandomLoot(LootRequest options)
{
var result = new List<List<Item>>();
var itemTypeCounts = InitItemLimitCounter(options.ItemLimits);
// Handle sealed weapon containers
@@ -81,7 +82,7 @@ public class LootGenerator(
);
// Pool has items we could add as loot, proceed
if (rewardPoolResults.ItemPool.Count > 0)
if (rewardPoolResults.ItemPool.Any())
{
var randomisedItemCount = randomUtil.GetInt(
options.ItemCount.Min,
@@ -113,11 +114,9 @@ public class LootGenerator(
);
if (randomisedWeaponPresetCount > 0)
{
var weaponDefaultPresets = globalDefaultPresets
.Where(preset =>
itemHelper.IsOfBaseclass(preset.Encyclopedia.Value, BaseClasses.WEAPON)
)
.ToList();
var weaponDefaultPresets = globalDefaultPresets.Where(preset =>
itemHelper.IsOfBaseclass(preset.Encyclopedia.Value, BaseClasses.WEAPON)
);
if (weaponDefaultPresets.Any())
{
@@ -149,9 +148,9 @@ public class LootGenerator(
var armorDefaultPresets = globalDefaultPresets.Where(preset =>
itemHelper.ArmorItemCanHoldMods(preset.Encyclopedia.Value)
);
var levelFilteredArmorPresets = armorDefaultPresets
.Where(armor => IsArmorOfDesiredProtectionLevel(armor, options))
.ToList();
var levelFilteredArmorPresets = armorDefaultPresets.Where(armor =>
IsArmorOfDesiredProtectionLevel(armor, options)
);
// Add some armors to rewards
if (levelFilteredArmorPresets.Any())
@@ -245,7 +244,7 @@ public class LootGenerator(
/// <returns>results of filtering + blacklist used</returns>
protected ItemRewardPoolResults GetItemRewardPool(
HashSet<MongoId> itemTplBlacklist,
List<MongoId> itemTypeWhitelist,
HashSet<MongoId> itemTypeWhitelist,
bool useRewardItemBlacklist,
bool allowBossItems,
bool blockSeasonalItemsOutOfSeason
@@ -281,14 +280,12 @@ public class LootGenerator(
itemBlacklist.UnionWith(seasonalEventService.GetInactiveSeasonalEventItems());
}
var items = itemsDb
.Where(item =>
!itemBlacklist.Contains(item.Id)
&& string.Equals(item.Type, "item", StringComparison.OrdinalIgnoreCase)
&& !item.Properties.QuestItem.GetValueOrDefault(false)
&& itemTypeWhitelist.Contains(item.Parent)
)
.ToList();
var items = itemsDb.Where(item =>
!itemBlacklist.Contains(item.Id)
&& string.Equals(item.Type, "item", StringComparison.OrdinalIgnoreCase)
&& !item.Properties.QuestItem.GetValueOrDefault(false)
&& itemTypeWhitelist.Contains(item.Parent)
);
return new ItemRewardPoolResults { ItemPool = items, Blacklist = itemBlacklist };
}
@@ -348,7 +345,7 @@ public class LootGenerator(
/// <param name="result">array to add found item to</param>
/// <returns>true if item was valid and added to pool</returns>
protected bool FindAndAddRandomItemToLoot(
List<TemplateItem> items,
IEnumerable<TemplateItem> items,
Dictionary<MongoId, ItemLimit> itemTypeCounts,
LootRequest options,
List<List<Item>> result
@@ -426,13 +423,13 @@ public class LootGenerator(
/// <param name="result">List to add chosen preset to</param>
/// <returns>true if preset was valid and added to pool</returns>
protected bool FindAndAddRandomPresetToLoot(
List<Preset> presetPool,
IEnumerable<Preset> presetPool,
Dictionary<MongoId, ItemLimit> itemTypeCounts,
HashSet<MongoId> itemBlacklist,
List<List<Item>> result
)
{
if (presetPool.Count == 0)
if (!presetPool.Any())
{
logger.Warning(serverLocalisationService.GetText("loot-preset_pool_is_empty"));
@@ -732,10 +729,10 @@ public class LootGenerator(
// Find a random item of the desired type and add as reward
for (var index = 0; index < rewardCount; index++)
{
var chosenItem = randomUtil.DrawRandomFromList(relatedItems.ToList());
var chosenItem = randomUtil.GetArrayValue(relatedItems);
var reward = new List<Item>
{
new() { Id = new MongoId(), Template = chosenItem[0].Id },
new() { Id = new MongoId(), Template = chosenItem.Id },
};
modRewards.Add(reward);
@@ -785,7 +782,7 @@ public class LootGenerator(
/// </summary>
/// <param name="rewardContainerDetails"></param>
/// <returns>Single tpl</returns>
protected string PickRewardItem(RewardDetails rewardContainerDetails)
protected MongoId PickRewardItem(RewardDetails rewardContainerDetails)
{
if (
rewardContainerDetails.RewardTplPool is not null
@@ -803,7 +800,7 @@ public class LootGenerator(
protected record ItemRewardPoolResults
{
public List<TemplateItem> ItemPool { get; set; }
public IEnumerable<TemplateItem> ItemPool { get; set; }
public HashSet<MongoId> Blacklist { get; set; }
}
@@ -13,8 +13,8 @@ public record GetAirdropLootResponse
/// The type of airdrop
/// </summary>
[JsonPropertyName("icon")]
public AirdropTypeEnum? Icon { get; set; }
public AirdropTypeEnum Icon { get; set; }
[JsonPropertyName("container")]
public List<Item>? Container { get; set; }
public IEnumerable<Item> Container { get; set; }
}
@@ -68,7 +68,7 @@ public record AirdropLoot
/// Item type (parentId) to allow inside crate
/// </summary>
[JsonPropertyName("itemTypeWhitelist")]
public required List<MongoId> ItemTypeWhitelist { get; set; }
public required HashSet<MongoId> ItemTypeWhitelist { get; set; }
/// <summary>
/// Item type/ item tpls to limit count of inside crate - key: item base type: value: max count
@@ -51,7 +51,7 @@ public record RewardDetails
public Dictionary<MongoId, double>? RewardTplPool { get; set; }
[JsonPropertyName("rewardTypePool")]
public List<MongoId>? RewardTypePool { get; set; }
public HashSet<MongoId>? RewardTypePool { get; set; }
}
public record SealedAirdropContainerSettings
@@ -43,7 +43,7 @@ public record LootRequest
/// Item tpl whitelist to pick from
/// </summary>
[JsonPropertyName("itemTypeWhitelist")]
public List<MongoId>? ItemTypeWhitelist { get; set; }
public HashSet<MongoId>? ItemTypeWhitelist { get; set; }
/// <summary>
/// key: item base type: value: max count
@@ -16,8 +16,8 @@ namespace SPTarkov.Server.Core.Services;
[Injectable]
public class AirdropService(
ConfigServer configServer,
ISptLogger<AirdropService> _logger,
ConfigServer configServer,
LootGenerator _lootGenerator,
DatabaseService databaseService,
WeightedRandomHelper _weightedRandomHelper,
@@ -80,14 +80,12 @@ public class AirdropService(
// Filter loot pool to just items that fit crate
var crateLoot = GetLootThatFitsContainer(airdropCrateItem, crateLootPool);
// Flatten loot into single array ready to be returned
var flattenedCrateLoot = crateLoot.SelectMany(x => x).ToList();
// Create new array with crate at front + loot behind
var containerWithLoot = Enumerable.Empty<Item>().Append(airdropCrateItem);
containerWithLoot = containerWithLoot.Union(crateLoot.SelectMany(x => x));
// Add crate to front of loot rewards
flattenedCrateLoot.Insert(0, airdropCrateItem);
// Re-parent loot items to crate we just added
foreach (var item in flattenedCrateLoot)
// Re-parent root loot items to have crate as parent
foreach (var item in containerWithLoot)
{
if (item.Id == airdropCrateItem.Id)
// Crate itself, skip
@@ -105,8 +103,8 @@ public class AirdropService(
return new GetAirdropLootResponse
{
Icon = airdropConfig.Icon,
Container = flattenedCrateLoot,
Icon = airdropConfig.Icon.Value,
Container = containerWithLoot,
};
}
@@ -116,9 +114,9 @@ public class AirdropService(
/// <param name="container">Crate item to fit items into</param>
/// <param name="crateLootPool">Item pool to try and fit into container</param>
/// <returns>Items that will fit container</returns>
protected List<List<Item>> GetLootThatFitsContainer(
protected IEnumerable<List<Item>> GetLootThatFitsContainer(
Item container,
List<List<Item>> crateLootPool
IEnumerable<List<Item>> crateLootPool
)
{
// list of root item + children in list
@@ -447,7 +447,7 @@ public class LocationLifecycleService(
}
// Flatten
List<Item> mailableLoot = [.. loot.SelectMany(x => x)];
IEnumerable<Item> mailableLoot = [.. loot.SelectMany(x => x)];
// Send message from fence giving player reward generated above
mailSendService.SendLocalisedNpcMessageToPlayer(