diff --git a/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs
index 9bfc0ffe..bd7d6fbe 100644
--- a/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs
+++ b/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs
@@ -358,34 +358,42 @@ public class BotWeaponGenerator(
///
/// Checks if all required slots are occupied on a weapon and all its mods.
///
- /// Weapon + mods
+ /// Weapon + mods
/// Role of bot weapon is for
/// True if valid
- protected bool IsWeaponValid(IEnumerable- weaponItemList, string botRole)
+ protected bool IsWeaponValid(List
- weaponAndChildren, string botRole)
{
- foreach (var mod in weaponItemList)
+ // Key weapon + children by parentId + slot name, ignore items without parentId or slotId
+ var slotItemLookup = weaponAndChildren.ToLookup(item => (item.ParentId, item.SlotId));
+
+ foreach (var item in weaponAndChildren)
{
- var modTemplate = itemHelper.GetItem(mod.Template).Value;
- if (!modTemplate.Properties.Slots?.Any() ?? false)
+ var modTemplate = itemHelper.GetItem(item.Template).Value;
+ if (!modTemplate?.Properties?.Slots?.Any() ?? false)
{
continue;
}
- // Iterate over required slots in db item, check mod exists for that slot
- foreach (var modSlotTemplate in modTemplate.Properties.Slots?.Where(slot => slot.Required.GetValueOrDefault(false)) ?? [])
+ var requiredSlots = modTemplate?.Properties?.Slots?.Where(slot => slot.Required.GetValueOrDefault(false)) ?? [];
+ if (!requiredSlots.Any())
{
- var slotName = modSlotTemplate.Name;
- var hasWeaponSlotItem = weaponItemList.Any(weaponItem => weaponItem.ParentId == mod.Id && weaponItem.SlotId == slotName);
- if (!hasWeaponSlotItem)
+ // No required slots, skip to next item in weapon
+ continue;
+ }
+
+ foreach (var requiredSlot in requiredSlots.ToList())
+ {
+ // Check if slot exists in cache
+ if (!slotItemLookup[(item.Id, requiredSlot.Name)].Any())
{
logger.Warning(
serverLocalisationService.GetText(
"bot-weapons_required_slot_missing_item",
new
{
- modSlot = modSlotTemplate.Name,
+ modSlot = requiredSlot.Name,
modName = modTemplate.Name,
- slotId = mod.SlotId,
+ slotId = item.SlotId,
botRole,
}
)
@@ -394,6 +402,8 @@ public class BotWeaponGenerator(
return false;
}
}
+
+ return true;
}
return true;