Added custom achievement system, adds achievements on server start

This commit is contained in:
Chomp
2025-03-28 17:06:43 +00:00
parent 21af001dd4
commit 0938f47a64
4 changed files with 1182 additions and 0 deletions
@@ -102,6 +102,16 @@ public record Templates
set;
}
/// <summary>
/// Achievements
/// </summary>
[JsonPropertyName("customAchievements")]
public List<Achievement>? CustomAchievements
{
get;
set;
}
/// <summary>
/// Location services data
/// </summary>
@@ -191,6 +191,22 @@ public class DatabaseService(
return _databaseServer.GetTables().Templates?.Achievements!;
}
/// <returns> assets/database/templates/customAchievements.json </returns>
public List<Achievement> GetCustomAchievements()
{
if (_databaseServer.GetTables().Templates?.Achievements == null)
{
throw new Exception(
_localisationService.GetText(
"database-data_at_path_missing",
"assets/database/templates/customAchievements.json"
)
);
}
return _databaseServer.GetTables().Templates?.CustomAchievements!;
}
/// <returns> assets/database/templates/customisation.json </returns>
public Dictionary<string, CustomizationItem?> GetCustomization()
{
@@ -6,6 +6,7 @@ using SPTarkov.Server.Core.Servers;
using SPTarkov.Server.Core.Utils;
using SPTarkov.Server.Core.Utils.Cloners;
using SPTarkov.Common.Annotations;
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
namespace SPTarkov.Server.Core.Services;
@@ -50,6 +51,8 @@ public class PostDbLoadService(
AddCustomLooseLootPositions();
MergeCustomAchievements();
AdjustMinReserveRaiderSpawnChance();
if (_coreConfig.Fixes.FixShotgunDispersion)
@@ -123,6 +126,23 @@ public class PostDbLoadService(
_raidWeatherService.GenerateWeather(currentSeason);
}
/// <summary>
/// Merge custom achievements into achievement db table
/// </summary>
protected void MergeCustomAchievements()
{
var achievements = _databaseService.GetAchievements();
foreach (var customAchievement in _databaseService.GetCustomAchievements()) {
if (achievements.Exists((a) => a.Id == customAchievement.Id))
{
_logger.Warning($"Unable to add custom achievement as id: ${customAchievement.Id} already exists");
continue;
}
achievements.Add(customAchievement);
}
}
private void RemoveNewBeginningRequirementFromPrestige()
{
var prestigeDb = _databaseService.GetTemplates().Prestige;