Updated Borkels NVGs & SVM
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
@ -5,7 +5,7 @@ version=d2025.1.12.0
|
|||
newestVersion=
|
||||
category="1,"
|
||||
nexusFileStatus=1
|
||||
installationFile=BRNVG-1.5.9.zip
|
||||
installationFile=BRNVG-1.6.0.zip
|
||||
repository=Nexus
|
||||
ignoredVersion=
|
||||
comments=
|
||||
|
|
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 9.2 KiB |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,3 @@
|
|||
Place any textures you want to use as masks in MaskTextures, just make sure they are PNGs and have the name of the NVG mask you want to replace.
|
||||
If you want to change the area where the NVG effect is applied, you have to change the textures in LensTextures
|
||||
Each LensTexture has to be the same size as its corresponding MaskTexture
|
|
@ -0,0 +1,28 @@
|
|||
[General]
|
||||
gameName=spt
|
||||
modid=0
|
||||
version=d2025.1.12.0
|
||||
newestVersion=
|
||||
category="1,"
|
||||
nexusFileStatus=1
|
||||
installationFile=BRNVG-1.5.9.zip
|
||||
repository=Nexus
|
||||
ignoredVersion=
|
||||
comments=
|
||||
notes=
|
||||
nexusDescription=
|
||||
url=
|
||||
hasCustomURL=false
|
||||
lastNexusQuery=
|
||||
lastNexusUpdate=
|
||||
nexusLastModified=2025-01-12T11:47:39Z
|
||||
nexusCategory=0
|
||||
converted=false
|
||||
validated=false
|
||||
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
|
||||
tracked=0
|
||||
|
||||
[installedFiles]
|
||||
1\modid=0
|
||||
1\fileid=0
|
||||
size=1
|
|
@ -0,0 +1,34 @@
|
|||
University of Illinois/NCSA Open Source License
|
||||
|
||||
Copyright (c) 2021 . All rights reserved.
|
||||
|
||||
Developed by: SPT-Aki
|
||||
|
||||
https://www.offline-tarkov.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal with the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimers.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimers in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the names of , SPT-Aki nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this Software without specific prior written permission.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH
|
||||
THE SOFTWARE.
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"manifest": [
|
||||
{
|
||||
"key": "assets/content/items/equipment/customizable/gpnvg/nvg_l3_gpnvg-18_anvis.bundle",
|
||||
"dependencyKeys": []
|
||||
},
|
||||
{
|
||||
"key": "assets/content/items/equipment/nvg_pvs14/pvs14_textures.bundle",
|
||||
"dependencyKeys": []
|
||||
},
|
||||
{
|
||||
"key": "assets/content/items/equipment/customizable/pvs_14/nvg_pvs_14.bundle",
|
||||
"dependencyKeys": []
|
||||
},
|
||||
{
|
||||
"key": "assets/content/items/equipment/customizable/nvg_armasight_n-15/nvg_armasight_n-15.bundle",
|
||||
"dependencyKeys": []
|
||||
},
|
||||
{
|
||||
"key": "assets/content/items/equipment/customizable/nvg_alfa_pnv-10t/nvg_alfa_pnv-10t.bundle",
|
||||
"dependencyKeys": []
|
||||
}
|
||||
]
|
||||
}
|
BIN
mods/Borkel's Realistic Night Vision Goggles_backup/user/mods/BRNVG_N-15Adapter/bundles/assets/content/items/equipment/nvg_pvs14/pvs14_textures.bundle (Stored with Git LFS)
Normal file
|
@ -0,0 +1 @@
|
|||
place in "BRNVG_N-15Adapter\bundles\assets\content\items\equipment\customizable\gpnvg"
|
BIN
mods/Borkel's Realistic Night Vision Goggles_backup/user/mods/BRNVG_N-15Adapter/optional black GPNVG-18/nvg_l3_gpnvg-18_anvis.bundle (Stored with Git LFS)
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"name": "BRNVG - N-15 Adapter",
|
||||
"version": "1.0.1",
|
||||
"main": "src/ModularNVG.js",
|
||||
"license": "CC BY-NC-SA 3.0",
|
||||
"author": "Borkel",
|
||||
"sptVersion": "~3.10",
|
||||
"scripts": {
|
||||
"setup": "npm i",
|
||||
"build": "node ./packageBuild.ts"
|
||||
},
|
||||
"isBundleMod": true,
|
||||
"devDependencies": {
|
||||
"@types/node": "16.18.10",
|
||||
"@typescript-eslint/eslint-plugin": "5.46.1",
|
||||
"@typescript-eslint/parser": "5.46.1",
|
||||
"bestzip": "2.2.1",
|
||||
"eslint": "8.30.0",
|
||||
"fs-extra": "11.1.0",
|
||||
"glob": "8.0.3",
|
||||
"tsyringe": "4.7.0",
|
||||
"typescript": "4.9.4"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
class ModularNVG {
|
||||
postDBLoad(container) {
|
||||
const Logger = container.resolve("WinstonLogger");
|
||||
const DB = container.resolve("DatabaseServer").getTables();
|
||||
const database = DB.templates.items;
|
||||
for (let file in database) {
|
||||
let fileData = database[file];
|
||||
//N-15 Adapter PNV-10T dovetail adapter
|
||||
if (fileData._id === "5c0695860db834001b735461") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("5c066e3a0db834001b7353f0");
|
||||
Logger.info("[SBNV]: Your N-15s can also be mounted on helmets now!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
module.exports = { mod: new ModularNVG };
|
||||
//# sourceMappingURL=ModularNVG.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"ModularNVG.js","sourceRoot":"","sources":["ModularNVG.ts"],"names":[],"mappings":";;AAOA,MAAM,UAAU;IAEZ,UAAU,CAAC,SAA8B;QAErC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAEpC,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;YACxB,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvC,uCAAuC;YACvC,IAAI,QAAQ,CAAC,GAAG,KAAK,0BAA0B,EAAE,CAAC;gBACrC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC/F,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC;IACL,CAAC;CACJ;AACD,MAAM,CAAC,OAAO,GAAG,EAAC,GAAG,EAAE,IAAI,UAAU,EAAC,CAAC"}
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
import { DependencyContainer } from "tsyringe";
|
||||
import {IPostDBLoadMod} from "@spt/models/external/IPostDBLoadMod";
|
||||
import { DatabaseServer } from "@spt/servers/DatabaseServer";
|
||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
||||
|
||||
|
||||
class ModularNVG implements IPostDBLoadMod
|
||||
{
|
||||
postDBLoad(container: DependencyContainer)
|
||||
{
|
||||
const Logger = container.resolve("WinstonLogger");
|
||||
const DB = container.resolve("DatabaseServer").getTables();
|
||||
const database = DB.templates.items;
|
||||
|
||||
for (let file in database) {
|
||||
let fileData = database[file];
|
||||
//N-15 Adapter PNV-10T dovetail adapter
|
||||
if (fileData._id === "5c0695860db834001b735461") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("5c066e3a0db834001b7353f0");
|
||||
Logger.info("[SBNV]: Your N-15s can also be mounted on helmets now!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
module.exports = {mod: new ModularNVG};
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"allowJs": true,
|
||||
"module": "CommonJS",
|
||||
"target": "es2020",
|
||||
"moduleResolution": "node",
|
||||
"esModuleInterop": true,
|
||||
"downlevelIteration": true,
|
||||
"experimentalDecorators": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"resolveJsonModule": true,
|
||||
"outDir": "tmp",
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@spt-aki/*": ["./types/*"]
|
||||
}
|
||||
},
|
||||
"lib": [
|
||||
"es2020"
|
||||
],
|
||||
"include": [
|
||||
"src/*",
|
||||
"src/**/*"
|
||||
]
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
Personal Use Source License (PUSL)
|
||||
Version 1.0
|
||||
|
||||
Copyright © 2024, GhostFenixx
|
||||
Copyright © 2025, GhostFenixx
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”),
|
||||
to use the Software for personal, non-commercial purposes only, subject to the following conditions:
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"CurrentlySelectedPreset":"Default"
|
||||
"CurrentlySelectedPreset":"null"
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "SVM",
|
||||
"author": "GhostFenixx",
|
||||
"version": "1.10.0",
|
||||
"version": "1.10.1",
|
||||
"sptVersion": "3.10.x",
|
||||
"license": "PUSL",
|
||||
"devdependencies": {},
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"MRifle":["762x51", "68x51", "762х54R", "762x54r", "86x70", "127x55", "277", "BMG"],
|
||||
"MarkedKeys":["5780cf7f2459777de4559322", "5d80c60f86f77440373c4ece", "5d80c62a86f7744036212b3f", "5ede7a8229445733cb4c18e2", "63a3a93f8a56922e82001f5d", "64ccc25f95763a1ae376e447", "62987dfc402c7f69bf010923"],
|
||||
"traderArray": ["54cb50c76803fa8b248b4571", "54cb57776803fa99248b456e", "58330581ace78e27b8b10cee", "5935c25fb3acc3127c3d8cd9", "5a7c2eca46aef81a7ca2145d", "5ac3b934156ae10c4430e83c", "5c0647fdd443bc2504c2d371"],
|
||||
"CasesID":["59fb016586f7746d0d4b423a","5783c43d2459774bbe137486","60b0f6c058e0b0481a09ad11","5e2af55f86f7746d4159f07c","59fb042886f7746c5005a7b2","59fb023c86f7746d0d4b423c","5b7c710788a4506dec015957","5aafbde786f774389d0cbc0f","5c127c4486f7745625356c13","5c093e3486f77430cb02e593","5aafbcd986f7745e590fff23","5c0a840b86f7742ffa4f2482","5b6d9ce188a4501afc1b2b25","5d235bb686f77443f4331278","59fafd4b86f7745ca07e1232","590c60fc86f77412b13fddcf","567143bf4bdc2d1a0f8b4567","5c093db286f7740a1b2617e3","619cbf7d23893217ec30b689","619cbf9e0a7c3a1a2731940a","62a09d3bcf4a99369e262447"],
|
||||
"CasesID":["59fb016586f7746d0d4b423a","5783c43d2459774bbe137486","60b0f6c058e0b0481a09ad11","5e2af55f86f7746d4159f07c","59fb042886f7746c5005a7b2","59fb023c86f7746d0d4b423c","5b7c710788a4506dec015957","5aafbde786f774389d0cbc0f","5c127c4486f7745625356c13","5c093e3486f77430cb02e593","5aafbcd986f7745e590fff23","5c0a840b86f7742ffa4f2482","5b6d9ce188a4501afc1b2b25","5d235bb686f77443f4331278","59fafd4b86f7745ca07e1232","590c60fc86f77412b13fddcf","567143bf4bdc2d1a0f8b4567","5c093db286f7740a1b2617e3","619cbf7d23893217ec30b689","619cbf9e0a7c3a1a2731940a","62a09d3bcf4a99369e262447","66bc98a01a47be227a5e956e"],
|
||||
"SecConID":["544a11ac4bdc2d470e8b456a","5c093ca986f7740a1867ab12","5857a8b324597729ab0a0e7d","59db794186f77448bc595262","5857a8bc2459772bad15db29","665ee77ccf2d642e98220bca","5732ee6a24597719ae0c0281","64f6f4c5911bcdfe8b03b0dc"],
|
||||
"AIAmount":["AsOnline","Low","Medium","High","Horde","NoBots"],
|
||||
"AIDifficulty":["AsOnline","Easy","Medium","Hard","Impossible","Random"],
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
"Stay Hydrated",
|
||||
"Have you tried Gray Zone Warfare? :D",
|
||||
"Still filled with bugs, don't worry",
|
||||
"Pls leave a like an subscribe, don't forget to click a bell button",
|
||||
"Pls leave a like and subscribe, don't forget to click a bell button",
|
||||
"Google Clearly doesn't like me ;-;",
|
||||
"Name of your PMC is disgusting, please revaluate your life choices",
|
||||
"Why do you want to carry 2000 rounds in one slot?",
|
||||
|
@ -79,14 +79,12 @@
|
|||
"What?",
|
||||
"Really, stop looking here, play the game already >:C",
|
||||
"Someday I'll paste whole Bee movie script here",
|
||||
"Seriously, Roseheart, stop posting those on r/sptarkov.",
|
||||
"They added a Deagle in the game...Makes me miss KMC once again",
|
||||
"Swedish siesta is fun ngl",
|
||||
"Yep, people still seem to fail to install this mod",
|
||||
"3.9.8 huh? SPT lads do stack those numbers high",
|
||||
"Cats are still superior than dogs, CWX.",
|
||||
"Someday the war will be over and world won't be the same...",
|
||||
"Damn, Stalker 2 footage is juicy",
|
||||
"Do yourself a favor, stop shitposting",
|
||||
"If SPT can go 3.10, so is SVM can go 1.10",
|
||||
"Show must go on!",
|
||||
|
@ -116,5 +114,14 @@
|
|||
"Want some music recommendation? Check Imminence.",
|
||||
"Want some music recommendation? Check Cantervice.",
|
||||
"You better not forget to take splint with you this time",
|
||||
"More music? Fine: Saint Asonia, Alesti, Memphis May Fire",
|
||||
"Not really hyped for 2025 ngl",
|
||||
"Four letters is better than three",
|
||||
"No, these messages is not made by ChatGPT",
|
||||
"I finally tried stalker 2, could've been better",
|
||||
"Unironically gonna listen to C418",
|
||||
"Want some DnB? Celldweller, Raizer, Blue Stahli",
|
||||
"I hate winter",
|
||||
"Astrobot being GOTY is a joke",
|
||||
"You cannot Escape From -REDACTED BY LICENSE VIOLATION-"]
|
||||
}
|
|
@ -99,9 +99,11 @@ class MainSVM {
|
|||
|
||||
//let event = [];
|
||||
if (Config.Raids.RaidEvents.Christmas) {
|
||||
SeasonalEventService.christmasEventActive = true;
|
||||
SeasonalEventService.updateGlobalEvents(globalConfig, Events.events[1]);
|
||||
}
|
||||
if (Config.Raids.RaidEvents.Halloween) {
|
||||
SeasonalEventService.halloweenEventActive = true;
|
||||
SeasonalEventService.updateGlobalEvents(globalConfig, Events.events[0]);
|
||||
}
|
||||
return HttpResponse.nullResponse();
|
||||
|
@ -166,7 +168,7 @@ class MainSVM {
|
|||
return HttpResponse.nullResponse();
|
||||
}
|
||||
catch (e) {
|
||||
Logger.error("[SVM] CSM CUSTOM POCKETS - New profile detected, Cancelling function, restart the game to fix it.\n" + e.message)
|
||||
Logger.warning("[SVM] REVIVE POCKETS - Attempt cancelled - New profile? Ignore if so.\n" + e.message)
|
||||
return HttpResponse.nullResponse();
|
||||
}
|
||||
}
|
||||
|
@ -194,7 +196,8 @@ class MainSVM {
|
|||
}], "spt");
|
||||
}
|
||||
//HEALTH + SCAV FUNCTIONS
|
||||
if (Config.Player.EnableHealth || Config.Scav.EnableScavHealth || Config.Scav.ScavCustomPockets || Config.Player.EnableStats || Config.Scav.EnableStats) //TO OVERRIDE HEALTH, STATS + CURRENT SCAV HEALTH, STATS AND POCKETS BEFORE RAID
|
||||
if (Config.Player.EnableHealth || Config.Scav.EnableScavHealth || Config.Scav.ScavCustomPockets || Config.Player.EnableStats || Config.Scav.EnableStats)
|
||||
//TO OVERRIDE HEALTH, STATS + CURRENT SCAV HEALTH, STATS AND POCKETS BEFORE RAID
|
||||
{
|
||||
StaticRouterModService.registerStaticRouter("EditHealth",
|
||||
[
|
||||
|
@ -235,7 +238,7 @@ class MainSVM {
|
|||
}
|
||||
}], "spt");
|
||||
}
|
||||
if (Config.Scav.EnableScavHealth || Config.Scav.ScavCustomPockets) { // TO OVERRIDE NEXT SCAVS HEALTH + POCKETS
|
||||
if (Config.Scav.EnableScavHealth || Config.Scav.ScavCustomPockets || Config.Scav.EnableStats) { // TO OVERRIDE NEXT SCAVS HEALTH + POCKETS
|
||||
//May Omnissiah save our souls, have to use both because register affects deaths and resolution affects extracts. Don't ask
|
||||
container.afterResolution("ProfileController", (_t, result) => {
|
||||
result.generatePlayerScav = (sessionID) => {
|
||||
|
@ -245,8 +248,10 @@ class MainSVM {
|
|||
scavData.Health.Energy.Maximum = Config.Scav.ScavStats.MaxEnergy;
|
||||
scavData.Health.Hydration.Maximum = Config.Scav.ScavStats.MaxHydration;
|
||||
}
|
||||
if (Config.Scav.EnableScavHealth) {
|
||||
HealthEdit(scavData, Config.Scav.Health.Head, Config.Scav.Health.Chest, Config.Scav.Health.Stomach, Config.Scav.Health.LeftArm, Config.Scav.Health.LeftLeg, Config.Scav.Health.RightArm, Config.Scav.Health.RightLeg, "Current");
|
||||
HealthEdit(scavData, Config.Scav.Health.Head, Config.Scav.Health.Chest, Config.Scav.Health.Stomach, Config.Scav.Health.LeftArm, Config.Scav.Health.LeftLeg, Config.Scav.Health.RightArm, Config.Scav.Health.RightLeg, "Maximum");
|
||||
}
|
||||
if (Config.Scav.ScavCustomPockets) {
|
||||
scavData.Inventory.items.forEach((item) => {
|
||||
if (item.slotId == "Pockets") {
|
||||
|
@ -261,15 +266,21 @@ class MainSVM {
|
|||
StaticRouterModService.registerStaticRouter("EditHealthv2",
|
||||
[
|
||||
{
|
||||
url: "/raid/profile/save",
|
||||
url: "/client/match/local/end",
|
||||
action: (url, info, sessionID) => {
|
||||
if (info.exit !== "survived" && info.exit !== "runner" && info.isPlayerScav) // 3.9.0 If statement for avoiding rerolling survived SCAV, biggest issue of 1.8.3
|
||||
if (info.results.result !== "survived" && info.results.result !== "runner") // 3.9.0 If statement for avoiding rerolling survived SCAV, biggest issue of 1.8.3
|
||||
{
|
||||
const saveServer = container.resolve("SaveServer");
|
||||
const playerScavGenerator = container.resolve("PlayerScavGenerator");
|
||||
const scavData = playerScavGenerator.generate(sessionID);
|
||||
if (Config.Scav.EnableStats) {
|
||||
scavData.Health.Energy.Maximum = Config.Scav.ScavStats.MaxEnergy;
|
||||
scavData.Health.Hydration.Maximum = Config.Scav.ScavStats.MaxHydration;
|
||||
}
|
||||
if (Config.Scav.EnableScavHealth) {
|
||||
HealthEdit(scavData, Config.Scav.Health.Head, Config.Scav.Health.Chest, Config.Scav.Health.Stomach, Config.Scav.Health.LeftArm, Config.Scav.Health.LeftLeg, Config.Scav.Health.RightArm, Config.Scav.Health.RightLeg, "Current");
|
||||
HealthEdit(scavData, Config.Scav.Health.Head, Config.Scav.Health.Chest, Config.Scav.Health.Stomach, Config.Scav.Health.LeftArm, Config.Scav.Health.LeftLeg, Config.Scav.Health.RightArm, Config.Scav.Health.RightLeg, "Maximum");
|
||||
}
|
||||
if (Config.Scav.ScavCustomPockets) {
|
||||
scavData.Inventory.items.forEach((item) => {
|
||||
if (item.slotId == "Pockets") {
|
||||
|
@ -333,6 +344,7 @@ class MainSVM {
|
|||
const Health = configServer.getConfig("spt-health");
|
||||
const Bots = configServer.getConfig("spt-bot");
|
||||
const Quest = configServer.getConfig("spt-quest");
|
||||
const HideoutConfig = configServer.getConfig("spt-hideout");
|
||||
const WeatherValues = configServer.getConfig("spt-weather");
|
||||
const trader = configServer.getConfig("spt-trader");
|
||||
const Events = configServer.getConfig("spt-seasonalevents");
|
||||
|
@ -408,7 +420,7 @@ class MainSVM {
|
|||
//############## LOOT SECTION #################
|
||||
if (Config.Loot.EnableLoot) {
|
||||
//loose loot mults
|
||||
locs.looseLootMultiplier.bigmap = Config.Loot.Locations.Streets.Loose;
|
||||
locs.looseLootMultiplier.bigmap = Config.Loot.Locations.Bigmap.Loose;
|
||||
locs.looseLootMultiplier.factory4_day = Config.Loot.Locations.FactoryDay.Loose;
|
||||
locs.looseLootMultiplier.factory4_night = Config.Loot.Locations.FactoryNight.Loose;
|
||||
locs.looseLootMultiplier.interchange = Config.Loot.Locations.Interchange.Loose;
|
||||
|
@ -477,17 +489,33 @@ class MainSVM {
|
|||
}
|
||||
break;
|
||||
case "bossPartisan":
|
||||
// if (i == "bigmap") { Controlled by trigger, ignored for now.
|
||||
// locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanCustoms
|
||||
// }
|
||||
if (i == "bigmap") {
|
||||
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanCustoms
|
||||
if (Config.Bots.AIChance.ForcePartisan) {
|
||||
locations[i].base.BossLocationSpawn[x].TriggerId = "";
|
||||
locations[i].base.BossLocationSpawn[x].botEvent = "";
|
||||
}
|
||||
}
|
||||
if (i == "shoreline") {
|
||||
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanShoreline
|
||||
if (Config.Bots.AIChance.ForcePartisan) {
|
||||
locations[i].base.BossLocationSpawn[x].TriggerId = "";
|
||||
locations[i].base.BossLocationSpawn[x].botEvent = "";
|
||||
}
|
||||
}
|
||||
if (i == "lighthouse") {
|
||||
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanLighthouse
|
||||
if (Config.Bots.AIChance.ForcePartisan) {
|
||||
locations[i].base.BossLocationSpawn[x].TriggerId = "";
|
||||
locations[i].base.BossLocationSpawn[x].botEvent = "";
|
||||
}
|
||||
}
|
||||
if (i == "woods") {
|
||||
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanWoods
|
||||
if (Config.Bots.AIChance.ForcePartisan) {
|
||||
locations[i].base.BossLocationSpawn[x].TriggerId = "";
|
||||
locations[i].base.BossLocationSpawn[x].botEvent = "";
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "bossBully":
|
||||
|
@ -661,6 +689,7 @@ class MainSVM {
|
|||
fileData.requirements.profileLevel = 1;
|
||||
fileData.requirements.standing = 0;
|
||||
fileData.requirements.questRequirements = [];//Only adik hits this
|
||||
fileData.requirements.achievementRequirements = []; // 1.10.1 Adik once again - removing the requirement for 'Master of Ultra' achievement.
|
||||
}
|
||||
//fileData.requirements.skillRequirements = [];//This is useless, it always stands for empty
|
||||
if (Config.Services.ClothesFree) {
|
||||
|
@ -844,9 +873,10 @@ class MainSVM {
|
|||
Cases.Holodilnick,
|
||||
Cases.InjectorCase,
|
||||
Cases.KeycardHolderCase,
|
||||
Cases.GKeychain
|
||||
Cases.GKeychain,
|
||||
Cases.StreamerCase
|
||||
]
|
||||
const Filts = [
|
||||
const Filts = [ // I think i can shortcut this eventually
|
||||
Cases.MoneyCase.Filter,
|
||||
Cases.SimpleWallet.Filter,
|
||||
Cases.WZWallet.Filter,
|
||||
|
@ -867,7 +897,8 @@ class MainSVM {
|
|||
Cases.Holodilnick.Filter,
|
||||
Cases.InjectorCase.Filter,
|
||||
Cases.KeycardHolderCase.Filter,
|
||||
Cases.GKeychain.Filter
|
||||
Cases.GKeychain.Filter,
|
||||
Cases.StreamerCase.Filter
|
||||
]
|
||||
for (let Case in Arrays.CasesID) {
|
||||
items[Arrays.CasesID[Case]]._props.Grids[0]._props["cellsV"] = Size[Case].Height;
|
||||
|
@ -950,11 +981,11 @@ class MainSVM {
|
|||
EditSimpleItemData(id, "ExaminedByDefault", true);
|
||||
}
|
||||
//Examine all items EXCEPT KEYS, checking for parent IDs of mechanical, keycards and keys in general just in case.
|
||||
else if (Config.Items.AllExaminedItems && base._parent !== "5c99f98d86f7745c314214b3" && base.parent !== "5c164d2286f774194c5e69fa" && base.parent !== "543be5e94bdc2df1348b4568") {
|
||||
else if (Config.Items.AllExaminedItems && base._parent !== "5c99f98d86f7745c314214b3" && base._parent !== "5c164d2286f774194c5e69fa" && base._parent !== "543be5e94bdc2df1348b4568") {
|
||||
EditSimpleItemData(id, "ExaminedByDefault", true);
|
||||
}
|
||||
//Change the weight
|
||||
if (base._type !== "Node" && base._type !== undefined && (base.parent !== "557596e64bdc2dc2118b4571" || base._parent !== "55d720f24bdc2d88028b456d")) {
|
||||
if (base._type !== "Node" && base._type !== undefined && (base._parent !== "557596e64bdc2dc2118b4571" || base._parent !== "55d720f24bdc2d88028b456d")) {
|
||||
EditSimpleItemData(id, "Weight", parseFloat(Config.Items.WeightChanger * base._props.Weight).toFixed(3));
|
||||
}
|
||||
if (Config.Items.NoGearPenalty) {
|
||||
|
@ -1023,7 +1054,7 @@ class MainSVM {
|
|||
}
|
||||
//Remove the keys usage - God i hate how i wrote it
|
||||
if (Config.Items.EnableKeys) {
|
||||
if ((base._parent == "5c99f98d86f7745c314214b3") && base._props.MaximumNumberOfUsage !== undefined) {
|
||||
if ((base._parent == "5c99f98d86f7745c314214b3") && base._props.MaximumNumberOfUsage !== undefined && Config.Items.InfiniteKeys) {
|
||||
|
||||
if (base._parent == "5c99f98d86f7745c314214b3" && base._props.MaximumNumberOfUsage == 1 && !Config.Items.AvoidSingleKeys) {
|
||||
base._props.MaximumNumberOfUsage = 0
|
||||
|
@ -1072,6 +1103,7 @@ class MainSVM {
|
|||
let ParentList = Config.Items.IDParent.split("\r\n")
|
||||
let IDArray = [];
|
||||
for (let Line in ParentList) {
|
||||
if (!ParentList[Line].startsWith("#") && !ParentList[Line].startsWith("//") && !ParentList[Line] == "") {
|
||||
const Variables = ParentList[Line].split(":")
|
||||
Logger.info("Parent: " + Variables)
|
||||
for (let ids in items) {
|
||||
|
@ -1087,14 +1119,17 @@ class MainSVM {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Config.Items.IDDefault.length > 0) {//ID:Variable:Value
|
||||
let DefaultList = Config.Items.IDDefault.split("\r\n")
|
||||
for (let Line in DefaultList) {
|
||||
if (!DefaultList[Line].startsWith("#") && !DefaultList[Line].startsWith("//") && !DefaultList[Line] == "") {
|
||||
let Variables = DefaultList[Line].split(":")
|
||||
Logger.info("Default: " + Variables)
|
||||
IDChanger(Variables)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Config.Items.IDFilter.length > 0) { //ID:Slots/Grids:Grid/Slot Number:Filter/ExcludedFilter:PushIntoArray
|
||||
let FilterList = Config.Items.IDFilter.split("\r\n")
|
||||
for (let Line in FilterList) {
|
||||
|
@ -1115,6 +1150,7 @@ class MainSVM {
|
|||
const handbook = DB.templates.handbook.Items
|
||||
let IDPriceLines = Config.Items.IDPrice.split("\r\n")
|
||||
for (let Line in IDPriceLines) {
|
||||
if (!IDPriceLines[Line].startsWith("#") && !IDPriceLines[Line].startsWith("//") && !IDPriceLines[Line] == "") {
|
||||
const Variables = IDPriceLines[Line].split(":")
|
||||
Logger.info("Price: " + Variables)
|
||||
let IDChecker = true;
|
||||
|
@ -1125,6 +1161,7 @@ class MainSVM {
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (IDChecker) {
|
||||
Logger.warning("[SVM] INVENTORY AND ITEMS - Price ID - " + Variables[0] + " - This ID is not found in handbook.\nChecking as ParentID")
|
||||
let childs = []
|
||||
|
@ -1151,6 +1188,7 @@ class MainSVM {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Logger.success("[SVM] Custom properties successfully loaded")
|
||||
}
|
||||
catch (e) {
|
||||
|
@ -1163,7 +1201,7 @@ class MainSVM {
|
|||
//Skill box
|
||||
globals.SkillsSettings.SkillProgressRate = Config.Player.SkillProgMult;
|
||||
globals.SkillsSettings.WeaponSkillProgressRate = Config.Player.WeaponSkillMult;
|
||||
//health after raid box
|
||||
//############## Health after raid status ##############
|
||||
Health.healthMultipliers.death = Config.Player.DiedHealth.Health_death;
|
||||
Health.healthMultipliers.blacked = Config.Player.DiedHealth.Health_blacked;
|
||||
Health.save.health = Config.Player.DiedHealth.Savehealth;
|
||||
|
@ -1182,21 +1220,29 @@ class MainSVM {
|
|||
globals.exp.kill.victimLevelExp = Config.Player.CharXP.PMCKill;
|
||||
globals.exp.kill.botHeadShotMult = Config.Player.CharXP.ScavHMult;
|
||||
globals.exp.kill.pmcHeadShotMult = Config.Player.CharXP.PMCHMult
|
||||
//############## END OF RAID Box ##############
|
||||
//############## XP mults Box ##############
|
||||
globals.exp.match_end.runnerMult = Config.Player.RaidMult.Runner
|
||||
globals.exp.match_end.miaMult = Config.Player.RaidMult.MIA
|
||||
globals.exp.match_end.survivedMult = Config.Player.RaidMult.Survived
|
||||
globals.exp.match_end.killedMult = Config.Player.RaidMult.Killed
|
||||
//Remove fall damage
|
||||
if (Config.Player.FallDamage) {
|
||||
globals.Health.Falling.SafeHeight = 200
|
||||
globals.Health.Falling.DamagePerMeter = 0
|
||||
|
||||
//############## Stamina ##############
|
||||
if (Config.Player.EnableStaminaLegs) {
|
||||
globals.Stamina.Capacity = Config.Player.MaxStaminaLegs
|
||||
globals.Stamina.BaseRestorationRate = Config.Player.RegenStaminaLegs
|
||||
globals.Stamina.JumpConsumption = Config.Player.JumpConsumption
|
||||
globals.Stamina.StandupConsumption.x = Config.Player.LayToStand
|
||||
globals.Stamina.PoseLevelConsumptionPerNotch.x = Config.Player.CrouchToStand/10;
|
||||
}
|
||||
//Change stamina (unlimited or no)
|
||||
if (Config.Player.MaxStamina !== 100 && !Config.Player.UnlimitedStamina) {
|
||||
globals.Stamina.Capacity = Config.Player.MaxStamina;
|
||||
if (Config.Player.EnableStaminaHands) {
|
||||
// globals.Stamina.AimDrainRate = Config.Player.
|
||||
globals.Stamina.HandsCapacity = Config.Player.MaxStaminaHands
|
||||
globals.Stamina.HandsRestoration = Config.Player.RegenStaminaHands
|
||||
globals.Stamina.AimConsumptionByPose.x = Config.Player.LyingDown
|
||||
globals.Stamina.AimConsumptionByPose.y = Config.Player.Crouching
|
||||
globals.Stamina.AimConsumptionByPose.z = Config.Player.Standing
|
||||
}
|
||||
else if (Config.Player.UnlimitedStamina) {
|
||||
if (Config.Player.UnlimitedStamina) {
|
||||
globals.Stamina.Capacity = 500;
|
||||
globals.Stamina.BaseRestorationRate = 500;
|
||||
globals.Stamina.StaminaExhaustionCausesJiggle = false;
|
||||
|
@ -1207,6 +1253,10 @@ class MainSVM {
|
|||
globals.Stamina.AimDrainRate = 0;
|
||||
globals.Stamina.SitToStandConsumption = 0;
|
||||
}
|
||||
if (Config.Player.FallDamage) {
|
||||
globals.Health.Falling.SafeHeight = 200
|
||||
globals.Health.Falling.DamagePerMeter = 0
|
||||
}
|
||||
globals.Health.Effects.Existence.HydrationLoopTime = (globals.Health.Effects.Existence.HydrationLoopTime / Config.Player.HydrationLoss)
|
||||
globals.Health.Effects.Existence.EnergyLoopTime = (globals.Health.Effects.Existence.EnergyLoopTime / Config.Player.EnergyLoss)
|
||||
globals.Health.Effects.Existence.DestroyedStomachEnergyTimeFactor = Config.Player.BlackStomach;
|
||||
|
@ -1220,6 +1270,13 @@ class MainSVM {
|
|||
//hideoutC.fuelDrainRateMultipler = Config.Hideout.FuelConsumptionRate;
|
||||
hideout.settings.airFilterUnitFlowRate *= Config.Hideout.AirFilterRate;
|
||||
hideout.settings.gpuBoostRate *= Config.Hideout.GPUBoostRate;
|
||||
HideoutConfig.cultistCircle.maxRewardItemCount = Config.Hideout.CultistMaxRewards
|
||||
for (let time in HideoutConfig.cultistCircle.craftTimeThreshholds) {
|
||||
HideoutConfig.cultistCircle.craftTimeThreshholds[time].craftTimeSeconds = parseInt(HideoutConfig.cultistCircle.craftTimeThreshholds[time].craftTimeSeconds * Config.Hideout.CultistTime)
|
||||
}
|
||||
for (let time in HideoutConfig.cultistCircle.directRewards) {
|
||||
HideoutConfig.cultistCircle.directRewards[time].craftTimeSeconds = parseInt(HideoutConfig.cultistCircle.directRewards[time].craftTimeSeconds * Config.Hideout.CultistTime)
|
||||
}
|
||||
|
||||
if (Config.Hideout.EnableStash) {
|
||||
items["566abbc34bdc2d92178b4576"]._props.Grids[0]._props.cellsV = Config.Hideout.Stash.StashLvl1
|
||||
|
@ -1279,9 +1336,8 @@ class MainSVM {
|
|||
if (Config.Hideout.RemoveConstructionsRequirements || Config.Hideout.RemoveSkillRequirements || Config.Hideout.RemoveTraderLevelRequirements) {
|
||||
for (const data in hideout.areas) {
|
||||
let areaData = hideout.areas[data]
|
||||
//Logger.info(areaData.stages[1].requirements[1])
|
||||
for (const stage in areaData.stages) {
|
||||
if (areaData.stages[stage].requirements !== undefined && areaData.stages[stage].requirements !== "[]") {
|
||||
if (areaData.stages[stage].requirements !== undefined && areaData.stages[stage].requirements.length > 0) {
|
||||
let rewriter = [];
|
||||
for (let req in areaData.stages[stage].requirements)//This is horrible
|
||||
{
|
||||
|
@ -1305,7 +1361,6 @@ class MainSVM {
|
|||
}
|
||||
}
|
||||
//Hideout regen menu
|
||||
//3.10
|
||||
for (let limb in globals.Health.Effects.Regeneration.BodyHealth) {
|
||||
globals.Health.Effects.Regeneration.BodyHealth[limb].Value *= Config.Hideout.Regeneration.HealthRegen
|
||||
}
|
||||
|
@ -1334,7 +1389,6 @@ class MainSVM {
|
|||
if (Config.Raids.EnableRaids) {
|
||||
//############## INRAID SECTION ##################
|
||||
if (Config.Raids.RaidStartup.EnableRaidStartup) {
|
||||
Inraid.MIAOnRaidEnd = Config.Raids.RaidStartup.MIAEndofRaid;
|
||||
Inraid.raidMenuSettings.aiAmount = Arrays.AIAmount[Config.Raids.RaidStartup.AIAmount];
|
||||
Inraid.raidMenuSettings.aiDifficulty = Arrays.AIDifficulty[Config.Raids.RaidStartup.AIDifficulty];
|
||||
Inraid.raidMenuSettings.bossEnabled = Config.Raids.RaidStartup.EnableBosses;
|
||||
|
@ -1590,40 +1644,58 @@ class MainSVM {
|
|||
locations[map].base.exits[extract].EntryPoints = "west,east"
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Removing that weird event ceasefire.
|
||||
if (Config.Raids.RaidEvents.DisableHalloweenAIFriendly) {
|
||||
for (let bottype in Events.hostilitySettingsForEvent.zombies.default) {
|
||||
if (Events.hostilitySettingsForEvent.zombies.default[bottype].BotRole == "pmcBEAR") {
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].SavagePlayerBehaviour = "AlwaysEnemies"
|
||||
for (let behavior in Events.hostilitySettingsForEvent.zombies.default[bottype]) {
|
||||
if (Events.hostilitySettingsForEvent.zombies.default[bottype].Neutral[behavior] == "pmcUSEC") {
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].Neutral.splice(behavior, 1)
|
||||
}
|
||||
}
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].AlwaysEnemies.push("pmcUSEC")
|
||||
}
|
||||
else if (Events.hostilitySettingsForEvent.zombies.default[bottype].BotRole == "pmcUSEC") {
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].SavagePlayerBehaviour = "AlwaysEnemies"
|
||||
for (let behavior in Events.hostilitySettingsForEvent.zombies.default[bottype]) {
|
||||
if (Events.hostilitySettingsForEvent.zombies.default[bottype].Neutral[behavior] == "pmcBEAR") {
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].Neutral.splice(behavior, 1)
|
||||
}
|
||||
}
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].AlwaysEnemies.push("pmcBEAR")
|
||||
}
|
||||
else {
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].BearPlayerBehaviour = "AlwaysEnemies"
|
||||
Events.hostilitySettingsForEvent.zombies.default[bottype].UsecPlayerBehaviour = "AlwaysEnemies"
|
||||
}
|
||||
}
|
||||
}
|
||||
Quest.showNonSeasonalEventQuests = Config.Raids.RaidEvents.NonSeasonalQuests
|
||||
Events.events[0].settings.zombieSettings.enabled = !Config.Raids.RaidEvents.DisableZombies
|
||||
//Explanation of this - Turns out SPT's method doesn't seem to convert upper case to lower case with the maps, while BSG's UI requests exactly uppercased scenario
|
||||
//In the end we have bigmap and lab only spawning waves because they are consistent on both sides. I hate my life.
|
||||
|
||||
if (Config.Raids.RaidEvents.RandomInfectionLevel) {
|
||||
Events.events[0].settings.zombieSettings.mapInfectionAmount =
|
||||
{
|
||||
"laboratory": 100,
|
||||
"bigmap": Math.floor(Math.random() * 100),
|
||||
"woods": Math.floor(Math.random() * 100),
|
||||
"shoreline": Math.floor(Math.random() * 100),
|
||||
"sandbox": Math.floor(Math.random() * 100),
|
||||
"rezervbase": Math.floor(Math.random() * 100),
|
||||
"tarkovstreets": Math.floor(Math.random() * 100),
|
||||
"factory4": Math.floor(Math.random() * 100),
|
||||
"lighthouse": Math.floor(Math.random() * 100),
|
||||
"interchange": Math.floor(Math.random() * 100)
|
||||
"bigmap": Math.floor(Math.random() * 100) + 1,
|
||||
"Woods": Math.floor(Math.random() * 100) + 1,
|
||||
"Shoreline": Math.floor(Math.random() * 100) + 1,
|
||||
"Sandbox": Math.floor(Math.random() * 100) + 1,
|
||||
"RezervBase": Math.floor(Math.random() * 100) + 1,
|
||||
"TarkovStreets": Math.floor(Math.random() * 100) + 1,
|
||||
"factory4": Math.floor(Math.random() * 100) + 1,
|
||||
"Lighthouse": Math.floor(Math.random() * 100) + 1,
|
||||
"Interchange": Math.floor(Math.random() * 100) + 1
|
||||
}
|
||||
//Hopefully a temporary fix
|
||||
Events.events[0].settings.zombieSettings.mapInfectionAmount["Woods"] = Events.events[0].settings.zombieSettings.mapInfectionAmount["woods"]
|
||||
Events.events[0].settings.zombieSettings.mapInfectionAmount["Shoreline"] = Events.events[0].settings.zombieSettings.mapInfectionAmount["shoreline"]
|
||||
Events.events[0].settings.zombieSettings.mapInfectionAmount["RezervBase"] = Events.events[0].settings.zombieSettings.mapInfectionAmount["rezervbase"]
|
||||
Events.events[0].settings.zombieSettings.mapInfectionAmount["TarkovStreets"] = Events.events[0].settings.zombieSettings.mapInfectionAmount["tarkovstreets"]
|
||||
Events.events[0].settings.zombieSettings.mapInfectionAmount["Lighthouse"] = Events.events[0].settings.zombieSettings.mapInfectionAmount["lighthouse"]
|
||||
Events.events[0].settings.zombieSettings.mapInfectionAmount["Interchange"] = Events.events[0].settings.zombieSettings.mapInfectionAmount["interchange"]
|
||||
for(let map in Events.eventBossSpawns.halloweenzombies)
|
||||
{
|
||||
for (let wave in Events.eventBossSpawns.halloweenzombies[map])
|
||||
{
|
||||
for (let map in Events.eventBossSpawns.halloweenzombies) {
|
||||
for (let wave in Events.eventBossSpawns.halloweenzombies[map]) {
|
||||
switch (map)//Feature - Infection level affects spawn chances.
|
||||
{
|
||||
case "factory4_day":
|
||||
|
@ -1675,6 +1747,7 @@ class MainSVM {
|
|||
locations["factory4_day"].base.BossLocationSpawn.push(KillaWave)
|
||||
locations["factory4_night"].base.BossLocationSpawn.push(KillaWave)
|
||||
}
|
||||
|
||||
if (Config.Raids.RaidEvents.TagillaInterchange) {
|
||||
for (let bosscheck in locations["interchange"].base.BossLocationSpawn)//Looking for exactly Killa wave, even tho he is the only boss here, safety measure
|
||||
{
|
||||
|
@ -1770,6 +1843,18 @@ class MainSVM {
|
|||
Glukhar.BossZone = "ZoneScavBase"
|
||||
locations["bigmap"].base.BossLocationSpawn.push(Glukhar)
|
||||
}
|
||||
if (Config.Raids.RaidEvents.CultistBosses) {
|
||||
const Cultists = Waves.Cultists;
|
||||
Cultists.BossChance = Config.Raids.RaidEvents.CultistBossesChance
|
||||
Cultists.OpenZones = locations["bigmap"].base.OpenZones
|
||||
locations["bigmap"].base.BossLocationSpawn.push(Cultists)
|
||||
Cultists.OpenZones = locations["shoreline"].base.OpenZones
|
||||
locations["shoreline"].base.BossLocationSpawn.push(Cultists)
|
||||
Cultists.OpenZones = locations["woods"].base.OpenZones
|
||||
locations["woods"].base.BossLocationSpawn.push(Cultists)
|
||||
Cultists.OpenZones = locations["lighthouse"].base.OpenZones
|
||||
locations["lighthouse"].base.BossLocationSpawn.push(Cultists)
|
||||
}
|
||||
if (Config.Raids.RaidEvents.GoonsFactory) {
|
||||
const Goons = Waves.Goons;
|
||||
Goons.BossZone = "BotZone";
|
||||
|
@ -1801,7 +1886,13 @@ class MainSVM {
|
|||
}
|
||||
}
|
||||
}
|
||||
//#######BTR STUFF
|
||||
if (Config.Raids.ForceTransitStash) {
|
||||
for (let levels in globals.FenceSettings.Levels) {
|
||||
globals.FenceSettings.Levels[levels].TransitGridSize["x"] = Config.Raids.TransitWidth
|
||||
globals.FenceSettings.Levels[levels].TransitGridSize["y"] = Config.Raids.TransitHeight
|
||||
}
|
||||
}
|
||||
//############## BTR STUFF
|
||||
if (Config.Raids.EnableBTR) {
|
||||
if (Config.Raids.ForceBTRFriendly) {
|
||||
for (let levels in globals.FenceSettings.Levels) {
|
||||
|
@ -1832,7 +1923,7 @@ class MainSVM {
|
|||
trader.fence.itemPriceMult = Config.Traders.Fence.PriceMult;
|
||||
for (let stock in trader.updateTime)//useless cycle for now, will remove later.
|
||||
{
|
||||
if (trader.updateTime[stock]._name == "fence" && trader.updateTime[stock].seconds.min != undefined) {
|
||||
if (trader.updateTime[stock].traderId === "579dc571d53a0658a154fbec") {
|
||||
trader.updateTime[stock].seconds.min = Config.Traders.Fence.StockTime_Min * 60;
|
||||
trader.updateTime[stock].seconds.max = Config.Traders.Fence.StockTime_Max * 60;
|
||||
}
|
||||
|
@ -1845,7 +1936,10 @@ class MainSVM {
|
|||
BlackItems.blacklist.push(BlacklistArray);
|
||||
}
|
||||
globals.TradingSettings.BuyoutRestrictions.MinDurability = Config.Traders.MinDurabSell / 100
|
||||
Quest.redeemTime = Config.Traders.QuestRedeemTime;
|
||||
|
||||
Quest.mailRedeemTimeHours.default = Config.Traders.QuestRedeemDefault;
|
||||
Quest.mailRedeemTimeHours.unheard_edition = Config.Traders.QuestRedeemUnheard;
|
||||
|
||||
trader.purchasesAreFoundInRaid = Config.Traders.FIRTrade;
|
||||
traders["5c0647fdd443bc2504c2d371"].base.unlockedByDefault = Config.Traders.UnlockJaeger
|
||||
traders["6617beeaa9cfa777ca915b7c"].base.unlockedByDefault = Config.Traders.UnlockRef
|
||||
|
@ -1874,18 +1968,7 @@ class MainSVM {
|
|||
if (Config.Traders.AllQuestsAvailable) {
|
||||
for (let id in Quests) {
|
||||
let QuestData = Quests[id]
|
||||
QuestData.conditions.AvailableForStart = [
|
||||
{
|
||||
"_parent": "Level",
|
||||
"_props":
|
||||
{
|
||||
"compareMethod": ">=",
|
||||
"value": "1",
|
||||
"index": 0,
|
||||
"parentId": "",
|
||||
"id": "683a4e6b255f7527fb05a0f6"
|
||||
}
|
||||
}]
|
||||
QuestData.conditions.AvailableForStart = []
|
||||
}
|
||||
}
|
||||
if (Config.Traders.FIRRestrictsQuests) {
|
||||
|
@ -1961,23 +2044,30 @@ class MainSVM {
|
|||
let p = 0;
|
||||
for (let CurTrader in Arrays.traderArray) {
|
||||
for (let assortment in traders[Arrays.traderArray[CurTrader]].assort.barter_scheme) {
|
||||
if (traders[Arrays.traderArray[CurTrader]].assort.barter_scheme[assortment][0][0]._tpl == "5449016a4bdc2d6f028b456f" ||
|
||||
traders[Arrays.traderArray[CurTrader]].assort.barter_scheme[assortment][0][0]._tpl == "569668774bdc2da2298b4568" ||
|
||||
traders[Arrays.traderArray[CurTrader]].assort.barter_scheme[assortment][0][0]._tpl == "5696686a4bdc2da3298b456a") {
|
||||
let TempValue = (traders[Arrays.traderArray[CurTrader]].assort.barter_scheme[assortment][0][0].count * SellArray[p]).toFixed(2)//testing
|
||||
traders[Arrays.traderArray[CurTrader]].assort.barter_scheme[assortment][0][0].count = parseFloat(TempValue)
|
||||
let TradeAssort = traders[Arrays.traderArray[CurTrader]].assort.barter_scheme[assortment][0][0];
|
||||
switch (TradeAssort._tpl) {
|
||||
case "5449016a4bdc2d6f028b456f":
|
||||
case "569668774bdc2da2298b4568":
|
||||
case "5696686a4bdc2da3298b456a":
|
||||
if (TradeAssort.count !== undefined) {
|
||||
TradeAssort.count = parseFloat((TradeAssort.count * SellArray[p]).toFixed(2));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
}
|
||||
if (Config.Traders.RemoveCurrencyOffers) {
|
||||
if (Config.Traders.RemoveCurrencyOffers || Config.Traders.RemoveBarterOffers) {
|
||||
for (let CurTrader in traders) {
|
||||
if (CurTrader !== "ragfair" && CurTrader !== "638f541a29ffd1183d187f57" && CurTrader !== "579dc571d53a0658a154fbec") //avoid ragfair, lighthouse trader and fence
|
||||
{
|
||||
for (let assortment in traders[CurTrader].assort.barter_scheme) {
|
||||
if (traders[CurTrader].assort.barter_scheme[assortment][0][0]._tpl == "5449016a4bdc2d6f028b456f" ||
|
||||
traders[CurTrader].assort.barter_scheme[assortment][0][0]._tpl == "569668774bdc2da2298b4568" ||
|
||||
traders[CurTrader].assort.barter_scheme[assortment][0][0]._tpl == "5696686a4bdc2da3298b456a") {
|
||||
let TradeAssort = traders[CurTrader].assort.barter_scheme[assortment][0][0];
|
||||
switch (TradeAssort._tpl) {
|
||||
case "5449016a4bdc2d6f028b456f":
|
||||
case "569668774bdc2da2298b4568":
|
||||
case "5696686a4bdc2da3298b456a":
|
||||
if (Config.Traders.RemoveCurrencyOffers) {
|
||||
for (let DeletElem in traders[CurTrader].assort.items) {//3.10 rework instead of deleting assort - set everything to 0 instead.
|
||||
if (traders[CurTrader].assort.items[DeletElem]._id == assortment) {
|
||||
if (traders[CurTrader].assort.items[DeletElem].upd.UnlimitedCount !== undefined) {
|
||||
|
@ -1987,18 +2077,9 @@ class MainSVM {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
if (Config.Traders.RemoveBarterOffers) {
|
||||
for (let CurTrader in traders) {
|
||||
if (CurTrader !== "ragfair" && CurTrader !== "638f541a29ffd1183d187f57" && CurTrader !== "579dc571d53a0658a154fbec") {
|
||||
for (let assortment in traders[CurTrader].assort.barter_scheme) {
|
||||
if (traders[CurTrader].assort.barter_scheme[assortment][0][0]._tpl !== "5449016a4bdc2d6f028b456f" &&
|
||||
traders[CurTrader].assort.barter_scheme[assortment][0][0]._tpl !== "569668774bdc2da2298b4568" &&
|
||||
traders[CurTrader].assort.barter_scheme[assortment][0][0]._tpl !== "5696686a4bdc2da3298b456a") {
|
||||
for (let DeletElem in traders[CurTrader].assort.items) {
|
||||
if (traders[CurTrader].assort.items[DeletElem]._id == assortment) {
|
||||
if (traders[CurTrader].assort.items[DeletElem].upd.UnlimitedCount !== undefined) {
|
||||
|
@ -2008,6 +2089,8 @@ class MainSVM {
|
|||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2028,12 +2111,48 @@ class MainSVM {
|
|||
PMC.convertIntoPmcChance.default.pmcbot.max = Config.PMC.AItoPMC.RaiderToPMC;
|
||||
PMC.convertIntoPmcChance.default.exusec.max = Config.PMC.AItoPMC.RogueToPMC;
|
||||
PMC.convertIntoPmcChance.default.marksman.max = Config.PMC.AItoPMC.SniperToPMC;
|
||||
|
||||
PMC.convertIntoPmcChance.factory4_day.assault.min = Config.PMC.AItoPMC.ScavToPMCFactory;
|
||||
PMC.convertIntoPmcChance.factory4_day.assault.max = Config.PMC.AItoPMC.ScavToPMCFactory;
|
||||
PMC.isUsec = Config.PMC.PMCRatio;
|
||||
for (let i in locations) {
|
||||
if (i !== "base" && locations[i].base.BossLocationSpawn !== undefined) {//I Really think this is overkill, but oh well.
|
||||
for (let ai in locations[i].base.BossLocationSpawn) {
|
||||
if (locations[i].base.BossLocationSpawn[ai].BossName == "pmcBEAR" || locations[i].base.BossLocationSpawn[ai].BossName == "pmcUSEC") {
|
||||
let randnum = Math.floor(Math.random() * 100) + 1
|
||||
if (randnum > Config.PMC.PMCRatio) {
|
||||
locations[i].base.BossLocationSpawn[ai].BossName = "pmcBEAR";
|
||||
}
|
||||
else {
|
||||
locations[i].base.BossLocationSpawn[ai].BossName = "pmcUSEC";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
PMC.botRelativeLevelDeltaMax = Config.PMC.LevelUpMargin;
|
||||
PMC.botRelativeLevelDeltaMin = Config.PMC.LevelDownMargin;
|
||||
if (Config.PMC.ChancesEnable) {
|
||||
PMC.chanceSameSideIsHostilePercent = Config.PMC.PMCChance.HostilePMC;
|
||||
//1.10.1 Hostility
|
||||
PMC.hostilitySettings.pmcbear.usecEnemyChance = Config.PMC.PMCChance.HostilePMC
|
||||
PMC.hostilitySettings.pmcbear.bearEnemyChance = Config.PMC.PMCChance.HostileSamePMC
|
||||
PMC.hostilitySettings.pmcusec.bearEnemyChance = Config.PMC.PMCChance.HostilePMC
|
||||
PMC.hostilitySettings.pmcusec.usecEnemyChance = Config.PMC.PMCChance.HostileSamePMC
|
||||
for (let diffs in Bot["pmcusec"].difficulty) {
|
||||
Bot["pmcusec"].difficulty[diffs].Mind.DEFAULT_USEC_BEHAVIOUR = "ChancedEnemies";//Something that live dumps and SPT configs have in conflict
|
||||
Bot["pmcusec"].difficulty[diffs].Mind.DEFAULT_BEAR_BEHAVIOUR = "ChancedEnemies";
|
||||
Bot["usec"].difficulty[diffs].Mind.DEFAULT_USEC_BEHAVIOUR = "ChancedEnemies";//No clue whether just 'usec' or 'bear' is required.
|
||||
Bot["usec"].difficulty[diffs].Mind.DEFAULT_BEAR_BEHAVIOUR = "ChancedEnemies";
|
||||
}
|
||||
for (let diffs in Bot["pmcbear"].difficulty) {
|
||||
Bot["pmcbear"].difficulty[diffs].Mind.DEFAULT_USEC_BEHAVIOUR = "ChancedEnemies";
|
||||
Bot["pmcbear"].difficulty[diffs].Mind.DEFAULT_BEAR_BEHAVIOUR = "ChancedEnemies";
|
||||
Bot["bear"].difficulty[diffs].Mind.DEFAULT_USEC_BEHAVIOUR = "ChancedEnemies";
|
||||
Bot["bear"].difficulty[diffs].Mind.DEFAULT_BEAR_BEHAVIOUR = "ChancedEnemies";
|
||||
}
|
||||
AIHostility("pmcBEAR", "pmcUSEC")
|
||||
AIHostility("pmcUSEC", "pmcBEAR")
|
||||
PMC.looseWeaponInBackpackChancePercent = Config.PMC.PMCChance.PMCLooseWep;
|
||||
PMC.weaponHasEnhancementChancePercent = Config.PMC.PMCChance.PMCWepEnhance;
|
||||
PMC.addPrefixToSameNamePMCAsPlayerChance = Config.PMC.PMCChance.PMCNamePrefix;
|
||||
|
@ -2173,6 +2292,45 @@ class MainSVM {
|
|||
|
||||
//############## FUNCTIONS ##############
|
||||
//Set a Unique AI type spawn within selected location, with a lot of variables to come in.
|
||||
function AIHostility(First, Second) {
|
||||
let temp;
|
||||
if (First == "pmcUSEC") {
|
||||
temp = "pmcusec"
|
||||
}
|
||||
else {
|
||||
temp = "pmcbear"
|
||||
}
|
||||
for (let ai in PMC.hostilitySettings[temp].chancedEnemies) {
|
||||
if (PMC.hostilitySettings[temp].chancedEnemies[ai].Role == Second) {
|
||||
PMC.hostilitySettings[temp].chancedEnemies[ai].EnemyChance = Config.PMC.PMCChance.HostilePMC;
|
||||
}
|
||||
if (PMC.hostilitySettings[temp].chancedEnemies[ai].Role == First) {
|
||||
PMC.hostilitySettings[temp].chancedEnemies[ai].EnemyChance = Config.PMC.PMCChance.HostileSamePMC;
|
||||
}
|
||||
}
|
||||
for (let i in locations) {
|
||||
if (i !== "base" && locations[i].base.BotLocationModifier.AdditionalHostilitySettings !== undefined) {
|
||||
for (let ai in locations[i].base.BotLocationModifier.AdditionalHostilitySettings) {
|
||||
if (locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].BotRole == First) {
|
||||
locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].bearEnemyChance = Config.PMC.PMCChance.HostilePMC
|
||||
locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].usecEnemyChance = Config.PMC.PMCChance.HostileSamePMC
|
||||
for (let hostility in locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].ChancedEnemies) {
|
||||
if (locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].ChancedEnemies[hostility].Role == Second) {//Because one PMC type has entry of other type and not themselves
|
||||
locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].ChancedEnemies[hostility].EnemyChance = Config.PMC.PMCChance.HostilePMC
|
||||
}
|
||||
}
|
||||
}
|
||||
else//Due to namings of the variables, this extra thing goes
|
||||
{
|
||||
locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].usecEnemyChance = Config.PMC.PMCChance.HostilePMC
|
||||
locations[i].base.BotLocationModifier.AdditionalHostilitySettings[ai].bearEnemyChance = Config.PMC.PMCChance.HostileSamePMC
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
function CreateBoss(role, chance, followers, escortAmount, zones) {
|
||||
return {
|
||||
"BossName": role,
|
||||
|
@ -2215,7 +2373,7 @@ class MainSVM {
|
|||
break;
|
||||
case 4: Quest.repeatableQuests[Digit].types.push(Arrays.Types[1], Arrays.Types[2])
|
||||
break;
|
||||
case 5: Quest.repeatableQuests[Digit].types.push(Arrays.Types[2], Arrays.Types[2])
|
||||
case 5: Quest.repeatableQuests[Digit].types.push(Arrays.Types[0], Arrays.Types[2])
|
||||
break;
|
||||
case 6: Quest.repeatableQuests[Digit].types.push(Arrays.Types[0], Arrays.Types[1], Arrays.Types[2])
|
||||
break;
|
||||
|
@ -2273,16 +2431,16 @@ class MainSVM {
|
|||
if ((Levels.length == Exp.length) && (Levels.length == Reputation.length) &&
|
||||
(Levels.length == ItemsReward.length) && (Levels.length == Roubles.length) &&
|
||||
(Levels.length == GPcoins.length) && (Levels.length == SkillChance.length) && (Levels.length == SkillPoint.length)) {
|
||||
Quest.repeatableQuests[Digit].rewardScaling.levels = Levels.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.experience = Exp.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.reputation = Reputation.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.items = ItemsReward.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.roubles = Roubles.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.gpCoins = GPcoins.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.skillRewardChance = SkillChance.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.skillPointReward = SkillPoint.map(Number);
|
||||
Quest.repeatableQuests[Digit].rewardScaling.levels = ApplyQuestRewardChange(Levels)
|
||||
Quest.repeatableQuests[Digit].rewardScaling.experience = ApplyQuestRewardChange(Exp)
|
||||
Quest.repeatableQuests[Digit].rewardScaling.reputation = ApplyQuestRewardChange(Reputation)
|
||||
Quest.repeatableQuests[Digit].rewardScaling.ItemsReward = ApplyQuestRewardChange(ItemsReward)
|
||||
Quest.repeatableQuests[Digit].rewardScaling.roubles = ApplyQuestRewardChange(Roubles)
|
||||
Quest.repeatableQuests[Digit].rewardScaling.gpCoins = ApplyQuestRewardChange(GPcoins)
|
||||
Quest.repeatableQuests[Digit].rewardScaling.SkillChance = ApplyQuestRewardChange(SkillChance)
|
||||
Quest.repeatableQuests[Digit].rewardScaling.SkillPoint = ApplyQuestRewardChange(SkillPoint)
|
||||
}
|
||||
else {
|
||||
else {//I think at this point this one is redundant.
|
||||
Logger.error("[SVM] REPEATABLE QUESTS - Daily rewards scales written wrongly, read FAQ, changes ignored.")
|
||||
}
|
||||
}
|
||||
|
@ -2290,6 +2448,15 @@ class MainSVM {
|
|||
Logger.error("[SVM] REPEATABLE QUESTS - Daily rewards scales written wrongly, read FAQ, changes ignored.")
|
||||
}
|
||||
}
|
||||
function ApplyQuestRewardChange(Item) {
|
||||
if (!Item.map(Number).includes(NaN)) {
|
||||
return Item.map(Number)
|
||||
}
|
||||
else {
|
||||
Logger.error("[SVM] REPEATABLE QUESTS - Certain field is not a number: " + Item)
|
||||
throw new Error()
|
||||
}
|
||||
}
|
||||
function isJSONValueDefined(value) {
|
||||
return value !== undefined && !value.isNaN;
|
||||
}
|
||||
|
@ -2383,6 +2550,9 @@ class MainSVM {
|
|||
case "-":
|
||||
Field = parseInt(parseInt(Field) - parseFloat(Value))
|
||||
break;
|
||||
case "=":
|
||||
Field = parseFloat(Value)
|
||||
break;
|
||||
}
|
||||
return Field
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
{
|
||||
"Glukhar":
|
||||
{
|
||||
"Glukhar": {
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "2",
|
||||
|
@ -44,8 +43,7 @@
|
|||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
"Kaban":
|
||||
{
|
||||
"Kaban": {
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "6",
|
||||
|
@ -89,8 +87,7 @@
|
|||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
"Kolontay":
|
||||
{
|
||||
"Kolontay": {
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "2",
|
||||
|
@ -167,13 +164,45 @@
|
|||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerBirdEye"
|
||||
}
|
||||
],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
"Cultists": {
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "sectantWarrior",
|
||||
"BossName": "sectantPredvestnik",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": true,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [
|
||||
{
|
||||
"BossEscortAmount": "0",
|
||||
"BossEscortAmount": "1",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerGluharScout"
|
||||
"BossEscortType": "sectantOni"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "1",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "sectantPrizrak"
|
||||
}
|
||||
],
|
||||
"Time": -1,
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
[General]
|
||||
gameName=spt
|
||||
modid=0
|
||||
version=d2024.12.19.0
|
||||
version=d2025.1.12.0
|
||||
newestVersion=
|
||||
category="1,2"
|
||||
nexusFileStatus=1
|
||||
installationFile=SVM.Server.Value.Modifier1.10H4.zip
|
||||
repository=
|
||||
installationFile=SVM.Server.Value.Modifier1.10.1.zip
|
||||
repository=Nexus
|
||||
ignoredVersion=
|
||||
comments=
|
||||
notes=
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=https://hub.sp-tarkov.com/advertising-disclaimer/
|
|
@ -0,0 +1,26 @@
|
|||
Personal Use Source License (PUSL)
|
||||
Version 1.0
|
||||
|
||||
Copyright © 2024, GhostFenixx
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”),
|
||||
to use the Software for personal, non-commercial purposes only, subject to the following conditions:
|
||||
|
||||
Usage Rights:
|
||||
The Software may only be used for personal purposes. Commercial use of the Software is strictly prohibited without prior written permission from the author.
|
||||
|
||||
Source Code Access:
|
||||
The source code of the Software is made available for viewing, but modifications to the Software are restricted as follows:
|
||||
You may modify the Software for personal use only.
|
||||
You are not permitted to distribute or share any modified versions of the Software in any form.
|
||||
|
||||
Redistribution:
|
||||
You may not redistribute the Software, whether in its original or modified form, without obtaining explicit permission from the copyright holder.
|
||||
|
||||
Non-Commercial Use:
|
||||
This Software is provided for non-commercial use only.
|
||||
Any use of the Software for commercial purposes, including but not limited to commercial distribution, is prohibited without a commercial license agreement obtained from the copyright holder.
|
||||
|
||||
No Warranty:
|
||||
The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement.
|
||||
In no event shall the author or copyright holder be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the Software or the use or other dealings in the Software
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"CurrentlySelectedPreset":"Default"
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"name": "SVM",
|
||||
"author": "GhostFenixx",
|
||||
"version": "1.10.0",
|
||||
"sptVersion": "3.10.x",
|
||||
"license": "PUSL",
|
||||
"devdependencies": {},
|
||||
"main": "src/SVM.js"
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"Pistol":["9x19", "9x18pm", "9x21", "762x25tt", "46x30", "57x28", "1143x23", "127x33", "9x33r", "10MM", "40SW", "357SIG", "9MM", "45ACP", "50AE", "380AUTO"],
|
||||
"ARifle":["762x39", "545x39", "556x45", "9x39", "366", "762x35", "300blk", "ATL15", "GRENDEL", "50WLF", "KURZ"],
|
||||
"Shotgun":["12x70", "20x70", "23x75"],
|
||||
"MRifle":["762x51", "68x51", "762х54R", "762x54r", "86x70", "127x55", "277", "BMG"],
|
||||
"MarkedKeys":["5780cf7f2459777de4559322", "5d80c60f86f77440373c4ece", "5d80c62a86f7744036212b3f", "5ede7a8229445733cb4c18e2", "63a3a93f8a56922e82001f5d", "64ccc25f95763a1ae376e447", "62987dfc402c7f69bf010923"],
|
||||
"traderArray": ["54cb50c76803fa8b248b4571", "54cb57776803fa99248b456e", "58330581ace78e27b8b10cee", "5935c25fb3acc3127c3d8cd9", "5a7c2eca46aef81a7ca2145d", "5ac3b934156ae10c4430e83c", "5c0647fdd443bc2504c2d371"],
|
||||
"CasesID":["59fb016586f7746d0d4b423a","5783c43d2459774bbe137486","60b0f6c058e0b0481a09ad11","5e2af55f86f7746d4159f07c","59fb042886f7746c5005a7b2","59fb023c86f7746d0d4b423c","5b7c710788a4506dec015957","5aafbde786f774389d0cbc0f","5c127c4486f7745625356c13","5c093e3486f77430cb02e593","5aafbcd986f7745e590fff23","5c0a840b86f7742ffa4f2482","5b6d9ce188a4501afc1b2b25","5d235bb686f77443f4331278","59fafd4b86f7745ca07e1232","590c60fc86f77412b13fddcf","567143bf4bdc2d1a0f8b4567","5c093db286f7740a1b2617e3","619cbf7d23893217ec30b689","619cbf9e0a7c3a1a2731940a","62a09d3bcf4a99369e262447"],
|
||||
"SecConID":["544a11ac4bdc2d470e8b456a","5c093ca986f7740a1867ab12","5857a8b324597729ab0a0e7d","59db794186f77448bc595262","5857a8bc2459772bad15db29","665ee77ccf2d642e98220bca","5732ee6a24597719ae0c0281","64f6f4c5911bcdfe8b03b0dc"],
|
||||
"AIAmount":["AsOnline","Low","Medium","High","Horde","NoBots"],
|
||||
"AIDifficulty":["AsOnline","Easy","Medium","Hard","Impossible","Random"],
|
||||
"Types":["Elimination","Completion","Exploration"]
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
{
|
||||
"funni":[
|
||||
"So, how's Erdtree? Or maybe you're into Dawntrail?",
|
||||
"Have you tried Minecraft though?",
|
||||
"I hope Nikita is proud of me",
|
||||
"This release provides you 16x time the details according to Todd Howard",
|
||||
"Bears are based but cringe, Usecs are cringe but based",
|
||||
"69.6969% of the update time were wasted for this specific line you're reading",
|
||||
"Still not enough tooltips added, slight chance to get stuck in a toaster",
|
||||
"Kept ya waiting huh?",
|
||||
"You're finally awake, you were trying to play like a chad, right?",
|
||||
"It's here, lurking in the shadows",
|
||||
"Chomp goes Caw Caw",
|
||||
"Goose goes Honk Honk",
|
||||
"GhostFenixx goes 'Not again'",
|
||||
"No more KMC ;-;",
|
||||
"Hello, how's your day? :]",
|
||||
"I hope you have enough RAM to play this",
|
||||
"Wipe at Thursday",
|
||||
"Tagilla locked me up in the basement to write mods for Tarkov, send help",
|
||||
"If you're reading this, you're capable of reading!",
|
||||
"Who wrote this stuff anyway?",
|
||||
"Hot single SCAVs in you area!",
|
||||
"These lines are such a waste of space",
|
||||
"I know you are reading this",
|
||||
"Do you like hurting other people?",
|
||||
"Don't play Gaijin games, such a cash grab, good source of classified data tho",
|
||||
"YOU, YES YOU, YOU ARE AWESOME, NOW LIVE WITH THAT!",
|
||||
"Did you wash your dishes?",
|
||||
"Sanitar did nothing wrong",
|
||||
"I actually played tarkov, finally",
|
||||
"rat attac",
|
||||
"Don't worry, I won't judge your preferences, you're my favorite casual <3",
|
||||
"Me (Head-Eyes) You",
|
||||
"HE DID THE WIGGLE!",
|
||||
"Are you sure you enabled sections?",
|
||||
"Did you know? If you kill guys with guns, there will be no one to kill you!",
|
||||
"The all consuming gluttony is approaching",
|
||||
"I swear if I forgot to remove a logger somewhere i'll choke someone",
|
||||
"Go on, tell me you're trying to run EFT with 8GB of ram",
|
||||
"Are you seriously playing SPT by yourself?",
|
||||
"No, Putting 16x Scope onto TOZ is not a great idea",
|
||||
"Don't dissapoint the Glock Daddy",
|
||||
"Still can't play streets, right? I feel ya",
|
||||
"Go on, take SVD into factory, see if I care",
|
||||
"RFB AND VPO FOR THE WIN!",
|
||||
"Makes your experience better since 2021!",
|
||||
"Dear diary, today I died with LEDX not in the secure container",
|
||||
"ALL SCREWS, NO NUTS, WHY?",
|
||||
"One does not simply launch flare properly",
|
||||
"Noooo, don't go that corridor, there is a mine in the room!",
|
||||
"No more Autumn in Tarkov",
|
||||
"The Holy Fox is gone",
|
||||
"Don't play MMO's, those are unhealthy",
|
||||
"I swear, stop putting those lines on Reddit",
|
||||
"I really hope you do not restart the server to read those",
|
||||
"There will be Up. Date. A creator on website nodes his head.",
|
||||
"Stay Hydrated",
|
||||
"Have you tried Gray Zone Warfare? :D",
|
||||
"Still filled with bugs, don't worry",
|
||||
"Pls leave a like an subscribe, don't forget to click a bell button",
|
||||
"Google Clearly doesn't like me ;-;",
|
||||
"Name of your PMC is disgusting, please revaluate your life choices",
|
||||
"Why do you want to carry 2000 rounds in one slot?",
|
||||
"Really? 20x2 cell sized pockets?",
|
||||
"Extremis malis extrema remedia, effugere non potes",
|
||||
"You're a PMC, Harry!",
|
||||
"Join the Dark side, we have Igolniks",
|
||||
"Imagine how many people died stepping on mines in Woods because they can't read the signs",
|
||||
"Each new line added in message of the day is increasing the load on your CPU, let that sink in",
|
||||
"Totally against Nikita(tm) vision(tm).",
|
||||
"3 HEAVY BLEEDS IN ONE SHOT, THANKS SCAV!",
|
||||
"What else can be so joyful than making a mod on my birthday? Not playing SPT afterwards!",
|
||||
"Nice work bitch!",
|
||||
"You can never go wrong loading .366 into 7.62x39 chamber",
|
||||
"There was a blue sky and bright yellow field, but now it is always dark and gray",
|
||||
"This mod probably works...Mostly? Hopefully?",
|
||||
"I have 59 bazillion mods, why X field doesn't work?",
|
||||
"What?",
|
||||
"Really, stop looking here, play the game already >:C",
|
||||
"Someday I'll paste whole Bee movie script here",
|
||||
"Seriously, Roseheart, stop posting those on r/sptarkov.",
|
||||
"They added a Deagle in the game...Makes me miss KMC once again",
|
||||
"Swedish siesta is fun ngl",
|
||||
"Yep, people still seem to fail to install this mod",
|
||||
"3.9.8 huh? SPT lads do stack those numbers high",
|
||||
"Cats are still superior than dogs, CWX.",
|
||||
"Someday the war will be over and world won't be the same...",
|
||||
"Damn, Stalker 2 footage is juicy",
|
||||
"Do yourself a favor, stop shitposting",
|
||||
"If SPT can go 3.10, so is SVM can go 1.10",
|
||||
"Show must go on!",
|
||||
">Are You Happy? >No. >Why? >I play Escape from Tarkov",
|
||||
"Deagle or Rsh12? That's the question.",
|
||||
"You know, if you won't report issues to GhostFenixx, they won't be fixed.",
|
||||
"Your AD could be here",
|
||||
"А Я і досі у пошуках щастя",
|
||||
"Вышел, блин, за хлебушком",
|
||||
"Angel, save us!",
|
||||
"You, Me, Factory, Full of nades",
|
||||
"Damn bruv, your profile name is cringe",
|
||||
"You're pretty good",
|
||||
"ПРОДАМ ГАРАЖ",
|
||||
"Fuck you, multitool",
|
||||
"Just one more run to labs, it will be fine, i promise",
|
||||
"ERROR, THE USER IS TOO HANDSOME TO PLAY THIS GAME!",
|
||||
"Going for the resort for a red card is like a definition of insanity",
|
||||
"I hope this app won't end in torrents",
|
||||
"Сподіваюсь, з тобою все гаразд",
|
||||
"[Insert Fun stuff for ADHD kiddos]",
|
||||
"Want some game recommendation? Well I've got none, otherwise I wouldn't play EFT",
|
||||
"Want some music recommendation? Check Solence.",
|
||||
"Want some music recommendation? Check Architects.",
|
||||
"Want some music recommendation? Check Bad Omens.",
|
||||
"Want some music recommendation? Check Geneburn... Nah, i'm joking, Check Motionless in White.",
|
||||
"Want some music recommendation? Check Imminence.",
|
||||
"Want some music recommendation? Check Cantervice.",
|
||||
"You better not forget to take splint with you this time",
|
||||
"You cannot Escape From -REDACTED BY LICENSE VIOLATION-"]
|
||||
}
|
|
@ -0,0 +1,183 @@
|
|||
{
|
||||
"Glukhar":
|
||||
{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "followerGluharSecurity",
|
||||
"BossName": "bossGluhar",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "",
|
||||
"Delay": 0,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [
|
||||
{
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerGluharAssault"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerGluharSecurity"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerGluharScout"
|
||||
}
|
||||
],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
"Kaban":
|
||||
{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "6",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "followerBoar",
|
||||
"BossName": "bossBoar",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "",
|
||||
"Delay": 0,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [
|
||||
{
|
||||
"BossEscortAmount": "4",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerBoar"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "1",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerBoarClose1"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "1",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerBoarClose2"
|
||||
}
|
||||
],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
"Kolontay":
|
||||
{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "followerKolontaySecurity",
|
||||
"BossName": "bossKolontay",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "",
|
||||
"Delay": 0,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [
|
||||
{
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerKolontayAssault"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerKolontaySecurity"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "0",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerGluharScout"
|
||||
}
|
||||
],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
"Goons":{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "2",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "exUsec",
|
||||
"BossName": "bossKnight",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": true,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [
|
||||
{
|
||||
"BossEscortAmount": "1",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerBigPipe"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "1",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerBirdEye"
|
||||
},
|
||||
{
|
||||
"BossEscortAmount": "0",
|
||||
"BossEscortDifficult": [
|
||||
"normal"
|
||||
],
|
||||
"BossEscortType": "followerGluharScout"
|
||||
}
|
||||
],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
[General]
|
||||
gameName=spt
|
||||
modid=0
|
||||
version=d2024.12.19.0
|
||||
newestVersion=
|
||||
category="1,2"
|
||||
nexusFileStatus=1
|
||||
installationFile=SVM.Server.Value.Modifier1.10H4.zip
|
||||
repository=
|
||||
ignoredVersion=
|
||||
comments=
|
||||
notes=
|
||||
nexusDescription=
|
||||
url=
|
||||
hasCustomURL=false
|
||||
lastNexusQuery=
|
||||
lastNexusUpdate=
|
||||
nexusLastModified=2024-12-16T06:50:21Z
|
||||
nexusCategory=0
|
||||
converted=false
|
||||
validated=false
|
||||
color=@Variant(\0\0\0\x43\0\xff\xff\0\0\0\0\0\0\0\0)
|
||||
tracked=0
|
||||
|
||||
[installedFiles]
|
||||
1\modid=0
|
||||
1\fileid=0
|
||||
size=1
|
|
@ -1,4 +1,3 @@
|
|||
# This file was automatically generated by Mod Organizer.
|
||||
-Unsorted_separator
|
||||
-Version 1.26.0_separator
|
||||
-Visceral Combat
|
||||
|
|