using SPTarkov.DI.Annotations; using SPTarkov.Server.Core.DI; using SPTarkov.Server.Core.Models; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Utils; namespace SPTarkov.Server.Core.Services; /// /// Source of truth for all default traders as well as any additional trader a server mod may add. /// [Injectable(InjectionType.Singleton, TypePriority = OnLoadOrder.TraderRegistration)] public class TraderStore : IOnLoad { private readonly DatabaseService _databaseService; private readonly IEnumerable _injectedTraders; private readonly ISptLogger _logger; private readonly Dictionary _traders = new(); public TraderStore(DatabaseService databaseService, IEnumerable injectedTraders, ISptLogger logger) { _databaseService = databaseService; _injectedTraders = injectedTraders; _logger = logger; } public Task OnLoad() { _logger.Info("Importing traders..."); var customTraders = 0; foreach (var trader in _injectedTraders) { if (trader is ICustomTrader customTrader) { try { var dbTrader = new Trader() { Assort = customTrader.GetAssort(), Base = customTrader.GetBase(), QuestAssort = customTrader.GetQuestAssort(), Dialogue = customTrader.GetDialogues(), Suits = customTrader.GetSuits(), Services = customTrader.GetServices(), }; _databaseService.GetTraders().Add(trader.Id, dbTrader); _traders.Add(trader.Id, trader); _logger.Info($"Loaded custom trader: {trader.Name}"); customTraders++; } catch (Exception e) { _logger.Error("Failed to load custom trader", e); } } else { _traders.Add(trader.Id, trader); } } _logger.Info($"Importing traders complete {(customTraders == 0 ? "" : $"[{customTraders} traders loaded]")}"); return Task.CompletedTask; } /// /// Returns a trader by given ID. /// /// /// public ITrader? GetTraderById(string traderId) { if (_traders.TryGetValue(traderId, out var trader)) { return trader; } return null; } /// /// Returns all traders in the game, including custom traders. /// /// public IEnumerable GetAllTraders() { return _traders.Values; } }