From efe77e33a19234f34f4b24ce27757d0f44d45b1c Mon Sep 17 00:00:00 2001 From: archon0ne Date: Sun, 21 Jul 2024 18:14:09 +0200 Subject: [PATCH] initial commit --- README.md | 0 config/config.json | 12 ++++++++ package.json | 26 ++++++++++++++++ src/mod.ts | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 README.md create mode 100644 config/config.json create mode 100644 package.json create mode 100644 src/mod.ts diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..d67b3da --- /dev/null +++ b/config/config.json @@ -0,0 +1,12 @@ +{ + "traders": [ + { + "name": "lotus", + "discount": 0 + }, + { + "name": "scorpion", + "discount": 0 + } + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9ab8550 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "average custom traders price", + "version": "0.0.3", + "main": "src/mod.js", + "license": "MIT", + "author": "robinxb", + "sptVersion": "~3.9", + "scripts": { + "setup": "npm i", + "build": "node ./build.mjs", + "buildinfo": "node ./build.mjs --verbose" + }, + "devDependencies": { + "@types/node": "20.11", + "@typescript-eslint/eslint-plugin": "7.2", + "@typescript-eslint/parser": "7.2", + "archiver": "^6.0", + "eslint": "8.57", + "fs-extra": "11.2", + "ignore": "^5.2", + "os": "^0.1", + "tsyringe": "4.8.0", + "typescript": "5.4", + "winston": "3.12" + } +} \ No newline at end of file diff --git a/src/mod.ts b/src/mod.ts new file mode 100644 index 0000000..6e585df --- /dev/null +++ b/src/mod.ts @@ -0,0 +1,76 @@ +import type { DependencyContainer } from "tsyringe"; +import { DatabaseServer } from "@spt/servers/DatabaseServer"; +import type { IPostDBLoadMod } from "@spt/models/external/IPostDBLoadMod"; +import type { IDatabaseTables } from "@spt/models/spt/server/IDatabaseTables"; +import type { ILogger } from "@spt/models/spt/utils/ILogger"; +const modConfig = require("../config/config.json"); + +const traderIds = [ + "54cb50c76803fa8b248b4571", // Prapor + "54cb57776803fa99248b456e", // Therapist + "58330581ace78e27b8b10cee", // Fence + "5935c25fb3acc3127c3d8cd9", // Skier + "5a7c2eca46aef81a7ca2145d", // Peacekeeper + "5ac3b934156ae10c4430e83c", // Mechanic + "5c0647fdd443bc2504c2d371" // Ragman +]; + +class Mod implements IPostDBLoadMod { + private tables: IDatabaseTables; + private logger: ILogger; + + private calculateAndPrintAverages() { + const averages = []; + const loyaltyLevels = Object.keys(this.tables.traders[traderIds[0]].base.loyaltyLevels); + + this.logger.log("[ACTP] Average Custom Trader Prices starting to apply trader changes...", "yellow"); + + loyaltyLevels.forEach(ll => { + let accumCoef = 0; + traderIds.forEach(id => { + const buyPriceCoef = this.tables.traders[id].base.loyaltyLevels[ll].buy_price_coef; + accumCoef += buyPriceCoef; + }); + const avg = Math.round(accumCoef / traderIds.length); + averages[ll] = avg; + }); + + this.logger.log(`[ACTP] Averages: ${loyaltyLevels.map(ll => `LL${parseInt(ll) + 1} - ${averages[ll]}`).join(' | ')}`, "white"); + + return averages; + } + + private applyTradersChange(averages: number[]) { + for (let i in modConfig['traders']) { + const traderConfig = modConfig['traders'][i]; + const name = traderConfig.name; + const discount = traderConfig.discount || 0; + const finalValues = []; + + if (this.tables.traders[name]) { + for (let ll in this.tables.traders[name].base.loyaltyLevels) { + let avg = averages[ll]; + avg += avg * (discount / 100); + const finalValue = Math.floor(avg); + this.tables.traders[name].base.loyaltyLevels[ll].buy_price_coef = finalValue; + finalValues.push(`LL${parseInt(ll) + 1} - ${finalValue}`); + } + this.logger.log(`[ACTP] Changed trader ${name} with discount ${discount}%: ${finalValues.join(' | ')}`, "white"); + } else { + this.logger.log(`[ACTP] Trader ${name} not found in database.`, "red"); + } + } + } + + postDBLoad(container: DependencyContainer): void { + this.logger = container.resolve("WinstonLogger"); + this.tables = container.resolve("DatabaseServer").getTables(); + + const averages = this.calculateAndPrintAverages(); + this.applyTradersChange(averages); + + this.logger.log("[ACTP] Finished applying trader changes.", "yellow"); + } +} + +module.exports = { mod: new Mod() };