Files
SPT-Server-Build/Libraries/SPTarkov.Server.Core/Migration/Migrations/4.0/TheVoices.cs
T
2025-07-31 15:23:32 +02:00

85 lines
2.6 KiB
C#

using System.Text.Json.Nodes;
using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.Services;
namespace SPTarkov.Server.Core.Migration.Migrations;
/// <summary>
/// In 16.8.0.37972 BSG added customization for voices, technically this only affects BE profiles, but this should fix these.
/// </summary>
[Injectable]
public class TheVoices(DatabaseService databaseService) : AbstractProfileMigration
{
private bool _pmcVoiceIsMissing = false;
private bool _scavVoiceIsMissing = false;
public override string FromVersion
{
get { return "~4.0"; }
}
public override string ToVersion
{
get { return "~4.0"; }
}
public override string MigrationName
{
get { return "TheVoices400"; }
}
public override IEnumerable<Type> PrerequisiteMigrations
{
// Requires ThreeTenToThreeEleven on legacy profiles, due to that adding the customization object for the first time
get { return [typeof(ThreeTenToThreeEleven)]; }
}
public override bool CanMigrate(JsonObject profile, IEnumerable<IProfileMigration> previouslyRanMigrations)
{
_pmcVoiceIsMissing = profile["characters"]?["pmc"]?["Customization"]?["Voice"] == null;
_scavVoiceIsMissing = profile["characters"]?["scav"]?["Customization"]?["Voice"] == null;
return _pmcVoiceIsMissing || _scavVoiceIsMissing;
}
public override JsonObject? Migrate(JsonObject profile)
{
if (_pmcVoiceIsMissing)
{
HandlePmcVoice(profile);
}
if (_scavVoiceIsMissing)
{
HandleScavVoice(profile);
}
return base.Migrate(profile);
}
private void HandlePmcVoice(JsonObject profileObject)
{
var pmcInfo = profileObject["characters"]!["pmc"]!["Info"] as JsonObject;
var oldVoice = pmcInfo["Voice"]?.ToString() ?? "";
pmcInfo.Remove("Voice");
var voiceMongoId = databaseService.GetCustomization().FirstOrDefault(x => x.Value.Properties.Name == oldVoice).Key;
profileObject["characters"]!["pmc"]!["Customization"]!["Voice"] = voiceMongoId.ToString();
}
private void HandleScavVoice(JsonObject profileObject)
{
var pmcInfo = profileObject["characters"]!["scav"]!["Info"] as JsonObject;
var oldVoice = pmcInfo["Voice"]?.ToString() ?? "";
pmcInfo.Remove("Voice");
var voiceMongoId = databaseService.GetCustomization().FirstOrDefault(x => x.Value.Properties.Name == oldVoice).Key;
profileObject["characters"]!["scav"]!["Customization"]!["Voice"] = voiceMongoId.ToString();
}
}