Fix calculations for the flea min, max and avg to more accurately match live (!268)

Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/268
Co-authored-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
Co-committed-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
This commit is contained in:
DrakiaXYZ 2024-03-23 19:18:14 +00:00 committed by chomp
parent d3fdb08528
commit fdbbc47e59

View File

@ -342,31 +342,51 @@ export class RagfairController
*/ */
public getItemMinAvgMaxFleaPriceValues(getPriceRequest: IGetMarketPriceRequestData): IGetItemPriceResult public getItemMinAvgMaxFleaPriceValues(getPriceRequest: IGetMarketPriceRequestData): IGetItemPriceResult
{ {
// Get all items of tpl (sort by price) // Get all items of tpl
let offers = this.ragfairOfferService.getOffersOfType(getPriceRequest.templateId); const offers = this.ragfairOfferService.getOffersOfType(getPriceRequest.templateId);
// Offers exist for item, get averages of what's listed // Offers exist for item, get averages of what's listed
if (typeof offers === "object" && offers.length > 0) if (typeof offers === "object" && offers.length > 0)
{ {
offers = this.ragfairSortHelper.sortOffers(offers, RagfairSort.PRICE); // These get calculated while iterating through the list below
const min = offers[0].requirementsCost; // Get first item from array as its pre-sorted let min = Number.MAX_VALUE;
const max = offers.at(-1).requirementsCost; // Get last item from array as its pre-sorted let max = 0;
// Get the average offer price, excluding barter offers // Get the average offer price, excluding barter offers
let avgOfferCount = 0; let avgOfferCount = 0;
const avg = offers.reduce((sum, offer) => const avg = offers.reduce((sum, offer) =>
{ {
// Exclude barter items // Exclude barter items, they tend to have outrageous equivalent prices
if (offer.requirements.some((req) => !this.paymentHelper.isMoneyTpl(req._tpl))) if (offer.requirements.some((req) => !this.paymentHelper.isMoneyTpl(req._tpl)))
{ {
return sum; return sum;
} }
// Figure out how many items the requirementsCost is applying to, and what the per-item price is
const offerItemCount = Math.max(offer.sellInOnePiece ? offer.items[0].upd?.StackObjectsCount ?? 1 : 1);
const perItemPrice = offer.requirementsCost / offerItemCount;
// Handle min/max calculations based on the per-item price
if (perItemPrice < min)
{
min = perItemPrice;
}
else if (perItemPrice > max)
{
max = perItemPrice;
}
avgOfferCount++; avgOfferCount++;
return sum + offer.requirementsCost; return sum + perItemPrice;
}, 0) / Math.max(avgOfferCount, 1); }, 0) / Math.max(avgOfferCount, 1);
return { avg: avg, min: min, max: max }; // If no items were actually counted, min will still be MAX_VALUE, so set it to 0
if (min === Number.MAX_VALUE)
{
min = 0;
}
return { avg: Math.round(avg), min: min, max: max };
} }
// No offers listed, get price from live ragfair price list prices.json // No offers listed, get price from live ragfair price list prices.json