using SPTarkov.DI.Annotations; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Spt.Config; using SPTarkov.Server.Core.Models.Utils; using SPTarkov.Server.Core.Servers; using SPTarkov.Server.Core.Utils; namespace SPTarkov.Server.Core.Helpers; [Injectable] public class DurabilityLimitsHelper( ISptLogger logger, RandomUtil randomUtil, BotHelper botHelper, ConfigServer configServer ) { private readonly BotConfig _botConfig = configServer.GetConfig(); /// /// Get max durability for a weapon based on bot role /// /// UNUSED - Item to get durability for /// Role of bot to get max durability for /// Max durability of weapon public double GetRandomizedMaxWeaponDurability(TemplateItem itemTemplate, string? botRole = null) { var durabilityRole = GetDurabilityRole(botRole); return GenerateMaxWeaponDurability(durabilityRole); } /// /// Get max durability value for armor based on bot role /// /// Item to get max durability for /// Role of bot to get max durability for /// max durability public double GetRandomizedMaxArmorDurability(TemplateItem? itemTemplate, string? botRole = null) { var itemMaxDurability = itemTemplate.Properties.MaxDurability.Value; if (botRole is null) { return itemMaxDurability; } if (botHelper.IsBotPmc(botRole)) { return GenerateMaxPmcArmorDurability(itemMaxDurability); } // Everyone else (Boss/follower etc) return itemMaxDurability; } /// /// Get randomised current weapon durability by bot role /// /// Unused - Item to get current durability of /// Role of bot to get current durability for /// Max durability of weapon /// Current weapon durability public double GetRandomizedWeaponDurability(TemplateItem itemTemplate, string? botRole, double maxDurability) { var durabilityRole = GetDurabilityRole(botRole); return GenerateWeaponDurability(durabilityRole, maxDurability); } /// /// Convert a bots role into a durability role used for looking up durability values with /// /// Role to convert /// protected string GetDurabilityRole(string? botRole) { if (botRole is null) { return "default"; } if (botHelper.IsBotPmc(botRole)) { return "pmc"; } if (botHelper.IsBotBoss(botRole)) { return "boss"; } if (botHelper.IsBotFollower(botRole)) { return "follower"; } if (botHelper.IsBotZombie(botRole)) { return "zombie"; } var roleExistsInConfig = _botConfig.Durability.BotDurabilities.ContainsKey(botRole); if (roleExistsInConfig) { return botRole; } logger.Debug($"{botRole} doesn't exist in bot config durability values, using default fallback"); return "default"; } /// /// Get randomised current armor durability by bot role /// /// Unused - Item to get current durability of /// Role of bot to get current durability for /// Max durability of armor /// Current armor durability public double GetRandomizedArmorDurability(TemplateItem? itemTemplate, string? botRole, double maxDurability) { var durabilityRole = GetDurabilityRole(botRole); return GenerateArmorDurability(durabilityRole, maxDurability); } protected double GenerateMaxWeaponDurability(string? botRole = null) { var lowestMax = GetLowestMaxWeaponFromConfig(botRole); var highestMax = GetHighestMaxWeaponDurabilityFromConfig(botRole); return randomUtil.GetInt(lowestMax, highestMax); } protected double GenerateMaxPmcArmorDurability(double itemMaxDurability) { var lowestMaxPercent = _botConfig.Durability.Pmc.Armor.LowestMaxPercent; var highestMaxPercent = _botConfig.Durability.Pmc.Armor.HighestMaxPercent; var multiplier = randomUtil.GetDouble(lowestMaxPercent, highestMaxPercent); return itemMaxDurability * (multiplier / 100); } protected int GetLowestMaxWeaponFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Weapon.LowestMax; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Weapon.LowestMax; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var durability); return durability.Weapon.LowestMax; } protected int GetHighestMaxWeaponDurabilityFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Weapon.HighestMax; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Weapon.HighestMax; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var durability); return durability.Weapon.HighestMax; } protected double GenerateWeaponDurability(string? botRole, double maxDurability) { var minDelta = GetMinWeaponDeltaFromConfig(botRole); var maxDelta = GetMaxWeaponDeltaFromConfig(botRole); var delta = randomUtil.GetInt(minDelta, maxDelta); var result = maxDurability - delta; var durabilityValueMinLimit = Math.Round(GetMinWeaponLimitPercentFromConfig(botRole) / 100 * maxDurability); // Don't let weapon durability go below the percent defined in config return result >= durabilityValueMinLimit ? result : durabilityValueMinLimit; } protected double GenerateArmorDurability(string? botRole, double maxDurability) { var minDelta = GetMinArmorDeltaFromConfig(botRole); var maxDelta = GetMaxArmorDeltaFromConfig(botRole); var delta = randomUtil.GetInt(minDelta, maxDelta); var result = maxDurability - delta; var durabilityValueMinLimit = Math.Round(GetMinArmorLimitPercentFromConfig(botRole) / 100 * maxDurability); // Don't let armor durability go below the percent defined in config return result >= durabilityValueMinLimit ? result : durabilityValueMinLimit; } protected int GetMinWeaponDeltaFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Weapon.MinDelta; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Weapon.MinDelta; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var durability); return durability.Weapon.MinDelta; } protected int GetMaxWeaponDeltaFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Weapon.MaxDelta; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Weapon.MaxDelta; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var value); return value.Weapon.MaxDelta; } protected int GetMinArmorDeltaFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Armor.MinDelta; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Armor.MinDelta; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var value); return value.Armor.MinDelta; } protected int GetMaxArmorDeltaFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Armor.MaxDelta; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Armor.MaxDelta; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var value); return value.Armor.MaxDelta; } protected double GetMinArmorLimitPercentFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Armor.MinLimitPercent; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Armor.MinLimitPercent; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var value); return value.Armor.MinLimitPercent; } protected double GetMinWeaponLimitPercentFromConfig(string? botRole = null) { if (botRole is null or "default") { return _botConfig.Durability.Default.Weapon.MinLimitPercent; } if (botRole == "pmc") { return _botConfig.Durability.Pmc.Weapon.MinLimitPercent; } _botConfig.Durability.BotDurabilities.TryGetValue(botRole, out var value); return value.Weapon.MinLimitPercent; } }