From 57dde6138480e4e2a40f79ca4a9dd866ed55f927 Mon Sep 17 00:00:00 2001 From: Chomp Date: Wed, 6 Aug 2025 12:28:56 +0100 Subject: [PATCH] Various code quality improvements --- .../Helpers/ItemHelper.cs | 35 +----------- .../Helpers/RepeatableQuestHelper.cs | 55 +++++++++---------- .../Helpers/RewardHelper.cs | 15 +++-- .../Eft/ItemEvent/ItemEventRouterBase.cs | 2 +- 4 files changed, 36 insertions(+), 71 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs index 54050717..d8db12d9 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs @@ -1730,7 +1730,7 @@ public class ItemHelper( var oldRootId = itemWithChildren[0].Id; Dictionary idMappings = []; - idMappings[oldRootId.ToString()] = rootItem.Id; + idMappings[oldRootId] = rootItem.Id; foreach (var mod in itemWithChildren) { @@ -1805,44 +1805,13 @@ public class ItemHelper( public int GetRandomisedAmmoStackSize(TemplateItem ammoItemTemplate, int maxLimit = 60) { return ammoItemTemplate.Properties?.StackMaxSize == 1 - ? 1 + ? 1 // Max is one, nothing to randomise : randomUtil.GetInt( ammoItemTemplate.Properties?.StackMinRandom ?? 1, Math.Min(ammoItemTemplate.Properties?.StackMaxRandom ?? 1, maxLimit) ); } - public MongoId? GetItemBaseType(MongoId tpl, bool rootOnly = true) - { - var result = GetItem(tpl); - if (!result.Key) - // Not an item - { - return null; - } - - var currentItem = result.Value; - while (currentItem is not null) - { - if (currentItem.Type == "Node" && !rootOnly) - // Hit first base type - { - return currentItem.Id; - } - - if (currentItem.Parent.IsEmpty()) - // No parent, reached root - { - return currentItem.Id; - } - - // Get parent item and start loop again - currentItem = GetItem(tpl).Value; - } - - return null; - } - /// /// Get a 2D grid of a container's item slots /// diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RepeatableQuestHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RepeatableQuestHelper.cs index 8bbd2fee..155c3cac 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/RepeatableQuestHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/RepeatableQuestHelper.cs @@ -32,24 +32,6 @@ public class RepeatableQuestHelper( return repeatableConfig.QuestConfig.Elimination.FirstOrDefault(x => pmcLevel >= x.LevelRange.Min && pmcLevel <= x.LevelRange.Max); } - /// - /// Returns the repeatable template ids for the provided side - /// - /// Side to get the templates for - /// - /// - public Dictionary GetRepeatableQuestTemplatesByGroup(PlayerGroup playerGroup) - { - var templates = QuestConfig.RepeatableQuestTemplates; - - return playerGroup switch - { - PlayerGroup.Pmc => templates.Pmc, - PlayerGroup.Scav => templates.Scav, - _ => throw new ArgumentOutOfRangeException(nameof(playerGroup), playerGroup, null), - }; - } - /// /// Gets a cloned repeatable quest template for the provided type with a unique id /// @@ -59,12 +41,13 @@ public class RepeatableQuestHelper( /// public RepeatableQuest? GetClonedQuestTemplateForType(RepeatableQuestType type, MongoId traderId) { + var repeatableQuestTemplates = databaseService.GetTemplates().RepeatableQuests.Templates; var quest = type switch { - RepeatableQuestType.Elimination => cloner.Clone(databaseService.GetTemplates().RepeatableQuests?.Templates?.Elimination), - RepeatableQuestType.Completion => cloner.Clone(databaseService.GetTemplates().RepeatableQuests?.Templates?.Completion), - RepeatableQuestType.Exploration => cloner.Clone(databaseService.GetTemplates().RepeatableQuests?.Templates?.Exploration), - RepeatableQuestType.Pickup => cloner.Clone(databaseService.GetTemplates().RepeatableQuests?.Templates?.Pickup), + RepeatableQuestType.Elimination => cloner.Clone(repeatableQuestTemplates?.Elimination), + RepeatableQuestType.Completion => cloner.Clone(repeatableQuestTemplates?.Completion), + RepeatableQuestType.Exploration => cloner.Clone(repeatableQuestTemplates?.Exploration), + RepeatableQuestType.Pickup => cloner.Clone(repeatableQuestTemplates?.Pickup), _ => null, }; @@ -100,28 +83,24 @@ public class RepeatableQuestHelper( ) { var questData = GetClonedQuestTemplateForType(type, traderId); - if (questData is null) { logger.Error(serverLocalisationService.GetText("repeatable-quest_helper_template_not_found", type)); return null; } - // Get template id from config based on side and type of quest - var typeIds = GetRepeatableQuestTemplatesByGroup(playerGroup); - var templateName = Enum.GetName(type); - if (templateName is null) { logger.Error(serverLocalisationService.GetText("repeatable-quest_helper_template_name_not_found", type)); return null; } - questData.TemplateId = typeIds[templateName]; + // Get template id from config based on side and type of quest + var typeIds = GetRepeatableQuestTemplatesByGroup(playerGroup); + questData.TemplateId = typeIds.GetValueOrDefault(templateName); // Force REF templates to use prapors ID - solves missing text issue - // TODO: Get rid of this new mongoid generation, needs handled in `Traders` but can't be done right now. var desiredTraderId = traderId == Traders.REF ? Traders.PRAPOR : traderId; // In locale, these id correspond to the text of quests @@ -175,6 +154,24 @@ public class RepeatableQuestHelper( return questData; } + /// + /// Returns the repeatable template ids for the provided side + /// + /// Side to get the templates for + /// + /// + protected Dictionary GetRepeatableQuestTemplatesByGroup(PlayerGroup playerGroup) + { + var templates = QuestConfig.RepeatableQuestTemplates; + + return playerGroup switch + { + PlayerGroup.Pmc => templates.Pmc, + PlayerGroup.Scav => templates.Scav, + _ => throw new ArgumentOutOfRangeException(nameof(playerGroup), playerGroup, null), + }; + } + /// /// Convert a raw location string into a location code can read (e.g. factory4_day into 55f2d3fd4bdc2d5f408b4567) /// diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs index afd7d427..d2535099 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs @@ -33,7 +33,7 @@ public class RewardHelper( /// Apply the given rewards to the passed in profile. /// /// List of rewards to apply. - /// The source of the rewards (Achievement, quest). + /// The source of the rewards (Achievement, quest). /// The full profile to apply the rewards to. /// The profile data (could be the scav profile). /// The quest or achievement ID, used for finding production unlocks. @@ -41,7 +41,7 @@ public class RewardHelper( /// List of items that is the reward. public List ApplyRewards( IEnumerable rewards, - string source, + string rewardSource, SptProfile fullProfile, PmcData profileData, MongoId rewardSourceId, @@ -118,7 +118,7 @@ public class RewardHelper( profileHelper.ReplaceProfilePocketTpl(pmcProfile, reward.Target); break; case RewardType.CustomizationDirect: - profileHelper.AddHideoutCustomisationUnlock(fullProfile, reward, source); + profileHelper.AddHideoutCustomisationUnlock(fullProfile, reward, rewardSource); notificationSendHelper.SendMessage( sessionId.Value, new WsNotificationEvent @@ -208,11 +208,10 @@ public class RewardHelper( // Add above match to pmc profile + client response var matchingCraftId = matchingProductions[0].Id; pmcData.UnlockedInfo.UnlockedProductionRecipe.Add(matchingCraftId); - if (response is not null) - { - response.ProfileChanges[sessionID].RecipeUnlocked ??= new Dictionary(); - response.ProfileChanges[sessionID].RecipeUnlocked[matchingCraftId] = true; - } + + // Update Inform client of change + response.ProfileChanges[sessionID].RecipeUnlocked ??= new(); + response.ProfileChanges[sessionID].RecipeUnlocked[matchingCraftId] = true; } /// diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/ItemEvent/ItemEventRouterBase.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/ItemEvent/ItemEventRouterBase.cs index 22f87b0b..e9419679 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/ItemEvent/ItemEventRouterBase.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/ItemEvent/ItemEventRouterBase.cs @@ -91,7 +91,7 @@ public record ProfileChange [JsonIgnore(Condition = JsonIgnoreCondition.Never)] [JsonPropertyName("recipeUnlocked")] - public Dictionary? RecipeUnlocked { get; set; } + public Dictionary? RecipeUnlocked { get; set; } [JsonPropertyName("changedHideoutStashes")] public Dictionary? ChangedHideoutStashes { get; set; }