diff --git a/project/assets/configs/trader.json b/project/assets/configs/trader.json index 8a089cbb..89162b4b 100644 --- a/project/assets/configs/trader.json +++ b/project/assets/configs/trader.json @@ -109,21 +109,33 @@ "5c99f98d86f7745c314214b3": 2, "5c164d2286f774194c5e69fa": 0 }, - "presetMaxDurabilityPercentMinMax": { - "min": 39, - "max": 60 + "weaponDurabilityPercentMinMax": { + "current": { + "min": 1, + "max": 90 + }, + "max": { + "min": 89, + "max": 100 + } }, "chancePlateExistsInArmorPercent": 50, "armorMaxDurabilityPercentMinMax": { - "min": 35, - "max": 75 + "current": { + "min": 1, + "max": 100 + }, + "max": { + "min": 80, + "max": 100 + } }, "itemStackSizeOverrideMinMax": { "59e690b686f7746c9f75e848": { "min": 5, "max": 15 }, - "5485a8684bdc2da71d8b4567": { + "5485a8684bdc2da71d8b4567": { "min": 80, "max": 7000 } @@ -217,8 +229,8 @@ "5448e54d4bdc2dcc718b4568", "5a341c4086f77401f2541505", "5422acb9af1c889c16000029", - "5448e5284bdc2dcb718b4567", - "64d0b40fbe2eed70e254e2d4" + "64d0b40fbe2eed70e254e2d4", + "5fc22d7c187fea44d52eda44" ], "coopExtractGift": { "sendGift": true, diff --git a/project/src/generators/FenceBaseAssortGenerator.ts b/project/src/generators/FenceBaseAssortGenerator.ts index d0d612c6..3972229f 100644 --- a/project/src/generators/FenceBaseAssortGenerator.ts +++ b/project/src/generators/FenceBaseAssortGenerator.ts @@ -74,6 +74,12 @@ export class FenceBaseAssortGenerator } } + // Only allow rigs with no slots (carrier rigs) + if (this.itemHelper.isOfBaseclass(rootItemDb._id, BaseClasses.VEST) && rootItemDb._props.Slots.length > 0) + { + continue; + } + // Skip seasonal event items when not in seasonal event if (this.traderConfig.fence.blacklistSeasonalItems && blockedSeasonalItems.includes(rootItemDb._id)) { diff --git a/project/src/models/spt/config/ITraderConfig.ts b/project/src/models/spt/config/ITraderConfig.ts index fc5714e1..71988b85 100644 --- a/project/src/models/spt/config/ITraderConfig.ts +++ b/project/src/models/spt/config/ITraderConfig.ts @@ -30,8 +30,8 @@ export interface FenceConfig equipmentPresetMinMax: MinMax; itemPriceMult: number; presetPriceMult: number; - armorMaxDurabilityPercentMinMax: MinMax; - presetMaxDurabilityPercentMinMax: MinMax; + armorMaxDurabilityPercentMinMax: IItemDurabilityCurrentMax; + weaponDurabilityPercentMinMax: IItemDurabilityCurrentMax; chancePlateExistsInArmorPercent: number; /** Key: item tpl */ itemStackSizeOverrideMinMax: Record; @@ -48,6 +48,12 @@ export interface FenceConfig btrDeliveryExpireHours: number; } +export interface IItemDurabilityCurrentMax +{ + current: MinMax; + max: MinMax; +} + export interface CoopExtractReward extends LootRequest { sendGift: boolean; diff --git a/project/src/services/FenceService.ts b/project/src/services/FenceService.ts index f54ae6ee..808a7f70 100644 --- a/project/src/services/FenceService.ts +++ b/project/src/services/FenceService.ts @@ -12,7 +12,7 @@ import { ITraderAssort } from "@spt-aki/models/eft/common/tables/ITrader"; import { BaseClasses } from "@spt-aki/models/enums/BaseClasses"; import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; import { Traders } from "@spt-aki/models/enums/Traders"; -import { ITraderConfig } from "@spt-aki/models/spt/config/ITraderConfig"; +import { IItemDurabilityCurrentMax, ITraderConfig } from "@spt-aki/models/spt/config/ITraderConfig"; import { IFenceAssortGenerationValues, IGenerationAssortValues, @@ -998,14 +998,19 @@ export class FenceService // Randomise Weapon durability if (this.itemHelper.isOfBaseclass(itemDetails._id, BaseClasses.WEAPON)) { - const presetMaxDurabilityLimits = this.traderConfig.fence.presetMaxDurabilityPercentMinMax; - const duraMin = presetMaxDurabilityLimits.min / 100 * itemDetails._props.MaxDurability; - const duraMax = presetMaxDurabilityLimits.max / 100 * itemDetails._props.MaxDurability; + const weaponDurabilityLimits = this.traderConfig.fence.weaponDurabilityPercentMinMax; + const maxDuraMin = weaponDurabilityLimits.max.min / 100 * itemDetails._props.MaxDurability; + const maxDuraMax = weaponDurabilityLimits.max.max / 100 * itemDetails._props.MaxDurability; + const chosenMaxDurability = this.randomUtil.getInt(maxDuraMin, maxDuraMax); - const maxDurability = this.randomUtil.getInt(duraMin, duraMax); - const durability = this.randomUtil.getInt(1, maxDurability); + const currentDuraMin = weaponDurabilityLimits.current.min / 100 * itemDetails._props.MaxDurability; + const currentDuraMax = weaponDurabilityLimits.current.max / 100 * itemDetails._props.MaxDurability; + const currentDurability = Math.min( + this.randomUtil.getInt(currentDuraMin, currentDuraMax), + chosenMaxDurability, + ); - itemToAdjust.upd.Repairable = { Durability: durability, MaxDurability: maxDurability }; + itemToAdjust.upd.Repairable = { Durability: currentDurability, MaxDurability: chosenMaxDurability }; return; } @@ -1043,21 +1048,26 @@ export class FenceService /** * Generate a randomised current and max durabiltiy value for an armor item * @param itemDetails Item to create values for - * @param maxDurabilityMinMaxPercent Max durabiltiy percent min/max values + * @param equipmentDurabilityLimits Max durabiltiy percent min/max values * @returns Durability + MaxDurability values */ protected getRandomisedArmorDurabilityValues( itemDetails: ITemplateItem, - maxDurabilityMinMaxPercent: MinMax, + equipmentDurabilityLimits: IItemDurabilityCurrentMax, ): Repairable { - const duraMin = maxDurabilityMinMaxPercent.min / 100 * itemDetails._props.MaxDurability; - const duraMax = maxDurabilityMinMaxPercent.max / 100 * itemDetails._props.MaxDurability; + const maxDuraMin = equipmentDurabilityLimits.max.min / 100 * itemDetails._props.MaxDurability; + const maxDuraMax = equipmentDurabilityLimits.max.max / 100 * itemDetails._props.MaxDurability; + const chosenMaxDurability = this.randomUtil.getInt(maxDuraMin, maxDuraMax); - const maxDurability = this.randomUtil.getInt(duraMin, duraMax); - const durability = this.randomUtil.getInt(1, maxDurability); + const currentDuraMin = equipmentDurabilityLimits.current.min / 100 * itemDetails._props.MaxDurability; + const currentDuraMax = equipmentDurabilityLimits.current.max / 100 * itemDetails._props.MaxDurability; + const chosenCurrentDurability = Math.min( + this.randomUtil.getInt(currentDuraMin, currentDuraMax), + chosenMaxDurability, + ); - return { Durability: durability, MaxDurability: maxDurability }; + return { Durability: chosenCurrentDurability, MaxDurability: chosenMaxDurability }; } /**