Improved Preset generation for Fence assort

Filter weapon preset root items by fence blacklist prior to looping over them
Added an exit after 25 failed attempts to add a preset to assort to prevent infinite loop

https://github.com/sp-tarkov/server-csharp/issues/167
This commit is contained in:
Chomp
2025-05-10 20:56:31 +01:00
parent d7c7aa33d0
commit 6a683cd2c9
@@ -1045,20 +1045,18 @@ public class FenceService(
int loyaltyLevel
)
{
var failedAttemptsCount = 0;
var weaponPresetsAddedCount = 0;
if (desiredWeaponPresetsCount > 0)
{
var weaponPresetRootItems = baseFenceAssort.Items.Where(item =>
item.Upd?.SptPresetId != null && itemHelper.IsOfBaseclass(item.Template, BaseClasses.WEAPON)
item.Upd?.SptPresetId is not null
&& itemHelper.IsOfBaseclass(item.Template, BaseClasses.WEAPON)
&& !traderConfig.Fence.Blacklist.Contains(item.Template)
);
while (weaponPresetsAddedCount < desiredWeaponPresetsCount)
{
var randomPresetRoot = randomUtil.GetArrayValue(weaponPresetRootItems);
if (traderConfig.Fence.Blacklist.Contains(randomPresetRoot.Template))
{
continue;
}
var rootItemDb = itemHelper.GetItem(randomPresetRoot.Template).Value;
var presetWithChildrenClone = _cloner.Clone(
@@ -1067,17 +1065,26 @@ public class FenceService(
RandomiseItemUpdProperties(rootItemDb, presetWithChildrenClone[0]);
// Simulate players listing weapons with parts removed
RemoveRandomModsOfItem(presetWithChildrenClone);
// Check chosen item is below price cap
var itemPrice = handbookHelper.GetTemplatePriceForItems(presetWithChildrenClone) *
// Check chosen preset is below listing cap in config
var presetPrice = handbookHelper.GetTemplatePriceForItems(presetWithChildrenClone) *
itemHelper.GetItemQualityModifierForItems(presetWithChildrenClone);
if (traderConfig.Fence.ItemCategoryRoublePriceLimit.TryGetValue(rootItemDb.Parent, out var priceLimitRouble))
{
if (itemPrice > priceLimitRouble)
if (presetPrice > priceLimitRouble)
// Too expensive, try again
{
failedAttemptsCount++;
if (failedAttemptsCount > 25)
{
logger.Warning($"Unable to add: {desiredWeaponPresetsCount} presets to Fence as all presets found after 25 attempts were too expensive.");
break;
}
continue;
}
}
@@ -1085,7 +1092,7 @@ public class FenceService(
itemHelper.ReparentItemAndChildren(presetWithChildrenClone[0], presetWithChildrenClone);
itemHelper.RemapRootItemId(presetWithChildrenClone);
// Remapping IDs causes parentid to be altered
// Remapping IDs causes parentId to be altered, fix
presetWithChildrenClone[0].ParentId = "hideout";
assorts.SptItems.Add(presetWithChildrenClone);
@@ -1098,7 +1105,7 @@ public class FenceService(
new BarterScheme
{
Template = Money.ROUBLES,
Count = Math.Round(itemPrice)
Count = Math.Round(presetPrice)
}
]
];