Rework items added to container code, now stops after 4 failed attempts
Don't increment cost of loot container total value if item was not placed in container
This commit is contained in:
parent
2d57bdb0ef
commit
8a26d3f807
@ -1517,5 +1517,6 @@
|
|||||||
"tarkovstreets": 18,
|
"tarkovstreets": 18,
|
||||||
"default": 15
|
"default": 15
|
||||||
},
|
},
|
||||||
"botGenerationBatchSizePerType": 15
|
"botGenerationBatchSizePerType": 15,
|
||||||
|
"forceHealingItemsIntoSecure": true
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem";
|
|||||||
import { BaseClasses } from "../models/enums/BaseClasses";
|
import { BaseClasses } from "../models/enums/BaseClasses";
|
||||||
import { ConfigTypes } from "../models/enums/ConfigTypes";
|
import { ConfigTypes } from "../models/enums/ConfigTypes";
|
||||||
import { EquipmentSlots } from "../models/enums/EquipmentSlots";
|
import { EquipmentSlots } from "../models/enums/EquipmentSlots";
|
||||||
|
import { ItemAddedResult } from "../models/enums/ItemAddedResult";
|
||||||
import { LootCacheType } from "../models/spt/bots/IBotLootCache";
|
import { LootCacheType } from "../models/spt/bots/IBotLootCache";
|
||||||
import { IBotConfig } from "../models/spt/config/IBotConfig";
|
import { IBotConfig } from "../models/spt/config/IBotConfig";
|
||||||
import { ILogger } from "../models/spt/utils/ILogger";
|
import { ILogger } from "../models/spt/utils/ILogger";
|
||||||
@ -74,7 +75,7 @@ export class BotLootGenerator
|
|||||||
const grenadeCount = this.getRandomisedCount(itemCounts.grenades.min, itemCounts.grenades.max, 4);
|
const grenadeCount = this.getRandomisedCount(itemCounts.grenades.min, itemCounts.grenades.max, 4);
|
||||||
|
|
||||||
// Forced pmc healing loot
|
// Forced pmc healing loot
|
||||||
if (isPmc)
|
if (isPmc && this.botConfig.pmc.forceHealingItemsIntoSecure)
|
||||||
{
|
{
|
||||||
this.addForcedMedicalItemsToPmcSecure(botInventory, botRole);
|
this.addForcedMedicalItemsToPmcSecure(botInventory, botRole);
|
||||||
}
|
}
|
||||||
@ -249,6 +250,7 @@ export class BotLootGenerator
|
|||||||
let currentTotalRub = 0;
|
let currentTotalRub = 0;
|
||||||
const itemLimits: Record<string, number> = {};
|
const itemLimits: Record<string, number> = {};
|
||||||
const itemSpawnLimits: Record<string,Record<string, number>> = {};
|
const itemSpawnLimits: Record<string,Record<string, number>> = {};
|
||||||
|
let fitItemIntoContainerAttempts = 0;
|
||||||
for (let i = 0; i < totalItemCount; i++)
|
for (let i = 0; i < totalItemCount; i++)
|
||||||
{
|
{
|
||||||
const itemToAddTemplate = this.getRandomItemFromPoolByRole(pool, botRole);
|
const itemToAddTemplate = this.getRandomItemFromPoolByRole(pool, botRole);
|
||||||
@ -294,10 +296,25 @@ export class BotLootGenerator
|
|||||||
this.randomiseAmmoStackSize(isPmc, itemToAddTemplate, itemsToAdd[0]);
|
this.randomiseAmmoStackSize(isPmc, itemToAddTemplate, itemsToAdd[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot(equipmentSlots, id, itemToAddTemplate._id, itemsToAdd, inventoryToAddItemsTo);
|
// Attempt to add item to container(s)
|
||||||
|
const itemAddedResult = this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot(equipmentSlots, id, itemToAddTemplate._id, itemsToAdd, inventoryToAddItemsTo);
|
||||||
|
if (itemAddedResult === ItemAddedResult.NO_SPACE)
|
||||||
|
{
|
||||||
|
fitItemIntoContainerAttempts++;
|
||||||
|
if (fitItemIntoContainerAttempts >= 4)
|
||||||
|
{
|
||||||
|
this.logger.debug(`Failed to place item ${i} of ${totalItemCount} item into ${botRole} container: ${equipmentSlots}, ${fitItemIntoContainerAttempts} times, skipping`);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fitItemIntoContainerAttempts = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Stop adding items to bots pool if rolling total is over total limit
|
// Stop adding items to bots pool if rolling total is over total limit
|
||||||
if (totalValueLimitRub > 0)
|
if (totalValueLimitRub > 0 && itemAddedResult === ItemAddedResult.SUCCESS)
|
||||||
{
|
{
|
||||||
currentTotalRub += this.handbookHelper.getTemplatePrice(itemToAddTemplate._id);
|
currentTotalRub += this.handbookHelper.getTemplatePrice(itemToAddTemplate._id);
|
||||||
if (currentTotalRub > totalValueLimitRub)
|
if (currentTotalRub > totalValueLimitRub)
|
||||||
|
@ -6,6 +6,7 @@ import { Item } from "../models/eft/common/tables/IItem";
|
|||||||
import { Grid, ITemplateItem } from "../models/eft/common/tables/ITemplateItem";
|
import { Grid, ITemplateItem } from "../models/eft/common/tables/ITemplateItem";
|
||||||
import { BaseClasses } from "../models/enums/BaseClasses";
|
import { BaseClasses } from "../models/enums/BaseClasses";
|
||||||
import { EquipmentSlots } from "../models/enums/EquipmentSlots";
|
import { EquipmentSlots } from "../models/enums/EquipmentSlots";
|
||||||
|
import { ItemAddedResult } from "../models/enums/ItemAddedResult";
|
||||||
import { ILogger } from "../models/spt/utils/ILogger";
|
import { ILogger } from "../models/spt/utils/ILogger";
|
||||||
import { DatabaseServer } from "../servers/DatabaseServer";
|
import { DatabaseServer } from "../servers/DatabaseServer";
|
||||||
import { LocalisationService } from "../services/LocalisationService";
|
import { LocalisationService } from "../services/LocalisationService";
|
||||||
@ -153,7 +154,7 @@ export class BotWeaponGeneratorHelper
|
|||||||
* @param inventory Inventory to add item+children into
|
* @param inventory Inventory to add item+children into
|
||||||
* @returns a `boolean` indicating item was added
|
* @returns a `boolean` indicating item was added
|
||||||
*/
|
*/
|
||||||
public addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: Inventory): boolean
|
public addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: Inventory): ItemAddedResult
|
||||||
{
|
{
|
||||||
for (const slot of equipmentSlots)
|
for (const slot of equipmentSlots)
|
||||||
{
|
{
|
||||||
@ -201,8 +202,8 @@ export class BotWeaponGeneratorHelper
|
|||||||
const containerItems = inventory.items.filter(i => i.parentId === container._id && i.slotId === slotGrid._name);
|
const containerItems = inventory.items.filter(i => i.parentId === container._id && i.slotId === slotGrid._name);
|
||||||
|
|
||||||
// Get a copy of base level items we can iterate over
|
// Get a copy of base level items we can iterate over
|
||||||
const itemsToCheck = containerItems.filter(x => x.slotId === slotGrid._name);
|
const containerItemsToCheck = containerItems.filter(x => x.slotId === slotGrid._name);
|
||||||
for (const item of itemsToCheck)
|
for (const item of containerItemsToCheck)
|
||||||
{
|
{
|
||||||
// Look for children on items, insert into array if found
|
// Look for children on items, insert into array if found
|
||||||
// (used later when figuring out how much space weapon takes up)
|
// (used later when figuring out how much space weapon takes up)
|
||||||
@ -213,13 +214,17 @@ export class BotWeaponGeneratorHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const slotMap = this.inventoryHelper.getContainerMap(slotGrid._props.cellsH, slotGrid._props.cellsV, containerItems, container._id);
|
// Get rid of items free/used spots in current grid
|
||||||
const findSlotResult = this.containerHelper.findSlotForItem(slotMap, itemSize[0], itemSize[1]);
|
const slotGridMap = this.inventoryHelper.getContainerMap(slotGrid._props.cellsH, slotGrid._props.cellsV, containerItems, container._id);
|
||||||
|
// Try to fit item into grid
|
||||||
|
const findSlotResult = this.containerHelper.findSlotForItem(slotGridMap, itemSize[0], itemSize[1]);
|
||||||
|
|
||||||
|
// Open slot found, add item to inventory
|
||||||
if (findSlotResult.success)
|
if (findSlotResult.success)
|
||||||
{
|
{
|
||||||
const parentItem = itemWithChildren.find(i => i._id === parentId);
|
const parentItem = itemWithChildren.find(i => i._id === parentId);
|
||||||
|
|
||||||
|
// Set items parent to container id
|
||||||
parentItem.parentId = container._id;
|
parentItem.parentId = container._id;
|
||||||
parentItem.slotId = slotGrid._name;
|
parentItem.slotId = slotGrid._name;
|
||||||
parentItem.location = {
|
parentItem.location = {
|
||||||
@ -229,16 +234,15 @@ export class BotWeaponGeneratorHelper
|
|||||||
};
|
};
|
||||||
|
|
||||||
inventory.items.push(...itemWithChildren);
|
inventory.items.push(...itemWithChildren);
|
||||||
return true;
|
|
||||||
}
|
return ItemAddedResult.SUCCESS;
|
||||||
else
|
|
||||||
{
|
|
||||||
this.logger.warning(`Unable to find space in container: ${container.slotId} item: ${itemWithChildren[0]._tpl}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start loop again in next grid of container
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return ItemAddedResult.NO_SPACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
5
project/src/models/enums/ItemAddedResult.ts
Normal file
5
project/src/models/enums/ItemAddedResult.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export enum ItemAddedResult
|
||||||
|
{
|
||||||
|
SUCCESS = 1,
|
||||||
|
NO_SPACE = 2
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user