List to ienumerable conversions
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user