From 6a864bffa98a49a8e7f0365c4ae6c38fe24ef304 Mon Sep 17 00:00:00 2001 From: chomp Date: Sun, 6 Aug 2023 11:36:07 +0000 Subject: [PATCH] Rework high flea listing price adjuster to be configurable, more item types can be added (!111) Co-authored-by: Dev Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/111 --- project/assets/configs/ragfair.json | 78 ++++++++++--------- .../assets/database/hideout/production.json | 6 +- .../src/models/spt/config/IRagfairConfig.ts | 18 ++--- project/src/services/ProfileFixerService.ts | 23 ++++-- 4 files changed, 70 insertions(+), 55 deletions(-) diff --git a/project/assets/configs/ragfair.json b/project/assets/configs/ragfair.json index 42dc4f82..43dcfad5 100644 --- a/project/assets/configs/ragfair.json +++ b/project/assets/configs/ragfair.json @@ -1,7 +1,7 @@ { "runIntervalSeconds": 45, "sell": { - "simulatedSellHours": 12, + "simulatedSellHours": 12, "fees": true, "chance": { "base": 50, @@ -31,29 +31,29 @@ "ragfair": false }, "dynamic": { - "purchasesAreFoundInRaid": false, - "useTraderPriceForOffersIfHigher": true, - "barter": { - "enable": true, - "chancePercent": 20, - "itemCountMin": 1, - "itemCountMax": 3, - "priceRangeVariancePercent": 15, - "minRoubleCostToBecomeBarter": 20000, - "itemTypeBlacklist": [ - "55802f4a4bdc2ddb688b4569", - "55802f3e4bdc2de7118b4584", - "543be5cb4bdc2deb348b4568", - "55818ac54bdc2d5b648b456e", - "5a74651486f7744e73386dd1" - ] - }, - "offerAdjustment":{ - "adjustPriceWhenBelowHandbookPrice": false, - "maxPriceDifferenceBelowHandbookPercent": 64, - "handbookPriceMultipier": 1.1, - "priceThreshholdRub": 20000 - }, + "purchasesAreFoundInRaid": false, + "useTraderPriceForOffersIfHigher": true, + "barter": { + "enable": true, + "chancePercent": 20, + "itemCountMin": 1, + "itemCountMax": 3, + "priceRangeVariancePercent": 15, + "minRoubleCostToBecomeBarter": 20000, + "itemTypeBlacklist": [ + "55802f4a4bdc2ddb688b4569", + "55802f3e4bdc2de7118b4584", + "543be5cb4bdc2deb348b4568", + "55818ac54bdc2d5b648b456e", + "5a74651486f7744e73386dd1" + ] + }, + "offerAdjustment": { + "adjustPriceWhenBelowHandbookPrice": false, + "maxPriceDifferenceBelowHandbookPercent": 64, + "handbookPriceMultipier": 1.1, + "priceThreshholdRub": 20000 + }, "expiredOfferThreshold": 1500, "offerItemCount": { "min": 7, @@ -67,7 +67,7 @@ "min": 0.95, "max": 1.05 }, - "showDefaultPresetsOnly": true, + "showDefaultPresetsOnly": true, "endTimeSeconds": { "min": 360, "max": 3600 @@ -128,7 +128,7 @@ "min": 0.1, "max": 0.95 }, - "_currencies": "what percentage of the offers are in each currency", + "_currencies": "what percentage of the offers are in each currency", "currencies": { "5449016a4bdc2d6f028b456f": 78, "5696686a4bdc2da3298b456a": 14, @@ -141,20 +141,28 @@ "5448e53e4bdc2d60728b4567", "5448bf274bdc2dfc2f8b456a", "543be5e94bdc2df1348b4568", - "5448f39d4bdc2d0a728b4568" + "5448f39d4bdc2d0a728b4568", + "62e910aaf957f2915e0a5e36" ], - "removeSeasonalItemsWhenNotInEvent": true, + "removeSeasonalItemsWhenNotInEvent": true, "blacklist": { - "damagedAmmoPacks": true, + "damagedAmmoPacks": true, "custom": [], - "enableBsgList": true, + "enableBsgList": false, "enableQuestList": true, "traderItems": false }, - "unreasonableModPrices": { - "enabled": true, - "handbookPriceOverMultiplier": 9, - "newPriceHandbookMultiplier": 9 - } + "unreasonableModPrices": { + "5448fe124bdc2da5018b4567": { + "enabled": true, + "handbookPriceOverMultiplier": 9, + "newPriceHandbookMultiplier": 9 + }, + "57864a66245977548f04a81f": { + "enabled": true, + "handbookPriceOverMultiplier": 11, + "newPriceHandbookMultiplier": 11 + } + } } } diff --git a/project/assets/database/hideout/production.json b/project/assets/database/hideout/production.json index 9d40b51e..9557605f 100644 --- a/project/assets/database/hideout/production.json +++ b/project/assets/database/hideout/production.json @@ -3917,7 +3917,7 @@ "count": 1, "endProduct": "62e910aaf957f2915e0a5e36", "isEncoded": true, - "locked": true, + "locked": false, "needFuelForAllProductionTime": true, "productionLimitCount": 0, "productionTime": 43200, @@ -3938,10 +3938,6 @@ "requiredLevel": 2, "type": "Area" }, - { - "questId": "625d700cc48e6c62a440fab5", - "type": "QuestComplete" - }, { "templateId": "590c2d8786f774245b1f03f3", "type": "Tool" diff --git a/project/src/models/spt/config/IRagfairConfig.ts b/project/src/models/spt/config/IRagfairConfig.ts index f3a9c78f..0da26374 100644 --- a/project/src/models/spt/config/IRagfairConfig.ts +++ b/project/src/models/spt/config/IRagfairConfig.ts @@ -85,15 +85,8 @@ export interface Dynamic removeSeasonalItemsWhenNotInEvent: boolean /** Flea blacklist settings */ blacklist: Blacklist - /** Should prices over the multiplier be adjusted */ - unreasonableModPrices: IUnreasonableModPrices -} - -export interface IUnreasonableModPrices -{ - enabled: boolean - handbookPriceOverMultiplier: number - newPriceHandbookMultiplier: number + /** Dict of price limits keyed by item type */ + unreasonableModPrices: Record } export interface Barter @@ -145,4 +138,11 @@ export interface Blacklist /** Should trader items that are blacklisted by bsg */ traderItems: boolean } + +export interface IUnreasonableModPrices +{ + enabled: boolean + handbookPriceOverMultiplier: number + newPriceHandbookMultiplier: number +} \ No newline at end of file diff --git a/project/src/services/ProfileFixerService.ts b/project/src/services/ProfileFixerService.ts index 2f4b11db..ec0651eb 100644 --- a/project/src/services/ProfileFixerService.ts +++ b/project/src/services/ProfileFixerService.ts @@ -11,7 +11,6 @@ import { } from "../models/eft/common/tables/IRepeatableQuests"; import { StageBonus } from "../models/eft/hideout/IHideoutArea"; import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; -import { BaseClasses } from "../models/enums/BaseClasses"; import { ConfigTypes } from "../models/enums/ConfigTypes"; import { HideoutAreas } from "../models/enums/HideoutAreas"; import { QuestStatus } from "../models/enums/QuestStatus"; @@ -102,7 +101,7 @@ export class ProfileFixerService this.updateProfilePocketsToNewId(pmcProfile); this.updateProfileQuestDataValues(pmcProfile); - if (this.ragfairConfig.dynamic.unreasonableModPrices.enabled) + if (Object.keys(this.ragfairConfig.dynamic.unreasonableModPrices).length > 0) { this.adjustUnreasonableModFleaPrices(); } @@ -113,17 +112,29 @@ export class ProfileFixerService const db = this.databaseServer.getTables(); const fleaPrices = db.templates.prices; const handbookPrices = db.templates.handbook.Items; - for (const itemTpl in fleaPrices) + + for (const itemTypeKey in this.ragfairConfig.dynamic.unreasonableModPrices) { - if (this.itemHelper.isOfBaseclass(itemTpl, BaseClasses.MOD)) + const details = this.ragfairConfig.dynamic.unreasonableModPrices[itemTypeKey]; + if (!details?.enabled) { + continue; + } + + for (const itemTpl in fleaPrices) + { + if (!this.itemHelper.isOfBaseclass(itemTpl, itemTypeKey)) + { + continue; + } + const itemHandbookPrice = handbookPrices.find(x => x.Id === itemTpl); if (!itemHandbookPrice) { continue; } - if (fleaPrices[itemTpl] > (itemHandbookPrice.Price * this.ragfairConfig.dynamic.unreasonableModPrices.handbookPriceOverMultiplier)) + if (fleaPrices[itemTpl] > (itemHandbookPrice.Price * details.handbookPriceOverMultiplier)) { if (fleaPrices[itemTpl] <= 1) { @@ -131,7 +142,7 @@ export class ProfileFixerService } // Price is over limit, adjust - fleaPrices[itemTpl] = itemHandbookPrice.Price * this.ragfairConfig.dynamic.unreasonableModPrices.newPriceHandbookMultiplier; + fleaPrices[itemTpl] = itemHandbookPrice.Price * details.newPriceHandbookMultiplier; } } }