0
0
mirror of https://github.com/sp-tarkov/server.git synced 2025-02-13 09:50:43 -05:00

Improve handling of adding items to a bot container when the items type is incompatible with container

This commit is contained in:
Dev 2023-12-08 16:27:34 +00:00
parent 8a78e074a4
commit 18dc76ec2c
4 changed files with 50 additions and 23 deletions

View File

@ -352,13 +352,14 @@ export class BotLootGenerator
itemsToAdd,
inventoryToAddItemsTo,
);
// Handle when item cannot be added
if (itemAddedResult !== ItemAddedResult.SUCCESS)
{
if (itemAddedResult === ItemAddedResult.NO_CONTAINERS)
{
// Bot has no container to put item in, exit
this.logger.debug(`Unable to add ${totalItemCount} items to bot as it lacks a container to include them`);
this.logger.debug(`Unable to add: ${totalItemCount} items to bot as it lacks a container to include them`);
break;
}
@ -371,10 +372,13 @@ export class BotLootGenerator
break;
}
// Reset loop, try again
continue;
}
else
{
// Reset counter
// Item added okay, reset counter for next item
fitItemIntoContainerAttempts = 0;
}

View File

@ -138,7 +138,7 @@ export class BotWeaponGeneratorHelper
if (result === ItemAddedResult.NO_SPACE || result === ItemAddedResult.NO_CONTAINERS)
{
// If there's no space for 1 stack, there's no space for the others
// If there's no space for 1 stack or no containers to hold item, there's no space for the others
break;
}
}
@ -183,7 +183,7 @@ export class BotWeaponGeneratorHelper
missingContainerCount++;
if (missingContainerCount === equipmentSlots.length)
{
// Bot doesnt have any containers
// Bot doesnt have any containers we want to add item to
this.logger.debug(
`Unable to add item: ${
itemWithChildren[0]._tpl
@ -193,6 +193,7 @@ export class BotWeaponGeneratorHelper
return ItemAddedResult.NO_CONTAINERS
}
// No container of desired type found, skip to next container type
continue;
}
@ -200,8 +201,9 @@ export class BotWeaponGeneratorHelper
const containerTemplate = this.itemHelper.getItem(container._tpl);
if (!containerTemplate[0])
{
this.logger.error(this.localisationService.getText("bot-missing_container_with_tpl", container._tpl));
this.logger.warning(this.localisationService.getText("bot-missing_container_with_tpl", container._tpl));
// Bad item, skip
continue;
}
@ -225,10 +227,17 @@ export class BotWeaponGeneratorHelper
continue;
}
// Can't put item type in grid, skip
// Can't put item type in grid, skip all grids as we're assuming they have the same rules
if (!this.itemAllowedInContainer(slotGrid, parentTpl))
{
continue;
// Only one possible slot and item is incompatible, exit function and inform caller
if (equipmentSlots.length === 1)
{
return ItemAddedResult.INCOMPATIBLE_ITEM;
}
// Multiple containers, maybe next one allows item, only break out of loop for this containers grids
break;
}
// Get all root items in backpack
@ -236,7 +245,7 @@ export class BotWeaponGeneratorHelper
i.parentId === container._id && i.slotId === slotGrid._name
);
// Get a copy of base level items we can iterate over
// Get root items in container we can iterate over to find out what space is free
const containerItemsToCheck = existingContainerItems.filter((x) => x.slotId === slotGrid._name);
for (const item of containerItemsToCheck)
{
@ -286,7 +295,7 @@ export class BotWeaponGeneratorHelper
}
currentGridCount++;
// Start loop again in next grid of container
// No space in this grid, move to next container grid and try again
}
}
@ -294,34 +303,42 @@ export class BotWeaponGeneratorHelper
}
/**
* is the provided item allowed inside a container
* @param slot location item wants to be placed in
* @param itemTpl item being placed
* @returns true if allowed
* Is the provided item allowed inside a container
* @param slotGrid Items sub-grid we want to place item inside
* @param itemTpl Item tpl being placed
* @returns True if allowed
*/
protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean
protected itemAllowedInContainer(slotGrid: Grid, itemTpl: string): boolean
{
const filters = slot._props.filters;
const propFilters = slotGrid._props.filters;
const excludedFilter = propFilters[0]?.ExcludedFilter;
const filter = propFilters[0]?.Filter;
if (propFilters.length === 0)
{
// no filters, item is fine to add
return true;
}
// Check if item base type is excluded
if (filters?.length && (filters[0].ExcludedFilter || filters[0].Filter))
if (excludedFilter || filter)
{
const itemDetails = this.itemHelper.getItem(itemTpl)[1];
// if item to add is found in exclude filter, not allowed
if (filters[0].ExcludedFilter.includes(itemDetails._parent))
if (excludedFilter.includes(itemDetails._parent))
{
return false;
}
// if Filter array only contains 1 filter and its for 'item', allowed
if (filters[0].Filter.length === 1 && filters[0].Filter.includes(BaseClasses.ITEM))
// If Filter array only contains 1 filter and its for basetype 'item', allow it
if (filter.length === 1 && filter.includes(BaseClasses.ITEM))
{
return true;
}
// if allowed filter has something in it + filter doesnt have item, not allowed
if (filters[0].Filter.length > 0 && !filters[0].Filter.includes(itemDetails._parent))
// If allowed filter has something in it + filter doesnt have basetype 'item', not allowed
if (filter.length > 0 && !filter.includes(itemDetails._parent))
{
return false;
}

View File

@ -1034,6 +1034,11 @@ class ItemHelper
magazineCartridgeMaxCount,
);
if (magazine.length > 1)
{
this.logger.warning(`Magazine ${magTemplate._name} already has cartridges defined, this may cause issues`);
}
// Loop over cartridge count and add stacks to magazine
let currentStoredCartridgeCount = 0;
let location = 0;

View File

@ -2,5 +2,6 @@ export enum ItemAddedResult {
UNKNOWN = -1,
SUCCESS = 1,
NO_SPACE = 2,
NO_CONTAINERS = 3
NO_CONTAINERS = 3,
INCOMPATIBLE_ITEM = 4,
}