Files
2025-08-05 04:01:22 -04:00

89 lines
2.8 KiB
C#

using MongoIdTplGenerator.Utils;
using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
using SPTarkov.Server.Core.Models.Utils;
using SPTarkov.Server.Core.Servers;
using SPTarkov.Server.Core.Services;
using SPTarkov.Server.Core.Utils;
using Path = System.IO.Path;
namespace MongoIdTplGenerator.Generators;
[Injectable]
public class QuestTplMongoIdGenerator(
ISptLogger<QuestTplMongoIdGenerator> logger,
DatabaseServer databaseServer,
LocaleService localeService,
FileUtil fileUtil,
LocaleUtil localeUtil
) : IMongoIdGenerator
{
private string? _enumDir;
private Dictionary<MongoId, Quest>? _quests;
public Task Run()
{
// Figure out our source and target directories
var projectDir = Directory.GetParent("./").Parent.Parent.Parent.Parent.Parent;
_enumDir = Path.Combine(projectDir.FullName, "Libraries", "SPTarkov.Server.Core", "Models", "Enums");
_quests = databaseServer.GetTables().Templates.Quests;
var questTplObject = GenerateQuestTplObject();
var questTplOutPath = Path.Combine(_enumDir, "QuestTpl.cs");
WriteEnumToFile(questTplOutPath, questTplObject);
return Task.CompletedTask;
}
private Dictionary<string, string> GenerateQuestTplObject()
{
var result = new Dictionary<string, string>();
foreach (var quest in _quests)
{
var id = quest.Key;
if (QuestOverrides.NameOverridesDictionary.TryGetValue(id, out var nameOverride))
{
if (!result.TryAdd(nameOverride, id))
{
logger.Warning($"Duplicate locale name: {nameOverride} with id: {id} in quest list");
}
continue;
}
var locale = localeService.GetLocaleDb()[$"{id} name"].Replace(" ", "_").Replace("-", "_");
locale = localeUtil.SanitizeEnumKey(locale);
if (!result.TryAdd(locale, id))
{
logger.Warning($"Duplicate locale name: {locale} with id: {id} in quest list");
}
}
return result;
}
private void WriteEnumToFile(string outputPath, Dictionary<string, string> enumEntries)
{
var enumFileData =
"using SPTarkov.Server.Core.Models.Common;\n\n"
+ "// This is an auto generated file, do not modify. Re-generate by running MongoIdTplGenerator.exe";
enumFileData += $"\npublic static class QuestTpl\n{{\n";
foreach (var (enumName, data) in enumEntries)
{
enumFileData += $" public static readonly MongoId {enumName} = new MongoId(\"{data}\");\n";
}
enumFileData += "}\n";
fileUtil.WriteFile(outputPath, enumFileData);
}
}