diff --git a/project/src/helpers/TradeHelper.ts b/project/src/helpers/TradeHelper.ts index 0a1654d5..814b637b 100644 --- a/project/src/helpers/TradeHelper.ts +++ b/project/src/helpers/TradeHelper.ts @@ -5,7 +5,7 @@ import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; import { TraderAssortHelper } from "@spt-aki/helpers/TraderAssortHelper"; import { TraderHelper } from "@spt-aki/helpers/TraderHelper"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; -import { Item, Upd } from "@spt-aki/models/eft/common/tables/IItem"; +import { Item } from "@spt-aki/models/eft/common/tables/IItem"; import { IAddItemDirectRequest } from "@spt-aki/models/eft/inventory/IAddItemDirectRequest"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; import { IProcessBuyTradeRequestData } from "@spt-aki/models/eft/trade/IProcessBuyTradeRequestData"; @@ -120,12 +120,12 @@ export class TradeHelper { // Update assort/flea item values const traderAssorts = this.traderHelper.getTraderAssortsByTraderId(buyRequestData.tid).items; - const itemPurchased = traderAssorts.find((x) => x._id === buyRequestData.item_id); + const itemPurchased = traderAssorts.find((assort) => assort._id === buyRequestData.item_id); // Decrement trader item count itemPurchased.upd.StackObjectsCount -= buyCount; - this.fenceService.removeFenceOffer(buyRequestData.item_id); + this.fenceService.amendOrRemoveFenceOffer(buyRequestData.item_id, buyCount); }; const fenceItems = this.fenceService.getRawFenceAssorts().items; diff --git a/project/src/services/FenceService.ts b/project/src/services/FenceService.ts index 0d41200c..36d6158d 100644 --- a/project/src/services/FenceService.ts +++ b/project/src/services/FenceService.ts @@ -897,21 +897,49 @@ export class FenceService } /** - * Remove an assort from fence by id - * @param assortIdToRemove assort id to remove from fence assorts + * Remove or lower stack size of an assort from fence by id + * @param assortId assort id to adjust + * @param buyCount Count of items bought */ - public removeFenceOffer(assortIdToRemove: string): void + public amendOrRemoveFenceOffer(assortId: string, buyCount: number): void + { + let fenceAssortItem = this.fenceAssort.items.find(item => item._id === assortId); + if (!fenceAssortItem) + { + // Not in main assorts, check secondary section + fenceAssortItem = this.fenceDiscountAssort.items.find(item => item._id === assortId); + if (!fenceAssortItem) + { + this.logger.error(`Offer with id: ${assortId} not found`); + + return; + } + } + + // Player wants to buy whole stack, delete stack + if (fenceAssortItem.upd.StackObjectsCount === buyCount) + { + this.deleteOffer(assortId, this.fenceAssort.items); + + return; + } + + // Adjust stack size + fenceAssortItem.upd.StackObjectsCount -= buyCount; + } + + protected deleteOffer(assortId: string, assorts: Item[]): void { // Assort could have child items, remove those too - const itemWithChildrenToRemove = this.itemHelper.findAndReturnChildrenAsItems(this.fenceAssort.items, assortIdToRemove); + const itemWithChildrenToRemove = this.itemHelper.findAndReturnChildrenAsItems(assorts, assortId); for (const itemToRemove of itemWithChildrenToRemove) { - let indexToRemove = this.fenceAssort.items.findIndex(item => item._id === itemToRemove._id); + let indexToRemove = assorts.findIndex(item => item._id === itemToRemove._id); // No offer found in main assort, check discount items if (indexToRemove === -1) { - indexToRemove = this.fenceDiscountAssort.items.findIndex((i) => i._id === itemToRemove._id); + indexToRemove = this.fenceDiscountAssort.items.findIndex((item) => item._id === itemToRemove._id); this.fenceDiscountAssort.items.splice(indexToRemove, 1); if (indexToRemove === -1) @@ -923,7 +951,7 @@ export class FenceService } // Remove offer from assort - this.fenceAssort.items.splice(indexToRemove, 1); + assorts.splice(indexToRemove, 1); } } }