From 87e1306f3363f29fd87d974b904617090a0e020d Mon Sep 17 00:00:00 2001 From: Chomp Date: Thu, 13 Feb 2025 13:09:27 +0000 Subject: [PATCH] Improved `GetAchievementStatics` --- .../Core/Controllers/AchievementController.cs | 48 ++++++++++++++----- .../Core/Models/Spt/Config/CoreConfig.cs | 10 ++++ Libraries/SptAssets/Assets/configs/core.json | 3 +- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/Libraries/Core/Controllers/AchievementController.cs b/Libraries/Core/Controllers/AchievementController.cs index 3f33c7e3..9a10c551 100644 --- a/Libraries/Core/Controllers/AchievementController.cs +++ b/Libraries/Core/Controllers/AchievementController.cs @@ -1,4 +1,7 @@ +using Core.Helpers; using Core.Models.Eft.Profile; +using Core.Models.Spt.Config; +using Core.Servers; using Core.Services; using SptCommon.Annotations; @@ -6,33 +9,52 @@ namespace Core.Controllers; [Injectable] public class AchievementController( - DatabaseService _databaseService + ProfileHelper profileHelper, + DatabaseService databaseService, + ConfigServer configServer ) { + protected CoreConfig coreConfig = configServer.GetConfig(); + public virtual GetAchievementsResponse GetAchievements(string sessionID) { return new GetAchievementsResponse { - Elements = _databaseService.GetAchievements() + Elements = databaseService.GetAchievements() }; } - public virtual CompletedAchievementsResponse GetAchievementStatics(string sessionID) + public virtual CompletedAchievementsResponse GetAchievementStatics(string sessionId) { - var achievements = _databaseService.GetAchievements(); var stats = new Dictionary(); + var profiles = profileHelper.GetProfiles(); - foreach (var achievement in achievements) - { - if (achievement.Id != null) - { - stats.Add(achievement.Id, 0); + var achievements = databaseService.GetAchievements(); + foreach (var achievement in achievements) { + var percentage = 0; + foreach (var (profileId, profile) in profiles) { + if (coreConfig.Features.AchievementProfileIdBlacklist.Contains(profileId)) + { + continue; + } + + if (profile.CharacterData?.PmcData?.Achievements is null) + { + continue; + } + + if (!profile.CharacterData.PmcData.Achievements.ContainsKey(achievement.Id)) + { + continue; + } + + percentage++; } + + percentage = (percentage / profiles.Count) * 100; + stats.Add(achievement.Id, percentage); } - return new CompletedAchievementsResponse - { - Elements = stats - }; + return new CompletedAchievementsResponse{ Elements = stats }; } } diff --git a/Libraries/Core/Models/Spt/Config/CoreConfig.cs b/Libraries/Core/Models/Spt/Config/CoreConfig.cs index ce1f59fe..c9bdd78d 100644 --- a/Libraries/Core/Models/Spt/Config/CoreConfig.cs +++ b/Libraries/Core/Models/Spt/Config/CoreConfig.cs @@ -340,6 +340,16 @@ public record ServerFeatures get; set; } + + /** + * Profile ids to ignore when calculating achievement stats + */ + [JsonPropertyName("achievementProfileIdBlacklist")] + public HashSet? AchievementProfileIdBlacklist + { + get; + set; + } } public record ChatbotFeatures diff --git a/Libraries/SptAssets/Assets/configs/core.json b/Libraries/SptAssets/Assets/configs/core.json index dbbf6d7a..bb2290fa 100644 --- a/Libraries/SptAssets/Assets/configs/core.json +++ b/Libraries/SptAssets/Assets/configs/core.json @@ -197,7 +197,8 @@ "6723fd51c5924c57ce0ca01f": true } }, - "createNewProfileTypesBlacklist": [] + "createNewProfileTypesBlacklist": [], + "achievementProfileIdBlacklist": [] }, "customWatermarkLocaleKeys": [] }