Rework sell all scav gear button to send money as mail

This commit is contained in:
Dev 2024-02-04 19:27:35 +00:00
parent 5bde733e7b
commit 9fa0bf53e5
3 changed files with 51 additions and 29 deletions

View File

@ -0,0 +1,5 @@
{
"soldItems": [
"64648f64063abf54100f587b 0"
]
}

View File

@ -20,28 +20,40 @@ import { ISellScavItemsToFenceRequestData } from "@spt-aki/models/eft/trade/ISel
import { BackendErrorCodes } from "@spt-aki/models/enums/BackendErrorCodes";
import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes";
import { MemberCategory } from "@spt-aki/models/enums/MemberCategory";
import { MessageType } from "@spt-aki/models/enums/MessageType";
import { Traders } from "@spt-aki/models/enums/Traders";
import { IRagfairConfig } from "@spt-aki/models/spt/config/IRagfairConfig";
import { ITraderConfig } from "@spt-aki/models/spt/config/ITraderConfig";
import { ILogger } from "@spt-aki/models/spt/utils/ILogger";
import { EventOutputHolder } from "@spt-aki/routers/EventOutputHolder";
import { ConfigServer } from "@spt-aki/servers/ConfigServer";
import { DatabaseServer } from "@spt-aki/servers/DatabaseServer";
import { RagfairServer } from "@spt-aki/servers/RagfairServer";
import { LocalisationService } from "@spt-aki/services/LocalisationService";
import { MailSendService } from "@spt-aki/services/MailSendService";
import { RagfairPriceService } from "@spt-aki/services/RagfairPriceService";
import { HashUtil } from "@spt-aki/utils/HashUtil";
import { HttpResponseUtil } from "@spt-aki/utils/HttpResponseUtil";
import { JsonUtil } from "@spt-aki/utils/JsonUtil";
import { RandomUtil } from "@spt-aki/utils/RandomUtil";
import { TimeUtil } from "@spt-aki/utils/TimeUtil";
@injectable()
export class TradeController
{
protected roubleTpl = "5449016a4bdc2d6f028b456f";
protected ragfairConfig: IRagfairConfig;
protected traderConfig: ITraderConfig;
constructor(
@inject("WinstonLogger") protected logger: ILogger,
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
@inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder,
@inject("TradeHelper") protected tradeHelper: TradeHelper,
@inject("TimeUtil") protected timeUtil: TimeUtil,
@inject("RandomUtil") protected randomUtil: RandomUtil,
@inject("HashUtil") protected hashUtil: HashUtil,
@inject("ItemHelper") protected itemHelper: ItemHelper,
@inject("ProfileHelper") protected profileHelper: ProfileHelper,
@inject("TraderHelper") protected traderHelper: TraderHelper,
@ -50,6 +62,7 @@ export class TradeController
@inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil,
@inject("LocalisationService") protected localisationService: LocalisationService,
@inject("RagfairPriceService") protected ragfairPriceService: RagfairPriceService,
@inject("MailSendService") protected mailSendService: MailSendService,
@inject("ConfigServer") protected configServer: ConfigServer,
)
{
@ -255,66 +268,66 @@ export class TradeController
return this.httpResponse.appendErrorToOutput(output, `Profile ${request.fromOwner.id} has no scav account`);
}
this.sellInventoryToTrader(sessionId, scavProfile, pmcData, Traders.FENCE, output);
this.calculateCostOfScavInventoryAndMailMoneyToPlayer(sessionId, scavProfile, Traders.FENCE);
return output;
}
/**
* Sell all sellable items to a trader from inventory
* WILL DELETE ITEMS FROM INVENTORY + CHILDREN OF ITEMS SOLD
* Get cost of items in inventory and send rouble total to player as mail
* @param sessionId Session id
* @param profileWithItemsToSell Profile with items to be sold to trader
* @param profileThatGetsMoney Profile that gets the money after selling items
* @param trader Trader to sell items to
* @param output IItemEventRouterResponse
*/
protected sellInventoryToTrader(
protected calculateCostOfScavInventoryAndMailMoneyToPlayer(
sessionId: string,
profileWithItemsToSell: IPmcData,
profileThatGetsMoney: IPmcData,
trader: Traders,
output: IItemEventRouterResponse,
): void
{
const handbookPrices = this.ragfairPriceService.getAllStaticPrices();
// TODO, apply trader sell bonuses?
const traderDetails = this.traderHelper.getTrader(trader, sessionId);
// Prep request object
const sellRequest: IProcessSellTradeRequestData = {
Action: "sell_to_trader",
type: "sell_to_trader",
tid: trader,
price: 0,
items: [],
};
// Get all base items that scav has (primaryweapon/backpack/pockets etc)
// Add items that trader will buy (only sell items that have the container as parent) to request object
const containerAndEquipmentItems = profileWithItemsToSell.Inventory.items.filter((x) =>
x.parentId === profileWithItemsToSell.Inventory.equipment
let roublesToSend = 0;
const containerAndEquipmentItems = profileWithItemsToSell.Inventory.items.filter((item) =>
item.parentId === profileWithItemsToSell.Inventory.equipment
);
for (const itemToSell of containerAndEquipmentItems)
{
// Increment sell price in request
sellRequest.price += this.getPriceOfItemAndChildren(
roublesToSend += this.getPriceOfItemAndChildren(
itemToSell._id,
profileWithItemsToSell.Inventory.items,
handbookPrices,
traderDetails,
);
// Add item details to request
// eslint-disable-next-line @typescript-eslint/naming-convention
sellRequest.items.push({
id: itemToSell._id,
count: itemToSell?.upd?.StackObjectsCount ?? 1,
scheme_id: 0,
});
}
this.logger.debug(`Selling scav items to fence for ${sellRequest.price} roubles`);
this.tradeHelper.sellItem(profileWithItemsToSell, profileThatGetsMoney, sellRequest, sessionId, output);
this.logger.debug(`Selling scav items to fence for ${roublesToSend} roubles`);
// Create single currency item with all currency on it
const rootCurrencyReward = {
_id: this.hashUtil.generate(),
_tpl: this.roubleTpl,
upd: { StackObjectsCount: roublesToSend },
};
// Ensure money is properly split to follow its max stack size limit
const curencyReward = this.itemHelper.splitStackIntoSeparateItems(rootCurrencyReward);
// Send mail from trader
this.mailSendService.sendLocalisedNpcMessageToPlayer(
sessionId,
this.traderHelper.getTraderById(trader),
MessageType.MESSAGE_WITH_ITEMS,
this.randomUtil.getArrayValue(this.databaseServer.getTables().traders[trader].dialogue.soldItems),
curencyReward.flatMap((x) => x),
this.timeUtil.getHoursAsSeconds(72),
);
}
/**

View File

@ -210,6 +210,7 @@ export class PaymentService
item.upd.StackObjectsCount = item.upd.StackObjectsCount + calcAmount;
}
// Inform client of change to items StackObjectsCount
output.profileChanges[sessionID].items.change.push(item);
if (skipSendingMoneyToStash)
@ -219,11 +220,14 @@ export class PaymentService
}
}
// Create single currency item with all currency on it
const rootCurrencyReward = {
_id: this.hashUtil.generate(),
_tpl: currency,
upd: { StackObjectsCount: calcAmount },
};
// Ensure money is properly split to follow its max stack size limit
const rewards = this.itemHelper.splitStackIntoSeparateItems(rootCurrencyReward);
if (!skipSendingMoneyToStash)
@ -237,7 +241,7 @@ export class PaymentService
this.inventoryHelper.addItemsToStash(sessionID, addItemToStashRequest, pmcData, output);
}
// set current sale sum
// Calcualte new total sale sum with trader item sold to
const saleSum = pmcData.TradersInfo[request.tid].salesSum + amountToSend;
pmcData.TradersInfo[request.tid].salesSum = saleSum;