From d3d1ef149efd34edc586d0b3d8a4e3d346dcc76f Mon Sep 17 00:00:00 2001 From: VforValens <jtdurant88@gmail.com> Date: Wed, 3 Aug 2022 21:57:37 -0400 Subject: [PATCH] Added new features for v1.1.0 --- Valens-AIO/Valens-AIO ReadMe.pdf | Bin 1684632 -> 1710847 bytes Valens-AIO/config/config.json | 154 +++++++--- Valens-AIO/package.json | 2 +- Valens-AIO/src/airdrop.ts | 24 +- Valens-AIO/src/ammo.ts | 67 +++++ Valens-AIO/src/ammotypes.ts | 188 ++++++++++++ Valens-AIO/src/bots.ts | 475 +++++++++++++++++++++++-------- Valens-AIO/src/flea.ts | 119 +++----- Valens-AIO/src/globals.ts | 75 +++-- Valens-AIO/src/hideout.ts | 52 ++-- Valens-AIO/src/insurance.ts | 42 ++- Valens-AIO/src/items.ts | 226 +++++---------- Valens-AIO/src/locations.ts | 154 ++++++++++ Valens-AIO/src/logger.ts | 20 ++ Valens-AIO/src/loot.ts | 64 ++--- Valens-AIO/src/mod.ts | 26 +- Valens-AIO/src/raid.ts | 104 +++---- Valens-AIO/tmp/airdrop.js | 45 +++ Valens-AIO/tmp/ammo.js | 259 +++++++++++++++++ Valens-AIO/tmp/bots.js | 101 +++++++ Valens-AIO/tmp/flea.js | 56 ++++ Valens-AIO/tmp/globals.js | 50 ++++ Valens-AIO/tmp/hideout.js | 56 ++++ Valens-AIO/tmp/insurance.js | 27 ++ Valens-AIO/tmp/items.js | 102 +++++++ Valens-AIO/tmp/locations.js | 32 +++ Valens-AIO/tmp/loot.js | 99 +++++++ Valens-AIO/tmp/mod.js | 51 ++++ Valens-AIO/tmp/raid.js | 90 ++++++ 29 files changed, 2148 insertions(+), 612 deletions(-) create mode 100644 Valens-AIO/src/ammo.ts create mode 100644 Valens-AIO/src/ammotypes.ts create mode 100644 Valens-AIO/src/locations.ts create mode 100644 Valens-AIO/src/logger.ts create mode 100644 Valens-AIO/tmp/airdrop.js create mode 100644 Valens-AIO/tmp/ammo.js create mode 100644 Valens-AIO/tmp/bots.js create mode 100644 Valens-AIO/tmp/flea.js create mode 100644 Valens-AIO/tmp/globals.js create mode 100644 Valens-AIO/tmp/hideout.js create mode 100644 Valens-AIO/tmp/insurance.js create mode 100644 Valens-AIO/tmp/items.js create mode 100644 Valens-AIO/tmp/locations.js create mode 100644 Valens-AIO/tmp/loot.js create mode 100644 Valens-AIO/tmp/mod.js create mode 100644 Valens-AIO/tmp/raid.js diff --git a/Valens-AIO/Valens-AIO ReadMe.pdf b/Valens-AIO/Valens-AIO ReadMe.pdf index 4c38f83ca216dfce27bb42c4b57210d96b6207ee..db6c9e4a128c7af54fa3b56a7f272835f764ecf0 100644 GIT binary patch delta 54555 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	+3yu;1$mQ+z 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 delta 31610 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 F{{w45<!1l@ diff --git a/Valens-AIO/config/config.json b/Valens-AIO/config/config.json index 2de5734..6f2e9e8 100644 --- a/Valens-AIO/config/config.json +++ b/Valens-AIO/config/config.json @@ -1,39 +1,73 @@ { + "DebugMode": false, + + "ammo": + { + "ammoStacks": + { + "grenadeCartridges": 1, + "marksmanCartridges": 40, + "pistolCartridges": 50, + "rifleCartridges": 60, + "shotgunCartridges": 20 + } + }, + "bots": { - "containersOnBots": true, - "chanceSameSideIsHostilePercent": 50, - "isUsec": 50, - "maxBackpackLootTotalRub": 150000, + "bossChance": + { + "activated": false, + "chance": 100 + }, + "maxBotCap": 20, - "maxPocketLootTotalRub": 50000, - "maxVestLootTotalRub": 50000, - "pmcDifficulty": "AsOnline", - "pmcNValue": 1.7, - "scavNValue": 2 + + "pmc": + { + "chanceSameSideIsHostilePercent": 50, + "containersOnPMCs": true, + "isUsec": 50, + "lootNValue": 3, + "maxBackpackLootTotalRub": 150000, + "maxPocketLootTotalRub": 50000, + "maxVestLootTotalRub": 50000, + "pmcDifficulty": "AsOnline", + + "convertIntoPmcChance": { + "assault": { + "min": 15, + "max": 40 + }, + "cursedassault": { + "min": 15, + "max": 40 + }, + "pmcbot": { + "min": 15, + "max": 30 + }, + "exusec": { + "min": 5, + "max": 20 + } + } + }, + + "scav": + { + "lootNValue": 4 + } }, "flea": { "minUserLevel": 15, - "time": + "blacklist": { - "baseSellTime": 15, - "minSellTime": 5, - "maxSellTime": 15 - }, - - "reputation": - { - "gain": 0.0000002, - "loss": 0.0000002 - }, - - "offerItemCount": - { - "min": 8, - "max": 15 + "enableBsgList": true, + "enableQuestList": true }, "condition": @@ -50,18 +84,49 @@ "euros": 2 }, - "blacklist": + "offerItemCount": { - "enableBsgList": true, - "enableQuestList": true + "min": 8, + "max": 15 + }, + + "reputation": + { + "gain": 0.0000002, + "loss": 0.0000002 + }, + + "time": + { + "baseSellTime": 15, + "minSellTime": 5, + "maxSellTime": 15 } }, "globals": { + "damagePerMeter": 9, "safeHeight": 3, - "maxTraders": false + "maxLoyaltyTraders": false, + "timeBeforeDeployLocal": 10, + + "match_end": + { + "survived_exp_requirement": 200, + "survived_seconds_requirement": 420, + "survived_exp_reward": 300, + "mia_exp_reward": 200, + "runner_exp_reward": 200, + "leftMult": 0, + "miaMult": 1, + "survivedMult": 1.3, + "runnerMult": 0.5, + "killedMult": 1, + "headShotMult": 1.2, + "expOnDamageAllHealth": 50 + } }, "hideout": @@ -115,14 +180,20 @@ "horizontal": 10 }, - "examineByDefault": false, + "examinedByDefault": false, "removeBackpackFilter": true, "weightModifier": 1, "roublesMaxStack": 500000, "dollarsMaxStack": 50000, - "eurosMaxStack": 50000, + "eurosMaxStack": 50000 + }, - "ammoStacks": 100 + "locations": + { + "allExtractsAvailable": false, + "exfilTime": 8, + "extractionsExtended": false, + "noExtractRestrictions": false }, "loot": @@ -134,16 +205,25 @@ "raid": { - "timeLimit": 60, - "fixOpenZones": true, + "carExtractBaseStandingGain": 0.25, "chompiesBossFix": true, + "fixOpenZones": true, + "scavExtractGain": 0.01, + "timeLimit": 60, "aiAmount": "AsOnline", "aiDifficulty": "AsOnline", "bossEnabled": true, "scavWars": false, "taggedAndCursed": false, - "enablePve": true, - "carExtractBaseStandingGain": 0.25, - "scavExtractGain": 0.01 + "enablePve": true + }, + + "prewipe_events": + { + "allBossesOnReserve": false, + "allTradersSellCheapItems": false, + "glukharOnLabs": false, + "killaOnFactory": false, + "makeObdolbosPowerful": false } } diff --git a/Valens-AIO/package.json b/Valens-AIO/package.json index 5dd1ecc..c435ab9 100644 --- a/Valens-AIO/package.json +++ b/Valens-AIO/package.json @@ -1,6 +1,6 @@ { "name": "Valens-AIO", - "version": "1.0.0", + "version": "1.0.1", "main": "src/mod.js", "license": "CC BY-NC-ND 4.0", "author": "Valens", diff --git a/Valens-AIO/src/airdrop.ts b/Valens-AIO/src/airdrop.ts index 19af994..ba42583 100644 --- a/Valens-AIO/src/airdrop.ts +++ b/Valens-AIO/src/airdrop.ts @@ -1,16 +1,16 @@ /*import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { Logger } from "./logger"; import { IAirdropConfig } from "@spt-aki/models/spt/config/IAirdropConfig"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; export class Airdrop { private modConfig = require("../config/config.jsonc"); - private logger: ILogger; + private logger: Logger; private tables: IDatabaseTables; private airdropConfig: IAirdropConfig; - constructor(logger: ILogger, databaseServer: DatabaseServer, airdropConfig: IAirdropConfig) + constructor(logger: Logger, databaseServer: DatabaseServer, airdropConfig: IAirdropConfig) { this.logger = logger; this.tables = databaseServer.getTables(); @@ -21,7 +21,12 @@ export class Airdrop { if (this.modConfig.airdropChancePercent != 25) { - this.airdropChance(); + this.airdropConfig.airdropChancePercent["bigmap"] = this.modConfig.airdrop.airdropChancePercent.bigmap; + this.airdropConfig.airdropChancePercent["woods"] = this.modConfig.airdrop.airdropChancePercent.woods; + this.airdropConfig.airdropChancePercent["lighthouse"] = this.modConfig.airdrop.airdropChancePercent.lighthouse; + this.airdropConfig.airdropChancePercent["shoreline"] = this.modConfig.airdrop.airdropChancePercent.shoreline; + this.airdropConfig.airdropChancePercent["interchange"] = this.modConfig.airdrop.airdropChancePercent.interchange; + this.airdropConfig.airdropChancePercent["reserve"] = this.modConfig.airdrop.airdropChancePercent.reserve; this.logger.info(`Customs Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.bigmap}`); this.logger.info(`Woods Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.woods}`); this.logger.info(`Lighthouse Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.lighthouse}`); @@ -30,16 +35,5 @@ export class Airdrop this.logger.info(`Reserve Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.reserve}`); } } - - private airdropChance(); - { - this.airdropConfig.airdropChancePercent["bigmap"] = this.modConfig.airdrop.airdropChancePercent.bigmap; - this.airdropConfig.airdropChancePercent["woods"] = this.modConfig.airdrop.airdropChancePercent.woods; - this.airdropConfig.airdropChancePercent["lighthouse"] = this.modConfig.airdrop.airdropChancePercent.lighthouse; - this.airdropConfig.airdropChancePercent["shoreline"] = this.modConfig.airdrop.airdropChancePercent.shoreline; - this.airdropConfig.airdropChancePercent["interchange"] = this.modConfig.airdrop.airdropChancePercent.interchange; - this.airdropConfig.airdropChancePercent["reserve"] = this.modConfig.airdrop.airdropChancePercent.reserve; - - } } */ \ No newline at end of file diff --git a/Valens-AIO/src/ammo.ts b/Valens-AIO/src/ammo.ts new file mode 100644 index 0000000..1cb24b1 --- /dev/null +++ b/Valens-AIO/src/ammo.ts @@ -0,0 +1,67 @@ +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; +import { Logger } from "./logger"; +import { Grenade, MarksmanCaliber, PistolCaliber, RifleCaliber, Shotguns } from "./ammotypes"; + +export class Ammo +{ + private modConfig = require("../config/config.json") + private logger: Logger; + private databaseServer: DatabaseServer; + + constructor(logger: Logger, databaseServer: DatabaseServer) + { + this.logger = logger; + this.databaseServer = databaseServer; + } + + public updateAmmo(): void + { + const items = this.databaseServer.getTables().templates.items; + const mod = this.modConfig.ammo; + + if (mod.ammoStacks.grenadeCartridges != 1) + { + for (const value of Object.values(Grenade)) + { + items[value]._props.StackMaxSize = mod.ammoStacks.grenadeCartridges + this.logger.info(`Grenade Cartridges Max Stacks set to ${mod.ammoStacks.grenadeCartridges}`); + } + } + + if (mod.ammoStacks.marksmanCartridges != 1) + { + for (const value of Object.values(MarksmanCaliber)) + { + items[value]._props.StackMaxSize = mod.ammoStacks.marksmanCartridges + this.logger.info(`Marksman Cartridges Max Stacks set to ${mod.ammoStacks.marksmanCartridges}`); + } + } + + if (mod.ammoStacks.pistolCartridges != 1) + { + for (const value of Object.values(PistolCaliber)) + { + items[value]._props.StackMaxSize = mod.ammoStacks.pistolCartridges + this.logger.info(`Pistol Cartridges Max Stacks set to ${mod.ammoStacks.pistolCartridges}`); + } + } + + if (mod.ammoStacks.rifleCartridges != 1) + { + for (const value of Object.values(RifleCaliber)) + { + items[value]._props.StackMaxSize = mod.ammoStacks.rifleCartridges + this.logger.info(`Rifle Cartridges Max Stacks set to ${mod.ammoStacks.rifleCartridges}`); + } + } + + if (mod.ammoStacks.shotgunCartridges != 1) + { + for (const value of Object.values(Shotguns)) + { + items[value]._props.StackMaxSize = mod.ammoStacks.shotgunCartridges + this.logger.info(`Shotgun Cartridges Max Stacks set to ${mod.ammoStacks.shotgunCartridges}`); + } + } + } +} diff --git a/Valens-AIO/src/ammotypes.ts b/Valens-AIO/src/ammotypes.ts new file mode 100644 index 0000000..3edaea4 --- /dev/null +++ b/Valens-AIO/src/ammotypes.ts @@ -0,0 +1,188 @@ +export enum Grenade +{ + M386_HE_GRENADE = "5ede475b549eed7c6d5c18fb", + M576_MP_APERS_GRENADE = "5ede475339ee016e8c534742", + M433_HEDP_GRENADE = "5f0c892565703e5c461894e9", + M406_HE_GRENADE = "5ede4739e0350d05467f73e8", + M381_HE_GRENADE = "5ede474b0c226a66f5402622", + M441_HE_GRENADE = "5ede47405b097655935d7d16" +} + +export enum MarksmanCaliber +{ + M62_TRACER = "5a608bf24f39f98ffc77720e", + M80 = "58dd3ad986f77403051cba8f", + M61 = "5a6086ea4f39f99cd479502f", + BCP_FMJ = "5e023e53d4353e3302577c4c", + ULTRA_NOSLER = "5e023e88277cce2b522ff2b1", + TCW_SP = "5e023e6e34d52a55c3304f71", + M993 = "5e023e6e34d52a55c3304f71", + TAC_X = "5fc382b6d6fa9c00c571bbc3", + UCW = "5fc382c1016cce60e8341b20", + AP = "5fc382a9d724d907e2077dab", + FMJ = "5fc275cf85fd526b824a571a", + SNB_GZH = "560d61e84bdc2da74d8b4571", + LPS_GZH = "5887431f2459777e1612938f", + PS_GZH = "59e77a2386f7742ee578960a", + T46M_GZH = "5e023cf8186a883be655e54f", + BT_GZH = "5e023d34e8a400319a28ed44", + BS_GZH = "5e023d48186a883be655e551" +} + +export enum PistolCaliber +{ + AP_SX = "5ba26835d4351e0035628ff5", + ACTION_SX = "5ba26812d4351e003201fef1", + FMJ_SX = "5ba2678ad4351e44f824b344", + SUBSONIC_SX = "5ba26844d4351e00334c9475", + SS198LF = "5cc80f79e4a949033c7343b2", + R37_F = "5cc86832d7f00c000d3a6e6c", + SS190 = "5cc80f38e4a949001152b560", + R37_X = "5cc86840d7f00c002412c56c", + L191 = "5cc80f53e4a949000e1ea4f8", + SS197SR = "5cc80f8fe4a949033b0224a2", + SB193 = "5cc80f67e4a949035e43bbba", + FMJ43 = "5735ff5c245977640e39ba7e", + LRN = "573601b42459776410737435", + P_GL = "5736026a245977644601dc61", + PST_GZH762 = "573603562459776430731618", + LRNPC = "573602322459776445391df1", + AKBS = "5735fdcd2459776445391d61", + PT_GZH = "573603c924597764442bd9cb", + PM_SP8_GZH = "5737218f245977612125ba51", + P_GZH18 = "573719762459775a626ccbc1", + PSTM_GZH = "57371aab2459775a77142f22", + RG028_GZH = "573720e02459776143012541", + BZHT_GZH = "573718ba2459775a75491131", + PM_PSV = "5737207f24597760ff7b25f2", + SP7_GZH = "57372140245977611f70ee91", + PBM_GZH = "573719df2459775a626ccbc2", + PSO_GZH18 = "57371f8d24597761006c6a81", + PST_GZH18 = "5737201124597760fc4431f1", + PS_GS_PPO = "57371f2b24597761224311f1", + PRS_GS = "57371eb62459776125652ac1", + PPT_GZH = "57371e4124597760ff7b25f1", + PPE_GZH = "57371b192459775a9f58a5e0", + PSO_GZH = "58864a4f2459770fcc257101", + PST_GZH19 = "56d59d3ad2720bdb418b4577", + GREEN_TRACER = "5c3df7d588a4501f290594e5", + RIP19 = "5c0d56a986f774449d5de529", + AP_63 = "5c925fa22e221601da359b7b", + LUGER_CCI = "5a3c16fe86f77452b62de32a", + PBP_GZH = "5efb0da7a29a85116f6ea05f", + QUAKEMAKER = "5efb0e16aeb21837e749c7ff", + P_GZH = "5a26abfac4a28232980eabff", + PS_GZH = "5a269f97c4a282000b151807", + PE_GZH = "5a26ac06c4a282000c5a90a8", + BT_GZH = "5a26ac0ec4a28200741e1e18", + FMJ = "62330b3ed4dc74626d570b95", + HOLLOW_POINT = "62330bfadc5883093563729b", + SOFT_POINT = "62330c40bdd19b369e1e53d1", + JACKET_HP = "62330c18744e5e31df12f516", + MATCH_FMJ = "5e81f423763d9f754677bf2e", + HYDRA_SHOK = "5efb0fc6aeb21837e749c801", + LASERMATCH_FMJ = "5efb0d4f4bc50b58e81710f3", + AP = "5efb0cabfb3e451d70735af5", + RIP45 = "5ea2a8e200685063ec28c05a" +} + +export enum RifleCaliber +{ + PS_GS = "56dff3afd2720bba668b4567", + SP = "56dff421d2720b5f5a8b4567", + PPBS_GS_IGOLNIK = "5c0d5e4486f77478390952fe", + PRS_GS = "56dff338d2720bbd668b4569", + BT_GS = "56dff061d2720bb5668b4567", + US_GS = "56dff4ecd2720b5f5a8b4568", + BP_GS_545 = "56dfef82d2720bbd668b4567", + HP_545 = "56dff216d2720bbd668b4568", + BS_GS = "56dff026d2720bb8668b4567", + T_GS = "56dff4a2d2720bbd668b456a", + PP_GS = "56dff2ced2720bb4668b4567", + FMJ_545 = "56dff0bed2720bb0668b4567", + M856 = "59e68f6f86f7746c9f75e846", + MK255_MOD_0_RRLP = "59e6918f86f7746c9f75e849", + M995 = "59e690b686f7746c9f75e848", + M855A1 = "54527ac44bdc2d36668b4567", + M856A1 = "59e6906286f7746c9f75e847", + M855 = "54527a984bdc2d4e668b4567", + HP_556 = "59e6927d86f77411da468256", + FMJ_556 = "59e6920f86f77411d82aa167", + WARMAGEDDON = "5c0d5ae286f7741e46554302", + MK_318_MOD_0_SOST = "60194943740c5d77f6705eea", + SSA_AP = "601949593ae8f707c4608daa", + M62_TRACER = "619636be6db0f2477964e710", + BCP_FMJ = "5fbe3ffdf8b6a877a729ea82", + AP = "5fd20ff893a8961fc660a954", + V_MAX = "6196364158ef8c428c287d9f", + WHISPER = "6196365d58ef8c428c287da1", + PS_GZH = "5656d7c34bdc2d9d198b4587", + HP_762 = "59e4d3d286f774176a36250a", + US_GZH = "59e4d24686f7741776641ac7", + T45M1_GZH = "59e4cf5286f7741778269d8a", + BP_GZH = "59e0d99486f7744a32234762", + MAI_AP = "601aa3d2b2bcb34913271e6d", + SP5_GS = "57a0dfb82459774d3078b56c", + BP_GS = "5c0d688c86f77413ae3407b2", + SP6_GS = "57a0e5022459774d1673f889", + SPP_GS = "5c0d668f86f7747ccb7f13b2", + PAB9_GS = "61962d879bb3d20b0946d385", + FMJ_366 = "59e6542b86f77411dc52a77a", + GEKSA = "59e6658b86f77411d949b250", + EKO = "59e655cb86f77411dc52a77b", + APM = "5f0596629e22f464da6bbdd9", + PS12 = "5cadf6ddae9215051e1c23b2", + PS12B = "5cadf6eeae921500134b2799", + PS12A = "5cadf6e5ae921500113bb973" +} + +export enum Shotguns +{ + BUCKSHOT_7MM = "560d5e524bdc2d25448b4571", + MAGNUM_85MM = "5d6e6806a4b936088465b17e", + RIP = "5c0d591486f7744c505b416f", + BMG_SLUG_50CAL = "5d6e68c4a4b9361b93413f79", + BUCKSHOT_525MM = "5d6e6772a4b936088465b17c", + EXPRESS_65MM = "5d6e67fba4b9361bc73bc779", + FLECHETTE = "5d6e6911a4b9361bd5780d52", + FTX_CUSTOM_LITE_SLUG = "5d6e68e6a4b9361c140bcfe0", + AP20_ARMOR_PIERCING_SLUG = "5d6e68a8a4b9360b6c0d54e2", + DUAL_SABOT_SLUG = "5d6e68dea4b9361bcc29e659", + POLEVA_6U_SLUG_12GA = "5d6e689ca4b9361bc8618956", + POLEVA_3_SLUG_12GA = "5d6e6891a4b9361bd473feea", + GRIZZLY_40_SLUG = "5d6e6869a4b9361c140bcfde", + SUPERFORMANCE_HP_SLUG = "5d6e68d1a4b93622fe60e845", + COPPER_SABOT_PREMIER_HP_SLUG = "5d6e68b3a4b9361bca7e50b5", + LEAD_SLUG = "58820d1224597753c90aeb13", + BUCKSHOT_75MM = "5a38ebd9c4a282000d722a5b", + STAR_SLUG = "5d6e6a05a4b93618084f58d0", + BUCKSHOT_73MM = "5d6e69c7a4b9360b6c0d54e4", + DEVASTATOR_SLUG = "5d6e6a5fa4b93614ec501745", + BUCKSHOT_56MM = "5d6e6a5fa4b93614ec501745", + POLEVA_6U_SLUG_20GA = "5d6e6a42a4b9364f07165f52", + POLEVA_3_SLUG_20GA = "5d6e6a53a4b9361bd473feec", + BUCKSHOT_62MM = "5d6e69b9a4b9361bc8618958", + SHRAPNEL10_BUCKSHOT = "5e85a9a6eacf8c039e4e2ac1", + SHRAPNEL25_BUCKSHOT = "5f647f31b6238e5dd066e196", + ZVEZDA_FLASHBANG = "5e85a9f4add9fe03027d9bf1", + BARRIKADA_SLUG = "5e85aa1a988a8701445df1f5" +} + +export enum Ammo30x29 +{ + VOG_30 = "5d70e500a4b9364de70d38ce" +} + +export enum Ammo127x108 +{ + B32 = "5cde8864d7f00c0010373be1", + BZT_44M = "5d2f2ab648f03550091993ca" +} + +export enum Ammo26x75 +{ + GREEN_FLARE = "62389aaba63f32501b1b444f", + RED_FLARE = "62389ba9a63f32501b1b4451", + WHITE_FLARE = "62389bc9423ed1685422dc57", + YELLOW_FLARE = "62389be94d5d474bf712e709" +} \ No newline at end of file diff --git a/Valens-AIO/src/bots.ts b/Valens-AIO/src/bots.ts index a92536b..70b5ad7 100644 --- a/Valens-AIO/src/bots.ts +++ b/Valens-AIO/src/bots.ts @@ -1,95 +1,360 @@ import { IBotConfig } from "@spt-aki/models/spt/config/IBotConfig"; import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger" import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; +import { Logger } from "./logger"; +import type { BossLocationSpawn } from "@spt-aki/models/eft/common/ILocationBase"; +import { Traders } from "./traders"; +import { Money } from "@spt-aki/models/enums/Money" export class Bots { private modConfig = require("../config/config.json") - private logger: ILogger; + private logger: Logger; private botConfig: IBotConfig; private tables: IDatabaseTables; + private traders: Traders; - constructor(logger: ILogger, databaseServer: DatabaseServer, botConfig: IBotConfig) + constructor(logger: Logger, databaseServer: DatabaseServer, botConfig: IBotConfig) { this.logger = logger; this.botConfig = botConfig; this.tables = databaseServer.getTables(); + this.traders = databaseServer.getTables().traders; } public updateBots(): void { - if (this.modConfig.bots.pmcDifficulty.toLowerCase() != "asonline") - { - this.pmcDifficulty(); - this.logger.info(`PMC Bot Difficulty set to ${this.modConfig.bots.pmcDifficulty}`); - } - if (this.modConfig.bots.containersOnBots) - { - this.containersOnBots(); - this.logger.info(`Containers On Bots: ${this.modConfig.bots.containersOnBots}`); - } - - if (this.modConfig.bots.isUsec != 50) - { - this.isUsec(); - this.logger.info(`isUsec Chance is: ${this.modConfig.bots.isUsec}`); - } - - if (this.modConfig.bots.maxBackpackLootTotalRub != 150000 - || this.modConfig.bots.maxPocketLootTotalRub !=50000 - || this.modConfig.bots.maxVestLootTotalRub != 50000) - { - this.pmcLoot(); - this.logger.info("PMC Loot totals changed!"); - this.logger.info(`Max Backpack Total Value: ${this.modConfig.bots.maxBackpackLootTotalRub}`); - this.logger.info(`Max Pocket Total Value: ${this.modConfig.bots.maxPocketLootTotalRub}`); - this.logger.info(`Max Vest Total Value: ${this.modConfig.bots.maxVestLootTotalRub}`); - } - - if (this.modConfig.bots.chanceSameSideIsHostilePercent != 50) - { - this.sameSideIsHostile(); - this.logger.info(`Chance Same Side Is Hostle is ${this.modConfig.bots.chanceSameSideIsHostilePercent}`); - } - - if (this.modConfig.bots.maxBotCap != 20) - { - this.maxBotCap(); - this.logger.info(`Bot Cap is now ${this.modConfig.bots.maxBotCap}`); - } - - if (this.modConfig.bots.pmcNValue != 1.7 || this.modConfig.bots.scavNValue != 2) - { - this.lootNValue(); - this.logger.info("Loot NValue has been changed!"); - this.logger.info(`Scav NValue set to ${this.modConfig.bots.scavNValue}`); - this.logger.info(`PMC NValue set to ${this.modConfig.bots.pmcNValue}`); - } + const mod = this.modConfig.bots; + // Changes PMC difficulty to Easy, Normal, Hard, Impossible or AsOnline. Default AsOnline. + if (mod.pmc.pmcDifficulty.toLowerCase() != "AsOnline") + { + this.botConfig.pmc.difficulty = mod.pmcDifficulty; + this.logger.info(`PMC Bot Difficulty set to ${mod.pmcDifficulty}`); + } + + // Enables common and secure containers to spawn on PMCs while additionally whitelisting the parent IDs. Rarity adjusted via PMC lootNValue. Default true. + if (mod.pmc.containersOnPMCs) + { + this.containersOnPMCs(); + this.logger.info(`Containers On PMCs: ${mod.pmc.containersOnPMCs}`); + } + + // Chance that PMC bot will be USEC or BEAR. Higher value means higher chance for the PMC to be USEC. Default is 50% + if (mod.pmc.isUsec != 50) + { + this.botConfig.pmc.isUsec = mod.isUsec; + this.logger.info(`PMC isUsec Chance is: ${mod.isUsec}`); + } + + // Max Loot Value in Rubles for PMC bots in Backpack, Pockets, and Vest respectively. Default is 150,000/50,000/50,000 + if (mod.pmc.maxBackpackLootTotalRub != 150000 + || mod.pmc.maxPocketLootTotalRub !=50000 + || mod.pmc.maxVestLootTotalRub != 50000) + { + this.botConfig.pmc.maxBackpackLootTotalRub = mod.pmc.maxBackpackLootTotalRub; + this.botConfig.pmc.maxPocketLootTotalRub = mod.pmc.maxPocketLootTotalRub; + this.botConfig.pmc.maxVestLootTotalRub = mod.pmc.maxVestLootTotalRub; + this.logger.info("PMC Loot Value totals changed!"); + this.logger.info(`Max Backpack Total Value: ${mod.pmc.maxBackpackLootTotalRub}`); + this.logger.info(`Max Pocket Total Value: ${mod.pmc.maxPocketLootTotalRub}`); + this.logger.info(`Max Vest Total Value: ${mod.pmc.maxVestLootTotalRub}`); + } + + // Chance that the PMC bot of your side (BEAR/USEC) will be hostile or not. Default is 50%. + if (mod.pmc.chanceSameSideIsHostilePercent != 50) + { + this.botConfig.pmc.chanceSameSideIsHostilePercent = mod.pmc.chanceSameSideIsHostilePercent; + this.logger.info(`Chance Same Side Is Hostle is ${mod.pmc.chanceSameSideIsHostilePercent}`); + } + + // Max Bot Cap located in configs/bot.json/maxBotCap + if (mod.maxBotCap != 20) + { + this.botConfig.maxBotCap = mod.maxBotCap; + this.logger.info(`Bot Cap is now ${mod.maxBotCap}`); + } + + if (mod.pmc.lootNValue != 3 || mod.scav.lootNValue != 4) + { + this.botConfig.lootNValue.scav = mod.scav.lootNValue; + this.botConfig.lootNValue.pmc = mod.pmc.lootNValue; + this.logger.info("Loot NValue for bots has been changed!"); + this.logger.info(`Scav lootNValue set to ${mod.scav.lootNValue}`); + this.logger.info(`PMC lootNValue set to ${mod.pmc.lootNValue}`); + } + + if (mod.pmc.convertIntoPmcChance.assault.min != 15 || mod.pmc.convertIntoPmcChance.assault.max != 40 + || mod.pmc.convertIntoPmcChance.cursedassault.min != 15 || mod.pmc.convertIntoPmcChance.cursedassault.max != 40 + || mod.pmc.convertIntoPmcChance.pmcbot.min != 15 || mod.pmc.convertIntoPmcChance.pmcbot.max != 30 + || mod.pmc.convertIntoPmcChance.exusec.min != 15 || mod.pmc.convertIntoPmcChance.exusec.max != 20) + { + this.botConfig.pmc.convertIntoPmcChance.assault.min = mod.pmc.convertIntoPmcChance.assault.min; + this.botConfig.pmc.convertIntoPmcChance.assault.max = mod.pmc.convertIntoPmcChance.assault.max; + this.botConfig.pmc.convertIntoPmcChance.cursedassault.min = mod.pmc.convertIntoPmcChance.cursedassault.min; + this.botConfig.pmc.convertIntoPmcChance.cursedassault.max = mod.pmc.convertIntoPmcChance.cursedassault.max; + this.botConfig.pmc.convertIntoPmcChance.pmcbot.min = mod.pmc.convertIntoPmcChance.pmcbot.min; + this.botConfig.pmc.convertIntoPmcChance.pmcbot.max = mod.pmc.convertIntoPmcChance.pmcbot.max; + this.botConfig.pmc.convertIntoPmcChance.exusec.min = mod.pmc.convertIntoPmcChance.exusec.min; + this.botConfig.pmc.convertIntoPmcChance.exusec.max = mod.pmc.convertIntoPmcChance.exusec.max; + this.logger.info("Chance to Convert Bots into PMC Patched"); + } + + // Make all bosses spawn chance configurable. + const locations = this.tables.locations; + + if (mod.bossChance.activated) + { + for (const i in locations) + { + if (i !== "base") + { + if (locations[i].base.BossLocationSpawn !== []) + { + for (const x in locations[i].base.BossLocationSpawn) + { + locations[i].base.BossLocationSpawn[x].BossChance = mod.bossChance.chance; + this.logger.info(`Boss Chance set to ${mod.bossChance.chance}`) + } + } + } + } + } + + // Prewipe Events + if (this.modConfig.prewipe_events.killaOnFactory) + { + const killaWave = this.botConfig.other.createBossWave("bossKilla", 100, "followerBully", 0, locations.factory4_day.base.OpenZones); + this.tables.locations.factory4_day.base.BossLocationSpawn.push(killaWave); + locations.factory4_night.base.BossLocationSpawn.push(killaWave); + this.logger.info("Killa Prewipe Event Enabled"); + } + + if (this.modConfig.prewipe_events.allBossesOnReserve) + { + let bossWave = this.botConfig.other.createBossWave("bossKilla", 100, "followerBully", 0, locations.rezervbase.base.OpenZones); + locations.rezervbase.base.BossLocationSpawn.push(bossWave); + bossWave = this.botConfig.other.createBossWave("bossBully", 100, "followerBully", 4, locations.rezervbase.base.OpenZones); + locations.rezervbase.base.BossLocationSpawn.push(bossWave); + bossWave = this.botConfig.other.createBossWave("bossKojaniy", 100, "followerKojaniy", 2, locations.rezervbase.base.OpenZones); + locations.rezervbase.base.BossLocationSpawn.push(bossWave); + bossWave = this.botConfig.other.createBossWave("bossSanitar", 100, "followerSanitar", 2, locations.rezervbase.base.OpenZones); + locations.rezervbase.base.BossLocationSpawn.push(bossWave); + this.logger.info("Bosses On Reserve Prewipe Event Enabled"); + } + + if (this.modConfig.prewipe_events.glukharOnLabs) + { + const glugluWave: BossLocationSpawn = { + "BossName": "bossGluhar", + "BossChance": 43, + "BossZone": "ZoneRailStrorage,ZoneRailStrorage,ZoneRailStrorage,ZonePTOR1,ZonePTOR2,ZoneBarrack,ZoneBarrack,ZoneBarrack,ZoneSubStorage", + "BossPlayer": false, + "BossDifficult": "normal", + "BossEscortType": "followerGluharAssault", + "BossEscortDifficult": "normal", + "BossEscortAmount": "0", + "Time": -1, + "TriggerId": "", + "TriggerName": "", + "Supports": [ + { + "BossEscortType": "followerGluharAssault", + "BossEscortDifficult": [ + "normal" + ], + "BossEscortAmount": "2" + }, + { + "BossEscortType": "followerGluharSecurity", + "BossEscortDifficult": [ + "normal" + ], + "BossEscortAmount": "2" + }, + { + "BossEscortType": "followerGluharScout", + "BossEscortDifficult": [ + "normal" + ], + "BossEscortAmount": "2" + } + ] + } + + glugluWave.BossZone = locations.laboratory.base.OpenZones; + locations.laboratory.base.BossLocationSpawn.push(glugluWave); + this.logger.info("Glukhar On Labs Prewipe Event Enabled"); + } + + // All cheap items on traders + if (this.modConfig.prewipe_events.allTradersSellCheapItems) + { + this.logger.info("Cheap Items On Traders Prewipe Event Enabled"); + for (const trader in this.traders) + { + for (const assort in this.traders[trader].assort.barter_scheme) + { + const itemScheme = this.traders[trader].assort.barter_scheme[assort]; + switch (itemScheme[0][0]._tpl) + { + case Money.ROUBLES: + itemScheme[0][0].count = itemScheme[0][0].count * 0.01; + break; + case Money.DOLLARS: + itemScheme[0][0].count = itemScheme[0][0].count * 0.1; + break; + case Money.EUROS: + itemScheme[0][0].count = itemScheme[0][0].count * 0.05; + break; + default: + break; + + } + } + } + } + + if (this.modConfig.prewipe_events.makeObdolbosPowerful) + { + const obdolbosBuff = [ + { + "BuffType": "StaminaRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": 0.5, + "AbsoluteValue": true, + "SkillName": "" + }, + { + "BuffType": "SkillRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": 10, + "AbsoluteValue": true, + "SkillName": "Endurance" + }, + { + "BuffType": "SkillRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": 10, + "AbsoluteValue": true, + "SkillName": "Strength" + }, + { + "BuffType": "SkillRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": 20, + "AbsoluteValue": true, + "SkillName": "StressResistance" + }, + { + "BuffType": "SkillRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": 20, + "AbsoluteValue": true, + "SkillName": "Charisma" + }, + { + "BuffType": "SkillRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": -20, + "AbsoluteValue": true, + "SkillName": "Memory" + }, + { + "BuffType": "SkillRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": -20, + "AbsoluteValue": true, + "SkillName": "Intellect" + }, + { + "BuffType": "SkillRate", + "Chance": 1, + "Delay": 1, + "Duration": 1800, + "Value": -20, + "AbsoluteValue": true, + "SkillName": "Attention" + }, + { + "BuffType": "Pain", + "Chance": 0.25, + "Delay": 1, + "Duration": 1800, + "Value": 0, + "AbsoluteValue": false, + "SkillName": "" + }, + { + "BuffType": "StomachBloodloss", + "Chance": 0.25, + "Delay": 1, + "Duration": 1800, + "Value": 0, + "AbsoluteValue": false, + "SkillName": "" + }, + { + "BuffType": "HydrationRate", + "Chance": 0.25, + "Delay": 1, + "Duration": 1800, + "Value": -0.05, + "AbsoluteValue": true, + "SkillName": "" + }, + { + "BuffType": "EnergyRate", + "Chance": 0.25, + "Delay": 1, + "Duration": 1800, + "Value": -0.05, + "AbsoluteValue": true, + "SkillName": "" + }, + { + "BuffType": "DamageModifier", + "Chance": 0.25, + "Delay": 1, + "Duration": 1800, + "Value": 0.2, + "AbsoluteValue": false, + "SkillName": "" + }, + { + "BuffType": "QuantumTunnelling", + "Chance": 0.25, + "Delay": 1, + "Duration": 1800, + "Value": 0, + "AbsoluteValue": false, + "SkillName": "" + }] + + this.tables.globals.config.Health.Effects.Stimulator.Buffs.Buffs_Obdolbos = obdolbosBuff; + this.logger.info("Make Obdolbos Powerful Prewipe Event Enabled"); + } } - /** - * Changes Bot Difficulty. - * - * Options for PMC are Easy, Normal, Hard, Impossible, As Online. - * - * Options for Scav are Easy, Medium, Hard, Impossible, As Online. - * - * String formatting: "Normal". - * @param botConfig SPT Bot Config - */ - private pmcDifficulty(): void + private containersOnPMCs(): void { - this.botConfig.pmc.difficulty = this.modConfig.bots.pmcDifficulty; - } - - private containersOnBots(): void - { - const spawnPoints = this.tables.bots.types; - const usec = spawnPoints.usec.inventory.items.Backpack; - const bear = spawnPoints.bear.inventory.items.Backpack; + const usec = this.tables.bots.types.usec.inventory.items.Backpack; + const bear = this.tables.bots.types.bear.inventory.items.Backpack; usec.push(...this.containers()); bear.push(...this.containers()); @@ -100,79 +365,39 @@ export class Bots dynaLoot.push("5795f317245977243854e041"); } - private isUsec(): void - { - this.botConfig.pmc.isUsec = this.modConfig.bots.isUsec; - } - - private pmcLoot(): void - { - this.botConfig.pmc.maxBackpackLootTotalRub = this.modConfig.bots.maxBackpackLootTotalRub; - this.botConfig.pmc.maxPocketLootTotalRub = this.modConfig.bots.maxPocketLootTotalRub; - this.botConfig.pmc.maxVestLootTotalRub = this.modConfig.bots.maxVestLootTotalRub; - } - - private sameSideIsHostile(): void - { - this.botConfig.pmc.chanceSameSideIsHostilePercent = this.modConfig.bots.chanceSameSideIsHostilePercent; - } - - private maxBotCap(): void - { - this.botConfig.maxBotCap = this.modConfig.bots.maxBotCap; - } - - private lootNValue(): void - { - this.botConfig.lootNValue.scav = this.modConfig.bots.scavNValue; - this.botConfig.lootNValue.pmc = this.modConfig.bots.pmcNValue; - } - - private containers(): any[] { /* Container "id"s * * S I C C pouch: 5d235bb686f77443f4331278 - * * Magazine Case: 5c127c4486f7745625356c13 - * * Weapon Case: 59fb023c86f7746d0d4b423c - * * T H I C C Weapon Case: 5b6d9ce188a4501afc1b2b25 - * * Item Case: 59fb042886f7746c5005a7b2 - * * T H I C C Item Case: 5c0a840b86f7742ffa4f2482 - * * Money case: 59fb016586f7746d0d4b423a - * * Mr Holodilnick Thermal Bag: 5c093db286f7740a1b2617e3 - * * Medicine case: 5aafbcd986f7745e590fff23 - * * Lucky scav junkbox: 5b7c710788a4506dec015957 - * * Grenade case: 5e2af55f86f7746d4159f07c - * + * Ammunition case: 5aafbde786f774389d0cbc0f + * Documents case: 590c60fc86f77412b13fddcf + * Key tool: 59fafd4b86f7745ca07e123 + * Injector case: 619cbf7d23893217ec30b689 + * Dogtag case: 5c093e3486f77430cb02e593 + * Keycard holder: 619cbf9e0a7c3a1a2731940a + * WZ Wallet: 60b0f6c058e0b0481a09ad11 + * Pistol case: 567143bf4bdc2d1a0f8b4567 * Secure container: 5448bf274bdc2dfc2f8b456a + * Kappa container: 5c093ca986f7740a1867ab12 + * Gamme container: 60b0f6c058e0b0481a09ad11 */ - const lootItems = []; - lootItems.push({"tpl": "5d235bb686f77443f4331278", "relativeProbability": 12}); - lootItems.push({"tpl": "5c127c4486f7745625356c13", "relativeProbability": 25}); - lootItems.push({"tpl": "59fb023c86f7746d0d4b423c", "relativeProbability": 13}); - lootItems.push({"tpl": "5b6d9ce188a4501afc1b2b25", "relativeProbability": 10}); - lootItems.push({"tpl": "59fb042886f7746c5005a7b2", "relativeProbability": 13}); - lootItems.push({"tpl": "5c0a840b86f7742ffa4f2482", "relativeProbability": 10}); - lootItems.push({"tpl": "59fb016586f7746d0d4b423a", "relativeProbability": 25}); - lootItems.push({"tpl": "5c093db286f7740a1b2617e3", "relativeProbability": 30}); - lootItems.push({"tpl": "5aafbcd986f7745e590fff23", "relativeProbability": 30}); - lootItems.push({"tpl": "5b7c710788a4506dec015957", "relativeProbability": 15}); - lootItems.push({"tpl": "5e2af55f86f7746d4159f07c", "relativeProbability": 23}); - lootItems.push({"tpl": "5448bf274bdc2dfc2f8b456a", "relativeProbability": 9}); - + const lootItems = ["5d235bb686f77443f4331278","5c127c4486f7745625356c13","59fb023c86f7746d0d4b423c","5b6d9ce188a4501afc1b2b25","59fb042886f7746c5005a7b2","5c0a840b86f7742ffa4f2482", + "59fb016586f7746d0d4b423a","5c093db286f7740a1b2617e3","5aafbcd986f7745e590fff23","5b7c710788a4506dec015957","5e2af55f86f7746d4159f07c","5448bf274bdc2dfc2f8b456a","5c093ca986f7740a1867ab12", + "5aafbde786f774389d0cbc0f","590c60fc86f77412b13fddcf","59fafd4b86f7745ca07e1232","619cbf7d23893217ec30b689","619cbf9e0a7c3a1a2731940a","5c093e3486f77430cb02e593","60b0f6c058e0b0481a09ad11", + "567143bf4bdc2d1a0f8b4567","60b0f6c058e0b0481a09ad11","59db794186f77448bc595262","5857a8b324597729ab0a0e7d"] + return lootItems; } - -} \ No newline at end of file +} diff --git a/Valens-AIO/src/flea.ts b/Valens-AIO/src/flea.ts index 7a5bb55..0473d6a 100644 --- a/Valens-AIO/src/flea.ts +++ b/Valens-AIO/src/flea.ts @@ -1,114 +1,81 @@ import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { IRagfairConfig } from "@spt-aki/models/spt/config/IRagfairConfig"; +import { Logger } from "./logger"; export class Flea { private modConfig = require("../config/config.json"); - private logger: ILogger; + private logger: Logger; private ragfairConfig: IRagfairConfig; private tables: IDatabaseTables; - constructor (logger: ILogger, ragfairConfig: IRagfairConfig, tables: IDatabaseTables) + constructor (logger: Logger, ragfairConfig: IRagfairConfig, tables: IDatabaseTables) { this.logger = logger; this.ragfairConfig = ragfairConfig; this.tables = tables; } + + public updateFlea(): void { - if (this.modConfig.flea.minUserLevel != 15) + const mod = this.modConfig.flea; + const global = this.tables.globals.config.RagFair; + const ragfair = this.ragfairConfig.dynamic; + + if (mod.minUserLevel != 15) { - this.ragfairLevel(); - this.logger.info(`Fleamarket unlocked at level ${this.modConfig.flea.minUserLevel}`) + global.minUserLevel = mod.minUserLevel; + this.logger.info(`Fleamarket unlocked at level ${mod.minUserLevel}`) } - const time = this.modConfig.flea.time; - if (time.baseSellTime != 15 || time.minSellTime != 5 || time.maxSellTime != 15) - { - this.ragfairTime(); - this.logger.info("Fleamarket Sell Times patched"); + + if (!mod.blacklist.enableBsgList || !mod.blacklist.enableQuestList) + { + ragfair.blacklist.enableBsgList = mod.blacklist.enableBsgList; + ragfair.blacklist.enableQuestList = mod.blacklist.enableQuestList; + this.logger.info("Fleamarket Blacklists patched"); } - const currency = this.modConfig.flea.currencies; - if (currency.roubles != 78 || currency.dollars != 20 || currency.euros != 2) + if (mod.condition.conditionChance != 0.2 || mod.condition.min != 0.6 || mod.condition.max != 1) + { + ragfair.condition.conditionChance = mod.conditionChance; + ragfair.condition.min = mod.min; + ragfair.condition.max = mod.max; + this.logger.info("Fleamarket Condition patched"); + } + + if (mod.currencies.roubles != 78 || mod.currencies.dollars != 20 || mod.currencies.euros != 2) { - this.ragfairCurrencies(); + ragfair.currencies["5449016a4bdc2d6f028b456f"] = mod.currencies.roubles; + ragfair.currencies["5696686a4bdc2da3298b456a"] = mod.currencies.dollars; + ragfair.currencies["569668774bdc2da2298b4568"] = mod.currencies.euros; this.logger.info("Fleamarket Currencies patched") } - const rep = this.modConfig.flea.reputation; - if (rep.gain != 0.0000002 || rep.loss != 0.0000002) + if (mod.offerItemCount.min != 8 || mod.offerItemCount.max != 15) { - this.ragfairReputation(); - this.logger.info("Fleamarket Reputation patched"); - } - - const count = this.modConfig.flea.offerItemCount; - if (count.min != 8 || count.max != 15) - { - this.ragfairOfferItemCount(); + ragfair.offerItemCount.min = mod.offerItemCount.min; + ragfair.offerItemCount.max = mod.offerItemCount.max; this.logger.info("Fleamarket Offer Item Count patched"); } - const condition = this.modConfig.flea.condition; - if (condition.conditionChance != 0.2 || condition.min != 0.6 || condition.max != 1) + if (mod.reputation.gain != 0.0000002 || mod.reputation.loss != 0.0000002) { - this.ragfairItemCondition(); - this.logger.info("Fleamarket Item Condition patched"); + ragfair.offerItemCount.min = mod.offerItemCount.min; + ragfair.offerItemCount.max = mod.offerItemCount.max; + this.logger.info("Fleamarket Reputation patched"); } - const list = this.modConfig.flea.blacklist; - if (!list.enableBsgList || !list.enableQuestList) + if (mod.time.baseSellTime != 15 || mod.time.minSellTime != 5 || mod.time.maxSellTime != 15) { - this.ragfairBlacklist(); - this.logger.info("Fleamarket Blacklists patched"); + const sell = this.ragfairConfig.sell; + sell.time.base = mod.time.baseSellTime; + sell.time.min = mod.time.minSellTime; + sell.time.max = mod.time.maxSellTime; + this.logger.info("Fleamarket Sell Times patched"); } } - - private ragfairLevel(): void - { - this.tables.globals.config.RagFair.minUserLevel = this.modConfig.flea.minUserLevel; - } - - private ragfairTime(): void - { - this.ragfairConfig.sell.time.base = this.modConfig.flea.time.baseSellTime; - this.ragfairConfig.sell.time.min = this.modConfig.flea.time.minSellTime; - this.ragfairConfig.sell.time.max = this.modConfig.flea.time.maxSellTime; - } - - private ragfairReputation(): void - { - this.ragfairConfig.sell.reputation.gain = this.modConfig.flea.reputation.gain; - this.ragfairConfig.sell.reputation.loss = this.modConfig.flea.reputation.loss; - } - - private ragfairOfferItemCount(): void - { - this.ragfairConfig.dynamic.offerItemCount.min = this.modConfig.flea.offerItemCount.min; - this.ragfairConfig.dynamic.offerItemCount.max = this.modConfig.flea.offerItemCount.max; - } - - private ragfairItemCondition(): void - { - this.ragfairConfig.dynamic.condition.conditionChance = this.modConfig.flea.conditionChance; - this.ragfairConfig.dynamic.condition.min = this.modConfig.flea.min; - this.ragfairConfig.dynamic.condition.max = this.modConfig.flea.max; - } - - public ragfairCurrencies(): void - { - this.ragfairConfig.dynamic.currencies["5449016a4bdc2d6f028b456f"] = this.modConfig.flea.currencies.roubles; - this.ragfairConfig.dynamic.currencies["5696686a4bdc2da3298b456a"] = this.modConfig.flea.currencies.dollars; - this.ragfairConfig.dynamic.currencies["569668774bdc2da2298b4568"] = this.modConfig.flea.currencies.euros; - } - - private ragfairBlacklist(): void - { - this.ragfairConfig.dynamic.blacklist.enableBsgList = this.modConfig.flea.blacklist.enableBsgList; - this.ragfairConfig.dynamic.blacklist.enableQuestList = this.modConfig.flea.blacklist.enableQuestList; - } } diff --git a/Valens-AIO/src/globals.ts b/Valens-AIO/src/globals.ts index 2a52db7..06175eb 100644 --- a/Valens-AIO/src/globals.ts +++ b/Valens-AIO/src/globals.ts @@ -1,51 +1,64 @@ -import { Falling } from "@spt-aki/models/eft/common/IGlobals"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; +import { Logger } from "./logger"; export class Globals { private modConfig = require("../config/config.json"); - private logger: ILogger; + private logger: Logger; private databaseServer: DatabaseServer; - private globals: Falling - constructor(logger: ILogger, databaseServer: DatabaseServer) + constructor(logger: Logger, databaseServer: DatabaseServer) { this.logger = logger; this.databaseServer = databaseServer; - this.globals = this.databaseServer.getTables().globals.config.Health.Falling; } public updateGlobals(): void { - if (this.modConfig.globals.damagePerMeter != 9 || this.modConfig.globals.safeHeight != 3) + const mod = this.modConfig.globals; + const global = this.databaseServer.getTables().globals; + + if (mod.damagePerMeter != 9 || mod.safeHeight != 3) { - this.damagePerMeter(); - this.safeHeight(); - this.logger.info(`Safe Fall Height set to ${this.modConfig.globals.safeHeight} meters`); - this.logger.info(`Damage Per Meter set to ${this.modConfig.globals.damagePerMeter} meters`) + global.config.Health.Falling.DamagePerMeter = mod.damagePerMeter; + global.config.Health.Falling.SafeHeight = mod.safeHeight; + this.logger.info(`Safe Fall Height set to ${mod.safeHeight} meters`); + this.logger.info(`Damage Per Meter set to ${mod.damagePerMeter} meters`) } - if (this.modConfig.globals.maxTraders) + if (mod.maxLoyaltyTraders) { - this.maxTraders(); - this.logger.info(`Max Loyalty Traders is: ${this.modConfig.globals.maxTraders}`); + global.config.MaxLoyaltyLevelForAll = mod.maxLoyaltyTraders; + this.logger.info(`Max Loyalty Traders is: ${mod.maxLoyaltyTraders}`); + } + + if (mod.timeBeforeDeployLocal != 10) + { + global.config.TimeBeforeDeployLocal = mod.timeBeforeDeployLocal; + this.logger.info(`Time Before Deploy set to: ${mod.timeBeforeDeployLocal}`); + } + + if (mod.match_end.survived_exp_requirement != 200 || mod.match_end.survived_seconds_requirement != 420 || mod.match_end.survived_exp_reward != 300 + || mod.match_end.mia_exp_reward != 200 || mod.match_end.runner_exp_reward != 200 || mod.match_end.leftMult != 0 + || mod.match_end.miaMult != 1 || mod.match_end.survivedMult != 1.3 || mod.match_end.runnerMult != 0.5 + || mod.match_end.killedMult != 1 || mod.match_end.headShotMult != 1.2 || mod.match_end.expOnDamageAllHealth != 50) + { + const global1 = this.databaseServer.getTables().globals.config.exp.match_end; + const mod = this.modConfig.globals.match_end; + + global1.survived_exp_requirement = mod.survived_exp_requirement; + global1.survived_seconds_requirement = mod.survived_seconds_requirement; + global1.survived_exp_reward = mod.survived_exp_reward; + global1.mia_exp_reward = mod.mia_exp_reward; + global1.runner_exp_reward = mod.runner_exp_reward; + global1.leftMult = mod.leftMult; + global1.miaMult = mod.miaMult; + global1.survivedMult = mod.survivedMult; + global1.runnerMult = mod.runnerMult; + global1.killedMult = mod.killedMult; + this.databaseServer.getTables().globals.config.exp.kill.headShotMult = mod.headShotMult; + this.databaseServer.getTables().globals.config.exp.kill.expOnDamageAllHealth = mod.expOnDamageAllHealth; + this.logger.info("Match End Globals Patched"); } } - - private damagePerMeter(): void - { - this.globals.DamagePerMeter = this.modConfig.globals.damagePerMeter; - } - - private safeHeight(): void - { - this.globals.SafeHeight = this.modConfig.globals.safeHeight; - } - - private maxTraders(): void - { - this.databaseServer.getTables().globals.config.MaxLoyaltyLevelForAll = this.modConfig.globals.maxTraders; - } - -} \ No newline at end of file +} diff --git a/Valens-AIO/src/hideout.ts b/Valens-AIO/src/hideout.ts index 29faf43..ee6f4e0 100644 --- a/Valens-AIO/src/hideout.ts +++ b/Valens-AIO/src/hideout.ts @@ -1,14 +1,13 @@ -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; +import { Logger } from "./logger"; export class Hideout { private modConfig = require("../config/config.json") - private logger: ILogger; + private logger: Logger; private databaseServer: DatabaseServer; - private hideout: {constructionTime: number; productionTime: number; scavCaseTime: number; airFilterUnitFlowRate: number; generatorFuelFlowRate: number; gpuBoostRate: number; }; - constructor(logger: ILogger, databaseServer: DatabaseServer) + constructor(logger: Logger, databaseServer: DatabaseServer) { this.logger = logger; this.databaseServer = databaseServer; @@ -16,32 +15,37 @@ export class Hideout public updateHideout(): void { - if (this.modConfig.hideout.constructionTime != 1) + const mod = this.modConfig.hideout; + + if (mod.constructionTime != 1) { this.updateConstructionTime(); - this.logger.info(`Construction Time Patched to ${this.modConfig.hideout.constructionTime} `); + this.logger.info(`Construction Time Patched to ${mod.constructionTime} `); } - if (this.modConfig.hideout.productionTime != 1) + if (mod.productionTime != 1) { this.updateProductionTime(); - this.logger.info(`Production Time Patched to ${this.modConfig.hideout.productionTime} `); + this.logger.info(`Production Time Patched to ${mod.productionTime} `); } - if (this.modConfig.hideout.scavCaseTime != 1) + if (mod.scavCaseTime != 1) { this.updateScavCase(); - this.logger.info(`Scav Case TIme Patched to ${this.modConfig.hideout.scavCaseTime}`); + this.logger.info(`Scav Case TIme Patched to ${mod.scavCaseTime}`); } - if (this.modConfig.hideout.airFilterUnitFlowRate != 0.0047222222222222 - ||this.modConfig.hideout.generatorFuelFlowRate != 0.0013194444444444 - ||this.modConfig.hideout.gpuBoostRate != 0.041225) + if (mod.airFilterUnitFlowRate != 0.0047222222222222 + ||mod.generatorFuelFlowRate != 0.0013194444444444 + ||mod.gpuBoostRate != 0.041225) { - this.updateSettings(); - this.logger.info(`Air Filter Flow Rate set to ${this.modConfig.hideout.airFilterUnitFlowRate}`); - this.logger.info(`Generator Fuel Flow Rate set to ${this.modConfig.hideout.generatorFuelFlowRate}`); - this.logger.info(`GPU Boost Rate set to ${this.modConfig.hideout.gpuBoostRate}`); + const settings = this.databaseServer.getTables().hideout.settings; + settings.airFilterUnitFlowRate = mod.airFilterUnitFlowRate; + settings.generatorFuelFlowRate = mod.generatorFuelFlowRate; + settings.gpuBoostRate = mod.gpuBoostRate; + this.logger.info(`Air Filter Flow Rate set to ${mod.airFilterUnitFlowRate}`); + this.logger.info(`Generator Fuel Flow Rate set to ${mod.generatorFuelFlowRate}`); + this.logger.info(`GPU Boost Rate set to ${mod.gpuBoostRate}`); } } @@ -73,16 +77,4 @@ export class Hideout scavCase.ProductionTime *= this.modConfig.hideout.scavCaseTime; } } - - private updateSettings() - { - const settings = this.databaseServer.getTables().hideout.settings; - settings.airFilterUnitFlowRate = this.modConfig.hideout.airFilterUnitFlowRate; - settings.generatorFuelFlowRate = this.modConfig.hideout.generatorFuelFlowRate; - settings.gpuBoostRate = this.modConfig.hideout.gpuBoostRate; - } - - - - -} \ No newline at end of file +} diff --git a/Valens-AIO/src/insurance.ts b/Valens-AIO/src/insurance.ts index f1e4377..1c9ae92 100644 --- a/Valens-AIO/src/insurance.ts +++ b/Valens-AIO/src/insurance.ts @@ -1,14 +1,14 @@ -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { IInsuranceConfig } from "@spt-aki/models/spt/config/IInsuranceConfig"; +import { Logger } from "./logger"; export class Insurance { private modConfig = require("../config/config.json"); - private logger: ILogger; + private logger: Logger; private insuranceConfig: IInsuranceConfig; - constructor(logger:ILogger, insuranceConfig: IInsuranceConfig) + constructor(logger:Logger, insuranceConfig: IInsuranceConfig) { this.logger = logger; this.insuranceConfig = insuranceConfig; @@ -16,31 +16,21 @@ export class Insurance public updateInsurance(): void { - const insMult = this.modConfig.insurance.insuranceMultiplier - if (insMult.prapor != 0.16 || insMult.therapist != 0.25) - { - this.insureMult(); - this.logger.info(`Prapor Insurance Price Multiplier Set to ${insMult.prapor}`); - } this.logger.info(`Therapist Insurance Price Multiplier Set to ${insMult.therapist}`); + const mod = this.modConfig.insurance; - const insReturn = this.modConfig.insurance.returnChancePercent - if (insReturn.prapor != 80 || insReturn.therapist != 85) + if (mod.insuranceMultiplier.prapor != 0.16 || mod.insuranceMultiplier.therapist != 0.25) { - this.insureReturn(); - this.logger.info(`Prapor Insurance Return Chance Set to ${this.modConfig.insurance.returnChancePercent.prapor}`); - this.logger.info(`Therapist Insurance Return Chance set to ${this.modConfig.insurance.returnChancePercent.therapist}`); + this.insuranceConfig.insuranceMultiplier["54cb50c76803fa8b248b4571"] = mod.insuranceMultiplier.prapor; + this.insuranceConfig.insuranceMultiplier["54cb57776803fa99248b456e"] = mod.insuranceMultiplier.therapist; + this.logger.info(`Prapor Insurance Price Multiplier Set to ${mod.insuranceMultiplier.prapor}`); + } this.logger.info(`Therapist Insurance Price Multiplier Set to ${mod.insuranceMultiplier.therapist}`); + + if (mod.returnChancePercent.prapor != 80 || mod.returnChancePercent.therapist != 85) + { + this.insuranceConfig.returnChancePercent["54cb50c76803fa8b248b4571"] = mod.returnChancePercent.prapor; + this.insuranceConfig.returnChancePercent["54cb57776803fa99248b456e"] = mod.returnChancePercent.therapist; + this.logger.info(`Prapor Insurance Return Chance Set to ${mod.returnChancePercent.prapor}`); + this.logger.info(`Therapist Insurance Return Chance set to ${mod.returnChancePercent.therapist}`); } } - - private insureMult(): void - { - this.insuranceConfig.insuranceMultiplier["54cb50c76803fa8b248b4571"] = this.modConfig.insurance.insuranceMultiplier.prapor; - this.insuranceConfig.insuranceMultiplier["54cb57776803fa99248b456e"] = this.modConfig.insurance.insuranceMultiplier.therapist; - } - - private insureReturn(): void - { - this.insuranceConfig.returnChancePercent["54cb50c76803fa8b248b4571"] = this.modConfig.insurance.returnChancePercent.prapor; - this.insuranceConfig.returnChancePercent["54cb57776803fa99248b456e"] = this.modConfig.insurance.returnChancePercent.therapist; - } } diff --git a/Valens-AIO/src/items.ts b/Valens-AIO/src/items.ts index b46ffbf..be33d78 100644 --- a/Valens-AIO/src/items.ts +++ b/Valens-AIO/src/items.ts @@ -1,13 +1,13 @@ -import { ILogger } from "@spt-aki/models/spt/utils/ILogger" import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; +import { Logger } from "./logger"; export class Items { private modConfig = require("../config/config.json") - private logger: ILogger; + private logger: Logger; private databaseServer: DatabaseServer; - constructor(logger: ILogger, databaseServer: DatabaseServer) + constructor(logger: Logger, databaseServer: DatabaseServer) { this.logger = logger; this.databaseServer = databaseServer; @@ -15,78 +15,94 @@ export class Items public updateItems(): void { - if (this.modConfig.items.weightModifier != 1) + + const items = Object.values(this.databaseServer.getTables().templates.items); + const mod = this.modConfig.items; + + // Weight Modifier. Multiplier of Weight *= modConfig.weightModifier + if (mod.weightModifier != 1) { this.updateWeight(); - this.logger.info(`Weight Multipler patched to ${this.modConfig.items.weightModifier}`); + this.logger.info(`Weight Multipler patched to ${mod.weightModifier}`); } - if (this.modConfig.items.removeBackpackFilter) + // Removes the ExcludedFilter on Backpacks + // which in turn enables common containers to spawn in the loot pool of AI. + if (mod.removeBackpackFilter) { this.updateBackpacks(); - this.logger.info(`Backpack Restrictions Removed: ${this.modConfig.items.removeBackpackFilter}`) + this.logger.info(`Backpack Restrictions Removed: ${mod.removeBackpackFilter}`) } - if (this.modConfig.items.standardStash.vertical != 28 || this.modConfig.items.standardStash.horizontal != 10) + // Standard Stash Size Changes + if (mod.standardStash.vertical != 28 || mod.standardStash.horizontal != 10) + { + items["566abbc34bdc2d92178b4576"]._grids._props.cellsV = mod.standardStash.vertical; + items["566abbc34bdc2d92178b4576"]._grids._props.cellsH = mod.standardStash.horizontal; + this.logger.info(`Standard Stash Vertical changed to ${mod.standardStash.vertical}`); + this.logger.info(`Standard Stash Horizontal changed to ${mod.tandardStash.horizontal}`); + } + + // Left Behind Stash Size Changes + if (mod.behindStash.vertical != 38 || mod.behindStash.horizontal != 10) + { + items["5811ce572459770cba1a34ea"]._grids._props.cellsV = mod.behindStash.vertical; + items["5811ce572459770cba1a34ea"]._grids._props.cellsH = mod.behindStash.horizontal; + this.logger.info(`Left Behind Stash Vertical changed to ${mod.behindStash.vertical}`); + this.logger.info(`Left Behind Stash Horizontal changed to ${mod.behindStash.horizontal}`); + } + + // Prepare for Escape Stash Size Changes + if (mod.escapeStash.vertical != 48 || mod.escapeStash.horizontal != 10) + { + items["5811ce662459770f6f490f32"]._grids._props.cellsV = mod.escapeStash.vertical; + items["5811ce662459770f6f490f32"]._grids._props.cellsH = mod.escapeStash.horizontal; + this.logger.info(`Prepare for Escape Stash Vertical changed to ${mod.escapeStash.vertical}`); + this.logger.info(`Prepare for Escape Stash Horizontal changed to ${mod.escapeStash.horizontal}`); + } + + // Edge of Darkness Stash Size Changes + if (mod.eodStash.vertical != 68 || mod.eodStash.horizontal != 10) { - this.standardStash(); - this.logger.info(`Standard Stash Vertical changed to ${this.modConfig.items.standardStash.vertical}`); - this.logger.info(`Standard Stash Horizontal changed to ${this.modConfig.items.standardStash.horizontal}`); + items["5811ce772459770e9e5f9532"]._grids._props.cellsV = mod.eodStash.vertical; + items["5811ce772459770e9e5f9532"]._grids._props.cellsH = mod.eodStash.horizontal; + this.logger.info(`Edge of Darkness Stash Vertical changed to ${mod.eodStash.vertical}`); + this.logger.info(`Edge of Darkness Stash Horizontal changed to ${mod.eodStash.horizontal}`); } - if (this.modConfig.items.behindStash.vertical != 38 || this.modConfig.items.behindStash.horizontal != 10) + // Toggles true/false the Examined By Default config on all items in database/templates/items.json + if (mod.examinedByDefault) { - this.behindStash(); - this.logger.info(`Left Behind Stash Vertical changed to ${this.modConfig.items.behindStash.vertical}`); - this.logger.info(`Left Behind Stash Horizontal changed to ${this.modConfig.items.behindStash.horizontal}`); + this.examinedByDefault(); + this.logger.info(`Examined By Default is ${mod.examinedByDefault}`); } - if (this.modConfig.items.escapeStash.vertical != 48 || this.modConfig.items.escapeStash.horizontal != 10) + // Roubles Max Stack + if (mod.roublesMaxStack != 500000) { - this.escapeStash(); - this.logger.info(`Prepare for Escape Stash Vertical changed to ${this.modConfig.items.escapeStash.vertical}`); - this.logger.info(`Prepare for Escape Stash Horizontal changed to ${this.modConfig.items.escapeStash.horizontal}`); + items["5449016a4bdc2d6f028b456f"]._props.StackMaxSize = mod.roublesMaxStack; + this.logger.info(`Rouble Max Stack set to ${mod.roublesMaxStack}`); } - - if (this.modConfig.items.eodStash.vertical != 68 || this.modConfig.items.eodStash.horizontal != 10) + + // Dollars Max Stack + if (mod.dollarsMaxStack != 50000) { - this.eodStash(); - this.logger.info(`Edge of Darkness Stash Vertical changed to ${this.modConfig.items.eodStash.vertical}`); - this.logger.info(`Edge of Darkness Stash Horizontal changed to ${this.modConfig.items.eodStash.horizontal}`); + items["5696686a4bdc2da3298b456a"]._props.StackMaxSize = mod.dollarsMaxStack; + this.logger.info(`Dollar Max Stack set to ${mod.dollarsMaxStack}`); } - if (this.modConfig.items.examineByDefault) + // Euros Max Stack + if (mod.eurosMaxStack != 50000) { - this.examineByDefault(); - this.logger.info(`Examine By Default is ${this.modConfig.items.examineByDefault}`); + items["569668774bdc2da2298b4568"]._props.StackMaxSize = mod.eurosMaxStack; + this.logger.info(`Euro Max Stack set to ${mod.eurosMaxStack}`); } - - if (this.modConfig.items.roublesMaxStack != 500000) - { - this.roublesMaxStack(); - this.logger.info(`Rouble Max Stack set to ${this.modConfig.items.roublesMaxStack}`); - } - - if (this.modConfig.items.dollarsMaxStack != 50000) - { - this.dollarsMaxStack(); - this.logger.info(`Dollar Max Stack set to ${this.modConfig.items.dollarsMaxStack}`); - } - - if (this.modConfig.items.eurosMaxStack != 50000) - { - this.eurosMaxStack(); - this.logger.info(`Euro Max Stack set to ${this.modConfig.items.eurosMaxStack}`); - } - - if (this.modConfig.items.ammoStacks) - { - this.updateAmmoStacks(); - this.logger.info(`Ammo Stacks set to ${this.modConfig.items.ammoStacks}`); - } - } + + // Functions Functions. + + // Updates the weight modifier (as a multiplier) for all items in database/templates/items.json private updateWeight(): void { const items = Object.values(this.databaseServer.getTables().templates.items); @@ -99,6 +115,7 @@ export class Items } } + // Updates backpacks and removes any values in the ExcludedFilter under props > Grids > props > filters > ExcludedFilter in database/templates/items.json private updateBackpacks(): void { const items = Object.values(this.databaseServer.getTables().templates.items); @@ -112,112 +129,13 @@ export class Items } } - private standardStash(): void + // Updates the Examined By Default modifier for all items in database/templates/items.json to either True or False depending on the config value. + private examinedByDefault(): void { const items = Object.values(this.databaseServer.getTables().templates.items); for (const item of items) { - if (item._name === "Standard stash 10x28") - { - item._props.Grids["cellsH"] = this.modConfig.items.standardStash.horizontal; - item._props.Grids["cellsV"] = this.modConfig.items.standardStash.vertical; - } - } - } - - private behindStash(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - if (item._name === "Left Behind stash 10x38") - { - item._props.Grids["cellsH"] = this.modConfig.items.behindStash.horizontal; - item._props.Grids["cellsV"] = this.modConfig.items.behindStash.vertical; - } - } - } - - private escapeStash(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - if (item._name === "Prepare for escape stash 10x48") - { - item._props.Grids["cellsH"] = this.modConfig.items.escapeStash.horizontal; - item._props.Grids["cellsV"] = this.modConfig.items.escapeStash.vertical; - } - } - } - - private eodStash(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - if (item._name === "Edge of darkness stash 10x68") - { - item._props.Grids["cellsH"] = this.modConfig.items.eodStash.horizontal; - item._props.Grids["cellsV"] = this.modConfig.items.eodStash.vertical; - } - } - } - - private examineByDefault(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - item._props.ExaminedByDefault = this.modConfig.items.examineByDefault; - } - } - - private roublesMaxStack(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - if (item._id === "5449016a4bdc2d6f028b456f") - { - item._props.StackMaxSize = this.modConfig.items.roublesMaxStack; - } - } - } - - private dollarsMaxStack(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - if (item._id === "5696686a4bdc2da3298b456a") - { - item._props.StackMaxSize = this.modConfig.items.roublesMaxStack; - } - } - } - - private eurosMaxStack(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - if (item._id === "569668774bdc2da2298b4568") - { - item._props.StackMaxSize = this.modConfig.items.roublesMaxStack; - } - } - } - - private updateAmmoStacks(): void - { - const items = Object.values(this.databaseServer.getTables().templates.items); - for (const item of items) - { - if (item._parent === "5485a8684bdc2da71d8b4567") - { - item._props.StackMaxSize = this.modConfig.items.ammoStacks; - } + item._props.ExaminedByDefault = this.modConfig.items.examinedByDefault; } } } diff --git a/Valens-AIO/src/locations.ts b/Valens-AIO/src/locations.ts new file mode 100644 index 0000000..bdb3644 --- /dev/null +++ b/Valens-AIO/src/locations.ts @@ -0,0 +1,154 @@ +import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; +import { Logger } from "./logger"; + +export class Locations +{ + private modConfig = require("../config/config.json"); + private logger: Logger; + private tables: IDatabaseTables; + + constructor (logger: Logger, databaseServer: DatabaseServer) + { + this.logger = logger; + this.tables = databaseServer.getTables(); + } + + public updateLocations(): void + { + const mod = this.modConfig.locations; + const maps = this.tables.locations; + + // Gives all extracts 100% chance to spawn. + if (mod.allExtractsAvailable) + { + for (const map in maps) + { + if (map.toLowerCase() === "base") + { + continue; + } + + const mapBase = this.tables.locations[map].base; + if (mapBase.Locked === true || mapBase?.EnabledCoop === undefined) + { + continue; + } + + for (const i in mapBase.exits) + { + const exit = mapBase[i]; + exit.Chance = 100; + } + } + this.logger.info("All Extracts Are Available @ 100% Chance"); + } + + // Sets exfil/extract timer to config. + if (mod.exfilTime != 8) + { + for (const map in maps) + { + if (map.toLowerCase() === "base") + { + continue; + } + + const mapBase = this.tables.locations[map].base; + if (mapBase.Locked === true || mapBase?.EnabledCoop === undefined) + { + continue; + } + + for (const i in mapBase.exits) + { + const exit = mapBase[i]; + exit.ExfiltrationTime = mod.exfilTime; + } + } + this.logger.info(`Exfil Time is set to ${mod.exfilTime} seconds`); + } + + // Remove extracts restrictions + if (mod.noExtractRestrictions) + { + for (const i in maps) + { + if (i !== "base") + { + for (const x in maps[i].base.exits) + { + if (maps[i].base.exits[x].Name !== "EXFIL_Train" && + !maps[i].base.exits[x].Name.includes("lab") || + maps[i].base.exits[x].Name === "lab_Vent") + { + if (maps[i].base.exits[x].PassageRequirement !== "None") + { + maps[i].base.exits[x].PassageRequirement = "None"; + } + if (maps[i].base.exits[x].ExfiltrationType !== "Individual") + { + maps[i].base.exits[x].ExfiltrationType = "Individual"; + } + if (maps[i].base.exits[x].Id !== "") + { + maps[i].base.exits[x].Id = ""; + } + if (maps[i].base.exits[x].Count !== 0) + { + maps[i].base.exits[x].Count = 0; + } + if (maps[i].base.exits[x].RequirementTip !== "") + { + maps[i].base.exits[x].RequirementTip = ""; + } + if (maps[i].base.exits[x].RequiredSlot) + { + delete maps[i].base.exits[x].RequiredSlot; + } + } + } + } + } + } + + // Make all extractions of the map available regardless of the infill + if (mod.extractionsExtended) + { + for (const map in maps) + { + switch (map) + { + case "base": + break; + case "bigmap": + for (const extract in maps[map].base.exits) + { + maps[map].base.exits[extract].EntryPoints = "Customs,Boiler Tanks"; + } + break; + case "interchange": + for (const extract in maps[map].base.exits) + { + maps[map].base.exits[extract].EntryPoints = "MallSE,MallNW"; + } + break; + case "shoreline": + for (const extract in maps[map].base.exits) + { + maps[map].base.exits[extract].EntryPoints = "Village,Riverside"; + } + break; + case "woods": + for (const extract in maps[map].base.exits) + { + maps[map].base.exits[extract].EntryPoints = "House,Old Station"; + } + break; + default: + break; + } + } + } + } +} \ No newline at end of file diff --git a/Valens-AIO/src/logger.ts b/Valens-AIO/src/logger.ts new file mode 100644 index 0000000..0b8b494 --- /dev/null +++ b/Valens-AIO/src/logger.ts @@ -0,0 +1,20 @@ +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; + +export class Logger +{ + private modConfig = require("../config/config.json"); + private logger: ILogger; + + constructor (logger: ILogger) + { + this.logger = logger; + } + + public info(text: string, forced = false): void + { + if (this.modConfig.DebugMode || forced) + { + this.logger.info(text); + } + } +} \ No newline at end of file diff --git a/Valens-AIO/src/loot.ts b/Valens-AIO/src/loot.ts index 52ca356..8190f92 100644 --- a/Valens-AIO/src/loot.ts +++ b/Valens-AIO/src/loot.ts @@ -1,57 +1,48 @@ import { ILocationConfig } from "@spt-aki/models/spt/config/ILocationConfig"; import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; +import { Logger } from "./logger"; export class Loot { private modConfig = require("../config/config.json"); - private logger: ILogger; + private logger: Logger; private tables: IDatabaseTables; private locationConfig: ILocationConfig; - constructor (logger: ILogger, databaseServer: DatabaseServer, locationConfig: ILocationConfig) + constructor (logger: Logger, databaseServer: DatabaseServer, locationConfig: ILocationConfig) { this.logger = logger; this.locationConfig = locationConfig; this.tables = databaseServer.getTables(); - this.modConfig = this.modConfig.loot; } public updateLoot(): void { - if (this.modConfig.looseLootMultiplier > 1) + const mod = this.modConfig.loot; + + if (mod.looseLootMultiplier > 1) { - this.looseLootMultiplier(); - this.logger.info(`Loose Loot Multiplier: ${this.modConfig.looseLootMultiplier}`); + for (const map in this.locationConfig.looseLootMultiplier) + { + this.locationConfig.looseLootMultiplier[map] = mod.looseLootMultiplier; + } + this.logger.info(`Loose Loot Multiplier: ${mod.looseLootMultiplier}`); } - if (this.modConfig.staticLootMultiplier > 1) + if (mod.staticLootMultiplier > 1) { - this.staticLootMultiplier(); - this.logger.info(`Static Loot Multiplier: ${this.modConfig.staticLootMultiplier}`); + for (const map in this.locationConfig.staticLootMultiplier) + { + this.locationConfig.staticLootMultiplier[map] = mod.staticLootMultiplier; + } + this.logger.info(`Static Loot Multiplier: ${mod.staticLootMultiplier}`); } - if (this.modConfig.containersInMarkedRoom) + if (mod.containersInMarkedRoom) { this.containersInMarkedRoom(); - this.logger.info(`Containers In Marked Room: ${this.modConfig.containersInMarkedRoom}`); - } - } - - private looseLootMultiplier(): void - { - for (const map in this.locationConfig.looseLootMultiplier) - { - this.locationConfig.looseLootMultiplier[map] = this.modConfig.looseLootMultiplier; - } - } - - private staticLootMultiplier(): void - { - for (const map in this.locationConfig.staticLootMultiplier) - { - this.locationConfig.staticLootMultiplier[map] = this.modConfig.staticLootMultiplier; + this.logger.info(`Containers In Marked Room: ${mod.containersInMarkedRoom}`); } } @@ -104,31 +95,18 @@ export class Loot private containers(): any[] { - /* Container "id"s - * * S I C C pouch: 5d235bb686f77443f4331278 - * * Magazine Case: 5c127c4486f7745625356c13 - * * Weapon Case: 59fb023c86f7746d0d4b423c - * * T H I C C Weapon Case: 5b6d9ce188a4501afc1b2b25 - * * Item Case: 59fb042886f7746c5005a7b2 - * * T H I C C Item Case: 5c0a840b86f7742ffa4f2482 - * * Money case: 59fb016586f7746d0d4b423a - * * Mr Holodilnick Thermal Bag: 5c093db286f7740a1b2617e3 - * * Medicine case: 5aafbcd986f7745e590fff23 - * * Lucky scav junkbox: 5b7c710788a4506dec015957 - * * Grenade case: 5e2af55f86f7746d4159f07c - * * Secure container: 5448bf274bdc2dfc2f8b456a */ @@ -148,9 +126,5 @@ export class Loot return lootItems; } - - } - - \ No newline at end of file diff --git a/Valens-AIO/src/mod.ts b/Valens-AIO/src/mod.ts index 22bb59f..48de371 100644 --- a/Valens-AIO/src/mod.ts +++ b/Valens-AIO/src/mod.ts @@ -11,6 +11,7 @@ import { IInsuranceConfig } from "@spt-aki/models/spt/config/IInsuranceConfig"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { ILocationConfig } from "@spt-aki/models/spt/config/ILocationConfig"; import { IRagfairConfig } from "@spt-aki/models/spt/config/IRagfairConfig"; +import { Ammo } from "./ammo"; import { Bots } from "./bots"; import { Flea } from "./flea"; import { Hideout } from "./hideout"; @@ -19,6 +20,7 @@ import { Loot } from "./loot"; import { Raid } from "./raid"; import { Globals } from "./globals"; import { Insurance } from "./insurance"; +import { Logger } from "./logger"; //import { Airdrop } from "./airdrop"; class ValensAIO implements IPostDBLoadMod @@ -38,7 +40,8 @@ class ValensAIO implements IPostDBLoadMod public postDBLoad(container: DependencyContainer): void { // get database from server - this.logger = container.resolve<ILogger>("WinstonLogger"); + const logger = container.resolve<ILogger>("WinstonLogger"); + const vLogger = new Logger(logger); this.databaseServer = container.resolve<DatabaseServer>("DatabaseServer"); this.configServer = container.resolve<ConfigServer>("ConfigServer"); this.locationConfig = this.configServer.getConfig<ILocationConfig>(ConfigTypes.LOCATION); @@ -51,28 +54,31 @@ class ValensAIO implements IPostDBLoadMod //const airdrop = new Airdrop(this.logger, this.airdropConfig, this.databaseServer) //airdrop.updateAirdrops(); - const bots = new Bots(this.logger, this.databaseServer, this.botConfig); + const ammo = new Ammo(vLogger, this.databaseServer); + ammo.updateAmmo(); + + const bots = new Bots(vLogger, this.databaseServer, this.botConfig); bots.updateBots(); - const flea = new Flea(this.logger, this.ragfairConfig, this.tables); + const flea = new Flea(vLogger, this.ragfairConfig, this.tables); flea.updateFlea(); - const globals = new Globals(this.logger, this.databaseServer); + const globals = new Globals(vLogger, this.databaseServer); globals.updateGlobals(); - const hideout = new Hideout(this.logger, this.databaseServer); + const hideout = new Hideout(vLogger, this.databaseServer); hideout.updateHideout(); - const insurance = new Insurance(this.logger, this.insuranceConfig); + const insurance = new Insurance(vLogger, this.insuranceConfig); insurance.updateInsurance(); - const items = new Items(this.logger, this.databaseServer); + const items = new Items(vLogger, this.databaseServer); items.updateItems(); - const loot = new Loot(this.logger, this.databaseServer, this.locationConfig); - loot.updateLoot(); + const loot = new Loot(vLogger, this.databaseServer, this.locationConfig); + loot.updateLoot(); - const raid = new Raid(this.logger, this.databaseServer, this.inRaidConfig); + const raid = new Raid(vLogger, this.databaseServer, this.inRaidConfig); raid.updateRaid(); } diff --git a/Valens-AIO/src/raid.ts b/Valens-AIO/src/raid.ts index ae02140..7deaffa 100644 --- a/Valens-AIO/src/raid.ts +++ b/Valens-AIO/src/raid.ts @@ -1,16 +1,16 @@ import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; import { IInRaidConfig } from "@spt-aki/models/spt/config/IInRaidConfig"; +import { Logger } from "./logger"; export class Raid { private modConfig = require("../config/config.json") - private logger: ILogger; + private logger: Logger; private tables: IDatabaseTables; private inRaidConfig: IInRaidConfig; - constructor(logger:ILogger, databaseServer: DatabaseServer, inRaidConfig: IInRaidConfig) + constructor(logger:Logger, databaseServer: DatabaseServer, inRaidConfig: IInRaidConfig) { this.logger = logger; this.tables = databaseServer.getTables(); @@ -19,50 +19,63 @@ export class Raid updateRaid(): void { - if (this.modConfig.raid.fixOpenZones) + const mod = this.modConfig.raid; + + if (mod.fixOpenZones) { this.fixOpenZones(); - this.logger.info(`Open Zones: ${this.modConfig.raid.fixOpenZones}.`) + this.logger.info(`Open Zones: ${mod.fixOpenZones}.`) } - if (this.modConfig.raid.chompiesBossFix) + if (mod.chompiesBossFix) { this.chompiesBossFix(); - this.logger.info(`Chompies Boss Fix: ${this.modConfig.raid.chompiesBossFix}.`) + this.logger.info(`Chompies Boss Fix: ${mod.chompiesBossFix}.`) } - if (this.modConfig.raid.timeLimit) + if (mod.timeLimit) { - this.raidTimeLimit(); - this.logger.info(`Raid Time Limits set to ${this.modConfig.raid.timeLimit} minutes.`); + const maps = this.tables.locations; + + for (const map in maps) + { + if (this.tables.locations[map].base?.EscapeTimeLimit) + { + this.tables.locations[map].base.EscapeTimeLimit = this.modConfig.raid.timeLimit; + } + } + this.logger.info(`Raid Time Limits set to ${mod.timeLimit} minutes.`); } - if (this.modConfig.raid.aiAmount.toLowerCase() != "asonline" - ||this.modConfig.raid.aiDifficulty.toLowerCase() != "asonline" - ||this.modConfig.raid.bossEnabled != true - ||this.modConfig.raid.scavWars != false - ||this.modConfig.raid.taggedAndCursed != false - ||this.modConfig.raid.enablePve != false) + if (mod.aiAmount.toLowerCase() != "asonline" ||mod.aiDifficulty.toLowerCase() != "asonline" ||mod.bossEnabled != true + ||mod.scavWars != false ||mod.taggedAndCursed != false ||mod.enablePve != false) { - this.raidDifficulty(); - this.logger.info(`AI Amount set to ${this.modConfig.raid.aiAmount}`); - this.logger.info(`AI Difficulty set to ${this.modConfig.raid.aiDifficulty}`); - this.logger.info(`Boss Enabled set to ${this.modConfig.raid.bossEnabled}`); - this.logger.info(`Scav Wars set to ${this.modConfig.raid.scavWars}`); - this.logger.info(`Tagged And Cursed set to ${this.modConfig.raid.taggedAndCursed}`); - this.logger.info(`Enable PvE set to ${this.modConfig.raid.enablePve}`); + const inRaidConfig = this.inRaidConfig; + + inRaidConfig.raidMenuSettings["aiAmount"] = mod.aiAmount; + inRaidConfig.raidMenuSettings["aiDifficulty"] = mod.aiDifficulty; + inRaidConfig.raidMenuSettings["bossEnabled"] = mod.bossEnabled; + inRaidConfig.raidMenuSettings["scavWars"] = mod.scavWars; + inRaidConfig.raidMenuSettings["taggedAndCursed"] = mod.taggedAndCursed; + inRaidConfig.raidMenuSettings["enablePve"] = mod.enablePve; + this.logger.info(`AI Amount set to ${mod.aiAmount}`); + this.logger.info(`AI Difficulty set to ${mod.aiDifficulty}`); + this.logger.info(`Boss Enabled set to ${mod.bossEnabled}`); + this.logger.info(`Scav Wars set to ${mod.scavWars}`); + this.logger.info(`Tagged And Cursed set to ${mod.taggedAndCursed}`); + this.logger.info(`Enable PvE set to ${mod.enablePve}`); } - if (this.modConfig.raid.carExtractBaseStandingGain != 0.25) + if (mod.carExtractBaseStandingGain != 0.25) { - this.carExtractsGain(); - this.logger.info(`Car Extract Base Standing Gain set to ${this.modConfig.raid.carExtractBaseStandingGain}`); + this.inRaidConfig.carExtractBaseStandingGain = mod.carExtractBaseStandingGain; + this.logger.info(`Car Extract Base Standing Gain set to ${mod.carExtractBaseStandingGain}`); } - if (this.modConfig.scavExtractGain != 0.01) + if (mod.scavExtractGain != 0.01) { - this.scavExtractGain(); - this.logger.info(`Scav Extract Gain set to ${this.modConfig.raid.scavExtractGain}`); + this.inRaidConfig.scavExtractGain = mod.scavExtractGain; + this.logger.info(`Scav Extract Gain set to ${mod.scavExtractGain}`); } } @@ -112,37 +125,4 @@ export class Raid spawn4.TriggerId = "autoId_00000_D2_LEVER"; } } - - private raidTimeLimit(): void - { - const maps = this.tables.locations; - - for (const map in maps) - { - if (this.tables.locations[map].base?.EscapeTimeLimit) - { - this.tables.locations[map].base.EscapeTimeLimit = this.modConfig.raid.timeLimit; - } - } - } - - private raidDifficulty(): void - { - this.inRaidConfig.raidMenuSettings["aiAmount"] = this.modConfig.raid.aiAmount; - this.inRaidConfig.raidMenuSettings["aiDifficulty"] = this.modConfig.raid.aiDifficulty; - this.inRaidConfig.raidMenuSettings["bossEnabled"] = this.modConfig.raid.bossEnabled; - this.inRaidConfig.raidMenuSettings["scavWars"] = this.modConfig.raid.scavWars; - this.inRaidConfig.raidMenuSettings["taggedAndCursed"] = this.modConfig.raid.taggedAndCursed; - this.inRaidConfig.raidMenuSettings["enablePve"] = this.modConfig.raid.enablePve; - } - - private carExtractsGain(): void - { - this.inRaidConfig.carExtractBaseStandingGain = this.modConfig.raid.carExtractBaseStandingGain; - } - - private scavExtractGain(): void - { - this.inRaidConfig.scavExtractGain = this.modConfig.raid.scavExtractGain; - } } diff --git a/Valens-AIO/tmp/airdrop.js b/Valens-AIO/tmp/airdrop.js new file mode 100644 index 0000000..bfe7c5d --- /dev/null +++ b/Valens-AIO/tmp/airdrop.js @@ -0,0 +1,45 @@ +/*import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { IAirdropConfig } from "@spt-aki/models/spt/config/IAirdropConfig"; +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; + +export class Airdrop +{ + private modConfig = require("../config/config.jsonc"); + private logger: ILogger; + private tables: IDatabaseTables; + private airdropConfig: IAirdropConfig; + + constructor(logger: ILogger, databaseServer: DatabaseServer, airdropConfig: IAirdropConfig) + { + this.logger = logger; + this.tables = databaseServer.getTables(); + this.airdropConfig = airdropConfig; + } + + public updateAirdrops(); + { + if (this.modConfig.airdropChancePercent != 25) + { + this.airdropChance(); + this.logger.info(`Customs Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.bigmap}`); + this.logger.info(`Woods Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.woods}`); + this.logger.info(`Lighthouse Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.lighthouse}`); + this.logger.info(`Shoreline Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.shoreline}`); + this.logger.info(`Interchange Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.interchange}`); + this.logger.info(`Reserve Airdrop Chance is ${this.modConfig.airdrop.airdropChancePercent.reserve}`); + } + } + + private airdropChance(); + { + this.airdropConfig.airdropChancePercent["bigmap"] = this.modConfig.airdrop.airdropChancePercent.bigmap; + this.airdropConfig.airdropChancePercent["woods"] = this.modConfig.airdrop.airdropChancePercent.woods; + this.airdropConfig.airdropChancePercent["lighthouse"] = this.modConfig.airdrop.airdropChancePercent.lighthouse; + this.airdropConfig.airdropChancePercent["shoreline"] = this.modConfig.airdrop.airdropChancePercent.shoreline; + this.airdropConfig.airdropChancePercent["interchange"] = this.modConfig.airdrop.airdropChancePercent.interchange; + this.airdropConfig.airdropChancePercent["reserve"] = this.modConfig.airdrop.airdropChancePercent.reserve; + + } +} +*/ diff --git a/Valens-AIO/tmp/ammo.js b/Valens-AIO/tmp/ammo.js new file mode 100644 index 0000000..92cd1da --- /dev/null +++ b/Valens-AIO/tmp/ammo.js @@ -0,0 +1,259 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Ammo = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Ammo { + constructor(logger, databaseServer) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.databaseServer = databaseServer; + } + updateAmmo() { + const items = Object.values(this.databaseServer.getTables().templates.items); + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.ammo); + /** + * Grenade Launcher Ammo Max Stacks + * + * 5ede475b549eed7c6d5c18fb = M386 (HE) grenade + * 5ede475339ee016e8c534742 = M576 (MP-APERS) grenade + * 5f0c892565703e5c461894e9 = M433 (HEDP) grenade + * 5ede4739e0350d05467f73e8 = M406 (HE) grenade + * 5ede474b0c226a66f5402622 = M381 (HE) grenade + * 5ede47405b097655935d7d16 = M441 (HE) grenade + */ + if (this.modConfig.ammoStacks.grenadeCartridges != 1) { + const itemArray = ["5ede475b549eed7c6d5c18fb", "5ede475339ee016e8c534742", "5f0c892565703e5c461894e9", "5ede4739e0350d05467f73e8", "5ede474b0c226a66f5402622", "5ede47405b097655935d7d16"]; + for (const id in itemArray) { + items[id]._props.StackMaxSize = mod.ammoStacks.grenadeCartridges; + this.logger.info(`Grenade Cartridges Max Stacks set to ${mod.ammoStacks.grenadeCartridges}`); + } + } + /** + * Marksman Caliber Ammo Max Stacks // 17 + * + * 5a608bf24f39f98ffc77720e = 7.62x51 M62 Tracer // 7 + * 58dd3ad986f77403051cba8f = M80 + * 5a6086ea4f39f99cd479502f = M61 + * 5e023e53d4353e3302577c4c = BCP FMJ + * 5e023e88277cce2b522ff2b1 = Ultra Nosler + * 5e023e6e34d52a55c3304f71 = TCW SP + * 5e023e6e34d52a55c3304f71 = M993 + * + * 560d61e84bdc2da74d8b4571 = 7.62x54 R SNB gzh // 6 + * 5887431f2459777e1612938f = R LPS gzh + * 59e77a2386f7742ee578960a = R PS gzh + * 5e023cf8186a883be655e54f = T-46M gzh + * 5e023d34e8a400319a28ed44 = BT gzh + * 5e023d48186a883be655e551 = BS gzh + * + * 5fc382b6d6fa9c00c571bbc3 = .338 LM TAC-X // 4 + * 5fc382c1016cce60e8341b20 = UCW + * 5fc382a9d724d907e2077dab = AP + * 5fc275cf85fd526b824a571a = FMJ + */ + if (mod.ammoStacks.marksmanCartridges != 40) { + const itemArray = ["5a608bf24f39f98ffc77720e", "58dd3ad986f77403051cba8f", "5a6086ea4f39f99cd479502f", "5e023e53d4353e3302577c4c", "5e023e88277cce2b522ff2b1", "5e023e6e34d52a55c3304f71", + "5e023e6e34d52a55c3304f71", "560d61e84bdc2da74d8b4571", "5887431f2459777e1612938f", "59e77a2386f7742ee578960a", "5e023cf8186a883be655e54f", "5e023d34e8a400319a28ed44", + "5e023d48186a883be655e551", "5fc382b6d6fa9c00c571bbc3", "5fc382c1016cce60e8341b20", "5fc382a9d724d907e2077dab", "5fc275cf85fd526b824a571a"]; + for (const id in itemArray) { + items[id]._props.StackMaxSize = mod.ammoStacks.marksmanCartridges; + this.logger.info(`Marksman Cartridges Max Stacks set to ${mod.ammoStacks.marksmanCartridges}`); + } + } + /** + * Pistol Caliber Ammo Max Stacks // 53 + * + * 5ba26835d4351e0035628ff5 = 4.6x30mm AP SX // 4 + * 5ba26812d4351e003201fef1 = Action SX + * 5ba2678ad4351e44f824b344 = FMJ SX + * 5ba26844d4351e00334c9475 = Subsonic SX + * + * 5cc80f79e4a949033c7343b2 = 5.7x28mm SS198LF // 7 + * 5cc86832d7f00c000d3a6e6c = R37.F + * 5cc80f38e4a949001152b560 = SS190 + * 5cc86840d7f00c002412c56c = R37.X + * 5cc80f53e4a949000e1ea4f8 = L191 + * 5cc80f8fe4a949033b0224a2 = SS197SR + * 5cc80f67e4a949035e43bbba = SB193 + * + * 5735ff5c245977640e39ba7e = 7.62x25mm TT FMJ43 // 7 + * 573601b42459776410737435 = LRN + * 5736026a245977644601dc61 = P gl + * 573603562459776430731618 = Pst gzh + * 573602322459776445391df1 = LRNPC + * 5735fdcd2459776445391d61 = AKBS + * 573603c924597764442bd9cb - PT gzh + * + * 5737218f245977612125ba51 = 9x18mm PM SP8 gzh // 14 + * 573719762459775a626ccbc1 = P gzh + * 57371aab2459775a77142f22 = PstM gzh + * 573720e02459776143012541 = RG028 gzh + * 573718ba2459775a75491131 = BZhT gzh + * 5737207f24597760ff7b25f2 = PM PSV + * 57372140245977611f70ee91 = SP7 gzh + * 573719df2459775a626ccbc2 = PBM gzh + * 57371f8d24597761006c6a81 = PSO gzh + * 5737201124597760fc4431f1 = Pst gzh + * 57371f2b24597761224311f1 = PS gs PPO + * 57371eb62459776125652ac1 = PRS gs + * 57371e4124597760ff7b25f1 = PPT gzh + * 57371b192459775a9f58a5e0 = PPe gzh + * + * 58864a4f2459770fcc257101 = 9x19mm PSO gzh // 8 + * 56d59d3ad2720bdb418b4577 = Pst gzh + * 5c3df7d588a4501f290594e5 = Green tracer + * 5c0d56a986f774449d5de529 = RIP + * 5c925fa22e221601da359b7b = AP 6.3 + * 5a3c16fe86f77452b62de32a = Luger CCI + * 5efb0da7a29a85116f6ea05f = PBP gzh + * 5efb0e16aeb21837e749c7ff = Quakemaker + * + * 5a26abfac4a28232980eabff = 9x21mm P gzh // 4 + * 5a269f97c4a282000b151807 = PS gzh + * 5a26ac06c4a282000c5a90a8 = PE gzh + * 5a26ac0ec4a28200741e1e18 = BT gzh + * + * 62330b3ed4dc74626d570b95 = .357 Mag FMJ // 4 + * 62330bfadc5883093563729b = Hollow Point + * 62330c40bdd19b369e1e53d1 = Soft Point + * 62330c18744e5e31df12f516 = Jacket HP + * + * 5e81f423763d9f754677bf2e = .45 ACP Match FMJ // 5 + * 5efb0fc6aeb21837e749c801 = Hydra-Shok + * 5efb0d4f4bc50b58e81710f3 = Lasermatch FMJ + * 5efb0cabfb3e451d70735af5 = AP + * 5ea2a8e200685063ec28c05a = RIP + */ + if (mod.ammoStacks.pistolCartridges != 50) { + const itemArray = ["5ba26835d4351e0035628ff5", "5ba26812d4351e003201fef1", "5ba2678ad4351e44f824b344", "5ba26844d4351e00334c9475", "5cc80f79e4a949033c7343b2", "5cc86832d7f00c000d3a6e6c", + "5cc80f38e4a949001152b560", "5cc86840d7f00c002412c56c", "5cc80f53e4a949000e1ea4f8", "5cc80f8fe4a949033b0224a2", "5cc80f67e4a949035e43bbba", "5735ff5c245977640e39ba7e", + "573601b42459776410737435", "5736026a245977644601dc61", "573603562459776430731618", "573602322459776445391df1", "5735fdcd2459776445391d61", "573603c924597764442bd9cb", + "5737218f245977612125ba51", "573719762459775a626ccbc1", "57371aab2459775a77142f22", "573720e02459776143012541", "573718ba2459775a75491131", "5737207f24597760ff7b25f2", + "57372140245977611f70ee91", "573719df2459775a626ccbc2", "57371f8d24597761006c6a81", "5737201124597760fc4431f1", "57371f2b24597761224311f1", "57371eb62459776125652ac1", "57371e4124597760ff7b25f1", "57371b192459775a9f58a5e0", + "58864a4f2459770fcc257101", "56d59d3ad2720bdb418b4577", "5c3df7d588a4501f290594e5", "5c0d56a986f774449d5de529", "5c925fa22e221601da359b7b", "5a3c16fe86f77452b62de32a", + "5efb0da7a29a85116f6ea05f", "5efb0e16aeb21837e749c7ff", "5a26abfac4a28232980eabff", "5a269f97c4a282000b151807", "5a26ac06c4a282000c5a90a8", "5a26ac0ec4a28200741e1e18", + "62330b3ed4dc74626d570b95", "62330bfadc5883093563729b", "62330c40bdd19b369e1e53d1", "62330c18744e5e31df12f516", "5e81f423763d9f754677bf2e", "5efb0fc6aeb21837e749c801", + "5efb0d4f4bc50b58e81710f3", "5efb0cabfb3e451d70735af5", "5ea2a8e200685063ec28c05a"]; + for (const id in itemArray) { + items[id]._props.StackMaxSize = mod.ammoStacks.pistolCartridges; + this.logger.info(`Pistol Cartridges Max Stacks set to ${mod.ammoStacks.pistolCartridges}`); + } + } + /** + * Rifle Calibers Max Ammo Stacks // 47 + * + * 56dff3afd2720bba668b4567 = 5.45x39mm PS gs // 13 + * 56dff421d2720b5f5a8b4567 = SP + * 5c0d5e4486f77478390952fe = PPBS gs "Igolnik" + * 56dff338d2720bbd668b4569 = PRS gs + * 56dff061d2720bb5668b4567 = BT gs + * 56dff4ecd2720b5f5a8b4568 = US gs + * 56dfef82d2720bbd668b4567 = BP gs + * 56dff216d2720bbd668b4568 = HP + * 56dff026d2720bb8668b4567 = BS gs + * 56dff4a2d2720bbd668b456a = T gs + * 56dff2ced2720bb4668b4567 = PP gs + * 56dff0bed2720bb0668b4567 = FMJ + * + * 59e68f6f86f7746c9f75e846 = 5.56x45mm M856 // 11 + * 59e6918f86f7746c9f75e849 = Mk255 Mod 0 (RRLP) + * 59e690b686f7746c9f75e848 = M995 + * 54527ac44bdc2d36668b4567 = M855A1 + * 59e6906286f7746c9f75e847 = M856A1 + * 54527a984bdc2d4e668b4567 = M855 + * 59e6927d86f77411da468256 = HP + * 59e6920f86f77411d82aa167 = FMJ + * 5c0d5ae286f7741e46554302 = Warmage + * 60194943740c5d77f6705eea = MK 318 Mod 0 (SOST) + * 601949593ae8f707c4608daa = SSA AP + * + * 619636be6db0f2477964e710 = .300 Blackout M62 Tracer // 5 + * 5fbe3ffdf8b6a877a729ea82 = BCP FMJ + * 5fd20ff893a8961fc660a954 = AP + * 6196364158ef8c428c287d9f = V-Max + * 6196365d58ef8c428c287da1 = Whisper + * + * 5656d7c34bdc2d9d198b4587 = 7.62x39mm PS gzh // 6 + * 59e4d3d286f774176a36250a = HP + * 59e4d24686f7741776641ac7 = US gzh + * 59e4cf5286f7741778269d8a = T-45M1 gzh + * 59e0d99486f7744a32234762 = BP gzh + * 601aa3d2b2bcb34913271e6d = MAI AP + * + * 57a0dfb82459774d3078b56c = 9x39mm SP-5 gs // 5 + * 5c0d688c86f77413ae3407b2 = BP gs + * 57a0e5022459774d1673f889 = SP-6 gs + * 5c0d668f86f7747ccb7f13b2 = SPP gs + * 61962d879bb3d20b0946d385 = PAB-9 gs + * + * 59e6542b86f77411dc52a77a = .366 TKM FMJ // 4 + * 59e6658b86f77411d949b250 = Geksa + * 59e655cb86f77411dc52a77b = EKO + * 5f0596629e22f464da6bbdd9 = AP-M + * + * 5cadf6ddae9215051e1c23b2 = 12.7x55mm PS12 // 3 + * 5cadf6eeae921500134b2799 = PS12B + * 5cadf6e5ae921500113bb973 = PS12A + */ + if (mod.ammoStacks.rifleCartridges != 60) { + const itemArray = ["56dff3afd2720bba668b4567", "56dff421d2720b5f5a8b4567", "5c0d5e4486f77478390952fe", "56dff338d2720bbd668b4569", "56dff061d2720bb5668b4567", "56dff4ecd2720b5f5a8b4568", + "56dfef82d2720bbd668b4567", "56dff216d2720bbd668b4568", "56dff026d2720bb8668b4567", "56dff4a2d2720bbd668b456a", "56dff2ced2720bb4668b4567", "56dff0bed2720bb0668b4567", "59e68f6f86f7746c9f75e846", + "59e6918f86f7746c9f75e849", "59e690b686f7746c9f75e848", "54527ac44bdc2d36668b4567", "59e6906286f7746c9f75e847", "54527a984bdc2d4e668b4567", "59e6927d86f77411da468256", "59e6920f86f77411d82aa167", + "5c0d5ae286f7741e46554302", "60194943740c5d77f6705eea", "601949593ae8f707c4608daa", "619636be6db0f2477964e710", "5fbe3ffdf8b6a877a729ea82", "5fd20ff893a8961fc660a954", "6196364158ef8c428c287d9f", + "6196365d58ef8c428c287da1", "5656d7c34bdc2d9d198b4587", "59e4d3d286f774176a36250a", "59e4d24686f7741776641ac7", "59e4cf5286f7741778269d8a", "59e0d99486f7744a32234762", "601aa3d2b2bcb34913271e6d", + "57a0dfb82459774d3078b56c", "5c0d688c86f77413ae3407b2", "57a0e5022459774d1673f889", "5c0d668f86f7747ccb7f13b2", "61962d879bb3d20b0946d385", "59e6542b86f77411dc52a77a", "59e6658b86f77411d949b250", + "59e655cb86f77411dc52a77b", "5f0596629e22f464da6bbdd9", "5cadf6ddae9215051e1c23b2", "5cadf6eeae921500134b2799", "5cadf6e5ae921500113bb973"]; + for (const id in itemArray) { + items[id]._props.StackMaxSize = mod.ammoStacks.rifleCartridges; + this.logger.info(`Rifle Cartridges Max Stacks set to ${mod.ammoStacks.rifleCartridges}`); + } + } + /** + * Shotgun Cartridges Max Ammo Stacks // 28 + * + * 560d5e524bdc2d25448b4571 = 12x70 7mm Buckshot // 16 + * 5d6e6806a4b936088465b17e = 8.5mm Magnum + * 5c0d591486f7744c505b416f = RIP + * 5d6e68c4a4b9361b93413f79 = .50 BMG Slug + * 5d6e6772a4b936088465b17c = 5.25mm Buckshot + * 5d6e67fba4b9361bc73bc779 = 6.5mm Express + * 5d6e6911a4b9361bd5780d52 = Flechette + * 5d6e68e6a4b9361c140bcfe0 = FTX Custom Lite slug + * 5d6e68a8a4b9360b6c0d54e2 = AP-20 armor-piercing slug + * 5d6e68dea4b9361bcc29e659 = Dual sabot slug + * 5d6e689ca4b9361bc8618956 = Poleva-6u slug + * 5d6e6891a4b9361bd473feea = Poleva 3 slug + * 5d6e6869a4b9361c140bcfde = Grizzly 40 slug + * 5d6e68d1a4b93622fe60e845 = SuperFormance HP slug + * 5d6e68b3a4b9361bca7e50b5 = Copper Sabot Premier HP slug + * 58820d1224597753c90aeb13 = lead slug + * + * 5a38ebd9c4a282000d722a5b = 20x70 7.5mm Buckshot // 8 + * 5d6e6a05a4b93618084f58d0 = Star slug + * 5d6e69c7a4b9360b6c0d54e4 = 7.3mm buckshot + * 5d6e6a5fa4b93614ec501745 = Devastator slug + * 5d6e695fa4b936359b35d852 = 5.6mm buckshot + * 5d6e6a42a4b9364f07165f52 = Poleva-6u slug + * 5d6e6a53a4b9361bd473feec = Poleva-3 slug + * 5d6e69b9a4b9361bc8618958 = 6.2mm buckshot + * + * 5e85a9a6eacf8c039e4e2ac1 = 23x75mm Shrapnel-10 buckshot // 4 + * 5f647f31b6238e5dd066e196 = Shrapnel-25 buckshot + * 5e85a9f4add9fe03027d9bf1 = Zvezda flashbang round + * 5e85aa1a988a8701445df1f5 = Barrikada slug + * + */ + if (mod.ammoStacks.shotgunCartridges != 20) { + const itemArray = ["560d5e524bdc2d25448b4571", "5d6e6806a4b936088465b17e", "5c0d591486f7744c505b416f", "5d6e68c4a4b9361b93413f79", "5d6e6772a4b936088465b17c", "5d6e67fba4b9361bc73bc779", + "5d6e6911a4b9361bd5780d52", "5d6e68e6a4b9361c140bcfe0", "5d6e68a8a4b9360b6c0d54e2", "5d6e68dea4b9361bcc29e659", "5d6e689ca4b9361bc8618956", "5d6e6891a4b9361bd473feea", + "5d6e6869a4b9361c140bcfde", "5d6e68d1a4b93622fe60e845", "5d6e68b3a4b9361bca7e50b5", "58820d1224597753c90aeb13", "5a38ebd9c4a282000d722a5b", "5d6e6a05a4b93618084f58d0", + "5d6e69c7a4b9360b6c0d54e4", "5d6e6a5fa4b93614ec501745", "5d6e695fa4b936359b35d852", "5d6e6a42a4b9364f07165f52", "5d6e6a53a4b9361bd473feec", "5d6e69b9a4b9361bc8618958", + "5e85a9a6eacf8c039e4e2ac1", "5f647f31b6238e5dd066e196", "5e85a9f4add9fe03027d9bf1", "5e85aa1a988a8701445df1f5"]; + for (const id in itemArray) { + items[id]._props.StackMaxSize = mod.ammoStacks.shotgunCartridges; + this.logger.info(`Shotgun Cartridges Max Stacks set to ${mod.ammoStacks.shotgunCartridges}`); + } + } + } +} +exports.Ammo = Ammo; diff --git a/Valens-AIO/tmp/bots.js b/Valens-AIO/tmp/bots.js new file mode 100644 index 0000000..52aba84 --- /dev/null +++ b/Valens-AIO/tmp/bots.js @@ -0,0 +1,101 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Bots = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Bots { + constructor(logger, databaseServer, botConfig) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.botConfig = botConfig; + this.tables = databaseServer.getTables(); + } + updateBots() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.bots); + // Changes PMC difficulty to Easy, Normal, Hard, Impossible or AsOnline. Default AsOnline. + if (mod.pmc.pmcDifficulty.toLowerCase() != "AsOnline") { + this.botConfig.pmc.difficulty = mod.pmcDifficulty; + this.logger.info(`PMC Bot Difficulty set to ${mod.pmcDifficulty}`); + } + // Enables common and secure containers to spawn on PMCs while additionally whitelisting the parent IDs. Rarity adjusted via PMC lootNValue. Default true. + if (mod.pmc.containersOnPMCs) { + this.containersOnPMCs(); + this.logger.info(`Containers On PMCs: ${mod.pmc.containersOnPMCs}`); + } + // Chance that PMC bot will be USEC or BEAR. Higher value means higher chance for the PMC to be USEC. Default is 50% + if (mod.pmc.isUsec != 50) { + this.botConfig.pmc.isUsec = mod.isUsec; + this.logger.info(`PMC isUsec Chance is: ${mod.isUsec}`); + } + // Max Loot Value in Rubles for PMC bots in Backpack, Pockets, and Vest respectively. Default is 150,000/50,000/50,000 + if (mod.pmc.maxBackpackLootTotalRub != 150000 + || mod.pmc.maxPocketLootTotalRub != 50000 + || mod.pmc.maxVestLootTotalRub != 50000) { + this.botConfig.pmc.maxBackpackLootTotalRub = mod.pmc.maxBackpackLootTotalRub; + this.botConfig.pmc.maxPocketLootTotalRub = mod.pmc.maxPocketLootTotalRub; + this.botConfig.pmc.maxVestLootTotalRub = mod.pmc.maxVestLootTotalRub; + this.logger.info("PMC Loot Value totals changed!"); + this.logger.info(`Max Backpack Total Value: ${mod.pmc.maxBackpackLootTotalRub}`); + this.logger.info(`Max Pocket Total Value: ${mod.pmc.maxPocketLootTotalRub}`); + this.logger.info(`Max Vest Total Value: ${mod.pmc.maxVestLootTotalRub}`); + } + // Chance that the PMC bot of your side (BEAR/USEC) will be hostile or not. Default is 50%. + if (mod.pmc.chanceSameSideIsHostilePercent != 50) { + this.botConfig.pmc.chanceSameSideIsHostilePercent = mod.pmc.chanceSameSideIsHostilePercent; + this.logger.info(`Chance Same Side Is Hostle is ${mod.pmc.chanceSameSideIsHostilePercent}`); + } + // Max Bot Cap located in configs/bot.json/maxBotCap + if (mod.maxBotCap != 20) { + this.botConfig.maxBotCap = mod.maxBotCap; + this.logger.info(`Bot Cap is now ${mod.maxBotCap}`); + } + if (mod.pmc.lootNValue != 1.7 || mod.scav.lootNValue != 2) { + this.botConfig.lootNValue.scav = mod.scav.lootNValue; + this.botConfig.lootNValue.pmc = mod.pmc.lootNValue; + this.logger.info("Loot NValue for bots has been changed!"); + this.logger.info(`Scav lootNValue set to ${mod.scav.lootNValue}`); + this.logger.info(`PMC lootNValue set to ${mod.pmc.lootNValue}`); + } + } + containersOnPMCs() { + const usec = this.tables.bots.types.usec.inventory.items.Backpack; + const bear = this.tables.bots.types.bear.inventory.items.Backpack; + usec.push(...this.containers()); + bear.push(...this.containers()); + const dynaLoot = this.botConfig.pmc.dynamicLoot.whitelist; + dynaLoot.push("5448bf274bdc2dfc2f8b456a"); + dynaLoot.push("5795f317245977243854e041"); + } + containers() { + /* Container "id"s + * + * S I C C pouch: 5d235bb686f77443f4331278 + * Magazine Case: 5c127c4486f7745625356c13 + * Weapon Case: 59fb023c86f7746d0d4b423c + * T H I C C Weapon Case: 5b6d9ce188a4501afc1b2b25 + * Item Case: 59fb042886f7746c5005a7b2 + * T H I C C Item Case: 5c0a840b86f7742ffa4f2482 + * Money case: 59fb016586f7746d0d4b423a + * Mr Holodilnick Thermal Bag: 5c093db286f7740a1b2617e3 + * Medicine case: 5aafbcd986f7745e590fff23 + * Lucky scav junkbox: 5b7c710788a4506dec015957 + * Grenade case: 5e2af55f86f7746d4159f07c + * Ammunition case: 5aafbde786f774389d0cbc0f + * Documents case: 590c60fc86f77412b13fddcf + * Key tool: 59fafd4b86f7745ca07e123 + * Injector case: 619cbf7d23893217ec30b689 + * Dogtag case: 5c093e3486f77430cb02e593 + * Keycard holder: 619cbf9e0a7c3a1a2731940a + * WZ Wallet: 60b0f6c058e0b0481a09ad11 + * Pistol case: 567143bf4bdc2d1a0f8b4567 + * Secure container: 5448bf274bdc2dfc2f8b456a + * Kappa container: 5c093ca986f7740a1867ab12 + * Gamme container: 60b0f6c058e0b0481a09ad11 + */ + const lootItems = ["5d235bb686f77443f4331278", "5c127c4486f7745625356c13", "59fb023c86f7746d0d4b423c", "5b6d9ce188a4501afc1b2b25", "59fb042886f7746c5005a7b2", "5c0a840b86f7742ffa4f2482", + "59fb016586f7746d0d4b423a", "5c093db286f7740a1b2617e3", "5aafbcd986f7745e590fff23", "5b7c710788a4506dec015957", "5e2af55f86f7746d4159f07c", "5448bf274bdc2dfc2f8b456a", "5c093ca986f7740a1867ab12", + "5aafbde786f774389d0cbc0f", "590c60fc86f77412b13fddcf", "59fafd4b86f7745ca07e1232", "619cbf7d23893217ec30b689", "619cbf9e0a7c3a1a2731940a", "5c093e3486f77430cb02e593", "60b0f6c058e0b0481a09ad11", + "567143bf4bdc2d1a0f8b4567", "60b0f6c058e0b0481a09ad11", "59db794186f77448bc595262", "5857a8b324597729ab0a0e7d"]; + return lootItems; + } +} +exports.Bots = Bots; diff --git a/Valens-AIO/tmp/flea.js b/Valens-AIO/tmp/flea.js new file mode 100644 index 0000000..c15190a --- /dev/null +++ b/Valens-AIO/tmp/flea.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Flea = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Flea { + constructor(logger, ragfairConfig, tables) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.ragfairConfig = ragfairConfig; + this.tables = tables; + } + updateFlea() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.flea); + const global = this.tables.globals.config.RagFair; + const ragfair = this.ragfairConfig.dynamic; + if (mod.minUserLevel != 15) { + global.minUserLevel = mod.minUserLevel; + this.logger.info(`Fleamarket unlocked at level ${mod.minUserLevel}`); + } + if (!mod.blacklist.enableBsgList || !mod.blacklist.enableQuestList) { + ragfair.blacklist.enableBsgList = mod.blacklist.enableBsgList; + ragfair.blacklist.enableQuestList = mod.blacklist.enableQuestList; + this.logger.info("Fleamarket Blacklists patched"); + } + if (mod.condition.conditionChance != 0.2 || mod.condition.min != 0.6 || mod.condition.max != 1) { + ragfair.condition.conditionChance = mod.conditionChance; + ragfair.condition.min = mod.min; + ragfair.condition.max = mod.max; + this.logger.info("Fleamarket Condition patched"); + } + if (mod.currencies.roubles != 78 || mod.currencies.dollars != 20 || mod.currencies.euros != 2) { + ragfair.currencies["5449016a4bdc2d6f028b456f"] = mod.currencies.roubles; + ragfair.currencies["5696686a4bdc2da3298b456a"] = mod.currencies.dollars; + ragfair.currencies["569668774bdc2da2298b4568"] = mod.currencies.euros; + this.logger.info("Fleamarket Currencies patched"); + } + if (mod.offerItemCount.min != 8 || mod.offerItemCount.max != 15) { + ragfair.offerItemCount.min = mod.offerItemCount.min; + ragfair.offerItemCount.max = mod.offerItemCount.max; + this.logger.info("Fleamarket Offer Item Count patched"); + } + if (mod.reputation.gain != 0.0000002 || mod.reputation.loss != 0.0000002) { + ragfair.offerItemCount.min = mod.offerItemCount.min; + ragfair.offerItemCount.max = mod.offerItemCount.max; + this.logger.info("Fleamarket Reputation patched"); + } + if (mod.time.baseSellTime != 15 || mod.time.minSellTime != 5 || mod.time.maxSellTime != 15) { + const sell = this.ragfairConfig.sell; + sell.time.base = mod.time.baseSellTime; + sell.time.min = mod.time.minSellTime; + sell.time.max = mod.time.maxSellTime; + this.logger.info("Fleamarket Sell Times patched"); + } + } +} +exports.Flea = Flea; diff --git a/Valens-AIO/tmp/globals.js b/Valens-AIO/tmp/globals.js new file mode 100644 index 0000000..951145e --- /dev/null +++ b/Valens-AIO/tmp/globals.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Globals = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Globals { + constructor(logger, databaseServer) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.databaseServer = databaseServer; + } + updateGlobals() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.globals); + const global = this.databaseServer.getTables().globals; + if (mod.damagePerMeter != 9 || mod.safeHeight != 3) { + global.config.Health.Falling.DamagePerMeter = mod.damagePerMeter; + global.config.Health.Falling.SafeHeight = mod.safeHeight; + this.logger.info(`Safe Fall Height set to ${mod.safeHeight} meters`); + this.logger.info(`Damage Per Meter set to ${mod.damagePerMeter} meters`); + } + if (mod.maxLoyaltyTraders) { + global.config.MaxLoyaltyLevelForAll = mod.maxLoyaltyTraders; + this.logger.info(`Max Loyalty Traders is: ${mod.maxLoyaltyTraders}`); + } + if (mod.timeBeforeDeployLocal != 10) { + global.config.TimeBeforeDeployLocal = mod.timeBeforeDeployLocal; + this.logger.info(`Time Before Deploy set to: ${mod.timeBeforeDeployLocal}`); + } + if (mod.match_end.survived_exp_requirement != 200 || mod.match_end.survived_seconds_requirement != 420 || mod.match_end.survived_exp_reward != 300 + || mod.match_end.mia_exp_reward != 200 || mod.match_end.runner_exp_reward != 200 || mod.match_end.leftMult != 0 + || mod.match_end.miaMult != 1 || mod.match_end.survivedMult != 1.3 || mod.match_end.runnerMult != 0.5 + || mod.match_end.killedMult != 1 || mod.match_end.headShotMult != 1.2 || mod.match_end.expOnDamageAllHealth != 50) { + const global1 = this.databaseServer.getTables().globals.config.exp.match_end; + const mod = this.modConfig.globals.match_end; + global1.survived_exp_requirement = mod.survived_exp_requirement; + global1.survived_seconds_requirement = mod.survived_seconds_requirement; + global1.survived_exp_reward = mod.survived_exp_reward; + global1.mia_exp_reward = mod.mia_exp_reward; + global1.runner_exp_reward = mod.runner_exp_reward; + global1.leftMult = mod.leftMult; + global1.miaMult = mod.miaMult; + global1.survivedMult = mod.survivedMult; + global1.runnerMult = mod.runnerMult; + global1.killedMult = mod.killedMult; + this.databaseServer.getTables().globals.config.exp.kill.headShotMult = mod.headShotMult; + this.databaseServer.getTables().globals.config.exp.kill.expOnDamageAllHealth = mod.expOnDamageAllHealth; + this.logger.info("Match End Globals Patched"); + } + } +} +exports.Globals = Globals; diff --git a/Valens-AIO/tmp/hideout.js b/Valens-AIO/tmp/hideout.js new file mode 100644 index 0000000..5322841 --- /dev/null +++ b/Valens-AIO/tmp/hideout.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Hideout = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Hideout { + constructor(logger, databaseServer) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.databaseServer = databaseServer; + } + updateHideout() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.hideout); + if (mod.constructionTime != 1) { + this.updateConstructionTime(); + this.logger.info(`Construction Time Patched to ${mod.constructionTime} `); + } + if (mod.productionTime != 1) { + this.updateProductionTime(); + this.logger.info(`Production Time Patched to ${mod.productionTime} `); + } + if (mod.scavCaseTime != 1) { + this.updateScavCase(); + this.logger.info(`Scav Case TIme Patched to ${mod.scavCaseTime}`); + } + if (mod.airFilterUnitFlowRate != 0.0047222222222222 + || mod.generatorFuelFlowRate != 0.0013194444444444 + || mod.gpuBoostRate != 0.041225) { + const settings = this.databaseServer.getTables().hideout.settings; + settings.airFilterUnitFlowRate = mod.airFilterUnitFlowRate; + settings.generatorFuelFlowRate = mod.generatorFuelFlowRate; + settings.gpuBoostRate = mod.gpuBoostRate; + this.logger.info(`Air Filter Flow Rate set to ${mod.airFilterUnitFlowRate}`); + this.logger.info(`Generator Fuel Flow Rate set to ${mod.generatorFuelFlowRate}`); + this.logger.info(`GPU Boost Rate set to ${mod.gpuBoostRate}`); + } + } + updateConstructionTime() { + for (const area of this.databaseServer.getTables().hideout.areas) { + for (const stage in area.stages) { + const stageData = area.stages[stage]; + stageData.constructionTime *= this.modConfig.hideout.constructionTime; + } + } + } + updateProductionTime() { + for (const production of this.databaseServer.getTables().hideout.production) { + production.productionTime *= this.modConfig.hideout.productionTime; + } + } + updateScavCase() { + for (const scavCase of this.databaseServer.getTables().hideout.scavcase) { + scavCase.ProductionTime *= this.modConfig.hideout.scavCaseTime; + } + } +} +exports.Hideout = Hideout; diff --git a/Valens-AIO/tmp/insurance.js b/Valens-AIO/tmp/insurance.js new file mode 100644 index 0000000..06e4256 --- /dev/null +++ b/Valens-AIO/tmp/insurance.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Insurance = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Insurance { + constructor(logger, insuranceConfig) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.insuranceConfig = insuranceConfig; + } + updateInsurance() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.insurance); + if (mod.insuranceMultiplier.prapor != 0.16 || mod.insuranceMultiplier.therapist != 0.25) { + this.insuranceConfig.insuranceMultiplier["54cb50c76803fa8b248b4571"] = mod.insuranceMultiplier.prapor; + this.insuranceConfig.insuranceMultiplier["54cb57776803fa99248b456e"] = mod.insuranceMultiplier.therapist; + this.logger.info(`Prapor Insurance Price Multiplier Set to ${mod.insuranceMultiplier.prapor}`); + } + this.logger.info(`Therapist Insurance Price Multiplier Set to ${mod.insuranceMultiplier.therapist}`); + if (mod.returnChancePercent.prapor != 80 || mod.returnChancePercent.therapist != 85) { + this.insuranceConfig.returnChancePercent["54cb50c76803fa8b248b4571"] = mod.returnChancePercent.prapor; + this.insuranceConfig.returnChancePercent["54cb57776803fa99248b456e"] = mod.returnChancePercent.therapist; + this.logger.info(`Prapor Insurance Return Chance Set to ${mod.returnChancePercent.prapor}`); + this.logger.info(`Therapist Insurance Return Chance set to ${mod.returnChancePercent.therapist}`); + } + } +} +exports.Insurance = Insurance; diff --git a/Valens-AIO/tmp/items.js b/Valens-AIO/tmp/items.js new file mode 100644 index 0000000..0488bbc --- /dev/null +++ b/Valens-AIO/tmp/items.js @@ -0,0 +1,102 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Items = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Items { + constructor(logger, databaseServer) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.databaseServer = databaseServer; + } + updateItems() { + const items = Object.values(this.databaseServer.getTables().templates.items); + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.items); + // Weight Modifier. Multiplier of Weight *= modConfig.weightModifier + if (mod.weightModifier != 1) { + this.updateWeight(); + this.logger.info(`Weight Multipler patched to ${mod.weightModifier}`); + } + // Removes the ExcludedFilter on Backpacks + // which in turn enables common containers to spawn in the loot pool of AI. + if (mod.removeBackpackFilter) { + this.updateBackpacks(); + this.logger.info(`Backpack Restrictions Removed: ${mod.removeBackpackFilter}`); + } + // Standard Stash Size Changes + if (mod.standardStash.vertical != 28 || mod.standardStash.horizontal != 10) { + items["566abbc34bdc2d92178b4576"]._grids._props.cellsV = mod.standardStash.vertical; + items["566abbc34bdc2d92178b4576"]._grids._props.cellsH = mod.standardStash.horizontal; + this.logger.info(`Standard Stash Vertical changed to ${mod.standardStash.vertical}`); + this.logger.info(`Standard Stash Horizontal changed to ${mod.tandardStash.horizontal}`); + } + // Left Behind Stash Size Changes + if (mod.behindStash.vertical != 38 || mod.behindStash.horizontal != 10) { + items["5811ce572459770cba1a34ea"]._grids._props.cellsV = mod.behindStash.vertical; + items["5811ce572459770cba1a34ea"]._grids._props.cellsH = mod.behindStash.horizontal; + this.logger.info(`Left Behind Stash Vertical changed to ${mod.behindStash.vertical}`); + this.logger.info(`Left Behind Stash Horizontal changed to ${mod.behindStash.horizontal}`); + } + // Prepare for Escape Stash Size Changes + if (mod.escapeStash.vertical != 48 || mod.escapeStash.horizontal != 10) { + items["5811ce662459770f6f490f32"]._grids._props.cellsV = mod.escapeStash.vertical; + items["5811ce662459770f6f490f32"]._grids._props.cellsH = mod.escapeStash.horizontal; + this.logger.info(`Prepare for Escape Stash Vertical changed to ${mod.escapeStash.vertical}`); + this.logger.info(`Prepare for Escape Stash Horizontal changed to ${mod.escapeStash.horizontal}`); + } + // Edge of Darkness Stash Size Changes + if (mod.eodStash.vertical != 68 || mod.eodStash.horizontal != 10) { + items["5811ce772459770e9e5f9532"]._grids._props.cellsV = mod.eodStash.vertical; + items["5811ce772459770e9e5f9532"]._grids._props.cellsH = mod.eodStash.horizontal; + this.logger.info(`Edge of Darkness Stash Vertical changed to ${mod.eodStash.vertical}`); + this.logger.info(`Edge of Darkness Stash Horizontal changed to ${mod.eodStash.horizontal}`); + } + // Toggles true/false the Examined By Default config on all items in database/templates/items.json + if (mod.examinedByDefault) { + this.examinedByDefault(); + this.logger.info(`Examined By Default is ${mod.examinedByDefault}`); + } + // Roubles Max Stack + if (mod.roublesMaxStack != 500000) { + items["5449016a4bdc2d6f028b456f"]._props.StackMaxSize = mod.roublesMaxStack; + this.logger.info(`Rouble Max Stack set to ${mod.roublesMaxStack}`); + } + // Dollars Max Stack + if (mod.dollarsMaxStack != 50000) { + items["5696686a4bdc2da3298b456a"]._props.StackMaxSize = mod.dollarsMaxStack; + this.logger.info(`Dollar Max Stack set to ${mod.dollarsMaxStack}`); + } + // Euros Max Stack + if (mod.eurosMaxStack != 50000) { + items["569668774bdc2da2298b4568"]._props.StackMaxSize = mod.eurosMaxStack; + this.logger.info(`Euro Max Stack set to ${mod.eurosMaxStack}`); + } + } + // Functions Functions. + // Updates the weight modifier (as a multiplier) for all items in database/templates/items.json + updateWeight() { + const items = Object.values(this.databaseServer.getTables().templates.items); + for (const item of items) { + if (item._props?.Weight) { + item._props.Weight *= this.modConfig.items.weightModifier; + } + } + } + // Updates backpacks and removes any values in the ExcludedFilter under props > Grids > props > filters > ExcludedFilter in database/templates/items.json + updateBackpacks() { + const items = Object.values(this.databaseServer.getTables().templates.items); + for (const item of items) { + if (item._parent === "5448e53e4bdc2d60728b4567") { + for (const grid of item._props.Grids) + grid._props.filters[0].ExcludedFilter = []; + } + } + } + // Updates the Examined By Default modifier for all items in database/templates/items.json to either True or False depending on the config value. + examinedByDefault() { + const items = Object.values(this.databaseServer.getTables().templates.items); + for (const item of items) { + item._props.ExaminedByDefault = this.modConfig.items.examinedByDefault; + } + } +} +exports.Items = Items; diff --git a/Valens-AIO/tmp/locations.js b/Valens-AIO/tmp/locations.js new file mode 100644 index 0000000..768625b --- /dev/null +++ b/Valens-AIO/tmp/locations.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Locations = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Locations { + constructor(logger, databaseServer) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.tables = databaseServer.getTables(); + } + updateLocations() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.locations); + const maps = this.tables.locations; + if (mod.allExtractsAvailable) { + for (const map in maps) { + if (map.toLowerCase() === "base") { + continue; + } + const mapBase = this.tables.locations[map].base; + if (mapBase.Locked === true || mapBase?.EnabledCoop === undefined) { + continue; + } + for (const i in mapBase.exits) { + const exit = mapBase[i]; + exit.Chance = 100; + } + } + this.logger.info("All Extracts Are Available @ 100% Chance"); + } + } +} +exports.Locations = Locations; diff --git a/Valens-AIO/tmp/loot.js b/Valens-AIO/tmp/loot.js new file mode 100644 index 0000000..f1dc44d --- /dev/null +++ b/Valens-AIO/tmp/loot.js @@ -0,0 +1,99 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Loot = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Loot { + constructor(logger, databaseServer, locationConfig) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.locationConfig = locationConfig; + this.tables = databaseServer.getTables(); + } + updateLoot() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.loot); + if (mod.looseLootMultiplier > 1) { + for (const map in this.locationConfig.looseLootMultiplier) { + this.locationConfig.looseLootMultiplier[map] = mod.looseLootMultiplier; + } + this.logger.info(`Loose Loot Multiplier: ${mod.looseLootMultiplier}`); + } + if (mod.staticLootMultiplier > 1) { + for (const map in this.locationConfig.staticLootMultiplier) { + this.locationConfig.staticLootMultiplier[map] = mod.staticLootMultiplier; + } + this.logger.info(`Static Loot Multiplier: ${mod.staticLootMultiplier}`); + } + if (mod.containersInMarkedRoom) { + this.containersInMarkedRoom(); + this.logger.info(`Containers In Marked Room: ${mod.containersInMarkedRoom}`); + } + } + /** + * Changes the loot database/tables to include containers in marked rooms. + * + * @variable containersInMarkedRoom Enables common containers (items case, weapon case, etc.) in Marked Rooms. + */ + containersInMarkedRoom() { + // Customs Marked Room Loot. + let spawnPoints = this.tables.locations.bigmap.looseLoot.spawnpoints; + const cstmsmarked1 = spawnPoints.find(x => x.template.Id === "Loot 135 (10)1203364"); + const cstmsmarked2 = spawnPoints.find(x => x.template.Id === "Loot 135 (9)1198014"); + const cstmsmarked3 = spawnPoints.find(x => x.template.Id === "Loot 135 (8)1207194"); + cstmsmarked1.itemDistribution.push(...this.containers()); + cstmsmarked2.itemDistribution.push(...this.containers()); + cstmsmarked3.itemDistribution.push(...this.containers()); + // Reserve Marked Room Loot. + spawnPoints = this.tables.locations.rezervbase.looseLoot.spawnpoints; + const rsrvRBBK1 = spawnPoints.find(x => x.template.Id === "Loot 135 (10)49516"); + const rsrvRBBK2 = spawnPoints.find(x => x.template.Id === "Loot 135 (8)69186"); + const rsrvRBBK3 = spawnPoints.find(x => x.template.Id === "Loot 135 (9)39600"); + const rsrvRBPKPM1 = spawnPoints.find(x => x.template.Id === "cult_Loot 135 (11)56822"); + const rsrvRBPKPM2 = spawnPoints.find(x => x.template.Id === "cult_Loot 135 (12)56254"); + const rsrvRBVO1 = spawnPoints.find(x => x.template.Id === "Loot 135 (10)60780"); + const rsrvRBVO2 = spawnPoints.find(x => x.template.Id === "Loot 135 (11)55578"); + const rsrvRBVO3 = spawnPoints.find(x => x.template.Id === "Loot 135 (12)55522"); + rsrvRBBK1.itemDistribution.push(...this.containers()); + rsrvRBBK2.itemDistribution.push(...this.containers()); + rsrvRBBK3.itemDistribution.push(...this.containers()); + rsrvRBPKPM1.itemDistribution.push(...this.containers()); + rsrvRBPKPM2.itemDistribution.push(...this.containers()); + rsrvRBVO1.itemDistribution.push(...this.containers()); + rsrvRBVO2.itemDistribution.push(...this.containers()); + rsrvRBVO3.itemDistribution.push(...this.containers()); + // Lighthouse Marked Room Loot ... Lighthouse Marked Has No Cases; Only Jewelry/Electronics. + /*const lhouseBdrm = spawnPoints.find(x=>x.template.Id===""); + + lhouseBdrm.itemDistribution.push(...this.containers());*/ + } + containers() { + /* Container "id"s + * S I C C pouch: 5d235bb686f77443f4331278 + * Magazine Case: 5c127c4486f7745625356c13 + * Weapon Case: 59fb023c86f7746d0d4b423c + * T H I C C Weapon Case: 5b6d9ce188a4501afc1b2b25 + * Item Case: 59fb042886f7746c5005a7b2 + * T H I C C Item Case: 5c0a840b86f7742ffa4f2482 + * Money case: 59fb016586f7746d0d4b423a + * Mr Holodilnick Thermal Bag: 5c093db286f7740a1b2617e3 + * Medicine case: 5aafbcd986f7745e590fff23 + * Lucky scav junkbox: 5b7c710788a4506dec015957 + * Grenade case: 5e2af55f86f7746d4159f07c + * Secure container: 5448bf274bdc2dfc2f8b456a + */ + const lootItems = []; + lootItems.push({ "tpl": "5d235bb686f77443f4331278", "relativeProbability": 12 }); + lootItems.push({ "tpl": "5c127c4486f7745625356c13", "relativeProbability": 25 }); + lootItems.push({ "tpl": "59fb023c86f7746d0d4b423c", "relativeProbability": 13 }); + lootItems.push({ "tpl": "5b6d9ce188a4501afc1b2b25", "relativeProbability": 10 }); + lootItems.push({ "tpl": "59fb042886f7746c5005a7b2", "relativeProbability": 13 }); + lootItems.push({ "tpl": "5c0a840b86f7742ffa4f2482", "relativeProbability": 10 }); + lootItems.push({ "tpl": "59fb016586f7746d0d4b423a", "relativeProbability": 25 }); + lootItems.push({ "tpl": "5c093db286f7740a1b2617e3", "relativeProbability": 30 }); + lootItems.push({ "tpl": "5aafbcd986f7745e590fff23", "relativeProbability": 30 }); + lootItems.push({ "tpl": "5b7c710788a4506dec015957", "relativeProbability": 15 }); + lootItems.push({ "tpl": "5e2af55f86f7746d4159f07c", "relativeProbability": 23 }); + lootItems.push({ "tpl": "5448bf274bdc2dfc2f8b456a", "relativeProbability": 9 }); + return lootItems; + } +} +exports.Loot = Loot; diff --git a/Valens-AIO/tmp/mod.js b/Valens-AIO/tmp/mod.js new file mode 100644 index 0000000..0c128fa --- /dev/null +++ b/Valens-AIO/tmp/mod.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ConfigTypes_1 = require("@spt-aki/models/enums/ConfigTypes"); +const ammo_1 = require("./ammo"); +const bots_1 = require("./bots"); +const flea_1 = require("./flea"); +const hideout_1 = require("./hideout"); +const items_1 = require("./items"); +const loot_1 = require("./loot"); +const raid_1 = require("./raid"); +const globals_1 = require("./globals"); +const insurance_1 = require("./insurance"); +//import { Airdrop } from "./airdrop"; +class ValensAIO { + constructor() { + this.modConfig = require("../config/config.json"); + } + postDBLoad(container) { + // get database from server + this.logger = container.resolve("WinstonLogger"); + this.databaseServer = container.resolve("DatabaseServer"); + this.configServer = container.resolve("ConfigServer"); + this.locationConfig = this.configServer.getConfig(ConfigTypes_1.ConfigTypes.LOCATION); + this.ragfairConfig = this.configServer.getConfig(ConfigTypes_1.ConfigTypes.RAGFAIR); + this.botConfig = this.configServer.getConfig(ConfigTypes_1.ConfigTypes.BOT); + this.tables = this.databaseServer.getTables(); + this.inRaidConfig = this.configServer.getConfig(ConfigTypes_1.ConfigTypes.IN_RAID); + this.insuranceConfig = this.configServer.getConfig(ConfigTypes_1.ConfigTypes.INSURANCE); + //const airdrop = new Airdrop(this.logger, this.airdropConfig, this.databaseServer) + //airdrop.updateAirdrops(); + const ammo = new ammo_1.Ammo(this.logger, this.databaseServer); + ammo.updateAmmo(); + const bots = new bots_1.Bots(this.logger, this.databaseServer, this.botConfig); + bots.updateBots(); + const flea = new flea_1.Flea(this.logger, this.ragfairConfig, this.tables); + flea.updateFlea(); + const globals = new globals_1.Globals(this.logger, this.databaseServer); + globals.updateGlobals(); + const hideout = new hideout_1.Hideout(this.logger, this.databaseServer); + hideout.updateHideout(); + const insurance = new insurance_1.Insurance(this.logger, this.insuranceConfig); + insurance.updateInsurance(); + const items = new items_1.Items(this.logger, this.databaseServer); + items.updateItems(); + const loot = new loot_1.Loot(this.logger, this.databaseServer, this.locationConfig); + loot.updateLoot(); + const raid = new raid_1.Raid(this.logger, this.databaseServer, this.inRaidConfig); + raid.updateRaid(); + } +} +module.exports = { mod: new ValensAIO() }; diff --git a/Valens-AIO/tmp/raid.js b/Valens-AIO/tmp/raid.js new file mode 100644 index 0000000..5a341a8 --- /dev/null +++ b/Valens-AIO/tmp/raid.js @@ -0,0 +1,90 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Raid = void 0; +const JsonUtil_1 = require("@spt-aki/utils/JsonUtil"); +class Raid { + constructor(logger, databaseServer, inRaidConfig) { + this.modConfig = require("../config/config.json"); + this.logger = logger; + this.tables = databaseServer.getTables(); + this.inRaidConfig = inRaidConfig; + } + updateRaid() { + const mod = JsonUtil_1.JsonUtil.bind(this.modConfig.raid); + if (mod.fixOpenZones) { + this.fixOpenZones(); + this.logger.info(`Open Zones: ${mod.fixOpenZones}.`); + } + if (mod.chompiesBossFix) { + this.chompiesBossFix(); + this.logger.info(`Chompies Boss Fix: ${mod.chompiesBossFix}.`); + } + if (mod.timeLimit) { + const maps = this.tables.locations; + for (const map in maps) { + if (this.tables.locations[map].base?.EscapeTimeLimit) { + this.tables.locations[map].base.EscapeTimeLimit = this.modConfig.raid.timeLimit; + } + } + this.logger.info(`Raid Time Limits set to ${mod.timeLimit} minutes.`); + } + if (mod.aiAmount.toLowerCase() != "asonline" || mod.aiDifficulty.toLowerCase() != "asonline" || mod.bossEnabled != true + || mod.scavWars != false || mod.taggedAndCursed != false || mod.enablePve != false) { + const inRaidConfig = this.inRaidConfig; + inRaidConfig.raidMenuSettings["aiAmount"] = mod.aiAmount; + inRaidConfig.raidMenuSettings["aiDifficulty"] = mod.aiDifficulty; + inRaidConfig.raidMenuSettings["bossEnabled"] = mod.bossEnabled; + inRaidConfig.raidMenuSettings["scavWars"] = mod.scavWars; + inRaidConfig.raidMenuSettings["taggedAndCursed"] = mod.taggedAndCursed; + inRaidConfig.raidMenuSettings["enablePve"] = mod.enablePve; + this.logger.info(`AI Amount set to ${mod.aiAmount}`); + this.logger.info(`AI Difficulty set to ${mod.aiDifficulty}`); + this.logger.info(`Boss Enabled set to ${mod.bossEnabled}`); + this.logger.info(`Scav Wars set to ${mod.scavWars}`); + this.logger.info(`Tagged And Cursed set to ${mod.taggedAndCursed}`); + this.logger.info(`Enable PvE set to ${mod.enablePve}`); + } + if (mod.carExtractBaseStandingGain != 0.25) { + this.inRaidConfig.carExtractBaseStandingGain = mod.carExtractBaseStandingGain; + this.logger.info(`Car Extract Base Standing Gain set to ${mod.carExtractBaseStandingGain}`); + } + if (mod.scavExtractGain != 0.01) { + this.inRaidConfig.scavExtractGain = mod.scavExtractGain; + this.logger.info(`Scav Extract Gain set to ${mod.scavExtractGain}`); + } + } + fixOpenZones() { + const zones = { + "bigmap": "ZoneBrige,ZoneCrossRoad,ZoneDormitory,ZoneGasStation,ZoneFactoryCenter,ZoneFactorySide,ZoneOldAZS,ZoneSnipeBrige,ZoneSnipeTower,ZoneSnipeFactory,ZoneBlockPost,ZoneBlockPostSniper,ZoneBlockPostSniper3,ZoneBlockPost,ZoneTankSquare,ZoneWade,ZoneCustoms,ZoneScavBase", + "laboratory": "BotZoneFloor1,BotZoneFloor2,BotZoneBasement", + "rezervbase": "ZoneRailStrorage,ZonePTOR1,ZonePTOR2,ZoneBarrack,ZoneBunkerStorage,ZoneSubStorage,ZoneSubCommand", + "woods": "ZoneRedHouse,ZoneWoodCutter,ZoneHouse,ZoneBigRocks,ZoneRoad,ZoneMiniHouse,ZoneScavBase2,ZoneBrokenVill,ZoneClearVill,ZoneHighRocks", + "shoreline": "ZoneSanatorium1,ZoneSanatorium2,ZonePassFar,ZonePassClose,ZoneTunnel,ZoneStartVillage,ZoneBunker,ZoneGreenHouses,ZoneIsland,ZoneGasStation,ZoneMeteoStation,ZonePowerStation,ZoneBusStation,ZoneRailWays,ZonePort,ZoneForestTruck,ZoneForestSpawn,ZoneForestGasStation", + "lighthouse": "Zone_TreatmentContainers,Zone_LongRoad,Zone_Blockpost,Zone_TreatmentBeach,Zone_Hellicopter,Zone_RoofContainers,Zone_Village,Zone_OldHouse,Zone_RoofRocks,Zone_DestroyedHouse,Zone_Chalet,Zone_SniperPeak,Zone_RoofBeach,Zone_Containers,Zone_TreatmentRocks,Zone_Rocks" + }; + for (const location in zones) { + this.tables.locations[location].base.OpenZones = zones[location]; + } + } + chompiesBossFix() { + const labsBosses = this.tables.locations.laboratory.base.BossLocationSpawn; + const reserveBosses = this.tables.locations.rezervbase.base.BossLocationSpawn; + const spawn1 = labsBosses.find(x => x.TriggerId === "autoId_00008_EXFIL"); + if (spawn1) { + spawn1.TriggerId = "00404"; + } + const spawn2 = labsBosses.find(x => x.TriggerId === "autoId_00010_EXFIL"); + if (spawn2) { + spawn2.TriggerId = "00409"; + } + const spawn3 = reserveBosses.find(x => x.TriggerId === "00457"); + if (spawn3) { + spawn3.TriggerId = "autoId_00632_EXFIL"; + } + const spawn4 = reserveBosses.find(x => x.TriggerId === "00452"); + if (spawn4) { + spawn4.TriggerId = "autoId_00000_D2_LEVER"; + } + } +} +exports.Raid = Raid;