From 34bd002876666e63420dd830ed67480141341a7f Mon Sep 17 00:00:00 2001 From: Chomp Date: Fri, 25 Jul 2025 12:28:40 +0100 Subject: [PATCH] list to ienumerable changes Removed unused methods strong to mongoId changes --- .../Controllers/HideoutController.cs | 15 ----- .../Controllers/InsuranceController.cs | 28 +++++---- .../Controllers/RagfairController.cs | 4 +- Libraries/SPTarkov.Server.Core/DI/Router.cs | 20 +++--- .../Extensions/DictionaryExtensions.cs | 8 +++ .../Extensions/UtilityExtensions.cs | 7 ++- .../Generators/RagfairOfferGenerator.cs | 16 +++-- .../Helpers/QuestHelper.cs | 23 ++++--- .../Helpers/RagfairHelper.cs | 8 +-- .../Helpers/RagfairOfferHelper.cs | 9 ++- .../Helpers/RagfairServerHelper.cs | 2 +- .../Helpers/RagfairSortHelper.cs | 6 +- .../Helpers/RewardHelper.cs | 8 +-- .../Helpers/TraderAssortHelper.cs | 2 +- .../Helpers/TraderHelper.cs | 7 +-- .../Helpers/WeightedRandomHelper.cs | 2 +- .../Models/Eft/Common/Tables/Achievement.cs | 2 +- .../Models/Eft/Common/Tables/BotType.cs | 56 +---------------- .../Eft/Match/EndLocalRaidRequestData.cs | 2 +- .../Models/Eft/Profile/SptProfile.cs | 6 +- .../Models/Eft/Ragfair/RagfairOffer.cs | 2 +- .../Models/Eft/Ragfair/SearchRequestData.cs | 2 +- .../Models/Spt/Config/HideoutConfig.cs | 2 +- .../Servers/RagfairServer.cs | 2 +- .../Services/BackupService.cs | 4 +- .../Services/BotNameService.cs | 2 +- .../Services/BtrDeliveryService.cs | 18 +++--- .../Services/CircleOfCultistService.cs | 44 ++++++------- .../Services/CreateProfileService.cs | 16 +++-- .../Services/FenceService.cs | 62 +++++++++++-------- .../Services/GiftService.cs | 4 +- .../Services/InsuranceService.cs | 2 +- .../Services/LocaleService.cs | 16 ----- .../Services/LocationLifecycleService.cs | 28 ++++----- .../Services/MailSendService.cs | 6 +- .../Services/PmcChatResponseService.cs | 13 ---- .../Services/ProfileFixerService.cs | 5 +- .../Services/RagfairCategoriesService.cs | 4 +- .../Services/RagfairOfferService.cs | 2 +- .../Services/RagfairPriceService.cs | 41 ++---------- .../Services/SeasonalEventService.cs | 10 +-- .../Services/ServerLocalisationService.cs | 5 +- .../TraderPurchasePersisterService.cs | 6 +- .../Collections/ProbabilityObjectArray.cs | 2 +- .../SPTarkov.Server.Core/Utils/MathUtil.cs | 4 +- SPTarkov.Server/Modding/ModDllLoader.cs | 5 +- SPTarkov.Server/Modding/ModValidator.cs | 14 ++--- SPTarkov.Server/Program.cs | 2 +- UnitTests/Tests/Utils/MathUtilTests.cs | 2 +- 49 files changed, 227 insertions(+), 329 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Controllers/HideoutController.cs b/Libraries/SPTarkov.Server.Core/Controllers/HideoutController.cs index 30714e89..3cf1638c 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/HideoutController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/HideoutController.cs @@ -874,21 +874,6 @@ public class HideoutController( return productionTime * fenceLevel.ScavCaseTimeModifier; } - /// - /// Add generated scav case rewards to player profile - /// - /// Players PMC profile - /// reward items to add to profile - /// recipe id to save into Production dict - public void AddScavCaseRewardsToProfile(PmcData pmcData, List rewards, MongoId recipeId) - { - pmcData.Hideout.Production[$"ScavCase{recipeId}"] = new Production - { - Products = rewards, - RecipeId = recipeId, - }; - } - /// /// Start production of continuously created item /// diff --git a/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs b/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs index cffc2b7d..7abeb754 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs @@ -687,17 +687,17 @@ public class InsuranceController( /// /// protected void HandleLabsInsurance( - Dictionary?>? traderDialogMessages, + Dictionary?> traderDialogMessages, Insurance insurance ) { // Use labs specific messages if available, otherwise use default - var responseMesageIds = - traderDialogMessages["insuranceFailedLabs"]?.Count > 0 - ? traderDialogMessages["insuranceFailedLabs"] - : traderDialogMessages["insuranceFailed"]; + if (!traderDialogMessages.TryGetValue("insuranceFailedLabs", out var responseMessageIds)) + { + traderDialogMessages.TryGetValue("insuranceFailed", out responseMessageIds); + } - insurance.MessageTemplateId = randomUtil.GetArrayValue(responseMesageIds); + insurance.MessageTemplateId = randomUtil.GetArrayValue(responseMessageIds); // Remove all insured items taken into labs insurance.Items = []; @@ -709,15 +709,19 @@ public class InsuranceController( /// /// protected void HandleLabyrinthInsurance( - Dictionary?>? traderDialogMessages, + Dictionary?> traderDialogMessages, Insurance insurance ) { - // Use labs specific messages if available, otherwise use default - var responseMessageIds = - traderDialogMessages["insuranceFailedLabyrinth"]?.Count > 0 - ? traderDialogMessages["insuranceFailedLabyrinth"] - : traderDialogMessages["insuranceFailed"]; + if ( + !traderDialogMessages.TryGetValue( + "insuranceFailedLabyrinth", + out var responseMessageIds + ) + ) + { + traderDialogMessages.TryGetValue("insuranceFailed", out responseMessageIds); + } insurance.MessageTemplateId = randomUtil.GetArrayValue(responseMessageIds); diff --git a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs index 9bd46a80..d2021003 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs @@ -219,7 +219,7 @@ public class RagfairController( // No trader found in profile, create a blank record for them var existsInProfile = !fullProfile.TraderPurchases.TryAdd( offer.User.Id, - new Dictionary() + new Dictionary() ); if (!existsInProfile) { @@ -249,7 +249,7 @@ public class RagfairController( /// Add index to all offers passed in (0-indexed) /// /// Offers to add index value to - protected void AddIndexValueToOffers(List offers) + protected void AddIndexValueToOffers(IEnumerable offers) { var counter = 0; diff --git a/Libraries/SPTarkov.Server.Core/DI/Router.cs b/Libraries/SPTarkov.Server.Core/DI/Router.cs index c8f74bd6..8f904890 100644 --- a/Libraries/SPTarkov.Server.Core/DI/Router.cs +++ b/Libraries/SPTarkov.Server.Core/DI/Router.cs @@ -10,18 +10,18 @@ namespace SPTarkov.Server.Core.DI; public abstract class Router { - protected List handledRoutes = []; + protected IEnumerable handledRoutes = []; public virtual string GetTopLevelRoute() { return "spt"; } - protected abstract List GetHandledRoutes(); + protected abstract IEnumerable GetHandledRoutes(); - protected List GetInternalHandledRoutes() + protected IEnumerable GetInternalHandledRoutes() { - if (handledRoutes.Count == 0) + if (!handledRoutes.Any()) { handledRoutes = GetHandledRoutes(); } @@ -40,7 +40,7 @@ public abstract class Router } } -public abstract class StaticRouter(JsonUtil jsonUtil, List routes) : Router +public abstract class StaticRouter(JsonUtil jsonUtil, IEnumerable routes) : Router { public async ValueTask HandleStatic( string url, @@ -60,13 +60,13 @@ public abstract class StaticRouter(JsonUtil jsonUtil, List routes) return await action.action(url, info, sessionId, output); } - protected override List GetHandledRoutes() + protected override IEnumerable GetHandledRoutes() { - return routes.Select(route => new HandledRoute(route.url, false)).ToList(); + return routes.Select(route => new HandledRoute(route.url, false)); } } -public abstract class DynamicRouter(JsonUtil jsonUtil, List routes) : Router +public abstract class DynamicRouter(JsonUtil jsonUtil, IEnumerable routes) : Router { public async ValueTask HandleDynamic( string url, @@ -86,9 +86,9 @@ public abstract class DynamicRouter(JsonUtil jsonUtil, List routes) return await action.action(url, info, sessionID, output); } - protected override List GetHandledRoutes() + protected override IEnumerable GetHandledRoutes() { - return routes.Select(route => new HandledRoute(route.url, true)).ToList(); + return routes.Select(route => new HandledRoute(route.url, true)); } } diff --git a/Libraries/SPTarkov.Server.Core/Extensions/DictionaryExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/DictionaryExtensions.cs index 5c639e5a..f2cea7b7 100644 --- a/Libraries/SPTarkov.Server.Core/Extensions/DictionaryExtensions.cs +++ b/Libraries/SPTarkov.Server.Core/Extensions/DictionaryExtensions.cs @@ -33,5 +33,13 @@ dict[key] += value; } } + + public static void RemoveItems(this IDictionary collection, ISet idsToRemove) + { + foreach (var key in idsToRemove) + { + collection.Remove(key); + } + } } } diff --git a/Libraries/SPTarkov.Server.Core/Extensions/UtilityExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/UtilityExtensions.cs index a8426b6f..d93bb9f4 100644 --- a/Libraries/SPTarkov.Server.Core/Extensions/UtilityExtensions.cs +++ b/Libraries/SPTarkov.Server.Core/Extensions/UtilityExtensions.cs @@ -2,12 +2,15 @@ { public static class UtilityExtensions { - public static List IntersectWith(this List first, List second) + public static IEnumerable IntersectWith( + this IEnumerable first, + IEnumerable second + ) { //a.Intersect(x => b.Contains(x)).ToList(); // gives error Delegate type could not be inferred - return first.Where(second.Contains).ToList(); + return first.Where(second.Contains); } } } diff --git a/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs index 91c8d458..5b06fab7 100644 --- a/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs +++ b/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs @@ -1019,7 +1019,7 @@ public class RagfairOfferGenerator( /// Barter config from ragfairConfig.Dynamic.barter /// Barter scheme protected List CreateBarterBarterScheme( - List offerItems, + IEnumerable offerItems, BarterDetails barterConfig ) { @@ -1057,13 +1057,11 @@ public class RagfairOfferGenerator( var max = desiredItemCostRouble + offerCostVarianceRoubles; var rootOfferItem = offerItems.FirstOrDefault(); - var itemsInsidePriceBounds = itemFleaPrices - .Where(itemAndPrice => - itemAndPrice.Price >= min - && itemAndPrice.Price <= max - && itemAndPrice.Tpl != rootOfferItem.Template // Don't allow the item being sold to be chosen - ) - .ToList(); + var itemsInsidePriceBounds = itemFleaPrices.Where(itemAndPrice => + itemAndPrice.Price >= min + && itemAndPrice.Price <= max + && itemAndPrice.Tpl != rootOfferItem.Template // Don't allow the item being sold to be chosen + ); // No items on flea have a matching price, fall back to currency if (!itemsInsidePriceBounds.Any()) @@ -1110,7 +1108,7 @@ public class RagfairOfferGenerator( /// What to multiply the resulting price by /// Barter scheme for offer protected List CreateCurrencyBarterScheme( - List offerWithChildren, + IEnumerable offerWithChildren, bool isPackOffer, double multiplier = 1 ) diff --git a/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs index 2756cf36..bcb4f315 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/QuestHelper.cs @@ -45,13 +45,13 @@ public class QuestHelper( QuestStatusEnum.AvailableForFinish, ]; protected readonly QuestConfig _questConfig = configServer.GetConfig(); - private Dictionary>? _sellToTraderQuestConditionCache; + private Dictionary>? _sellToTraderQuestConditionCache; /// /// List of conditions that require trader sales be tracked and incremented, keyed by /// We need to keep track of quests with `SellItemToTrader` finish conditions to avoid expensive lookups during trading. /// - protected virtual Dictionary> SellToTraderQuestConditionCache + protected virtual Dictionary> SellToTraderQuestConditionCache { get { @@ -103,10 +103,10 @@ public class QuestHelper( /// List of quests #1 /// List of quests #2 /// quests not in before - public IEnumerable GetDeltaQuests(List before, List after) + public IEnumerable GetDeltaQuests(IEnumerable before, IEnumerable after) { // Nothing to compare against, return after - if (before.Count == 0) + if (!before.Any()) { return after; } @@ -686,10 +686,12 @@ public class QuestHelper( /// /// Quests to process /// List of quests with `SellItemToTrader` finish condition(s) - protected Dictionary> GetSellToTraderQuests(List quests) + protected Dictionary> GetSellToTraderQuests( + IEnumerable quests + ) { // Create cache - var result = new Dictionary>(); + var result = new Dictionary>(); foreach (var quest in quests) { foreach (var cond in quest.Conditions.AvailableForFinish) @@ -729,7 +731,7 @@ public class QuestHelper( { return pmcData .TaskConditionCounters?.Values.Where(condition => - SellToTraderQuestConditionCache.ContainsKey(condition.SourceId) + SellToTraderQuestConditionCache.ContainsKey(condition.SourceId.Value) && condition.Type == "SellItemToTrader" ) .ToList(); @@ -758,7 +760,12 @@ public class QuestHelper( foreach (var counter in activeConditionCounters) { // Condition is in profile, but quest doesn't exist in database - if (!SellToTraderQuestConditionCache.TryGetValue(counter.SourceId, out var conditions)) + if ( + !SellToTraderQuestConditionCache.TryGetValue( + counter.SourceId.Value, + out var conditions + ) + ) { logger.Error( serverLocalisationService.GetText( diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairHelper.cs index 1afe4188..9fa0c5b9 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairHelper.cs @@ -88,10 +88,10 @@ public class RagfairHelper( } // Case: category - if (!string.IsNullOrEmpty(request.HandbookId)) + if (request.HandbookId.HasValue && !request.HandbookId.Value.IsEmpty()) { - var handbook = GetCategoryList(request.HandbookId); - result = result?.Count > 0 ? result.IntersectWith(handbook) : handbook; + var handbook = GetCategoryList(request.HandbookId.Value); + result = (result?.Count > 0 ? result.IntersectWith(handbook) : handbook).ToList(); } return result; @@ -157,7 +157,7 @@ public class RagfairHelper( /// /// Items to merge /// - public List MergeStackable(List items) + public List MergeStackable(IEnumerable items) { var list = new List(); Item? rootItem = null; diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs index d69e082c..1b9894a4 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairOfferHelper.cs @@ -612,7 +612,10 @@ public class RagfairOfferHelper( return false; } - protected HashSet GetLoyaltyLockedOffers(List offers, PmcData pmcProfile) + protected HashSet GetLoyaltyLockedOffers( + IEnumerable offers, + PmcData pmcProfile + ) { var loyaltyLockedOffers = new HashSet(); foreach (var offer in offers.Where(x => x.IsTraderOffer())) @@ -657,7 +660,7 @@ public class RagfairOfferHelper( if ( offer.SellResults is null - || offer.SellResults.Count == 0 + || !offer.SellResults.Any() || currentTimestamp < offer.SellResults.FirstOrDefault()?.SellTime ) { @@ -705,7 +708,7 @@ public class RagfairOfferHelper( /// /// items to sum up /// Total stack count - public double GetTotalStackCountSize(List> itemsInInventoryToSumStackCount) + public double GetTotalStackCountSize(IEnumerable> itemsInInventoryToSumStackCount) { return itemsInInventoryToSumStackCount.Sum(itemAndChildren => itemAndChildren.FirstOrDefault()?.Upd?.StackObjectsCount.GetValueOrDefault(1) ?? 1 diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairServerHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairServerHelper.cs index a63f2c84..6faa08f4 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairServerHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairServerHelper.cs @@ -129,7 +129,7 @@ public class RagfairServerHelper( /// /// Player to send items to /// Items to send to player - public void ReturnItems(MongoId sessionID, List returnedItems) + public void ReturnItems(MongoId sessionID, IEnumerable returnedItems) { mailSendService.SendLocalisedNpcMessageToPlayer( sessionID, diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs index ca13df2f..d2f63e0d 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/RagfairSortHelper.cs @@ -66,11 +66,13 @@ public class RagfairSortHelper(LocaleService localeService) protected int SortOffersByBarter(RagfairOffer a, RagfairOffer b) { var aIsOnlyMoney = - a.Requirements.Count == 1 && Money.GetMoneyTpls().Contains(a.Requirements[0].TemplateId) + a.Requirements.Count() == 1 + && Money.GetMoneyTpls().Contains(a.Requirements.First().TemplateId) ? 1 : 0; var bIsOnlyMoney = - b.Requirements.Count == 1 && Money.GetMoneyTpls().Contains(b.Requirements[0].TemplateId) + b.Requirements.Count() == 1 + && Money.GetMoneyTpls().Contains(b.Requirements.First().TemplateId) ? 1 : 0; diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs index 1359961f..d9391af2 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs @@ -40,7 +40,7 @@ public class RewardHelper( /// Response to quest completion when a production is unlocked. /// List of items that is the reward. public List ApplyRewards( - List rewards, + IEnumerable rewards, string source, SptProfile fullProfile, PmcData profileData, @@ -166,7 +166,7 @@ public class RewardHelper( } } - return GetRewardItems(rewards, gameVersion); + return GetRewardItems(rewards, gameVersion).ToList(); } /// @@ -287,7 +287,7 @@ public class RewardHelper( /// Array of rewards to get the items from. /// The game version of the profile. /// Array of items with the correct maxStack. - protected List GetRewardItems(List rewards, string gameVersion) + protected IEnumerable GetRewardItems(IEnumerable rewards, string gameVersion) { // Iterate over all rewards with the desired status, flatten out items that have a type of Item var rewardItems = rewards.SelectMany(reward => @@ -296,7 +296,7 @@ public class RewardHelper( : [] ); - return rewardItems.ToList(); + return rewardItems; } /// diff --git a/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs index d3086c61..78ddda6d 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/TraderAssortHelper.cs @@ -129,7 +129,7 @@ public class TraderAssortHelper( /// Reset every traders root item `BuyRestrictionCurrent` property to 0 /// /// Items to adjust - protected void ResetBuyRestrictionCurrentValue(List assortItems) + protected void ResetBuyRestrictionCurrentValue(IEnumerable assortItems) { // iterate over root items foreach (var assort in assortItems.Where(item => item.SlotId == "hideout")) diff --git a/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs index 62be0e89..0a4d5c6e 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs @@ -467,12 +467,11 @@ public class TraderHelper( var currentTime = timeUtil.GetTimeStamp(); // Nullguard traderPurchases - profile.TraderPurchases ??= - new Dictionary?>(); + profile.TraderPurchases ??= new(); // Nullguard traderPurchases for this trader - profile.TraderPurchases[traderId] ??= new Dictionary(); + profile.TraderPurchases[traderId] ??= new(); - // Null guard when dict doesnt exist + // Null guard when dict doesn't exist if ( profile.TraderPurchases[traderId][purchasedItem.ItemId].PurchaseCount is null diff --git a/Libraries/SPTarkov.Server.Core/Helpers/WeightedRandomHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/WeightedRandomHelper.cs index 64c2e907..9353d507 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/WeightedRandomHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/WeightedRandomHelper.cs @@ -47,7 +47,7 @@ public class WeightedRandomHelper( /// List of items /// List of weights /// Dictionary with item and index - public WeightedRandomResult WeightedRandom(List items, List weights) + public WeightedRandomResult WeightedRandom(IList items, IList weights) { if (items.Count == 0) { diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Achievement.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Achievement.cs index 57f0256b..0bd1e549 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Achievement.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Achievement.cs @@ -24,7 +24,7 @@ public record Achievement public string? AssetPath { get; set; } [JsonPropertyName("rewards")] - public required List Rewards { get; set; } + public required IEnumerable Rewards { get; set; } [JsonPropertyName("conditions")] public required AchievementQuestConditionTypes Conditions { get; set; } diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs index 7229ac5c..1548264b 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs @@ -35,7 +35,7 @@ public record BotType public BotTypeInventory BotInventory { get; set; } [JsonPropertyName("lastName")] - public List LastNames { get; set; } + public IEnumerable LastNames { get; set; } [JsonPropertyName("skills")] public BotDbSkills BotSkills { get; set; } @@ -248,24 +248,6 @@ public double? ModPistol_Grip { get; set; } } */ -public record Difficulties -{ - [JsonExtensionData] - public Dictionary? ExtensionData { get; set; } - - [JsonPropertyName("easy")] - public DifficultyCategories Easy { get; set; } - - [JsonPropertyName("normal")] - public DifficultyCategories Normal { get; set; } - - [JsonPropertyName("hard")] - public DifficultyCategories Hard { get; set; } - - [JsonPropertyName("impossible")] - public DifficultyCategories Impossible { get; set; } -} - public record DifficultyCategories { [JsonExtensionData] @@ -408,7 +390,7 @@ public record BotTypeHealth [JsonExtensionData] public Dictionary? ExtensionData { get; set; } - public List BodyParts { get; set; } + public IEnumerable BodyParts { get; set; } public MinMax Energy { get; set; } @@ -454,40 +436,6 @@ public record BotTypeInventory public GlobalMods Mods { get; set; } } -public record Equipment -{ - [JsonExtensionData] - public Dictionary? ExtensionData { get; set; } - - public Dictionary? ArmBand { get; set; } - - public Dictionary? ArmorVest { get; set; } - - public Dictionary? Backpack { get; set; } - - public Dictionary? Earpiece { get; set; } - - public Dictionary? Eyewear { get; set; } - - public Dictionary? FaceCover { get; set; } - - public Dictionary? FirstPrimaryWeapon { get; set; } - - public Dictionary? Headwear { get; set; } - - public Dictionary? Holster { get; set; } - - public Dictionary? Pockets { get; set; } - - public Dictionary? Scabbard { get; set; } - - public Dictionary? SecondPrimaryWeapon { get; set; } - - public Dictionary? SecuredContainer { get; set; } - - public Dictionary? TacticalVest { get; set; } -} - public record ItemPools { [JsonExtensionData] diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Match/EndLocalRaidRequestData.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Match/EndLocalRaidRequestData.cs index 5269405f..f1e809e0 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Match/EndLocalRaidRequestData.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Match/EndLocalRaidRequestData.cs @@ -31,7 +31,7 @@ public record EndLocalRaidRequestData : IRequestData /// Items sent via traders to player, keyed to service e.g. BTRTransferStash /// [JsonPropertyName("transferItems")] - public Dictionary>? TransferItems { get; set; } + public Dictionary>? TransferItems { get; set; } [JsonPropertyName("locationTransit")] public LocationTransit? LocationTransit { get; set; } diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Profile/SptProfile.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Profile/SptProfile.cs index 55606b89..78a2338b 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Profile/SptProfile.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Profile/SptProfile.cs @@ -49,8 +49,8 @@ public record SptProfile /// [JsonPropertyName("traderPurchases")] public Dictionary< - string, - Dictionary? + MongoId, + Dictionary? >? TraderPurchases { get; set; } /// @@ -311,7 +311,7 @@ public record Message public SystemData? SystemData { get; set; } [JsonPropertyName("profileChangeEvents")] - public List? ProfileChangeEvents { get; set; } + public IEnumerable? ProfileChangeEvents { get; set; } } public record ReplyTo diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/RagfairOffer.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/RagfairOffer.cs index 18d12bd3..ac60448e 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/RagfairOffer.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/RagfairOffer.cs @@ -24,7 +24,7 @@ public record RagfairOffer public List? Items { get; set; } [JsonPropertyName("requirements")] - public List? Requirements { get; set; } + public IEnumerable? Requirements { get; set; } [JsonPropertyName("root")] public MongoId Root { get; set; } diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/SearchRequestData.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/SearchRequestData.cs index 883e3b10..772a4441 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/SearchRequestData.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Ragfair/SearchRequestData.cs @@ -62,7 +62,7 @@ public record SearchRequestData : IRequestData public bool? UpdateOfferCount { get; set; } [JsonPropertyName("handbookId")] - public string? HandbookId { get; set; } + public MongoId? HandbookId { get; set; } [JsonPropertyName("linkedSearchId")] public string? LinkedSearchId { get; set; } diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/HideoutConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/HideoutConfig.cs index 404a590e..03b48be6 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/HideoutConfig.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/HideoutConfig.cs @@ -133,7 +133,7 @@ public record CultistCircleSettings /// Item tpls to include in the reward pool /// [JsonPropertyName("additionalRewardItemPool")] - public required List AdditionalRewardItemPool { get; set; } + public required List AdditionalRewardItemPool { get; set; } [JsonPropertyName("currencyRewards")] public required Dictionary> CurrencyRewards { get; set; } diff --git a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs index f909dd33..71d016f3 100644 --- a/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs +++ b/Libraries/SPTarkov.Server.Core/Servers/RagfairServer.cs @@ -85,7 +85,7 @@ public class RagfairServer( public Dictionary GetAllActiveCategories( bool fleaUnlocked, SearchRequestData searchRequestData, - List offers + IEnumerable offers ) { return _ragfairCategoriesService.GetCategoriesFromOffers( diff --git a/Libraries/SPTarkov.Server.Core/Services/BackupService.cs b/Libraries/SPTarkov.Server.Core/Services/BackupService.cs index 40c06ba8..0ccdeb4a 100644 --- a/Libraries/SPTarkov.Server.Core/Services/BackupService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/BackupService.cs @@ -213,7 +213,7 @@ public class BackupService } protected SortedDictionary GetBackupPathsWithCreationTimestamp( - List backupPaths + IEnumerable backupPaths ) { var result = new SortedDictionary(); @@ -295,7 +295,7 @@ public class BackupService /// /// List of backup file names to be removed. /// A promise that resolves when all specified backups have been removed. - protected void RemoveExcessBackups(List backupFilenames) + protected void RemoveExcessBackups(IEnumerable backupFilenames) { var filePathsToDelete = backupFilenames.Select(x => x); foreach (var pathToDelete in filePathsToDelete) diff --git a/Libraries/SPTarkov.Server.Core/Services/BotNameService.cs b/Libraries/SPTarkov.Server.Core/Services/BotNameService.cs index 46000a69..c5ddadc1 100644 --- a/Libraries/SPTarkov.Server.Core/Services/BotNameService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/BotNameService.cs @@ -66,7 +66,7 @@ public class BotNameService( _botConfig.BotNameLengthLimit, botGenerationDetails.Side ) - : $"{randomUtil.GetArrayValue(botJsonTemplate.FirstNames)} {(botJsonTemplate.LastNames.Count > 0 ? randomUtil.GetArrayValue(botJsonTemplate.LastNames) : "")}"; + : $"{randomUtil.GetArrayValue(botJsonTemplate.FirstNames)} {(botJsonTemplate.LastNames.Any() ? randomUtil.GetArrayValue(botJsonTemplate.LastNames) : "")}"; name = name.Trim(); diff --git a/Libraries/SPTarkov.Server.Core/Services/BtrDeliveryService.cs b/Libraries/SPTarkov.Server.Core/Services/BtrDeliveryService.cs index 3f81bee0..6f8b74e0 100644 --- a/Libraries/SPTarkov.Server.Core/Services/BtrDeliveryService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/BtrDeliveryService.cs @@ -40,17 +40,21 @@ public class BtrDeliveryService( foreach (var transferType in _transferTypes) { var rootId = $"{Traders.BTR}_{transferType}"; - List? itemsToSend = null; + + if (request.TransferItems is null) + { + continue; + } // if rootId doesn't exist in TransferItems, skip - if (!request?.TransferItems?.TryGetValue(rootId, out itemsToSend) ?? false) + if (!request.TransferItems.TryGetValue(rootId, out var itemsToSend)) { continue; } // Filter out the btr container item from transferred items before delivering - itemsToSend = itemsToSend?.Where(item => item.Id != Traders.BTR).ToList(); - if (itemsToSend?.Count == 0) + itemsToSend = itemsToSend?.Where(item => item.Id != Traders.BTR); + if (itemsToSend is null || !itemsToSend.Any()) { continue; } @@ -59,7 +63,7 @@ public class BtrDeliveryService( } } - protected void HandleTransferItemDelivery(MongoId sessionId, List items) + protected void HandleTransferItemDelivery(MongoId sessionId, IEnumerable items) { var serverProfile = saveServer.GetProfile(sessionId); var pmcData = serverProfile.CharacterData.PmcData; @@ -81,12 +85,12 @@ public class BtrDeliveryService( { Id = new MongoId(), ScheduledTime = (int)GetBTRDeliveryReturnTimestamp(), - Items = items, + Items = items.ToList(), } ); } - public void SendBTRDelivery(MongoId sessionId, List items) + public void SendBTRDelivery(MongoId sessionId, IEnumerable items) { var dialogueTemplates = databaseService.GetTrader(Traders.BTR).Dialogue; if (dialogueTemplates is null) diff --git a/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs b/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs index 6f502502..5a4492d4 100644 --- a/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/CircleOfCultistService.cs @@ -838,7 +838,7 @@ public class CircleOfCultistService( var nextTargetStageLevel = (currentStageLevel + 1).ToString() ?? ""; if (dbArea?.Stages?.TryGetValue(nextTargetStageLevel, out var nextStageDbData) ?? false) { - // Next stage exists, gather up requirements and add to pool + // Next stage exists, gather requirements and add to pool var itemRequirements = GetItemRequirements(nextStageDbData.Requirements); foreach (var rewardToAdd in itemRequirements) { @@ -869,23 +869,23 @@ public class CircleOfCultistService( /// /// Hideout areas to iterate over /// Active area array - protected List GetPlayerAccessibleHideoutAreas(List areas) + protected IEnumerable GetPlayerAccessibleHideoutAreas( + IEnumerable areas + ) { - return areas - .Where(area => + return areas.Where(area => + { + if ( + area.Type == HideoutAreas.ChristmasIllumination + && !seasonalEventService.ChristmasEventEnabled() + ) + // Christmas tree area and not Christmas, skip { - if ( - area.Type == HideoutAreas.ChristmasIllumination - && !seasonalEventService.ChristmasEventEnabled() - ) - // Christmas tree area and not Christmas, skip - { - return false; - } + return false; + } - return true; - }) - .ToList(); + return true; + }); } /// @@ -944,17 +944,9 @@ public class CircleOfCultistService( /// /// Requirements to iterate over /// Array of item requirements - protected List GetItemRequirements(List requirements) - { - return requirements.Where(requirement => requirement.Type == "Item").ToList(); - } - - /// - /// Iterate over passed in hideout requirements and return the Item - /// - /// Requirements to iterate over - /// Array of item requirements - protected List GetItemRequirements(List requirements) + protected IEnumerable GetItemRequirements( + IEnumerable requirements + ) { return requirements.Where(requirement => requirement.Type == "Item").ToList(); } diff --git a/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs b/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs index 8176dbe2..2657964a 100644 --- a/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs @@ -415,15 +415,13 @@ public class CreateProfileService( questFromDb.StartedMessageText, questFromDb.Description ); - var itemRewards = questRewardHelper - .ApplyQuestReward( - profileDetails.CharacterData.PmcData, - quest.QId, - QuestStatusEnum.Started, - sessionID, - response - ) - .ToList(); + var itemRewards = questRewardHelper.ApplyQuestReward( + profileDetails.CharacterData.PmcData, + quest.QId, + QuestStatusEnum.Started, + sessionID, + response + ); mailSendService.SendLocalisedNpcMessageToPlayer( sessionID, diff --git a/Libraries/SPTarkov.Server.Core/Services/FenceService.cs b/Libraries/SPTarkov.Server.Core/Services/FenceService.cs index be05476b..d46c97f5 100644 --- a/Libraries/SPTarkov.Server.Core/Services/FenceService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/FenceService.cs @@ -931,9 +931,9 @@ public class FenceService( && string.Equals(item.ParentId, "hideout", StringComparison.OrdinalIgnoreCase) ) != null ) - .SelectMany(i => i) - .ToList(); - if (matchingItems.Count == 0) + .SelectMany(i => i); + + if (!matchingItems.Any()) // Nothing matches by tpl and is root item, exit early { return null; @@ -952,9 +952,9 @@ public class FenceService( && itemDbDetails.Properties.Slots.Any(); // Only one match and it's not medical or armored gear - if (matchingItems.Count == 1 && !(isMedical || isGearAndHasSlots)) + if (matchingItems.Count() == 1 && !(isMedical || isGearAndHasSlots)) { - return matchingItems[0]; + return matchingItems.First(); } // Items have sub properties that need to be checked against @@ -1777,34 +1777,46 @@ public class FenceService( fenceAssortItem.Upd.StackObjectsCount -= buyCount; } - protected void DeleteOffer(MongoId assortId, List assorts) + /// + /// Remove an offer from assort + /// + /// Id of assort offer to remove + /// Assort items to remove from (fenceAssort.Items / fenceDiscountAssort.Items) + protected void DeleteOffer(MongoId assortId, List assortItemsToRemoveFrom) { // Assort could have child items, remove those too - var itemWithChildrenToRemove = assorts.GetItemWithChildren(assortId); + var itemWithChildrenToRemove = assortItemsToRemoveFrom.GetItemWithChildren(assortId); foreach (var itemToRemove in itemWithChildrenToRemove) { - var indexToRemove = assorts.FindIndex(item => item.Id == itemToRemove.Id); - - // No offer found in main assort, check discount items - if (indexToRemove == -1) + if (!assortItemsToRemoveFrom.Remove(itemToRemove)) { - indexToRemove = fenceDiscountAssort.Items.FindIndex(item => - item.Id == itemToRemove.Id + logger.Warning( + $"unable to remove fence assort item: {itemToRemove.Id} tpl: {itemToRemove.Template}" ); - fenceDiscountAssort.Items.Splice(indexToRemove, 1); - - if (indexToRemove == -1) - { - logger.Warning( - $"unable to remove fence assort item: {itemToRemove.Id} tpl: {itemToRemove.Template}" - ); - } - - return; } - // Remove offer from assort - assorts.Splice(indexToRemove, 1); + //var indexToRemove = assortsToDeleteFrom.FindIndex(item => item.Id == itemToRemove.Id); + + //// No offer found in main assort, check discount items + //if (indexToRemove == -1) + //{ + // indexToRemove = fenceDiscountAssort.Items.FindIndex(item => + // item.Id == itemToRemove.Id + // ); + // fenceDiscountAssort.Items.Splice(indexToRemove, 1); + + // if (indexToRemove == -1) + // { + // logger.Warning( + // $"unable to remove fence assort item: {itemToRemove.Id} tpl: {itemToRemove.Template}" + // ); + // } + + // return; + //} + + //// Remove offer from assort + //assortsToDeleteFrom.Splice(indexToRemove, 1); } } } diff --git a/Libraries/SPTarkov.Server.Core/Services/GiftService.cs b/Libraries/SPTarkov.Server.Core/Services/GiftService.cs index aa7a0ed6..951735cc 100644 --- a/Libraries/SPTarkov.Server.Core/Services/GiftService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/GiftService.cs @@ -54,9 +54,9 @@ public class GiftService( /// Get an array of all gift ids /// /// String list of gift ids - public List GetGiftIds() + public IEnumerable GetGiftIds() { - return _giftConfig.Gifts.Keys.ToList(); + return _giftConfig.Gifts.Keys; } /// diff --git a/Libraries/SPTarkov.Server.Core/Services/InsuranceService.cs b/Libraries/SPTarkov.Server.Core/Services/InsuranceService.cs index 2fac8c27..1c77dcb8 100644 --- a/Libraries/SPTarkov.Server.Core/Services/InsuranceService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/InsuranceService.cs @@ -297,7 +297,7 @@ public class InsuranceService( /// Item being returned in insurance /// Player inventory /// True if item - protected bool ItemCannotBeLostOnDeath(Item lostItem, List inventoryItems) + protected bool ItemCannotBeLostOnDeath(Item lostItem, IEnumerable inventoryItems) { if (lostItem.SlotId?.StartsWith("specialslot", StringComparison.OrdinalIgnoreCase) ?? false) { diff --git a/Libraries/SPTarkov.Server.Core/Services/LocaleService.cs b/Libraries/SPTarkov.Server.Core/Services/LocaleService.cs index e4601833..858c72c0 100644 --- a/Libraries/SPTarkov.Server.Core/Services/LocaleService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/LocaleService.cs @@ -232,20 +232,4 @@ public class LocaleService( { return CultureInfo.InstalledUICulture; } - - public List GetLocaleKeysThatStartsWithValue(string partialKey) - { - return GetLocaleDb().Keys.Where(x => x.StartsWith(partialKey)).ToList(); - } - - /// - /// Blank out the "test" mail message from prapor - /// - protected Dictionary RemovePraporTestMessage( - Dictionary dbLocales - ) - { - dbLocales["61687e2c3e526901fa76baf9"] = ""; - return dbLocales; - } } diff --git a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs index 7ee27d25..57db2964 100644 --- a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs @@ -1042,7 +1042,7 @@ public class LocationLifecycleService( questStatus.QId == matchingQuest.Id ); if (profileQuestToUpdate is null) - // Profile doesnt have a matching quest + // Profile doesn't have a matching quest { continue; } @@ -1071,20 +1071,18 @@ public class LocationLifecycleService( ) { // LK quests that were not completed before raid but now are - var newlyCompletedLightkeeperQuests = postRaidQuests - .Where(postRaidQuest => - postRaidQuest.Status == QuestStatusEnum.Success - && // Quest is complete - preRaidQuests.Any(preRaidQuest => - preRaidQuest.QId == postRaidQuest.QId - && // Get matching pre-raid quest - preRaidQuest.Status != QuestStatusEnum.Success - ) - && // Completed quest was not completed before raid started - databaseService.GetQuests().TryGetValue(postRaidQuest.QId, out var quest) - && quest?.TraderId == Traders.LIGHTHOUSEKEEPER - ) // Quest is from LK - .ToList(); + var newlyCompletedLightkeeperQuests = postRaidQuests.Where(postRaidQuest => + postRaidQuest.Status == QuestStatusEnum.Success + && // Quest is complete + preRaidQuests.Any(preRaidQuest => + preRaidQuest.QId == postRaidQuest.QId + && // Get matching pre-raid quest + preRaidQuest.Status != QuestStatusEnum.Success + ) + && // Completed quest was not completed before raid started + databaseService.GetQuests().TryGetValue(postRaidQuest.QId, out var quest) + && quest?.TraderId == Traders.LIGHTHOUSEKEEPER + ); // Quest is from LK // Run server complete quest process to ensure player gets rewards foreach (var questToComplete in newlyCompletedLightkeeperQuests) diff --git a/Libraries/SPTarkov.Server.Core/Services/MailSendService.cs b/Libraries/SPTarkov.Server.Core/Services/MailSendService.cs index e78b29b8..8180c0ce 100644 --- a/Libraries/SPTarkov.Server.Core/Services/MailSendService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/MailSendService.cs @@ -595,12 +595,12 @@ public class MailSendService( /// /// Possible items to choose from /// Chosen 'primary' item - protected Item? GetBaseItemFromRewards(List items) + protected Item? GetBaseItemFromRewards(IEnumerable items) { // Only one item in reward, return it - if (items?.Count == 1) + if (items.Count() == 1) { - return items[0]; + return items.First(); } // Find first item with slotId that indicates it's a 'base' item diff --git a/Libraries/SPTarkov.Server.Core/Services/PmcChatResponseService.cs b/Libraries/SPTarkov.Server.Core/Services/PmcChatResponseService.cs index 0bd9bea8..3624d60b 100644 --- a/Libraries/SPTarkov.Server.Core/Services/PmcChatResponseService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/PmcChatResponseService.cs @@ -281,19 +281,6 @@ public class PmcChatResponseService( return keys.Where(x => x.StartsWith("pmcresponse-suffix")).ToList(); } - /// - /// Randomly draw a victim of the list and return their details - /// - /// Possible victims to choose from - /// UserDialogInfo object - // TODO: is this used? - protected UserDialogInfo ChooseRandomVictim(List pmcVictims) - { - var randomVictim = randomUtil.GetArrayValue(pmcVictims); - - return GetVictimDetails(randomVictim); - } - /// /// Convert a victim object into a IUserDialogInfo object /// diff --git a/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs b/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs index 8e9c827a..2d4b0054 100644 --- a/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/ProfileFixerService.cs @@ -610,7 +610,8 @@ public class ProfileFixerService( { for (var i = 0; i < count; i++) { - if (!slots.Any(x => x.LocationIndex == i)) + // No slots have this location index + if (slots.All(x => x.LocationIndex != i)) { slots.Add(new HideoutSlot { LocationIndex = i }); } @@ -1018,7 +1019,7 @@ public class ProfileFixerService( /// Bonuses from profile /// Bonus to find /// Matching bonus - protected Bonus? GetBonusFromProfile(List? profileBonuses, Bonus bonus) + protected Bonus? GetBonusFromProfile(IEnumerable? profileBonuses, Bonus bonus) { // match by id first, used by "TextBonus" bonuses if (!bonus.Id.IsEmpty()) diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairCategoriesService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairCategoriesService.cs index 9bef33b6..812e1392 100644 --- a/Libraries/SPTarkov.Server.Core/Services/RagfairCategoriesService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/RagfairCategoriesService.cs @@ -21,7 +21,7 @@ public class RagfairCategoriesService( /// Can player see full flea yet (level 15 by default) /// KVP of item tpls + count of offers public Dictionary GetCategoriesFromOffers( - List offers, + IEnumerable offers, SearchRequestData searchRequestData, bool fleaUnlocked ) @@ -46,7 +46,7 @@ public class RagfairCategoriesService( string.IsNullOrEmpty(searchRequestData.NeededSearchId) && searchRequestData.RemoveBartering.GetValueOrDefault(false) && ( - offer.Requirements.Count > 1 + offer.Requirements.Count() > 1 || !paymentHelper.IsMoneyTpl(offer.Requirements.FirstOrDefault().TemplateId) ) ) diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs index 5c78f2a4..fc787618 100644 --- a/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/RagfairOfferService.cs @@ -327,7 +327,7 @@ public class RagfairOfferService( // Items within stack tolerance, return existing data - no changes needed if (totalItemCount <= itemMaxStackSize) { - // Edge case - Ensure items stack count isnt < 1 + // Edge case - Ensure items stack count isn't < 1 if (items[0]?.Upd?.StackObjectsCount < 1) { items[0].Upd.StackObjectsCount = 1; diff --git a/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs b/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs index 24827bc9..122fbbe1 100644 --- a/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/RagfairPriceService.cs @@ -101,22 +101,6 @@ public class RagfairPriceService( return itemPrice.Value; } - /// - /// Get the flea price for an offers items + children - /// - /// offer item + children to process - /// Rouble price - public double GetFleaPriceForOfferItems(List offerItems) - { - // Preset weapons take the direct prices.json value, otherwise they're massively inflated - if (itemHelper.IsOfBaseclass(offerItems[0].Template, BaseClasses.WEAPON)) - { - return GetFleaPriceForItem(offerItems[0].Template); - } - - return offerItems.Sum(item => GetFleaPriceForItem(item.Template)); - } - /// /// Get the dynamic (flea) price for an item /// @@ -176,23 +160,6 @@ public class RagfairPriceService( return 100 * a / (a + b); } - /// - /// Get the rouble price for an assorts barter scheme - /// - /// - /// Rouble price - public double GetBarterPrice(List barterScheme) - { - var price = 0d; - - foreach (var item in barterScheme) - { - price += GetStaticPriceForItem(item.Template).Value * item.Count.Value; - } - - return Math.Round(price); - } - /// /// Generate a currency cost for an item and its mods /// @@ -201,8 +168,8 @@ public class RagfairPriceService( /// Price is for a pack type offer /// cost of item in desired currency public double GetDynamicOfferPriceForOffer( - List offerItems, - string desiredCurrency, + IEnumerable offerItems, + MongoId desiredCurrency, bool isPackOffer ) { @@ -254,7 +221,7 @@ public class RagfairPriceService( MongoId itemTemplateId, MongoId desiredCurrency, Item? item = null, - List? offerItems = null, + IEnumerable? offerItems = null, bool? isPackOffer = null ) { @@ -453,7 +420,7 @@ public class RagfairPriceService( /// price of weapon in roubles protected double GetWeaponPresetPrice( Item weaponRootItem, - List weaponWithChildren, + IEnumerable weaponWithChildren, double existingPrice ) { diff --git a/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs b/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs index 41834952..962d4f20 100644 --- a/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs @@ -389,12 +389,8 @@ public class SeasonalEventService( foreach (var container in containersToCheck) { - // Find all Christmas items in container - var keysToRemove = container.Keys.Where(key => christmasItems.Contains(key)).ToList(); - foreach (var key in keysToRemove) - { - container.Remove(key); - } + // Find all Christmas items in container and remove + container.RemoveItems(christmasItems); } } @@ -711,7 +707,7 @@ public class SeasonalEventService( } } - protected void RemoveEntryRequirement(List locationIds) + protected void RemoveEntryRequirement(IEnumerable locationIds) { foreach (var locationId in locationIds) { diff --git a/Libraries/SPTarkov.Server.Core/Services/ServerLocalisationService.cs b/Libraries/SPTarkov.Server.Core/Services/ServerLocalisationService.cs index ad86823b..33de0afb 100644 --- a/Libraries/SPTarkov.Server.Core/Services/ServerLocalisationService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/ServerLocalisationService.cs @@ -38,10 +38,9 @@ public class ServerLocalisationService( var files = fileUtil .GetFiles(LocaleDirectory, true) - .Where(f => fileUtil.GetFileExtension(f) == "json") - .ToList(); + .Where(f => fileUtil.GetFileExtension(f) == "json"); - if (files.Count == 0) + if (!files.Any()) { throw new Exception($"Localisation files in directory {LocaleDirectory} not found."); } diff --git a/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs b/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs index f9ab4e03..4913f231 100644 --- a/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs @@ -27,7 +27,7 @@ public class TraderPurchasePersisterService( /// Session id /// Trader to loop up purchases for /// Dictionary of assort id and count purchased - public Dictionary? GetProfileTraderPurchases( + public Dictionary? GetProfileTraderPurchases( MongoId sessionId, MongoId traderId ) @@ -59,7 +59,7 @@ public class TraderPurchasePersisterService( if (!profile.TraderPurchases.TryGetValue(traderId, out _)) { - profile.TraderPurchases.TryAdd(traderId, new Dictionary()); + profile.TraderPurchases.TryAdd(traderId, new()); } var traderPurchases = profile.TraderPurchases[traderId]; @@ -94,7 +94,7 @@ public class TraderPurchasePersisterService( continue; } - profile.Value.TraderPurchases[traderId] = new Dictionary(); + profile.Value.TraderPurchases[traderId] = new(); } logger.Debug($"Reset trader: {traderId} assort buy limits"); diff --git a/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs b/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs index bdfa9852..66b17ccd 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs @@ -38,7 +38,7 @@ public class ProbabilityObjectArray : List> /// /// The relative probability values of which to calculate the normalized cumulative sum /// Cumulative Sum normalized to 1 - public List CumulativeProbability(List probValues) + public List CumulativeProbability(IEnumerable probValues) { var sum = probValues.Sum(); var probCumsum = probValues.CumulativeSum(); diff --git a/Libraries/SPTarkov.Server.Core/Utils/MathUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/MathUtil.cs index 3a0aaf17..0e036e47 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/MathUtil.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/MathUtil.cs @@ -12,9 +12,9 @@ public class MathUtil /// The list of numbers to which the summand should be added /// /// A list of elements with the additive added to all elements - public List ListAdd(List values, double additive) + public IEnumerable ListAdd(IEnumerable values, double additive) { - return values.Select(v => v + additive).ToList(); + return values.Select(v => v + additive); } /// diff --git a/SPTarkov.Server/Modding/ModDllLoader.cs b/SPTarkov.Server/Modding/ModDllLoader.cs index c493cb4b..31c9c793 100644 --- a/SPTarkov.Server/Modding/ModDllLoader.cs +++ b/SPTarkov.Server/Modding/ModDllLoader.cs @@ -102,7 +102,10 @@ public class ModDllLoader /// Path of the mod directory /// Mod metadata /// Thrown if duplicate metadata implementations are found - private static AbstractModMetadata LoadModMetadata(List assemblies, string path) + private static AbstractModMetadata LoadModMetadata( + IEnumerable assemblies, + string path + ) { AbstractModMetadata? result = null; diff --git a/SPTarkov.Server/Modding/ModValidator.cs b/SPTarkov.Server/Modding/ModValidator.cs index 83c8f0c8..3cf22b8f 100644 --- a/SPTarkov.Server/Modding/ModValidator.cs +++ b/SPTarkov.Server/Modding/ModValidator.cs @@ -27,7 +27,7 @@ public class ModValidator( protected readonly CoreConfig sptConfig = configServer.GetConfig(); - public List ValidateAndSort(List mods) + public List ValidateAndSort(IEnumerable mods) { if (ProgramStatics.MODS()) { @@ -58,9 +58,9 @@ public class ModValidator( return $"{basepath}{mod}/"; } - protected void ValidateMods(List mods) + protected void ValidateMods(IEnumerable mods) { - logger.Info(localisationService.GetText("modloader-loading_mods", mods.Count)); + logger.Info(localisationService.GetText("modloader-loading_mods", mods.Count())); // Mod order if (!fileUtil.FileExists(modOrderPath)) @@ -88,7 +88,7 @@ public class ModValidator( } // Validate and remove broken mods from mod list - var validMods = GetValidMods(mods); + var validMods = GetValidMods(mods).ToList(); // ToList now so we can .Sort later var modPackageData = validMods.ToDictionary(m => m.ModMetadata!.Name!, m => m.ModMetadata!); CheckForDuplicateMods(modPackageData); @@ -144,7 +144,7 @@ public class ModValidator( } } - // add mods + // Add mods foreach (var mod in validMods) { if (ShouldSkipMod(mod.ModMetadata)) @@ -207,9 +207,9 @@ public class ModValidator( /// /// mods to validate /// array of mod folder names - protected List GetValidMods(List mods) + protected IEnumerable GetValidMods(IEnumerable mods) { - return mods.Where(ValidMod).ToList(); + return mods.Where(ValidMod); } /// diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs index 52ef8479..832339d3 100644 --- a/SPTarkov.Server/Program.cs +++ b/SPTarkov.Server/Program.cs @@ -168,7 +168,7 @@ public static class Program return builder; } - private static List ValidateMods(List mods) + private static List ValidateMods(IEnumerable mods) { if (!ProgramStatics.MODS()) { diff --git a/UnitTests/Tests/Utils/MathUtilTests.cs b/UnitTests/Tests/Utils/MathUtilTests.cs index bb879115..b7eabb01 100644 --- a/UnitTests/Tests/Utils/MathUtilTests.cs +++ b/UnitTests/Tests/Utils/MathUtilTests.cs @@ -70,7 +70,7 @@ public class MathUtilTests var test = new List { 1f, 2f, 3f, 4f }; var expected = new List { 3f, 4f, 5f, 6f }; - var actual = _mathUtil.ListAdd(test, 2); + var actual = _mathUtil.ListAdd(test, 2).ToList(); for (var i = 0; i < actual.Count; i++) {