Add code to add items to a wallets flee slot if available
This commit is contained in:
parent
c7f1570c8f
commit
a26ff26a4a
@ -4,6 +4,7 @@ import { BotWeaponGenerator } from "@spt-aki/generators/BotWeaponGenerator";
|
|||||||
import { BotGeneratorHelper } from "@spt-aki/helpers/BotGeneratorHelper";
|
import { BotGeneratorHelper } from "@spt-aki/helpers/BotGeneratorHelper";
|
||||||
import { BotWeaponGeneratorHelper } from "@spt-aki/helpers/BotWeaponGeneratorHelper";
|
import { BotWeaponGeneratorHelper } from "@spt-aki/helpers/BotWeaponGeneratorHelper";
|
||||||
import { HandbookHelper } from "@spt-aki/helpers/HandbookHelper";
|
import { HandbookHelper } from "@spt-aki/helpers/HandbookHelper";
|
||||||
|
import { InventoryHelper } from "@spt-aki/helpers/InventoryHelper";
|
||||||
import { ItemHelper } from "@spt-aki/helpers/ItemHelper";
|
import { ItemHelper } from "@spt-aki/helpers/ItemHelper";
|
||||||
import { WeightedRandomHelper } from "@spt-aki/helpers/WeightedRandomHelper";
|
import { WeightedRandomHelper } from "@spt-aki/helpers/WeightedRandomHelper";
|
||||||
import { Inventory as PmcInventory } from "@spt-aki/models/eft/common/tables/IBotBase";
|
import { Inventory as PmcInventory } from "@spt-aki/models/eft/common/tables/IBotBase";
|
||||||
@ -23,6 +24,7 @@ import { DatabaseServer } from "@spt-aki/servers/DatabaseServer";
|
|||||||
import { BotLootCacheService } from "@spt-aki/services/BotLootCacheService";
|
import { BotLootCacheService } from "@spt-aki/services/BotLootCacheService";
|
||||||
import { LocalisationService } from "@spt-aki/services/LocalisationService";
|
import { LocalisationService } from "@spt-aki/services/LocalisationService";
|
||||||
import { HashUtil } from "@spt-aki/utils/HashUtil";
|
import { HashUtil } from "@spt-aki/utils/HashUtil";
|
||||||
|
import { JsonUtil } from "@spt-aki/utils/JsonUtil";
|
||||||
import { RandomUtil } from "@spt-aki/utils/RandomUtil";
|
import { RandomUtil } from "@spt-aki/utils/RandomUtil";
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
@ -36,6 +38,8 @@ export class BotLootGenerator
|
|||||||
@inject("HashUtil") protected hashUtil: HashUtil,
|
@inject("HashUtil") protected hashUtil: HashUtil,
|
||||||
@inject("RandomUtil") protected randomUtil: RandomUtil,
|
@inject("RandomUtil") protected randomUtil: RandomUtil,
|
||||||
@inject("ItemHelper") protected itemHelper: ItemHelper,
|
@inject("ItemHelper") protected itemHelper: ItemHelper,
|
||||||
|
@inject("JsonUtil") protected jsonUtil: JsonUtil,
|
||||||
|
@inject("InventoryHelper") protected inventoryHelper: InventoryHelper,
|
||||||
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
|
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
|
||||||
@inject("HandbookHelper") protected handbookHelper: HandbookHelper,
|
@inject("HandbookHelper") protected handbookHelper: HandbookHelper,
|
||||||
@inject("BotGeneratorHelper") protected botGeneratorHelper: BotGeneratorHelper,
|
@inject("BotGeneratorHelper") protected botGeneratorHelper: BotGeneratorHelper,
|
||||||
@ -403,7 +407,25 @@ export class BotLootGenerator
|
|||||||
const addCurrency = this.randomUtil.getChance100(25);
|
const addCurrency = this.randomUtil.getChance100(25);
|
||||||
if (addCurrency)
|
if (addCurrency)
|
||||||
{
|
{
|
||||||
itemWithChildrenToAdd.push(...this.createWalletLoot(newRootItemId));
|
const itemsToAdd = this.createWalletLoot(newRootItemId);
|
||||||
|
const stashFS2D = this.inventoryHelper.getContainerSlotMap(weightedItemTpl);
|
||||||
|
const canAddToContainer = this.inventoryHelper.canPlaceItemsInContainer(
|
||||||
|
this.jsonUtil.clone(stashFS2D),
|
||||||
|
itemsToAdd,
|
||||||
|
);
|
||||||
|
if (canAddToContainer)
|
||||||
|
{
|
||||||
|
for (const itemToAdd of itemsToAdd)
|
||||||
|
{
|
||||||
|
this.inventoryHelper.placeItemInContainer(
|
||||||
|
stashFS2D,
|
||||||
|
itemToAdd,
|
||||||
|
itemWithChildrenToAdd[0]._id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
itemWithChildrenToAdd.push(...itemsToAdd.flatMap((x) => x));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,9 +486,9 @@ export class BotLootGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected createWalletLoot(walletId: string): Item[]
|
protected createWalletLoot(walletId: string): Item[][]
|
||||||
{
|
{
|
||||||
const result: Item[] = [];
|
const result: Item[][] = [];
|
||||||
|
|
||||||
// Choose how many stacks of currency will be added to wallet
|
// Choose how many stacks of currency will be added to wallet
|
||||||
const itemCount = this.randomUtil.getInt(1, this.botConfig.walletLoot.itemCount);
|
const itemCount = this.randomUtil.getInt(1, this.botConfig.walletLoot.itemCount);
|
||||||
@ -476,12 +498,12 @@ export class BotLootGenerator
|
|||||||
const chosenStackCount = Number(
|
const chosenStackCount = Number(
|
||||||
this.weightedRandomHelper.getWeightedValue<string>(this.botConfig.walletLoot.stackSizeWeight),
|
this.weightedRandomHelper.getWeightedValue<string>(this.botConfig.walletLoot.stackSizeWeight),
|
||||||
);
|
);
|
||||||
result.push({
|
result.push([{
|
||||||
_id: this.hashUtil.generate(),
|
_id: this.hashUtil.generate(),
|
||||||
_tpl: "5449016a4bdc2d6f028b456f", // TODO - extend to be more than just roubles
|
_tpl: "5449016a4bdc2d6f028b456f", // TODO - extend to be more than just roubles
|
||||||
parentId: walletId,
|
parentId: walletId,
|
||||||
upd: { StackObjectsCount: chosenStackCount },
|
upd: { StackObjectsCount: chosenStackCount },
|
||||||
});
|
}]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -233,6 +233,12 @@ export class InventoryHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can all probided items be added into player inventory
|
||||||
|
* @param sessionId Player id
|
||||||
|
* @param itemsWithChildren array of items with children to try and fit
|
||||||
|
* @returns True all items fit
|
||||||
|
*/
|
||||||
public canPlaceItemsInInventory(sessionId: string, itemsWithChildren: Item[][]): boolean
|
public canPlaceItemsInInventory(sessionId: string, itemsWithChildren: Item[][]): boolean
|
||||||
{
|
{
|
||||||
const pmcData = this.profileHelper.getPmcProfile(sessionId);
|
const pmcData = this.profileHelper.getPmcProfile(sessionId);
|
||||||
@ -240,7 +246,7 @@ export class InventoryHelper
|
|||||||
const stashFS2D = this.jsonUtil.clone(this.getStashSlotMap(pmcData, sessionId));
|
const stashFS2D = this.jsonUtil.clone(this.getStashSlotMap(pmcData, sessionId));
|
||||||
for (const itemWithChildren of itemsWithChildren)
|
for (const itemWithChildren of itemsWithChildren)
|
||||||
{
|
{
|
||||||
if (this.canPlaceItemInInventory(stashFS2D, itemWithChildren))
|
if (this.canPlaceItemInContainer(stashFS2D, itemWithChildren))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -249,20 +255,45 @@ export class InventoryHelper
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public canPlaceItemInInventory(stashFS2D: number[][], itemWithChildren: Item[]): boolean
|
/**
|
||||||
|
* Do the provided items all fit into the grid
|
||||||
|
* @param containerFS2D Container grid to fit items into
|
||||||
|
* @param itemsWithChildren items to try and fit into grid
|
||||||
|
* @returns True all fit
|
||||||
|
*/
|
||||||
|
public canPlaceItemsInContainer(containerFS2D: number[][], itemsWithChildren: Item[][]): boolean
|
||||||
|
{
|
||||||
|
for (const itemWithChildren of itemsWithChildren)
|
||||||
|
{
|
||||||
|
if (this.canPlaceItemInContainer(containerFS2D, itemWithChildren))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does an item fit into a container grid
|
||||||
|
* @param containerFS2D Container grid
|
||||||
|
* @param itemWithChildren item to check fits
|
||||||
|
* @returns True it fits
|
||||||
|
*/
|
||||||
|
public canPlaceItemInContainer(containerFS2D: number[][], itemWithChildren: Item[]): boolean
|
||||||
{
|
{
|
||||||
// Get x/y size of item
|
// Get x/y size of item
|
||||||
const rootItem = itemWithChildren[0];
|
const rootItem = itemWithChildren[0];
|
||||||
const itemSize = this.getItemSize(rootItem._tpl, rootItem._id, itemWithChildren);
|
const itemSize = this.getItemSize(rootItem._tpl, rootItem._id, itemWithChildren);
|
||||||
|
|
||||||
// Look for a place to slot item into
|
// Look for a place to slot item into
|
||||||
const findSlotResult = this.containerHelper.findSlotForItem(stashFS2D, itemSize[0], itemSize[1]);
|
const findSlotResult = this.containerHelper.findSlotForItem(containerFS2D, itemSize[0], itemSize[1]);
|
||||||
if (findSlotResult.success)
|
if (findSlotResult.success)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.containerHelper.fillContainerMapWithItem(
|
this.containerHelper.fillContainerMapWithItem(
|
||||||
stashFS2D,
|
containerFS2D,
|
||||||
findSlotResult.x,
|
findSlotResult.x,
|
||||||
findSlotResult.y,
|
findSlotResult.y,
|
||||||
itemSize[0],
|
itemSize[0],
|
||||||
@ -285,6 +316,55 @@ export class InventoryHelper
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a free location inside a container to fit the item
|
||||||
|
* @param containerFS2D Container grid to add item to
|
||||||
|
* @param itemWithChildren Item to add to grid
|
||||||
|
* @param containerId Id of the container we're fitting item into
|
||||||
|
*/
|
||||||
|
public placeItemInContainer(containerFS2D: number[][], itemWithChildren: Item[], containerId: string): void
|
||||||
|
{
|
||||||
|
// Get x/y size of item
|
||||||
|
const rootItemAdded = itemWithChildren[0];
|
||||||
|
const itemSize = this.getItemSize(rootItemAdded._tpl, rootItemAdded._id, itemWithChildren);
|
||||||
|
|
||||||
|
// Look for a place to slot item into
|
||||||
|
const findSlotResult = this.containerHelper.findSlotForItem(containerFS2D, itemSize[0], itemSize[1]);
|
||||||
|
if (findSlotResult.success)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.containerHelper.fillContainerMapWithItem(
|
||||||
|
containerFS2D,
|
||||||
|
findSlotResult.x,
|
||||||
|
findSlotResult.y,
|
||||||
|
itemSize[0],
|
||||||
|
itemSize[1],
|
||||||
|
findSlotResult.rotation,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
catch (err)
|
||||||
|
{
|
||||||
|
const errorText = (typeof err === "string") ? ` -> ${err}` : err.message;
|
||||||
|
this.logger.error(this.localisationService.getText("inventory-fill_container_failed", errorText));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Store details for object, incuding container item will be placed in
|
||||||
|
rootItemAdded.parentId = containerId;
|
||||||
|
rootItemAdded.slotId = "hideout";
|
||||||
|
rootItemAdded.location = {
|
||||||
|
x: findSlotResult.x,
|
||||||
|
y: findSlotResult.y,
|
||||||
|
r: findSlotResult.rotation ? 1 : 0,
|
||||||
|
rotation: findSlotResult.rotation,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Success! exit
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a location to place an item into inventory and place it
|
* Find a location to place an item into inventory and place it
|
||||||
* @param stashFS2D 2-dimensional representation of the container slots
|
* @param stashFS2D 2-dimensional representation of the container slots
|
||||||
@ -777,9 +857,14 @@ export class InventoryHelper
|
|||||||
return inventoryItemHash;
|
return inventoryItemHash;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]
|
protected getBlankContainerMap(containerH: number, containerY: number): number[][]
|
||||||
{
|
{
|
||||||
const container2D: number[][] = Array(containerH).fill(0).map(() => Array(containerW).fill(0));
|
return Array(containerY).fill(0).map(() => Array(containerH).fill(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public getContainerMap(containerH: number, containerV: number, itemList: Item[], containerId: string): number[][]
|
||||||
|
{
|
||||||
|
const container2D: number[][] = this.getBlankContainerMap(containerH, containerV);
|
||||||
const inventoryItemHash = this.getInventoryItemHash(itemList);
|
const inventoryItemHash = this.getInventoryItemHash(itemList);
|
||||||
const containerItemHash = inventoryItemHash.byParentId[containerId];
|
const containerItemHash = inventoryItemHash.byParentId[containerId];
|
||||||
|
|
||||||
@ -841,7 +926,11 @@ export class InventoryHelper
|
|||||||
* @returns OwnerInventoryItems with inventory of player/scav to adjust
|
* @returns OwnerInventoryItems with inventory of player/scav to adjust
|
||||||
*/
|
*/
|
||||||
public getOwnerInventoryItems(
|
public getOwnerInventoryItems(
|
||||||
request: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData | IInventoryTransferRequestData,
|
request:
|
||||||
|
| IInventoryMoveRequestData
|
||||||
|
| IInventorySplitRequestData
|
||||||
|
| IInventoryMergeRequestData
|
||||||
|
| IInventoryTransferRequestData,
|
||||||
sessionId: string,
|
sessionId: string,
|
||||||
): IOwnerInventoryItems
|
): IOwnerInventoryItems
|
||||||
{
|
{
|
||||||
@ -910,6 +999,16 @@ export class InventoryHelper
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getContainerSlotMap(containerTpl: string): number[][]
|
||||||
|
{
|
||||||
|
const containerTemplate = this.itemHelper.getItem(containerTpl)[1];
|
||||||
|
|
||||||
|
const containerH = containerTemplate._props.Grids[0]._props.cellsH;
|
||||||
|
const containerV = containerTemplate._props.Grids[0]._props.cellsV;
|
||||||
|
|
||||||
|
return this.getBlankContainerMap(containerH, containerV);
|
||||||
|
}
|
||||||
|
|
||||||
protected getSortingTableSlotMap(pmcData: IPmcData): number[][]
|
protected getSortingTableSlotMap(pmcData: IPmcData): number[][]
|
||||||
{
|
{
|
||||||
return this.getContainerMap(10, 45, pmcData.Inventory.items, pmcData.Inventory.sortingTable);
|
return this.getContainerMap(10, 45, pmcData.Inventory.items, pmcData.Inventory.sortingTable);
|
||||||
@ -934,13 +1033,13 @@ export class InventoryHelper
|
|||||||
this.logger.error(this.localisationService.getText("inventory-stash_not_found", stashTPL));
|
this.logger.error(this.localisationService.getText("inventory-stash_not_found", stashTPL));
|
||||||
}
|
}
|
||||||
|
|
||||||
const stashX = stashItemDetails[1]._props.Grids[0]._props.cellsH !== 0
|
const stashH = stashItemDetails[1]._props.Grids[0]._props.cellsH !== 0
|
||||||
? stashItemDetails[1]._props.Grids[0]._props.cellsH
|
? stashItemDetails[1]._props.Grids[0]._props.cellsH
|
||||||
: 10;
|
: 10;
|
||||||
const stashY = stashItemDetails[1]._props.Grids[0]._props.cellsV !== 0
|
const stashY = stashItemDetails[1]._props.Grids[0]._props.cellsV !== 0
|
||||||
? stashItemDetails[1]._props.Grids[0]._props.cellsV
|
? stashItemDetails[1]._props.Grids[0]._props.cellsV
|
||||||
: 66;
|
: 66;
|
||||||
return [stashX, stashY];
|
return [stashH, stashY];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user