Fika-Tarkov/mods/Server Value Modifier/User/Mods/[SVM] Server Value Modifier/src/SVM.js

2407 lines
125 KiB
JavaScript

"use strict";
class MainSVM {
preSptLoad(container) {
const Logger = container.resolve("WinstonLogger");
try { //Checking for loader.json, if doesn't exist - throw a message, disable the mod.
const PresetLoader = require('../Loader/loader.json');
if (PresetLoader.CurrentlySelectedPreset == null || PresetLoader.CurrentlySelectedPreset == "null") {
Logger.warning("[SVM] Null Preset detected, SVM is disabled, Most likely you're running this mod for the first time, head to the SVM mod folder and run the Greed.exe");
return
}
const Config = require('../Presets/' + PresetLoader.CurrentlySelectedPreset + '.json');
}
catch (e) {
const Logger = container.resolve("WinstonLogger");
Logger.warning("\n[SVM] SVM is lacking loader file or there is an error, mod is disabled\n" +
"Most likely you're running this mod for the first time, head to the SVM mod folder and run the Greed.exe\n" +
"Don't forget to apply your changes...Really, hit that Apply button, it will create loader file\n" +
"[SVM] If it's Syntax error, edit it manually in loader.json or/and edit values with UIs properly\n" +
"Exception message below may help you distinguish what went wrong:\n");
Logger.error(e.message + "\n");
return
}
const PresetLoader = require('../Loader/loader.json');
const Config = require('../Presets/' + PresetLoader.CurrentlySelectedPreset + '.json');
const StaticRouterModService = container.resolve("StaticRouterModService");
const HttpResponse = container.resolve("HttpResponseUtil");
const repeatableQuestController = container.resolve("RepeatableQuestController");
//PRE LOAD - QUESTS SECTION
if (Config.Quests.EnableQuests && Config.Quests.EnableQuestsMisc)//Horrible, as usual
{
try {
container.afterResolution("QuestCallbacks", (_t, result) => {
result.activityPeriods = (url, info, sessionID) => {
let Edited = repeatableQuestController.getClientRepeatableQuests(sessionID);
for (let quests in Edited) {
for (let act in Edited[quests].activeQuests) {//this needs to be trimmed as well, eventually.
if (Edited[quests].activeQuests[act].changeCost[0].count !== undefined) {
Edited[quests].activeQuests[act].changeCost[0].count = 5000 * Config.Quests.QuestCostMult;
}
if (Config.Quests.QuestRepToZero) {
Edited[quests].activeQuests[act].changeStandingCost = 0;
}
}
for (let inact in Edited[quests].inactiveQuests) {
if (Edited[quests].inactiveQuests[inact].changeCost[0].count !== undefined) {
Edited[quests].inactiveQuests[inact].changeCost[0].count = 5000 * Config.Quests.QuestCostMult;
}
if (Config.Quests.QuestRepToZero) {
Edited[quests].inactiveQuests[inact].changeStandingCost = 0;
}
}
for (let req in Edited[quests].changeRequirement) {
Edited[quests].changeRequirement[req].changeCost[0].count = 5000 * Config.Quests.QuestCostMult;
if (Config.Quests.QuestRepToZero) {
Edited[quests].changeRequirement[req].changeStandingCost = 0;
}
}
}
return HttpResponse.getBody(Edited);
}
}, { frequency: "Always" });
container.afterResolution("QuestCallbacks", (_t, result) => {
result.changeRepeatableQuest = (pmcData, body, sessionID) => {
//const repeatableQuestController = container.resolve("RepeatableQuestController");
let Edited = repeatableQuestController.changeRepeatableQuest(pmcData, body, sessionID);
for (let quests in Edited.profileChanges) {
for (let test in Edited.profileChanges[quests].repeatableQuests[0].changeRequirement) {
Edited.profileChanges[quests].repeatableQuests[0].changeRequirement[test].changeCost[0].count = 5000 * Config.Quests.QuestCostMult;
if (Config.Quests.QuestRepToZero) {
Edited.profileChanges[quests].repeatableQuests[0].changeRequirement[test].changeStandingCost = 0;
}
}
}
return Edited;
}
}, { frequency: "Always" });
}
catch (e) {
Logger.error("[SVM] REPEATABLE QUEST HANDLED EXCEPTION - Something wrong attempting to change quest reroll price\n" + e.message + "\n");
}
}
//PRE LOAD - RAIDS SECTION
if (Config.Raids.RaidEvents.Halloween || Config.Raids.RaidEvents.Christmas)//Extra check, just in case
{
StaticRouterModService.registerStaticRouter("EventOverride",
[
{
url: "/client/game/version/validate",
action: (url, info, sessionID) => {
const DB = container.resolve("DatabaseService");
const globalConfig = DB.getGlobals().config;
const configServer = container.resolve("ConfigServer");
const SeasonalEventService = container.resolve("SeasonalEventService");
const Events = configServer.getConfig("spt-seasonalevents");
//let event = [];
if (Config.Raids.RaidEvents.Christmas) {
SeasonalEventService.updateGlobalEvents(globalConfig, Events.events[1]);
}
if (Config.Raids.RaidEvents.Halloween) {
SeasonalEventService.updateGlobalEvents(globalConfig, Events.events[0]);
}
return HttpResponse.nullResponse();
}
}
], "spt");
}
if (Config.Hideout.EnableHideout) {
if (Config.Hideout.Regeneration.OfflineRegen) {
container.afterResolution("GameController", (_t, result) => {
result.updateProfileHealthValues = (url, info, sessionID) => {
}
}, { frequency: "Always" });
}
}
if (Config.Raids.SafeExit) {
container.afterResolution("MatchCallbacks", (_t, result) => {
result.endLocalRaid = (url, info, sessionID) => {
if (info.results.result == "Left") {
info.results.result = "Runner"
}
const MatchController = container.resolve("MatchController");
MatchController.endLocalRaid(sessionID, info);
return HttpResponse.nullResponse();
}
}, { frequency: "Always" });
}
if (Config.Raids.SaveGearAfterDeath) {
container.afterResolution("MatchCallbacks", (_t, result) => {
result.endLocalRaid = (url, info, sessionID) => {
if (info.results.result !== "Survived") {
info.results.result = "Runner"
}
const MatchController = container.resolve("MatchController");
MatchController.endLocalRaid(sessionID, info);
return HttpResponse.nullResponse();
}
}, { frequency: "Always" });
}
//PRE LOAD - CSM SECTION
//Attempt to fix pockets if custom is not present
StaticRouterModService.registerStaticRouter("Revive Pockets",
[
{
url: "/client/game/version/validate",
action: (url, info, sessionID) => {
let pmcData = container.resolve("ProfileHelper").getPmcProfile(sessionID);
let pockets;
try {
if (pmcData.Info.GameVersion == "unheard_edition") {
pockets = "65e080be269cbd5c5005e529";
}
else {
pockets = "627a4e6b255f7527fb05a0f6";
}
pmcData.Inventory.items.forEach((item) => {
if (item.slotId == "Pockets" && item._tpl == "a8edfb0bce53d103d3f62b9b") {
item._tpl = pockets;
}
})
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)
return HttpResponse.nullResponse();
}
}
}], "spt");
if (Config.CSM.EnableCSM && Config.CSM.CustomPocket) {
StaticRouterModService.registerStaticRouter("CustomPocket",
[
{
url: "/client/game/version/validate",
action: (url, info, sessionID) => {
let pmcData = container.resolve("ProfileHelper").getPmcProfile(sessionID);
try {
pmcData.Inventory.items.forEach((item) => {
if (item.slotId == "Pockets") {
item._tpl = "a8edfb0bce53d103d3f62b9b";
}
})
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)
return HttpResponse.nullResponse();
}
}
}], "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
{
StaticRouterModService.registerStaticRouter("EditHealth",
[
{
url: "/client/game/version/validate",
action: (url, info, sessionID) => {
try {
let pmcData = container.resolve("ProfileHelper").getPmcProfile(sessionID);
let scavData = container.resolve("ProfileHelper").getScavProfile(sessionID);
if (Config.Player.EnableStats) {
pmcData.Health.Energy.Maximum = Config.Player.PMCStats.MaxEnergy;
pmcData.Health.Hydration.Maximum = Config.Player.PMCStats.MaxHydration;
}
if (Config.Scav.EnableStats) {
scavData.Health.Energy.Maximum = Config.Scav.ScavStats.MaxEnergy;
scavData.Health.Hydration.Maximum = Config.Scav.ScavStats.MaxHydration;
}
if (Config.Player.EnableHealth) {
HealthEdit(pmcData, Config.Player.Health.Head, Config.Player.Health.Chest, Config.Player.Health.Stomach, Config.Player.Health.LeftArm, Config.Player.Health.LeftLeg, Config.Player.Health.RightArm, Config.Player.Health.RightLeg, "Maximum");
}
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") {
item._tpl = "a8edfb0bce53d103d3f6219b";
}
})
}
return HttpResponse.nullResponse();
}
catch (e) {
Logger.error("[SVM] PMC/SCAV HEALTH/STATS - Didn't manage to apply settings, new profile?\n" + e)
return HttpResponse.nullResponse();
}
}
}], "spt");
}
if (Config.Scav.EnableScavHealth || Config.Scav.ScavCustomPockets) { // 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) => {
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;
}
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") {
item._tpl = "a8edfb0bce53d103d3f6219b";
}
})
}
return scavData;
}
}, { frequency: "Always" });
StaticRouterModService.registerStaticRouter("EditHealthv2",
[
{
url: "/raid/profile/save",
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
{
const saveServer = container.resolve("SaveServer");
const playerScavGenerator = container.resolve("PlayerScavGenerator");
const scavData = playerScavGenerator.generate(sessionID);
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") {
item._tpl = "a8edfb0bce53d103d3f6219b";
}
})
}
saveServer.getProfile(sessionID).characters.scav = scavData;
}
return HttpResponse.nullResponse();
}
}], "spt");
}
function HealthEdit(Data, Head, Chest, Stomach, LeftArm, LeftLeg, RightArm, RightLeg, CurMax) {
try {
Data.Health.BodyParts["Head"].Health[CurMax] = Head
Data.Health.BodyParts["Chest"].Health[CurMax] = Chest
Data.Health.BodyParts["Stomach"].Health[CurMax] = Stomach
Data.Health.BodyParts["LeftArm"].Health[CurMax] = LeftArm
Data.Health.BodyParts["LeftLeg"].Health[CurMax] = LeftLeg
Data.Health.BodyParts["RightArm"].Health[CurMax] = RightArm
Data.Health.BodyParts["RightLeg"].Health[CurMax] = RightLeg
}
catch {
Logger.error("[SVM] HEALTH EDIT - Something went wrong with trying to generate custom maximum health, new profile? \n" + e)
}
}
}
postDBLoad(container) {
const PreDBStart = performance.now();
const Logger = container.resolve("WinstonLogger");
try {//This is dumb piece of code is a handler so PostDB won't run after PreDB did throw a message that something ain't right with the loader.
const PresetLoader = require('../Loader/loader.json');
const Config = require('../Presets/' + PresetLoader.CurrentlySelectedPreset + '.json');
}
catch (e) {
return
}
//Config variables to asset for funcs.
const PresetLoader = require('../Loader/loader.json');
const Config = require('../Presets/' + PresetLoader.CurrentlySelectedPreset + '.json');
const Arrays = require('../src/Arrays.json');
//DB redirects
const DB = container.resolve("DatabaseService").getTables();
const hideout = DB.hideout;
const locations = DB.locations;
const traders = DB.traders;
const Quests = DB.templates.quests;
const suits = DB.templates.customization;
const items = DB.templates.items;
const globals = DB.globals.config;
const Bot = DB.bots.types
// Redirects to server internal configs.
const configServer = container.resolve("ConfigServer");
const Inraid = configServer.getConfig("spt-inraid");
const Repair = configServer.getConfig("spt-repair");
const locs = configServer.getConfig("spt-location");
const Airdrop = configServer.getConfig("spt-airdrop");
const Ragfair = configServer.getConfig("spt-ragfair");
const Insurance = configServer.getConfig("spt-insurance");
const Health = configServer.getConfig("spt-health");
const Bots = configServer.getConfig("spt-bot");
const Quest = configServer.getConfig("spt-quest");
const WeatherValues = configServer.getConfig("spt-weather");
const trader = configServer.getConfig("spt-trader");
const Events = configServer.getConfig("spt-seasonalevents");
//const Inventory = configServer.getConfig("aki-inventory");
const BlackItems = configServer.getConfig("spt-item");
const PMC = configServer.getConfig("spt-pmc")
//############## FLEAMARKET SECTION ###########
if (Config.Fleamarket.EnableFleamarket) {
if (Config.Fleamarket.EnablePlayerOffers) {
globals.RagFair.minUserLevel = Config.Fleamarket.FleaMarketLevel;
Ragfair.dynamic.purchasesAreFoundInRaid = Config.Fleamarket.FleaFIR;
globals.RagFair.isOnlyFoundInRaidAllowed = Config.Fleamarket.FleaNoFIRSell;
Ragfair.dynamic.blacklist.enableBsgList = !Config.Fleamarket.DisableBSGList;
Ragfair.sell.fees = Config.Fleamarket.EnableFees;
Ragfair.sell.chance.base = Config.Fleamarket.Sell_chance;
Ragfair.sell.chance.sellMultiplier = Config.Fleamarket.Sell_mult;
Ragfair.sell.time.max = Config.Fleamarket.Tradeoffer_max;
Ragfair.sell.time.min = Config.Fleamarket.Tradeoffer_min;
globals.RagFair.ratingIncreaseCount = Config.Fleamarket.Rep_gain;
globals.RagFair.ratingDecreaseCount = Config.Fleamarket.Rep_loss;
if (Config.Fleamarket.OverrideOffers) {
const offer = {
"from": -100000,
"to": 100000,
"count": Config.Fleamarket.SellOffersAmount
}
globals.RagFair.maxActiveOfferCount = []
globals.RagFair.maxActiveOfferCount.push(offer)
}
}
//Bundle Chance
Ragfair.dynamic.pack.chancePercent = Config.Fleamarket.DynamicOffers.BundleOfferChance;
//Dynamic offers
Ragfair.dynamic.expiredOfferThreshold = Config.Fleamarket.DynamicOffers.ExpireThreshold;
//Min-Max
Ragfair.dynamic.offerItemCount.min = Config.Fleamarket.DynamicOffers.PerOffer_min;
Ragfair.dynamic.offerItemCount.max = Config.Fleamarket.DynamicOffers.PerOffer_max;
//Unifying the multiplier, not the best case scenario, but it is rather simple to comprehend and modify for common user, they'll never know >_>
Ragfair.dynamic.priceRanges.default.min = Config.Fleamarket.DynamicOffers.Price_min;
Ragfair.dynamic.priceRanges.default.max = Config.Fleamarket.DynamicOffers.Price_max;
Ragfair.dynamic.priceRanges.pack.min = Config.Fleamarket.DynamicOffers.Price_min;
Ragfair.dynamic.priceRanges.pack.max = Config.Fleamarket.DynamicOffers.Price_max;
Ragfair.dynamic.priceRanges.preset.min = Config.Fleamarket.DynamicOffers.Price_min;
Ragfair.dynamic.priceRanges.preset.max = Config.Fleamarket.DynamicOffers.Price_max;
Ragfair.dynamic.endTimeSeconds.min = Config.Fleamarket.DynamicOffers.Time_min * 60;
Ragfair.dynamic.endTimeSeconds.max = Config.Fleamarket.DynamicOffers.Time_max * 60;
Ragfair.dynamic.nonStackableCount.min = Config.Fleamarket.DynamicOffers.NonStack_min;
Ragfair.dynamic.nonStackableCount.max = Config.Fleamarket.DynamicOffers.NonStack_max;
Ragfair.dynamic.stackablePercent.min = Config.Fleamarket.DynamicOffers.Stack_min;
Ragfair.dynamic.stackablePercent.max = Config.Fleamarket.DynamicOffers.Stack_max;
//Currencies
Ragfair.dynamic.currencies["5449016a4bdc2d6f028b456f"] = Config.Fleamarket.DynamicOffers.Roubleoffers;
Ragfair.dynamic.currencies["5696686a4bdc2da3298b456a"] = Config.Fleamarket.DynamicOffers.Dollaroffers;
Ragfair.dynamic.currencies["569668774bdc2da2298b4568"] = Config.Fleamarket.DynamicOffers.Eurooffers;
//Wear condition in offers
if (Config.Fleamarket.EnableFleaConditions)
Ragfair.dynamic.condition["5422acb9af1c889c16000029"].max.min = parseFloat((Config.Fleamarket.FleaConditions.FleaWeapons_Min / 100).toFixed(2))
Ragfair.dynamic.condition["543be5664bdc2dd4348b4569"].max.min = parseFloat((Config.Fleamarket.FleaConditions.FleaMedical_Min / 100).toFixed(2))
Ragfair.dynamic.condition["5447e0e74bdc2d3c308b4567"].max.min = parseFloat((Config.Fleamarket.FleaConditions.FleaSpec_Min / 100).toFixed(2))
Ragfair.dynamic.condition["543be5e94bdc2df1348b4568"].max.min = parseFloat((Config.Fleamarket.FleaConditions.FleaKeys_Min / 100).toFixed(2))
Ragfair.dynamic.condition["5448e5284bdc2dcb718b4567"].max.min = parseFloat((Config.Fleamarket.FleaConditions.FleaVests_Min / 100).toFixed(2))
Ragfair.dynamic.condition["57bef4c42459772e8d35a53b"].max.min = parseFloat((Config.Fleamarket.FleaConditions.FleaArmor_Min / 100).toFixed(2))
Ragfair.dynamic.condition["543be6674bdc2df1348b4569"].max.min = parseFloat((Config.Fleamarket.FleaConditions.FleaFood_Min / 100).toFixed(2))
Ragfair.dynamic.condition["5422acb9af1c889c16000029"].max.max = parseFloat((Config.Fleamarket.FleaConditions.FleaWeapons_Max / 100).toFixed(2))
Ragfair.dynamic.condition["543be5664bdc2dd4348b4569"].max.max = parseFloat((Config.Fleamarket.FleaConditions.FleaMedical_Max / 100).toFixed(2))
Ragfair.dynamic.condition["5447e0e74bdc2d3c308b4567"].max.max = parseFloat((Config.Fleamarket.FleaConditions.FleaSpec_Max / 100).toFixed(2))
Ragfair.dynamic.condition["543be5e94bdc2df1348b4568"].max.max = parseFloat((Config.Fleamarket.FleaConditions.FleaKeys_Max / 100).toFixed(2))
Ragfair.dynamic.condition["5448e5284bdc2dcb718b4567"].max.max = parseFloat((Config.Fleamarket.FleaConditions.FleaVests_Max / 100).toFixed(2))
Ragfair.dynamic.condition["57bef4c42459772e8d35a53b"].max.max = parseFloat((Config.Fleamarket.FleaConditions.FleaArmor_Max / 100).toFixed(2))
Ragfair.dynamic.condition["543be6674bdc2df1348b4569"].max.max = parseFloat((Config.Fleamarket.FleaConditions.FleaFood_Max / 100).toFixed(2))
}
//############## LOOT SECTION #################
if (Config.Loot.EnableLoot) {
//loose loot mults
locs.looseLootMultiplier.bigmap = Config.Loot.Locations.Streets.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;
locs.looseLootMultiplier.laboratory = Config.Loot.Locations.Laboratory.Loose;
locs.looseLootMultiplier.rezervbase = Config.Loot.Locations.Reserve.Loose;
locs.looseLootMultiplier.shoreline = Config.Loot.Locations.Shoreline.Loose;
locs.looseLootMultiplier.woods = Config.Loot.Locations.Woods.Loose;
locs.looseLootMultiplier.lighthouse = Config.Loot.Locations.Lighthouse.Loose;
locs.looseLootMultiplier.tarkovstreets = Config.Loot.Locations.Streets.Loose;
locs.looseLootMultiplier.sandbox = Config.Loot.Locations.Sandbox.Loose;
locs.looseLootMultiplier.sandbox_high = Config.Loot.Locations.SandboxHard.Loose;
//container loot mults
locs.staticLootMultiplier.bigmap = Config.Loot.Locations.Bigmap.Container;
locs.staticLootMultiplier.factory4_day = Config.Loot.Locations.FactoryDay.Container;
locs.staticLootMultiplier.factory4_night = Config.Loot.Locations.FactoryNight.Container;
locs.staticLootMultiplier.interchange = Config.Loot.Locations.Interchange.Container;
locs.staticLootMultiplier.laboratory = Config.Loot.Locations.Laboratory.Container;
locs.staticLootMultiplier.rezervbase = Config.Loot.Locations.Reserve.Container;
locs.staticLootMultiplier.shoreline = Config.Loot.Locations.Shoreline.Container;
locs.staticLootMultiplier.woods = Config.Loot.Locations.Woods.Container;
locs.staticLootMultiplier.lighthouse = Config.Loot.Locations.Lighthouse.Container;
locs.staticLootMultiplier.tarkovstreets = Config.Loot.Locations.Streets.Container;
locs.staticLootMultiplier.sandbox = Config.Loot.Locations.Sandbox.Container;
locs.staticLootMultiplier.sandbox_high = Config.Loot.Locations.SandboxHard.Container;
locs.containerRandomisationSettings.enabled = !Config.Loot.Locations.AllContainers
//############## AIRDROPS SECTION ##################
locations["bigmap"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Bigmap_air / 100).toFixed(2));
locations["shoreline"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Shoreline_air / 100).toFixed(2));
locations["rezervbase"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Reserve_air / 100).toFixed(2));
locations["lighthouse"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Lighthouse_air / 100).toFixed(2));
locations["interchange"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Interchange_air / 100).toFixed(2));
locations["tarkovstreets"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Streets_air / 100).toFixed(2));
locations["sandbox"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Sandbox_air / 100).toFixed(2));
locations["sandbox_high"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Sandbox_air / 100).toFixed(2));
locations["woods"].base.AirdropParameters[0].PlaneAirdropChance = parseFloat((Config.Loot.Airdrops.Woods_air / 100).toFixed(2));
for (let timers in locations) {
if (timers != "develop" && timers != "base" && timers != "privatearea" && timers != "terminal" && timers != "factory4_day" && timers != "hideout" && timers != "laboratory" && timers != "factory4_night" && timers != "town" && timers != "suburbs") {// 3.10 need to rework.
locations[timers].base.AirdropParameters[0].PlaneAirdropStartMin = Config.Loot.Airdrops.AirtimeMin * 60;
locations[timers].base.AirdropParameters[0].PlaneAirdropStartMax = Config.Loot.Airdrops.AirtimeMax * 60;
}
}
let Mixed = Config.Loot.Airdrops.Mixed
let Weapon = Config.Loot.Airdrops.Weapon
let Barter = Config.Loot.Airdrops.Barter
let Medical = Config.Loot.Airdrops.Medical
AirdropContents("mixed", Mixed)
AirdropContents("weaponArmor", Weapon)
AirdropContents("barter", Barter)
AirdropContents("foodMedical", Medical)
}
//############## BOTS SECTION #################
if (Config.Bots.EnableBots) {
for (let i in locations) {
if (i !== "base" && locations[i].base.BossLocationSpawn) {
for (let x in locations[i].base.BossLocationSpawn) {
switch (locations[i].base.BossLocationSpawn[x].BossName) {
case "bossBoar":
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Kaban
break;
case "bossKolontay":
if (i == "sandbox_high") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.KolontayGZ
}
if (i == "tarkovstreets") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.KolontayStreets
}
break;
case "bossPartisan":
// if (i == "bigmap") { Controlled by trigger, ignored for now.
// locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanCustoms
// }
if (i == "shoreline") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanShoreline
}
if (i == "lighthouse") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanLighthouse
}
if (i == "woods") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.PartisanWoods
}
break;
case "bossBully":
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Reshala
break;
case "bossSanitar":
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Sanitar
break;
case "bossKilla":
if (i == "interchange") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Killa
}
break;
case "bossTagilla":
if (i == "factory4_day") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Tagilla
}
if (i == "factory4_night") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.TagillaNight
}
break;
case "bossGluhar":
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Glukhar
break;
case "bossKojaniy":
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Shturman
break;
case "bossZryachiy":
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Zryachiy
break;
case "exUsec":
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Rogue
break;
case "bossKnight":
if (i == "woods") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.TrioWoods
}
if (i == "shoreline") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.TrioShoreline
}
if (i == "bigmap") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.Trio
}
if (i == "lighthouse") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.TrioLighthouse
}
break;
case "pmcBot":
if (i == "laboratory") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.RaiderLab
}
if (i == "rezervbase") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.RaiderReserve
}
break;
case "sectantPriest":
if (i == "factory4_night") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.CultistFactory
}
if (i == "woods") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.CultistWoods
}
if (i == "bigmap") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.CultistCustoms
}
if (i == "shoreline") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Bots.AIChance.CultistShoreline
}
break;
}
}
}
}
const WepDur = Config.Bots.WeaponDurab;
const ArmorDur = Config.Bots.ArmorDurab;
const BotWepMinID = [WepDur.ScavMin, WepDur.MarksmanMin, WepDur.RaiderMin, WepDur.RogueMin, WepDur.PMCMin, WepDur.BossMin, WepDur.FollowerMin];
const BotWepMaxID = [WepDur.ScavMax, WepDur.MarksmanMax, WepDur.RaiderMax, WepDur.RogueMax, WepDur.PMCMax, WepDur.BossMax, WepDur.FollowerMax];
const BotArmorMinID = [ArmorDur.ScavMin, ArmorDur.MarksmanMin, ArmorDur.RaiderMin, ArmorDur.RogueMin, ArmorDur.PMCMin, ArmorDur.BossMin, ArmorDur.FollowerMin];
const BotArmorMaxID = [ArmorDur.ScavMax, ArmorDur.MarksmanMax, ArmorDur.RaiderMax, ArmorDur.RogueMax, ArmorDur.PMCMax, ArmorDur.BossMax, ArmorDur.FollowerMax];
const BotTypeID = ["assault", "marksman", "pmcbot", "exusec", "pmc", "boss", "follower"]
for (let durab in BotTypeID) {
Bots.durability[BotTypeID[durab]].weapon.lowestMax = BotWepMinID[durab];
Bots.durability[BotTypeID[durab]].weapon.highestMax = BotWepMaxID[durab];
Bots.durability[BotTypeID[durab]].armor.maxDelta = 100 - BotArmorMinID[durab];
Bots.durability[BotTypeID[durab]].armor.minDelta = 100 - BotArmorMaxID[durab];
switch (BotTypeID[durab]) {
case "assault":
Bots.durability["cursedassault"].weapon.lowestMax = BotWepMinID[durab]
Bots.durability["cursedassault"].weapon.highestMax = BotWepMaxID[durab]
Bots.durability["cursedassault"].armor.maxDelta = 100 - BotArmorMinID[durab];
Bots.durability["cursedassault"].armor.minDelta = 100 - BotArmorMaxID[durab];
Bots.durability["crazyassaultevent"].weapon.lowestMax = BotWepMinID[durab]
Bots.durability["crazyassaultevent"].weapon.highestMax = BotWepMaxID[durab]
Bots.durability["crazyassaultevent"].armor.maxDelta = 100 - BotArmorMinID[durab];
Bots.durability["crazyassaultevent"].armor.minDelta = 100 - BotArmorMaxID[durab];
break;
case "pmcbot":
Bots.durability["arenafighterevent"].weapon.lowestMax = BotWepMinID[durab]
Bots.durability["arenafighterevent"].weapon.highestMax = BotWepMaxID[durab]
Bots.durability["arenafighterevent"].armor.maxDelta = 100 - BotArmorMinID[durab];
Bots.durability["arenafighterevent"].armor.minDelta = 100 - BotArmorMaxID[durab];
break
case "boss":
Bots.durability["sectantpriest"].weapon.lowestMax = BotWepMinID[durab];
Bots.durability["sectantpriest"].weapon.highestMax = BotWepMaxID[durab];
Bots.durability["sectantpriest"].armor.maxDelta = 100 - BotArmorMinID[durab];
Bots.durability["sectantpriest"].armor.minDelta = 100 - BotArmorMaxID[durab];
break;
case "follower":
Bots.durability["sectantwarrior"].weapon.lowestMax = BotWepMinID[durab];
Bots.durability["sectantwarrior"].weapon.highestMax = BotWepMaxID[durab];
Bots.durability["sectantwarrior"].armor.maxDelta = 100 - BotArmorMinID[durab];
Bots.durability["sectantwarrior"].armor.minDelta = 100 - BotArmorMaxID[durab];
break;
}
}
}
//############## INSURANCE/REPAIR SECTION ############
if (Config.Services.EnableServices) {
//Repair.priceMultiplier = Config.Insurance.RepairBox.RepairMult; Disabled due to visual bug - it doesn't show converted number, the function itself is working tho
Repair.armorKitSkillPointGainPerRepairPointMultiplier = Config.Services.RepairBox.ArmorSkillMult;
Repair.weaponTreatment.pointGainMultiplier = Config.Services.RepairBox.WeaponMaintenanceSkillMult;
Repair.repairKitIntellectGainMultiplier.weapon = Config.Services.RepairBox.IntellectSkillMultWeaponKit;
Repair.repairKitIntellectGainMultiplier.armor = Config.Services.RepairBox.IntellectSkillMultArmorKit;
Repair.maxIntellectGainPerRepair.kit = Config.Services.RepairBox.IntellectSkillLimitKit;
Repair.maxIntellectGainPerRepair.trader = Config.Services.RepairBox.IntellectSkillLimitTraders;
Repair.applyRandomizeDurabilityLoss = !Config.Services.RepairBox.NoRandomRepair;
if (Config.Services.EnableInsurance) {
Insurance.returnChancePercent["54cb50c76803fa8b248b4571"] = Config.Services.ReturnChancePrapor;
Insurance.returnChancePercent["54cb57776803fa99248b456e"] = Config.Services.ReturnChanceTherapist;
traders["54cb50c76803fa8b248b4571"].base.insurance.max_storage_time = Config.Services.PraporStorageTime;
traders["54cb57776803fa99248b456e"].base.insurance.max_storage_time = Config.Services.TherapistStorageTime;
traders["54cb50c76803fa8b248b4571"].base.insurance.min_return_hour = Config.Services.Prapor_Min;
traders["54cb50c76803fa8b248b4571"].base.insurance.max_return_hour = Config.Services.Prapor_Max;
traders["54cb57776803fa99248b456e"].base.insurance.min_return_hour = Config.Services.Therapist_Min;
traders["54cb57776803fa99248b456e"].base.insurance.max_return_hour = Config.Services.Therapist_Max;
Insurance.chanceNoAttachmentsTakenPercent = Config.Services.InsuranceAttachmentChance
//3.9.0 insurance fix + new fields
Insurance.runIntervalSeconds = Config.Services.InsuranceInterval
if (Config.Services.EnableTimeOverride) {
Insurance.returnTimeOverrideSeconds = Config.Services.InsuranceTimeOverride
}
let TherapistMult = [Config.Services.InsuranceMultTherapistLvl1, Config.Services.InsuranceMultTherapistLvl2, Config.Services.InsuranceMultTherapistLvl3, Config.Services.InsuranceMultTherapistLvl4]
for (let level in traders["54cb57776803fa99248b456e"].base.loyaltyLevels) {
traders["54cb57776803fa99248b456e"].base.loyaltyLevels[level].insurance_price_coef = TherapistMult[level]
}
let PraporMult = [Config.Services.InsuranceMultPraporLvl1, Config.Services.InsuranceMultPraporLvl2, Config.Services.InsuranceMultPraporLvl3, Config.Services.InsuranceMultPraporLvl4]
for (let level in traders["54cb50c76803fa8b248b4571"].base.loyaltyLevels) {
traders["54cb50c76803fa8b248b4571"].base.loyaltyLevels[level].insurance_price_coef = PraporMult[level]
}
}
//Enable all clothes available for both side
if (Config.Services.ClothesAnySide) {
for (let suit in suits) {
let suitData = suits[suit]
if (suitData._parent === "5cd944ca1388ce03a44dc2a4" || suitData._parent === "5cd944d01388ce000a659df9") {
suitData._props.Side = ["Bear", "Usec"];
}
}
}
if (Config.Services.ClothesFree || Config.Services.ClothesLevelUnlock) {
for (let tradercloth in traders) {
if (traders[tradercloth].suits) {
for (let file in traders[tradercloth].suits) {
let fileData = traders[tradercloth].suits[file]
if (Config.Services.ClothesLevelUnlock) {
fileData.requirements.loyaltyLevel = 1;
fileData.requirements.profileLevel = 1;
fileData.requirements.standing = 0;
fileData.requirements.questRequirements = [];//Only adik hits this
}
//fileData.requirements.skillRequirements = [];//This is useless, it always stands for empty
if (Config.Services.ClothesFree) {
fileData.requirements.itemRequirements = [];
}
}
}
}
}
if (Config.Services.EnableHealMarkup) {
let TherapistLevels = [Config.Services.TherapistLvl1, Config.Services.TherapistLvl2, Config.Services.TherapistLvl3, Config.Services.TherapistLvl4]
for (let level in traders["54cb57776803fa99248b456e"].base.loyaltyLevels) {
traders["54cb57776803fa99248b456e"].base.loyaltyLevels[level].heal_price_coef = TherapistLevels[level] * 100
}
globals.Health.HealPrice.TrialLevels = Config.Services.FreeHealLvl
globals.Health.HealPrice.TrialRaids = Config.Services.FreeHealRaids
}
if (Config.Services.EnableRepair) {
for (let CurTrader in traders) {
if (CurTrader !== "ragfair" && (CurTrader == "5a7c2eca46aef81a7ca2145d" || CurTrader == "5ac3b934156ae10c4430e83c" || CurTrader == "5c0647fdd443bc2504c2d371" || CurTrader == "54cb50c76803fa8b248b4571" || CurTrader == "54cb57776803fa99248b456e" || CurTrader == "579dc571d53a0658a154fbec" || CurTrader == "5935c25fb3acc3127c3d8cd9" || CurTrader == "58330581ace78e27b8b10cee")) {
for (let level in traders[CurTrader].base.loyaltyLevels) {
traders[CurTrader].base.loyaltyLevels[level].repair_price_coef *= Config.Services.RepairBox.RepairMult;
}
}
}
if (Config.Services.RepairBox.OpArmorRepair) {
for (let armormats in globals.ArmorMaterials) {
globals.ArmorMaterials[armormats].MaxRepairDegradation = 0
globals.ArmorMaterials[armormats].MinRepairDegradation = 0
globals.ArmorMaterials[armormats].MaxRepairKitDegradation = 0
globals.ArmorMaterials[armormats].MinRepairKitDegradation = 0
}
}
if (Config.Services.RepairBox.OpGunRepair) {
for (let stuff in items) {
if (items[stuff]._props.MaxRepairDegradation !== undefined && items[stuff]._props.MaxRepairKitDegradation !== undefined) {
EditSimpleItemData(stuff, "MinRepairDegradation", 0);
EditSimpleItemData(stuff, "MaxRepairDegradation", 0);
EditSimpleItemData(stuff, "MinRepairKitDegradation", 0);
EditSimpleItemData(stuff, "MaxRepairKitDegradation", 0);
}
}
}
}
}
//############## CSM SECTION ##################
if (Config.CSM.EnableCSM) {
if (Config.CSM.CustomPocket) {
const JsonUtil = container.resolve("JsonUtil");
let CustomPocketItem = JsonUtil.clone(items["627a4e6b255f7527fb05a0f6"])
let PocketSize = Config.CSM.Pockets
CustomPocketItem._id = "a8edfb0bce53d103d3f62b9b";
for (let cell in CustomPocketItem._props.Grids)//tried to make less code, made more, smh.
{
CustomPocketItem._props.Grids[cell]._parent = "a8edfb0bce53d103d3f62b9b"
}
for (let cell in CustomPocketItem._props.Slots) {
CustomPocketItem._props.Slots[cell]._parent = "a8edfb0bce53d103d3f62b9b"
}
CustomPocketItem._props.Grids[0]._id = "a8edfb0bce53d103d3f62b0b"
CustomPocketItem._props.Grids[0]._props.cellsH = PocketSize.FirstWidth
CustomPocketItem._props.Grids[0]._props.cellsV = PocketSize.FirstHeight
CustomPocketItem._props.Grids[1]._id = "a8edfb0bce53d103d3f62b1b"
CustomPocketItem._props.Grids[1]._props.cellsH = PocketSize.SecondWidth
CustomPocketItem._props.Grids[1]._props.cellsV = PocketSize.SecondHeight
CustomPocketItem._props.Grids[2]._id = "a8edfb0bce53d103d3f62b2b"
CustomPocketItem._props.Grids[2]._props.cellsH = PocketSize.ThirdWidth
CustomPocketItem._props.Grids[2]._props.cellsV = PocketSize.ThirdHeight
CustomPocketItem._props.Grids[3]._id = "a8edfb0bce53d103d3f62b3b"
CustomPocketItem._props.Grids[3]._props.cellsH = PocketSize.FourthWidth
CustomPocketItem._props.Grids[3]._props.cellsV = PocketSize.FourthHeight
CustomPocketItem._props.Slots[0]._id = "a8edfb0bce53d103d3f62b4b"
CustomPocketItem._props.Slots[1]._id = "a8edfb0bce53d103d3f62b5b"
CustomPocketItem._props.Slots[2]._id = "a8edfb0bce53d103d3f62b6b"
if (PocketSize.FourthWidth == 0 || PocketSize.FourthHeight == 0) {
CustomPocketItem._props.Grids.splice(3, 1);
}
if (PocketSize.ThirdWidth == 0 || PocketSize.ThirdHeight == 0) {
CustomPocketItem._props.Grids.splice(2, 1);
}
if (PocketSize.SecondWidth == 0 || PocketSize.SecondHeight == 0) {
CustomPocketItem._props.Grids.splice(1, 1);
}
if (PocketSize.FirstWidth == 0 || PocketSize.FirstHeight == 0) {
CustomPocketItem._props.Grids.splice(0, 1);
}
switch (true) {
case Config.CSM.Pockets.SpecSlots == 0:
CustomPocketItem._props.Slots.splice(0, 3);
break;
case Config.CSM.Pockets.SpecSlots == 1:
CustomPocketItem._props.Slots.splice(1, 2);
break;
case Config.CSM.Pockets.SpecSlots == 2:
CustomPocketItem._props.Slots.splice(2, 1);
break;
case Config.CSM.Pockets.SpecSlots == 3:
break;
case Config.CSM.Pockets.SpecSlots >= 4://Graduality done, switched `switch` to true statement and expressions.
CustomPocketItem._props.Slots[3] = JsonUtil.clone(CustomPocketItem._props.Slots[2])
CustomPocketItem._props.Slots[3]._id = "a8edfb0bce53d103d3f62b7b"
CustomPocketItem._props.Slots[3]._name = "SpecialSlot4"
CustomPocketItem._props.Slots[3]._parent = "a8edfb0bce53d103d3f62b9b"
Insurance.blacklistedEquipment.push("SpecialSlot4")
case Config.CSM.Pockets.SpecSlots == 5:
CustomPocketItem._props.Slots[4] = JsonUtil.clone(CustomPocketItem._props.Slots[2])
CustomPocketItem._props.Slots[4]._id = "a8edfb0bce53d103d3f62b8b"
CustomPocketItem._props.Slots[4]._name = "SpecialSlot5"
CustomPocketItem._props.Slots[4]._parent = "a8edfb0bce53d103d3f62b9b"
Insurance.blacklistedEquipment.push("SpecialSlot5")
break;
}
//This is a solution to avoid removing cases from bodies if they die.
let IDsToFilter = ["5783c43d2459774bbe137486", "60b0f6c058e0b0481a09ad11", "619cbf9e0a7c3a1a2731940a", "619cbf7d23893217ec30b689", "59fafd4b86f7745ca07e1232", "62a09d3bcf4a99369e262447"];
let Pockets = Config.CSM.Pockets
let CasesToFilter = [Pockets.SpecSimpleWallet, Pockets.SpecWZWallet, Pockets.SpecKeycardHolder, Pockets.SpecInjectorCase, Pockets.SpecKeytool, Pockets.SpecGKeychain];
for (let ID in IDsToFilter) {
items[IDsToFilter[ID]]._props.DiscardLimit = -1;
items[IDsToFilter[ID]]._props.InsuranceDisabled = true;
}
for (let specialslots in CustomPocketItem._props.Slots) {
for (let element in IDsToFilter) {
if (CasesToFilter[element]) {
CustomPocketItem._props.Slots[specialslots]._props.filters[0].Filter.push(IDsToFilter[element])
}
}
//items[IDsToFilter[specialslots]]._props.HideEntrails = true;
}
items["a8edfb0bce53d103d3f62b9b"] = CustomPocketItem;
//items["5795f317245977243854e041"]._props.HideEntrails = true; Still unsure what does it do
}
if (Config.CSM.EnableSecureCases) {
const SecCon = Config.CSM.SecureContainers
const SecHeight = [
SecCon.AlphaHeight,
SecCon.KappaHeight,
SecCon.BetaHeight,
SecCon.EpsilonHeight,
SecCon.GammaHeight,
SecCon.GammaTUEHeight,
SecCon.WaistPouchHeight,
SecCon.DevHeight
];
const SecWidth = [
SecCon.AlphaWidth,
SecCon.KappaWidth,
SecCon.BetaWidth,
SecCon.EpsilonWidth,
SecCon.GammaWidth,
SecCon.GammaTUEWidth,
SecCon.WaistPouchWidth,
SecCon.DevWidth
];
for (let SecConts in Arrays.SecConID) {
items[Arrays.SecConID[SecConts]]._props.Grids[0]._props["cellsV"] = SecHeight[SecConts];
items[Arrays.SecConID[SecConts]]._props.Grids[0]._props["cellsH"] = SecWidth[SecConts];
}
}
if (Config.CSM.EnableCases) {
const Cases = Config.CSM.Cases
const Size = [
Cases.MoneyCase,
Cases.SimpleWallet,
Cases.WZWallet,
Cases.GrenadeCase,
Cases.ItemsCase,
Cases.WeaponCase,
Cases.LuckyScav,
Cases.AmmunitionCase,
Cases.MagazineCase,
Cases.DogtagCase,
Cases.MedicineCase,
Cases.ThiccItemsCase,
Cases.ThiccWeaponCase,
Cases.SiccCase,
Cases.Keytool,
Cases.DocumentsCase,
Cases.PistolCase,
Cases.Holodilnick,
Cases.InjectorCase,
Cases.KeycardHolderCase,
Cases.GKeychain
]
const Filts = [
Cases.MoneyCase.Filter,
Cases.SimpleWallet.Filter,
Cases.WZWallet.Filter,
Cases.GrenadeCase.Filter,
Cases.ItemsCase.Filter,
Cases.WeaponCase.Filter,
Cases.LuckyScav.Filter,
Cases.AmmunitionCase.Filter,
Cases.MagazineCase.Filter,
Cases.DogtagCase.Filter,
Cases.MedicineCase.Filter,
Cases.ThiccItemsCase.Filter,
Cases.ThiccWeaponCase.Filter,
Cases.SiccCase.Filter,
Cases.Keytool.Filter,
Cases.DocumentsCase.Filter,
Cases.PistolCase.Filter,
Cases.Holodilnick.Filter,
Cases.InjectorCase.Filter,
Cases.KeycardHolderCase.Filter,
Cases.GKeychain.Filter
]
for (let Case in Arrays.CasesID) {
items[Arrays.CasesID[Case]]._props.Grids[0]._props["cellsV"] = Size[Case].Height;
items[Arrays.CasesID[Case]]._props.Grids[0]._props["cellsH"] = Size[Case].Width;
}
//Filters
for (let Filters in Filts) {
if (Filts[Filters]) // To check whether checkmark is true or false
{
items[Arrays.CasesID[Filters]]._props.Grids[0]._props.filters = [];
}
}
}
}
//############## ITEMS SECTION ################
if (Config.Items.EnableItems) {
//Price Modifier
for (const item in DB.templates.handbook.Items) {
if (DB.templates.handbook.Items[item].ParentId !== "5b5f78b786f77447ed5636af" && DB.templates.handbook.Items[item].Price != null) {
DB.templates.handbook.Items[item].Price = (DB.templates.handbook.Items[item].Price * Config.Items.ItemPriceMult)
}
}
//Loading-Unloading rounds in a magazine
globals.BaseUnloadTime = globals.BaseUnloadTime * Config.Items.AmmoLoadSpeed;
globals.BaseLoadTime = globals.BaseLoadTime * Config.Items.AmmoLoadSpeed;
//Signal Pistol into Special slots
if (Config.Items.AddSignalPistolToSpec) {
if (items["a8edfb0bce53d103d3f62b9b"] !== undefined) {
for (let specialslots in items["a8edfb0bce53d103d3f62b9b"]._props.Slots) {
items["a8edfb0bce53d103d3f62b9b"]._props.Slots[specialslots]._props.filters[0].Filter.push("620109578d82e67e7911abf2")
}
}
if (items["627a4e6b255f7527fb05a0f6"] !== undefined) {
for (let specialslots in items["627a4e6b255f7527fb05a0f6"]._props.Slots) {
items["627a4e6b255f7527fb05a0f6"]._props.Slots[specialslots]._props.filters[0].Filter.push("620109578d82e67e7911abf2")
}
}
if (items["65e080be269cbd5c5005e529"] !== undefined) {
for (let specialslots in items["65e080be269cbd5c5005e529"]._props.Slots) {
items["65e080be269cbd5c5005e529"]._props.Slots[specialslots]._props.filters[0].Filter.push("620109578d82e67e7911abf2")
}
}
}
for (const id in items) {
let base = items[id]
//Examining time
if (base._type == "Item" && base._props.ExamineTime !== undefined) {
EditSimpleItemData(id, "ExamineTime", Config.Items.ExamineTime);
}
//Fragmentation Multiplier
if (base._props.FragmentationChance !== undefined) {
EditSimpleItemData(id, "FragmentationChance", parseFloat(base._props.FragmentationChance * Config.Items.FragmentMult).toFixed(2));
}
//Heat Factor Multiplier
if (base._props.HeatFactor !== undefined) {
EditSimpleItemData(id, "HeatFactor", parseFloat(base._props.HeatFactor * Config.Items.HeatFactor).toFixed(4));
}
//Dropping items in raid rather deleting them
if (base._type == "Item" && base._props.DiscardLimit !== undefined && Config.Items.RaidDrop) {
EditSimpleItemData(id, "DiscardLimit", -1);
}
//Turns off weapon overheat
if (base._props.AllowOverheat !== undefined && Config.Items.WeaponHeatOff) {
EditSimpleItemData(id, "AllowOverheat", false);
}
//Malfunction chance
if ((base._parent == "5447b5cf4bdc2d65278b4567" || base._parent == "5447b6254bdc2dc3278b4568" || items[id]._parent == "5447b5f14bdc2d61278b4567" || items[id]._parent == "5447bed64bdc2d97278b4568" || items[id]._parent == "5447b6094bdc2dc3278b4567" || items[id]._parent == "5447b5e04bdc2d62278b4567" || items[id]._parent == "5447b6194bdc2d67278b4567") && items[id]._props.BaseMalfunctionChance !== undefined) {
EditSimpleItemData(id, "BaseMalfunctionChance", parseFloat(base._props.BaseMalfunctionChance * Config.Items.MalfunctChanceMult).toFixed(6));
}
if (base._parent == "5448bc234bdc2d3c308b4569" && base._props.MalfunctionChance !== undefined) {
EditSimpleItemData(id, "MalfunctionChance", parseFloat(base._props.MalfunctionChance * Config.Items.MalfunctChanceMult).toFixed(2));
}
//Misfire chance
if (base._parent == "5485a8684bdc2da71d8b4567" && base._props.MalfMisfireChance !== undefined) {
EditSimpleItemData(id, "MalfMisfireChance", parseFloat(base._props.MalfMisfireChance * Config.Items.MisfireChance).toFixed(3));
}
//Examine all items
if (Config.Items.AllExaminedItems && Config.Items.ExamineKeys) {
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") {
EditSimpleItemData(id, "ExaminedByDefault", true);
}
//Change the weight
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) {
if (base._props.mousePenalty) {
EditSimpleItemData(id, "mousePenalty", 0)
}
if (base._props.weaponErgonomicPenalty) {
EditSimpleItemData(id, "weaponErgonomicPenalty", 0)
}
if (base._props.speedPenaltyPercent) {
EditSimpleItemData(id, "speedPenaltyPercent", 0)
}
}
//Ammo Stacks
if (base._parent.includes("5485a8684bdc2da71d8b4567") && Config.Items.AmmoSwitch) {
let str = base._name//.split("_", 2)
if (AmmoFilter(Arrays.Pistol, str)) {
EditSimpleItemData(id, "StackMaxSize", Config.Items.AmmoStacks.PistolRound)
}
else if (AmmoFilter(Arrays.Shotgun, str)) {
EditSimpleItemData(id, "StackMaxSize", Config.Items.AmmoStacks.ShotgunRound)
}
else if (AmmoFilter(Arrays.ARifle, str)) {
EditSimpleItemData(id, "StackMaxSize", Config.Items.AmmoStacks.RifleRound)
}
else if (AmmoFilter(Arrays.MRifle, str)) {
EditSimpleItemData(id, "StackMaxSize", Config.Items.AmmoStacks.MarksmanRound)
}
}
//Change money stacks
if (base._parent == "543be5dd4bdc2deb348b4569" && base._props.StackMaxSize !== undefined && Config.Items.EnableCurrency) {
switch (base._id) {
case "569668774bdc2da2298b4568":
EditSimpleItemData(id, "StackMaxSize", Config.Items.EuroStack);
break;
case "5696686a4bdc2da3298b456a":
EditSimpleItemData(id, "StackMaxSize", Config.Items.DollarStack);
break;
case "5d235b4d86f7742e017bc88a":
EditSimpleItemData(id, "StackMaxSize", Config.Items.GPStack);
break;
default:
EditSimpleItemData(id, "StackMaxSize", Config.Items.RubStack);
break;
}
}
//Allow armored rigs with armors
if (Config.Items.EquipRigsWithArmors && base._props.BlocksArmorVest !== undefined) {
EditSimpleItemData(id, "BlocksArmorVest", false);
}
//Remove filters
if (Config.Items.RemoveSecureContainerFilters && base._parent == "5448bf274bdc2dfc2f8b456a" && base._props.Grids[0]._props.filters !== undefined) {
base._props.Grids[0]._props.filters = [];
}
if (Config.Items.RemoveBackpacksRestrictions && base._parent == "5448e53e4bdc2d60728b4567" && base._props.Grids[0]._props.filters !== undefined) {
base._props.Grids[0]._props.filters = [];
}
//Change items experience gain
if (base._props.LootExperience !== undefined) {
let calculation = Math.round(base._props.LootExperience * Config.Items.LootExp);
EditSimpleItemData(id, "LootExperience", calculation);
}
if (base._props.ExamineExperience !== undefined) {
let calculation = Math.round(base._props.ExamineExperience * Config.Items.ExamineExp);
EditSimpleItemData(id, "ExamineExperience", calculation);
}
//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 == 1 && !Config.Items.AvoidSingleKeys) {
base._props.MaximumNumberOfUsage = 0
}
if ( Arrays.MarkedKeys.includes(base._id) && !Config.Items.AvoidMarkedKeys) {
base._props.MaximumNumberOfUsage = 0
}
if (!(Arrays.MarkedKeys.includes(base._id)) && base._props.MaximumNumberOfUsage !== 1) {
base._props.MaximumNumberOfUsage = 0
}
}
if (base._parent == "5c164d2286f774194c5e69fa" && base._props.MaximumNumberOfUsage !== undefined && Config.Items.InfiniteKeycards) {
base._props.MaximumNumberOfUsage = 0
}
if (base._parent == "5c99f98d86f7745c314214b3" && base._props.MaximumNumberOfUsage != 0) {
base._props.MaximumNumberOfUsage *= Config.Items.KeyUseMult
if (base._props.MaximumNumberOfUsage > Config.Items.KeyDurabilityThreshold) {
base._props.MaximumNumberOfUsage = Config.Items.KeyDurabilityThreshold
}
}
if (base._parent == "5c164d2286f774194c5e69fa" && base._props.MaximumNumberOfUsage != 0) {
base._props.MaximumNumberOfUsage *= Config.Items.KeycardUseMult
if (base._props.MaximumNumberOfUsage > Config.Items.KeyDurabilityThreshold) {
base._props.MaximumNumberOfUsage = Config.Items.KeyDurabilityThreshold
}
}
}
}
if (Config.Items.SMGToHolster) {
items["55d7217a4bdc2d86028b456d"]._props.Slots[2]._props.filters[0].Filter.push("5447b5e04bdc2d62278b4567");
}
if (Config.Items.PistolToMain) {
items["55d7217a4bdc2d86028b456d"]._props.Slots[0]._props.filters[0].Filter.push("5447b5cf4bdc2d65278b4567", "617f1ef5e8b54b0998387733");
items["55d7217a4bdc2d86028b456d"]._props.Slots[1]._props.filters[0].Filter.push("5447b5cf4bdc2d65278b4567", "617f1ef5e8b54b0998387733");
}
if (Config.Items.RemoveRaidRestr) {
globals.RestrictionsInRaid = []
}
if (Config.Items.IDChanger) {
//Edit item properties, i know it looks stupid, but hey - it works and i like it.
//5th revision, now including separate fields for filters, parents and expressions.
Logger.info("[SVM] Custom Properties is loading", "blue")
try {
if (Config.Items.IDParent.length > 0) { //ID=ParentID, same as above
let ParentList = Config.Items.IDParent.split("\r\n")
let IDArray = [];
for (let Line in ParentList) {
const Variables = ParentList[Line].split(":")
Logger.info("Parent: " + Variables)
for (let ids in items) {
if (Variables[0] == items[ids]._parent) {
IDArray.push(items[ids]._id);
}
}
Logger.info("Affected by parent: ")
Logger.info(IDArray)
for (let ID in IDArray) {
Variables[0] = IDArray[ID]
IDChanger(Variables)
}
}
}
if (Config.Items.IDDefault.length > 0) {//ID:Variable:Value
let DefaultList = Config.Items.IDDefault.split("\r\n")
for (let Line in DefaultList) {
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) {
const Variables = FilterList[Line].split(":")
Logger.info("Filter: " + Variables)
if (Variables.length === 5) {
let check = CheckType(Variables[4])
for (let fields in check) {
items[Variables[0]]._props[Variables[1]][Variables[2]]._props.filters[0][Variables[3]].push(check[fields])
}
}
else {
Logger.error("[SVM] INVENTORY AND ITEMS - Filters ID - failed to apply\n")
}
}
}
if (Config.Items.IDPrice.length > 0) { //ID:Expression:Number
const handbook = DB.templates.handbook.Items
let IDPriceLines = Config.Items.IDPrice.split("\r\n")
for (let Line in IDPriceLines) {
const Variables = IDPriceLines[Line].split(":")
Logger.info("Price: " + Variables)
let IDChecker = true;
for (let Target in handbook) {
if (handbook[Target].Id.includes(Variables[0])) {
handbook[Target].Price = Calculus(handbook[Target].Price, Variables[1], Variables[2])
IDChecker = false;
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 = []
for (let ID in items) {
if (items[ID]._parent == Variables[0]) {
childs.push(items[ID]._id)
}
}
if (childs.length > 0) {
Logger.success("[SVM] Success, Changing prices of Child IDs")
Logger.info(childs)
for (let child in childs) {
for (let ID in handbook) {
if (handbook[ID].Id.includes(childs[child])) {
handbook[ID].Price = Calculus(handbook[ID].Price, Variables[1], Variables[2])
break;
}
}
}
}
else {
Logger.error("[SVM] Price ID Failed, this ID doesn't exist in Items.json")
}
}
}
}
Logger.success("[SVM] Custom properties successfully loaded")
}
catch (e) {
Logger.error("[SVM] INVENTORY AND ITEMS - Custom properties failed to load, error of the code:\n" + e)
}
}
}
//############## PLAYER SECTION ###############
if (Config.Player.EnablePlayer) {
//Skill box
globals.SkillsSettings.SkillProgressRate = Config.Player.SkillProgMult;
globals.SkillsSettings.WeaponSkillProgressRate = Config.Player.WeaponSkillMult;
//health after raid box
Health.healthMultipliers.death = Config.Player.DiedHealth.Health_death;
Health.healthMultipliers.blacked = Config.Player.DiedHealth.Health_blacked;
Health.save.health = Config.Player.DiedHealth.Savehealth;
Health.save.effects = Config.Player.DiedHealth.Saveeffects;
// skill eff box
if (Config.Player.EnableFatigue) {
globals.SkillMinEffectiveness = Config.Player.Skills.SkillMinEffect;
globals.SkillFatiguePerPoint = Config.Player.Skills.SkillFatiguePerPoint;
globals.SkillFreshEffectiveness = Config.Player.Skills.SkillFreshEffect;
globals.SkillFreshPoints = Config.Player.Skills.SkillFPoints;
globals.SkillPointsBeforeFatigue = Config.Player.Skills.SkillPointsBeforeFatigue;
globals.SkillFatigueReset = Config.Player.Skills.SkillFatigueReset;
}
//############## Player level XP box ##############
globals.exp.kill.victimBotLevelExp = Config.Player.CharXP.ScavKill;
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 ##############
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
}
//Change stamina (unlimited or no)
if (Config.Player.MaxStamina !== 100 && !Config.Player.UnlimitedStamina) {
globals.Stamina.Capacity = Config.Player.MaxStamina;
}
else if (Config.Player.UnlimitedStamina) {
globals.Stamina.Capacity = 500;
globals.Stamina.BaseRestorationRate = 500;
globals.Stamina.StaminaExhaustionCausesJiggle = false;
globals.Stamina.StaminaExhaustionStartsBreathSound = false;
globals.Stamina.StaminaExhaustionRocksCamera = false;
globals.Stamina.SprintDrainRate = 0;
globals.Stamina.JumpConsumption = 0;
globals.Stamina.AimDrainRate = 0;
globals.Stamina.SitToStandConsumption = 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;
globals.Health.Effects.Existence.DestroyedStomachHydrationTimeFactor = Config.Player.BlackStomach;
}
//############## HIDEOUT SECTION ##############
if (Config.Hideout.EnableHideout) {
//Change hideout fuel consumption
hideout.settings.generatorFuelFlowRate *= Config.Hideout.FuelConsumptionRate;
hideout.settings.generatorSpeedWithoutFuel *= Config.Hideout.NoFuelMult;
//hideoutC.fuelDrainRateMultipler = Config.Hideout.FuelConsumptionRate;
hideout.settings.airFilterUnitFlowRate *= Config.Hideout.AirFilterRate;
hideout.settings.gpuBoostRate *= Config.Hideout.GPUBoostRate;
if (Config.Hideout.EnableStash) {
items["566abbc34bdc2d92178b4576"]._props.Grids[0]._props.cellsV = Config.Hideout.Stash.StashLvl1
items["5811ce572459770cba1a34ea"]._props.Grids[0]._props.cellsV = Config.Hideout.Stash.StashLvl2
items["5811ce662459770f6f490f32"]._props.Grids[0]._props.cellsV = Config.Hideout.Stash.StashLvl3
items["5811ce772459770e9e5f9532"]._props.Grids[0]._props.cellsV = Config.Hideout.Stash.StashLvl4
items["6602bcf19cc643f44a04274b"]._props.Grids[0]._props.cellsV = Config.Hideout.Stash.StashTUE
}
//Enable hideout fast constructions
for (const data in hideout.areas) {
let areaData = hideout.areas[data]
for (const i in areaData.stages) {
if (areaData.stages[i].constructionTime > 0) {
areaData.stages[i].constructionTime = parseInt(areaData.stages[i].constructionTime * Config.Hideout.HideoutConstMult)
if (areaData.stages[i].constructionTime < 1) {
areaData.stages[i].constructionTime = 2
}
}
}
}
//Enable fast hideout production
for (const data in hideout.production.recipes) {
let productionData = hideout.production.recipes[data];
if (productionData._id == "5d5589c1f934db045e6c5492") {
productionData.productionTime = Config.Hideout.WaterFilterTime * 60
productionData.requirements[1].resource = Config.Hideout.WaterFilterRate
}
if (productionData._id == "5d5c205bd582a50d042a3c0e") {
productionData.productionLimitCount = Config.Hideout.MaxBitcoins;
productionData.productionTime = Config.Hideout.BitcoinTime * 60;
}
if (!productionData.continuous && productionData.productionTime >= 10) {
productionData.productionTime = parseInt(productionData.productionTime * Config.Hideout.HideoutProdMult)
if (productionData.productionTime < 1) {
productionData.productionTime = 2
}
}
}
//Scav cases modifications
for (const scav in hideout.production.scavRecipes) {
let caseData = hideout.production.scavRecipes[scav];
if (caseData.productionTime >= 10) {
caseData.productionTime = parseInt(caseData.productionTime * Config.Hideout.ScavCaseTime);
if (caseData.productionTime < 1) {
caseData.productionTime = 2
}
}
}
for (const scase in hideout.production.scavRecipes) {
let caseData = hideout.production.scavRecipes[scase];
if (caseData.requirements[0].templateId == "5449016a4bdc2d6f028b456f" || caseData.requirements[0].templateId == "5696686a4bdc2da3298b456a" || caseData.requirements[0].templateId == "569668774bdc2da2298b4568") {
caseData.requirements[0].count = parseInt(caseData.requirements[0].count * Config.Hideout.ScavCasePrice);
}
}
//Remove construction requirements
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 !== "[]") {
let rewriter = [];
for (let req in areaData.stages[stage].requirements)//This is horrible
{
if (areaData.stages[stage].requirements[req].hasOwnProperty("templateId") && !Config.Hideout.RemoveConstructionsRequirements) {
rewriter.push(areaData.stages[stage].requirements[req])
}
else if (areaData.stages[stage].requirements[req].hasOwnProperty("skillName") && !Config.Hideout.RemoveSkillRequirements) {
rewriter.push(areaData.stages[stage].requirements[req])
}
else if (areaData.stages[stage].requirements[req].hasOwnProperty("traderId") && !Config.Hideout.RemoveTraderLevelRequirements) {
rewriter.push(areaData.stages[stage].requirements[req])
}
else if (areaData.stages[stage].requirements[req].hasOwnProperty("areaType"))//Just for sanity check to avoid certain errors like building bitcoin farm while there is no generator.
{
rewriter.push(areaData.stages[stage].requirements[req])
}
}
areaData.stages[stage].requirements = rewriter
}
}
}
}
//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
}
globals.Health.Effects.Regeneration.Energy = Config.Hideout.Regeneration.EnergyRegen
globals.Health.Effects.Regeneration.Hydration = Config.Hideout.Regeneration.HydrationRegen
for (const data in hideout.areas) {
let areaData = hideout.areas[data]
for (const i in areaData.stages) {
for (const x in areaData.stages[i].bonuses) {
if (Config.Hideout.Regeneration.HideoutHydration && areaData.stages[i].bonuses[x].type == "HydrationRegeneration") {
areaData.stages[i].bonuses[x].value = 0;
}
if (Config.Hideout.Regeneration.HideoutEnergy && areaData.stages[i].bonuses[x].type == "EnergyRegeneration") {
areaData.stages[i].bonuses[x].value = 0;
}
if (Config.Hideout.Regeneration.HideoutHealth && areaData.stages[i].bonuses[x].type == "HealthRegeneration") {
areaData.stages[i].bonuses[x].value = 0;
}
}
}
}
}
//############## RAIDS SECTION ################
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;
Inraid.raidMenuSettings.scavWars = Config.Raids.RaidStartup.ScavWars;
Inraid.raidMenuSettings.taggedAndCursed = Config.Raids.RaidStartup.TaggedAndCursed;
Inraid.save.loot = Config.Raids.RaidStartup.SaveLoot;
}
if (Config.Raids.ForceSeason) {
WeatherValues.overrideSeason = Config.Raids.Season;
}
trader.fence.coopExtractGift.sendGift = !Config.Raids.Exfils.FenceGift;
const Midcore = configServer.getConfig("spt-lostondeath");
if (Config.Raids.SaveQuestItems) {
Midcore.questItems = false;
}
//Low Ground zero level access
locations["sandbox"].base.RequiredPlayerLevelMax = Config.Raids.SandboxAccessLevel;
//Time acceleration
WeatherValues.acceleration = Config.Raids.Timeacceleration
//Deploy Window time
globals.TimeBeforeDeployLocal = Config.Raids.RaidStartup.TimeBeforeDeployLocal
//Always survived
if (Config.Raids.NoRunThrough) {
globals.exp.match_end.survived_exp_requirement = 0;
globals.exp.match_end.survived_seconds_requirement = 0;
}
DB.locations["laboratory"].base.Insurance = Config.Raids.LabInsurance;
//Remove labs entry keycard
if (Config.Raids.Removelabkey) {
locations["laboratory"].base.AccessKeys = []
}
if (Config.Raids.Exfils.ArmorExtract) {
globals.RequirementReferences.Alpinist.splice(2, 1)
}
if (Config.Raids.Exfils.GearExtract) {
globals.RequirementReferences.Alpinist.splice(0, 2)
}
//Remove extracts restrictions
for (let i in locations) {
if (i !== "base") {
let ExitNames = locations[i].base.exits // 3.10 TODO CHECK
for (let x in ExitNames) {
if (ExitNames !== "EXFIL_Train" && (!ExitNames.includes("lab") || ExitNames == "lab_Vent") && ExitNames !== "Saferoom Exfil") {//Ok, i feel dumb again, but i was in a rush ok?
if (Config.Raids.Exfils.GearExtract && Config.Raids.Exfils.ArmorExtract && locations[i].base.exits[x].PassageRequirement == "Reference") {
FreeExit(locations[i].base.exits[x])
}
if (Config.Raids.Exfils.NoBackpack && locations[i].base.exits[x].PassageRequirement == "Empty") {
FreeExit(locations[i].base.exits[x])
}
if (locations[i].base.exits[x].PassageRequirement == "TransferItem" && Config.Raids.EnableCarCoop) {
locations[i].base.exits[x].ExfiltrationTime = Config.Raids.Exfils.CarExtractTime;
switch (i) {
case "woods":
if (Config.Raids.Exfils.CarWoods !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CarWoods;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "interchange":
if (Config.Raids.Exfils.CarInterchange !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CarInterchange;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "bigmap":
if (Config.Raids.Exfils.CarCustoms !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CarCustoms;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "tarkovstreets":
if (Config.Raids.Exfils.CarStreets !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CarStreets;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "lighthouse":
if (Config.Raids.Exfils.CarLighthouse !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CarLighthouse;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "shoreline":
if (Config.Raids.Exfils.CarShoreline !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CarShoreline;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "sandbox":
case "sandbox_high":
if (Config.Raids.Exfils.CarSandbox !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CarSandbox;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
default:
break;
}
}
if (Config.Raids.Exfils.CoopPaid && Config.Raids.EnableCarCoop && locations[i].base.exits[x].PassageRequirement == "ScavCooperation") {
locations[i].base.exits[x].PassageRequirement = "TransferItem";
locations[i].base.exits[x].ExfiltrationType = "SharedTimer";
locations[i].base.exits[x].Id = "5449016a4bdc2d6f028b456f";
locations[i].base.exits[x].PlayersCount = 0;
locations[i].base.exits[x].RequirementTip = "EXFIL_Item";
switch (i) {
case "woods":
if (Config.Raids.Exfils.CoopPaidWoods !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CoopPaidWoods;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "tarkovstreets":
if (Config.Raids.Exfils.CoopPaidStreets !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CoopPaidStreets;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "interchange":
if (Config.Raids.Exfils.CoopPaidInterchange !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CoopPaidInterchange;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "lighthouse":
if (Config.Raids.Exfils.CoopPaidLighthouse !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CoopPaidLighthouse;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "rezervbase":
if (Config.Raids.Exfils.CoopPaidReserve !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CoopPaidReserve;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "shoreline":
if (Config.Raids.Exfils.CoopPaidShoreline !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CoopPaidShoreline;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
case "sandbox":
case "sandbox_high":
if (Config.Raids.Exfils.CoopPaidSandbox !== 0) {
locations[i].base.exits[x].Count = Config.Raids.Exfils.CoopPaidSandbox;
}
else {
FreeExit(locations[i].base.exits[x])
}
break;
default:
break;
}
}
if (Config.Raids.Exfils.FreeCoop && Config.Raids.EnableCarCoop && locations[i].base.exits[x].PassageRequirement == "ScavCooperation") {
FreeExit(locations[i].base.exits[x])
}
}
}
}
}
//Make all extractions available to extract
if (Config.Raids.Exfils.ChanceExtracts) {
for (let i in locations) {
if (i !== "base") {
for (let x in locations[i].base.exits) {
if (locations[i].base.exits[x].Name !== "EXFIL_Train") {
locations[i].base.exits[x].Chance = 100;
}
}
}
}
}
//Extend raids time
if (Config.Raids.RaidTime != 0) {
for (let map in locations) {
if (map !== "base") {
if (isJSONValueDefined(locations[map].base.exit_access_time)) {
locations[map].base.exit_access_time += Config.Raids.RaidTime
}
if (isJSONValueDefined(locations[map].base.EscapeTimeLimit)) {
locations[map].base.EscapeTimeLimit += Config.Raids.RaidTime
}
}
}
}
//Make all extractions of the map available regardless of the infill
if (Config.Raids.Exfils.ExtendedExtracts) {
for (let map in locations) {
switch (map) {
case "bigmap":
for (const extract in locations[map].base.exits) {
locations[map].base.exits[extract].EntryPoints = "Customs,Boiler Tanks"
}
break;
case "interchange":
for (const extract in locations[map].base.exits) {
locations[map].base.exits[extract].EntryPoints = "MallSE,MallNW"
}
break;
case "shoreline":
for (const extract in locations[map].base.exits) {
locations[map].base.exits[extract].EntryPoints = "Village,Riverside"
}
break;
case "woods":
for (const extract in locations[map].base.exits) {
locations[map].base.exits[extract].EntryPoints = "House,Old Station"
}
break;
case "lighthouse":
for (const extract in locations[map].base.exits) {
locations[map].base.exits[extract].EntryPoints = "Tunnel,North"
}
break;
case "tarkovstreets":
for (const extract in locations[map].base.exits) {
locations[map].base.exits[extract].EntryPoints = "E1_2,E6_1,E2_3,E3_4,E4_5,E5_6,E6_1"
}
break;
case "sandbox":
case "sandbox_high":
for (const extract in locations[map].base.exits) {
locations[map].base.exits[extract].EntryPoints = "west,east"
}
break;
default:
break;
}
}
}
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)
}
//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])
{
switch(map)//Feature - Infection level affects spawn chances.
{
case "factory4_day":
Events.eventBossSpawns.halloweenzombies[map][wave].BossChance = Events.events[0].settings.zombieSettings.mapInfectionAmount.factory4;
break;
case "factory4_night":
Events.eventBossSpawns.halloweenzombies[map][wave].BossChance = Events.events[0].settings.zombieSettings.mapInfectionAmount.factory4;
break;
case "sandbox":
Events.eventBossSpawns.halloweenzombies[map][wave].BossChance = Events.events[0].settings.zombieSettings.mapInfectionAmount.Sandbox;
break;
case "sandbox_high":
Events.eventBossSpawns.halloweenzombies[map][wave].BossChance = Events.events[0].settings.zombieSettings.mapInfectionAmount.Sandbox;
break;
default:
if (Events.events[0].settings.zombieSettings.mapInfectionAmount[map] !== undefined){
Events.eventBossSpawns.halloweenzombies[map][wave].BossChance = Events.events[0].settings.zombieSettings.mapInfectionAmount[map];
}
break;
}
}
}
}
Events.enableSeasonalEventDetection = !Config.Raids.RaidEvents.DisableEvents
if (Config.Raids.RaidEvents.RaidersEverywhere) // 3.9.0 Raider rework, need to split them up into 3 fields - Start of the raid Scavs, PMC and general waves.
{
for (let i in locations)//Locations DB
{
if (i !== "base" && locations[i].base.waves) {
for (let x in locations[i].base.waves) {
locations[i].base.waves[x].WildSpawnType = "pmcBot"
}
}
}
for (let loc in locs.customWaves.boss) {
for (let ai in locs.customWaves.boss[loc]) {
locs.customWaves.boss[loc][ai].BossName = "pmcBot";
locs.customWaves.boss[loc][ai].BossEscortType = "pmcBot";
}
}
for (let loc in locs.customWaves.normal) {
for (let ai in locs.customWaves.normal[loc]) {
locs.customWaves.normal[loc][ai].WildSpawnType = "pmcBot"
}
}
}
if (Config.Raids.RaidEvents.KillaFactory) {
const KillaWave = CreateBoss("bossKilla", Config.Raids.RaidEvents.KillaFactoryChance, "followerBully", 0, locations["factory4_day"].base.OpenZones)
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
{
if (locations["interchange"].base.BossLocationSpawn[bosscheck].BossName == "bossKilla") {
locations["interchange"].base.BossLocationSpawn[bosscheck].BossEscortAmount = 1
locations["interchange"].base.BossLocationSpawn[bosscheck].BossEscortType = "bossTagilla"
}
}
}
const Waves = require('../src/Waves.json');
if (Config.Raids.RaidEvents.BossesOnReserve) {
let BossWave = CreateBoss("bossKilla", 100, "followerBully", "0", locations["rezervbase"].base.OpenZones)
locations["rezervbase"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossBully", 100, "followerBully", "4", locations["rezervbase"].base.OpenZones)
locations["rezervbase"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossKojaniy", 100, "followerKojaniy", "2", locations["rezervbase"].base.OpenZones)
locations["rezervbase"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossSanitar", 100, "followerSanitar", "2", locations["rezervbase"].base.OpenZones)
locations["rezervbase"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossTagilla", 100, "followerBully", "0", locations["rezervbase"].base.OpenZones)
locations["rezervbase"].base.BossLocationSpawn.push(BossWave)
if (Config.Raids.RaidEvents.IncludeStreetBosses) {
const Kaban = Waves.Kaban
Kaban.BossZone = locations["rezervbase"].base.OpenZones
locations["rezervbase"].base.BossLocationSpawn.push(Kaban)
const Kolontay = Waves.Kolontay
Kaban.BossZone = locations["rezervbase"].base.OpenZones
locations["rezervbase"].base.BossLocationSpawn.push(Kolontay)
}
}
if (Config.Raids.RaidEvents.BossesOnHealthResort) {
if (Config.Raids.RaidEvents.HealthResortIncludeGuards) {
let BossWave = CreateBoss("bossKilla", 100, "followerBully", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossBully", 100, "followerBully", 4, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossKojaniy", 100, "followerKojaniy", 2, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossSanitar", 100, "followerSanitar", 2, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossTagilla", 100, "followerBully", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
const Goons = Waves.Goons
Goons.BossZone = "ZoneSanatorium1,ZoneSanatorium2"
locations["shoreline"].base.BossLocationSpawn.push(Goons)
const Glukhar = Waves.Glukhar
Glukhar.BossZone = "ZoneSanatorium1,ZoneSanatorium2"
locations["shoreline"].base.BossLocationSpawn.push(Glukhar)
const Kaban = Waves.Kaban
Kaban.BossZone = "ZoneSanatorium1,ZoneSanatorium2"
locations["shoreline"].base.BossLocationSpawn.push(Kaban)
const Kolontay = Waves.Kolontay
Kolontay.BossZone = "ZoneSanatorium1,ZoneSanatorium2"
locations["shoreline"].base.BossLocationSpawn.push(Kolontay)//can be shorted harder, will leave it for the next time.
}
else {
let BossWave = CreateBoss("bossKilla", 100, "followerBully", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossBully", 100, "followerBully", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossKojaniy", 100, "followerKojaniy", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossSanitar", 100, "followerSanitar", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossTagilla", 100, "followerBully", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossGluhar", 100, "followerBully", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossBoar", 100, "followerKojaniy", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossKolontay", 100, "followerSanitar", 0, "ZoneSanatorium1,ZoneSanatorium2")
locations["shoreline"].base.BossLocationSpawn.push(BossWave)
const Goons = Waves.Goons
Goons.BossZone = "ZoneSanatorium1,ZoneSanatorium2"
locations["shoreline"].base.BossLocationSpawn.push(Goons)
}
}
if (Config.Raids.RaidEvents.BossesOnCustoms) {
for (let bosses in locations["bigmap"].base.BossLocationSpawn) {
if (locations["bigmap"].base.BossLocationSpawn[bosses].BossName == "bossBully") {
locations["bigmap"].base.BossLocationSpawn[bosses].BossChance = 100;
}
}
let BossWave = CreateBoss("bossKilla", 100, "followerBully", 0, "ZoneOldAZS")
locations["bigmap"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossKojaniy", 100, "followerKojaniy", 2, "ZoneFactoryCenter")
locations["bigmap"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossSanitar", 100, "followerSanitar", 2, "ZoneGasStation")
locations["bigmap"].base.BossLocationSpawn.push(BossWave)
BossWave = CreateBoss("bossTagilla", 100, "followerBully", 0, "ZoneOldAZS")
locations["bigmap"].base.BossLocationSpawn.push(BossWave)
const Glukhar = Waves.Glukhar
Glukhar.BossZone = "ZoneScavBase"
locations["bigmap"].base.BossLocationSpawn.push(Glukhar)
}
if (Config.Raids.RaidEvents.GoonsFactory) {
const Goons = Waves.Goons;
Goons.BossZone = "BotZone";
Goons.BossChance = Config.Raids.RaidEvents.GoonsFactoryChance;
locations["factory4_day"].base.BossLocationSpawn.push(Goons)
locations["factory4_night"].base.BossLocationSpawn.push(Goons)
}
if (Config.Raids.RaidEvents.GlukharLabs) {//BossZone": "BotZoneFloor1,BotZoneFloor2", // "BossChance": 43,
const Glukhar = Waves.Glukhar
Glukhar.BossZone = "BotZoneFloor1,BotZoneFloor2"
locations["laboratory"].base.BossLocationSpawn.push(Glukhar)
}
for (let i in locations)//Bloodhounds events spawn chance - this is bad solution, but i made it on a quick hand, not sure this event lasts either.
{
if (i !== "base" && locations[i].base.BossLocationSpawn) {
for (let x in locations[i].base.BossLocationSpawn) {
if (locations[i].base.BossLocationSpawn[x].BossName == "arenaFighterEvent" && i == "bigmap") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Raids.RaidEvents.HoundsCustoms
}
if (locations[i].base.BossLocationSpawn[x].BossName == "arenaFighterEvent" && i == "woods") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Raids.RaidEvents.HoundsWoods
}
if (locations[i].base.BossLocationSpawn[x].BossName == "peacemaker" && i == "shoreline") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Raids.RaidEvents.PeaceFighters
}
if (locations[i].base.BossLocationSpawn[x].BossName == "skier" && i == "bigmap") {
locations[i].base.BossLocationSpawn[x].BossChance = Config.Raids.RaidEvents.SkierFighters
}
}
}
}
//#######BTR STUFF
if (Config.Raids.EnableBTR) {
if (Config.Raids.ForceBTRFriendly) {
for (let levels in globals.FenceSettings.Levels) {
globals.FenceSettings.Levels[levels].CanInteractWithBtr = true;
}
}
if (Config.Raids.ForceBTRStash) {
for (let levels in globals.FenceSettings.Levels) {
globals.FenceSettings.Levels[levels].DeliveryGridSize["x"] = Config.Raids.BTRWidth
globals.FenceSettings.Levels[levels].DeliveryGridSize["y"] = Config.Raids.BTRHeight
}
}
globals.BTRSettings.BasePriceTaxi = Config.Raids.BTRTaxiPrice
globals.BTRSettings.CleanUpPrice = Config.Raids.BTRCoverPrice
globals.BTRSettings.BearPriceMod = Config.Raids.BearMults
globals.BTRSettings.UsecPriceMod = Config.Raids.UsecMult
globals.BTRSettings.ScavPriceMod = Config.Raids.ScavMult
}
}
//############## TRADERS SECTION ##############
if (Config.Traders.EnableTraders) {
if (Config.Traders.Fence.EnableFence) {
trader.fence.assortSize = Config.Traders.Fence.AmountOnSale;
trader.fence.discountOptions.assortSize = Config.Traders.Fence.PremiumAmountOnSale;
trader.fence.weaponPresetMinMax.min = Config.Traders.Fence.PresetCount;
trader.fence.weaponPresetMinMax.max = Config.Traders.Fence.PresetCount;
trader.fence.presetPriceMult = Config.Traders.Fence.PresetMult;
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) {
trader.updateTime[stock].seconds.min = Config.Traders.Fence.StockTime_Min * 60;
trader.updateTime[stock].seconds.max = Config.Traders.Fence.StockTime_Max * 60;
}
}
trader.fence.weaponDurabilityPercentMinMax.current.min = Config.Traders.Fence.GunDurability_Min
trader.fence.weaponDurabilityPercentMinMax.current.max = Config.Traders.Fence.GunDurability_Max
trader.fence.armorMaxDurabilityPercentMinMax.current.min = Config.Traders.Fence.ArmorDurability_Min
trader.fence.armorMaxDurabilityPercentMinMax.current.max = Config.Traders.Fence.ArmorDurability_Max
let BlacklistArray = Config.Traders.Fence.Blacklist.split("\r\n");
BlackItems.blacklist.push(BlacklistArray);
}
globals.TradingSettings.BuyoutRestrictions.MinDurability = Config.Traders.MinDurabSell / 100
Quest.redeemTime = Config.Traders.QuestRedeemTime;
trader.purchasesAreFoundInRaid = Config.Traders.FIRTrade;
traders["5c0647fdd443bc2504c2d371"].base.unlockedByDefault = Config.Traders.UnlockJaeger
traders["6617beeaa9cfa777ca915b7c"].base.unlockedByDefault = Config.Traders.UnlockRef
const Mark = Config.Traders.TraderMarkup;
const MarkArray = [Mark.Prapor,
Mark.Therapist,
Mark.Fence,
Mark.Skier,
Mark.Peacekeeper,
Mark.Mechanic,
Mark.Ragman,
Mark.Jaeger
]
let i = 0;
for (let CurTrader in traders) {//Bad solution to avoid modded traders.
if (CurTrader !== "ragfair" && (CurTrader == "5a7c2eca46aef81a7ca2145d" || CurTrader == "5ac3b934156ae10c4430e83c" ||
CurTrader == "5c0647fdd443bc2504c2d371" || CurTrader == "54cb50c76803fa8b248b4571" || CurTrader == "54cb57776803fa99248b456e" ||
CurTrader == "579dc571d53a0658a154fbec" || CurTrader == "5935c25fb3acc3127c3d8cd9" || CurTrader == "58330581ace78e27b8b10cee")) {
for (let level in traders[CurTrader].base.loyaltyLevels) {
traders[CurTrader].base.loyaltyLevels[level].buy_price_coef = 100 - MarkArray[i]
}
i++
}
}
//Enable all the quests
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"
}
}]
}
}
if (Config.Traders.FIRRestrictsQuests) {
for (const id in Quests) {
let condition = Quests[id].conditions.AvailableForFinish
for (const requirements in condition) {
if (condition[requirements].onlyFoundInRaid !== undefined) {
condition[requirements].onlyFoundInRaid = false;
}
}
}
}
if (Config.Traders.RemoveTimeCondition) {
for (const id in Quests) {
let condition = Quests[id].conditions.AvailableForStart
for (const requirements in condition) {
if (condition[requirements].availableAfter !== undefined) {
condition[requirements].availableAfter = 0;
}
}
}
}
//Enable all traders 4 stars
if (Config.Traders.TradersLvl4) {
for (let traderID in traders) {
let loyaltyLevels = traders[traderID].base.loyaltyLevels;
for (let level in loyaltyLevels) {
loyaltyLevels[level].minLevel = 1
loyaltyLevels[level].minSalesSum = 0
loyaltyLevels[level].minStanding = 0
}
}
}
if (Config.Traders.UnlockQuestAssort) {
for (let AssortR in traders) {
if (AssortR !== "ragfair" && AssortR !== "638f541a29ffd1183d187f57" && traders[AssortR].questassort.success !== undefined) {
traders[AssortR].questassort.success = {}
}
}
}
if (Config.Traders.RemoveTradeLimits) {
for (let AssortR in traders) {
if (AssortR !== "ragfair" && AssortR !== "638f541a29ffd1183d187f57") {
for (let level in traders[AssortR].assort.items) {
if (traders[AssortR].assort.items[level].upd !== undefined && traders[AssortR].assort.items[level].upd["BuyRestrictionMax"] !== undefined) {
traders[AssortR].assort.items[level].upd["BuyRestrictionMax"] = 999999;
}
}
}
}
}
if (Config.Traders.IncreaseAssort) {
for (let AssortR in traders) {
if (AssortR !== "ragfair" && AssortR !== "638f541a29ffd1183d187f57") {
for (let level in traders[AssortR].assort.items) {
if (traders[AssortR].assort.items[level].upd !== undefined && traders[AssortR].assort.items[level].upd["StackObjectsCount"] !== undefined) {
traders[AssortR].assort.items[level].upd["StackObjectsCount"] = 1337420;
}
}
}
}
}
//sell assort
const Sell = Config.Traders.TraderSell;
const SellArray = [Sell.Prapor,
Sell.Therapist,
Sell.Skier,
Sell.Peacekeeper,
Sell.Mechanic,
Sell.Ragman,
Sell.Jaeger
]
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)
}
}
p++;
}
if (Config.Traders.RemoveCurrencyOffers) {
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") {
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) {
traders[CurTrader].assort.items[DeletElem].upd.UnlimitedCount = false;
}
traders[CurTrader].assort.items[DeletElem].upd["StackObjectsCount"] = 0;
}
}
}
}
}
}
}
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) {
traders[CurTrader].assort.items[DeletElem].upd.UnlimitedCount = false;
}
traders[CurTrader].assort.items[DeletElem].upd["StackObjectsCount"] = 0;
}
}
}
}
}
}
}
}
//############## PMC SECTION ##################,
if (Config.PMC.EnablePMC) {
if (Config.PMC.EnableConvert) {
PMC.convertIntoPmcChance.default.assault.min = Config.PMC.AItoPMC.ScavToPMC;
PMC.convertIntoPmcChance.default.cursedassault.min = Config.PMC.AItoPMC.CursedToPMC;
PMC.convertIntoPmcChance.default.pmcbot.min = Config.PMC.AItoPMC.RaiderToPMC;
PMC.convertIntoPmcChance.default.exusec.min = Config.PMC.AItoPMC.RogueToPMC;
PMC.convertIntoPmcChance.default.marksman = {};
PMC.convertIntoPmcChance.default.marksman.min = Config.PMC.AItoPMC.SnipertoPMC;
PMC.convertIntoPmcChance.default.assault.max = Config.PMC.AItoPMC.ScavToPMC;
PMC.convertIntoPmcChance.default.cursedassault.max = Config.PMC.AItoPMC.CursedToPMC;
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.isUsec = Config.PMC.PMCRatio;
}
PMC.botRelativeLevelDeltaMax = Config.PMC.LevelUpMargin;
PMC.botRelativeLevelDeltaMin = Config.PMC.LevelDownMargin;
if (Config.PMC.ChancesEnable) {
PMC.chanceSameSideIsHostilePercent = Config.PMC.PMCChance.HostilePMC;
PMC.looseWeaponInBackpackChancePercent = Config.PMC.PMCChance.PMCLooseWep;
PMC.weaponHasEnhancementChancePercent = Config.PMC.PMCChance.PMCWepEnhance;
PMC.addPrefixToSameNamePMCAsPlayerChance = Config.PMC.PMCChance.PMCNamePrefix;
PMC.allPMCsHavePlayerNameWithRandomPrefixChance = Config.PMC.PMCChance.PMCAllNamePrefix;
}
//Lootable melees
for (const id in items) {
let base = items[id]
if (base._parent === "5447e1d04bdc2dff2f8b4567" && base._id !== "6087e570b998180e9f76dc24" && Config.PMC.LootableMelee) {
EditSimpleItemData(id, "Unlootable", false);
items[id]._props.UnlootableFromSide = [];
}
}
if (Config.PMC.DisableLowLevelPMC) {
Bots.equipment.pmc.randomisation[0].levelRange.max = 1;
Bots.equipment.pmc.randomisation[1].levelRange.min = 1;
Bots.equipment.pmc.randomisation[2].levelRange.min = 1;
Bots.equipment.pmc.randomisation[3].levelRange.min = 1;
//Bots.equipment.pmc.randomisation[4].levelRange.min = 1;
}
if (Config.PMC.NamesEnable) {
if (Config.PMC.NameOverride) {
let Names = Config.PMC.PMCNameList.split("\r\n")
Bot["pmcusec"].firstName = Names;
Bot["pmcbear"].firstName = Names;
Bot["usec"].firstName = Names;
Bot["bear"].firstName = Names;
}
else {
let Names = Config.PMC.PMCNameList.split("\r\n")
for (const name in Names)//I don't really remember should i even have this cycle here, but eh, cba.
{
Bot["pmcusec"].firstName.push(Names[name])
Bot["pmcbear"].firstName.push(Names[name])
Bot["usec"].firstName.push(Names[name])
Bot["bear"].firstName.push(Names[name])
}
}
}
}
//############## REPEATABLE QUESTS SECTION #############
if (Config.Quests.EnableQuests) {
const Daily = Config.Quests.DailyQuests;
const Weekly = Config.Quests.WeeklyQuests;
const ScavDaily = Config.Quests.ScavQuests;
//Requirements
QuestDetails(Daily, "0")
QuestDetails(Weekly, "1")
QuestDetails(ScavDaily, "2")
//Rewards
QuestReward(Daily, "0")
QuestReward(Weekly, "1")
QuestReward(ScavDaily, "2")
}
//############## SCAV SECTION ############## I wish i never made one, but here we are
if (Config.Scav.EnableScav) {
//Base Fence rep given by car extract
Inraid.carExtractBaseStandingGain = Config.Scav.CarBaseStanding
//Allow Scav into Lab
locations["laboratory"].base.DisabledForScav = !Config.Scav.ScavLab;
//Scav Cooldown Timer
globals.SavagePlayCooldown = Config.Scav.ScavTimer;
for (let levels in globals.FenceSettings.Levels)//Damn it looks counter intuitive
{
if (Config.Scav.HostileScavs) {
globals.FenceSettings.Levels[levels].HostileScavs = Config.Scav.HostileScavs
}
if (Config.Scav.HostileBosses) {
globals.FenceSettings.Levels[levels].HostileBosses = Config.Scav.HostileScavs
}
if (Config.Scav.FriendlyScavs) {
globals.FenceSettings.Levels[levels].HostileScavs = !Config.Scav.FriendlyScavs
}
if (Config.Scav.FriendlyBosses) {
globals.FenceSettings.Levels[levels].HostileBosses = !Config.Scav.FriendlyBosses
}
}
if (Config.Scav.ScavCustomPockets) {
const JsonUtil = container.resolve("JsonUtil");
let ScavCustomPocketItem = JsonUtil.clone(items["557ffd194bdc2d28148b457f"])
let ScavPocketSize = Config.Scav.SCAVPockets
ScavCustomPocketItem._id = "a8edfb0bce53d103d3f6219b"
for (let cell in ScavCustomPocketItem._props.Grids)//tried to make less code, made more, smh.
{
ScavCustomPocketItem._props.Grids[cell]._parent = "a8edfb0bce53d103d3f6219b"
}
ScavCustomPocketItem._props.Grids[0]._id = "a8edfb0bce53d103d3f6229b"
ScavCustomPocketItem._props.Grids[0]._props.cellsH = ScavPocketSize.FirstWidth
ScavCustomPocketItem._props.Grids[0]._props.cellsV = ScavPocketSize.FirstHeight
ScavCustomPocketItem._props.Grids[1]._id = "a8edfb0bce53d103d3f6239b"
ScavCustomPocketItem._props.Grids[1]._props.cellsH = ScavPocketSize.SecondWidth
ScavCustomPocketItem._props.Grids[1]._props.cellsV = ScavPocketSize.SecondHeight
ScavCustomPocketItem._props.Grids[2]._id = "a8edfb0bce53d103d3f6249b"
ScavCustomPocketItem._props.Grids[2]._props.cellsH = ScavPocketSize.ThirdWidth
ScavCustomPocketItem._props.Grids[2]._props.cellsV = ScavPocketSize.ThirdHeight
ScavCustomPocketItem._props.Grids[3]._id = "a8edfb0bce53d103d3f6259b"
ScavCustomPocketItem._props.Grids[3]._props.cellsH = ScavPocketSize.FourthWidth
ScavCustomPocketItem._props.Grids[3]._props.cellsV = ScavPocketSize.FourthHeight
switch (true) {
case ScavPocketSize.FourthWidth == 0 || ScavPocketSize.FourthHeight == 0:
ScavCustomPocketItem._props.Grids.splice(3, 1)
case ScavPocketSize.ThirdWidth == 0 || ScavPocketSize.ThirdHeight == 0:
ScavCustomPocketItem._props.Grids.splice(2, 1);
case ScavPocketSize.SecondWidth == 0 || ScavPocketSize.SecondHeight == 0:
ScavCustomPocketItem._props.Grids.splice(1, 1);
case ScavPocketSize.FirstWidth == 0 || ScavPocketSize.FirstHeight == 0:
ScavCustomPocketItem._props.Grids.splice(0, 1);
break;
default:
break;
}
items["a8edfb0bce53d103d3f6219b"] = ScavCustomPocketItem;
}
}
//############## CUSTOM SECTION ##############
if (Config.Custom.EnableCustom) {
if (Config.Custom.LoggerIntoServer) {
Logger.warning("[SVM] PRESET IS BEING LOGGED INTO SERVER, DO NOT USE THIS FEATURE UNDER NORMAL CIRCUMSTANCES")
Logger.debug(Config)
}
const Core = configServer.getConfig("spt-core");
Core.features.chatbotFeatures.sptFriendEnabled = !Config.Custom.DisableSPTFriend
Core.features.chatbotFeatures.commandoEnabled = !Config.Custom.DisableCommando
if (Config.Custom.DisablePMCMessages) {
const Chat = configServer.getConfig("spt-pmcchatresponse");
Chat.victim.responseChancePercent = 0;
Chat.killer.responseChancePercent = 0;
}
//If you're reading here, maybe you checked that custom fields exist now,
//feel free to use this place to run your own little scripts using SVM as a framework, Search word is `banana`
//Mind you, Custom section needs to be enabled, you can however write stuff after the bracket there to run the code if at least preset exist.
//Fields names are `CustomCheck1,2,3,4` and `CustomNumber1,2,3,4`
}
//#####
//############## FUNCTIONS ##############
//Set a Unique AI type spawn within selected location, with a lot of variables to come in.
function CreateBoss(role, chance, followers, escortAmount, zones) {
return {
"BossName": role,
"BossChance": chance,
"BossZone": zones,
"BossPlayer": false,
"BossDifficult": "normal",
"BossEscortType": followers,
"BossEscortDifficult": "normal",
"BossEscortAmount": escortAmount,
"Time": -1
}
}
function Filter(value) {
let test = value.substring(1, value.length - 1)
let result = test.split(",")
return result
}
function EditSimpleItemData(id, data, value) {
if (isNaN(value) && value !== 'true' && value !== 'false') {
items[id]._props[data] = value
}
else {
items[id]._props[data] = JSON.parse(value)
}
}
function QuestDetails(Type, Digit) {
Quest.repeatableQuests[Digit].resetTime = Type.Lifespan * 60;
Quest.repeatableQuests[Digit].types = []
if (Digit < 2) {
switch (Type.Types)//Horrible
{
case 0: Quest.repeatableQuests[Digit].types.push(Arrays.Types[0])
break;
case 1: Quest.repeatableQuests[Digit].types.push(Arrays.Types[1])
break;
case 2: Quest.repeatableQuests[Digit].types.push(Arrays.Types[2])
break;
case 3: Quest.repeatableQuests[Digit].types.push(Arrays.Types[0], Arrays.Types[1])
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])
break;
case 6: Quest.repeatableQuests[Digit].types.push(Arrays.Types[0], Arrays.Types[1], Arrays.Types[2])
break;
}
}
else {
switch (Type.Types) {
case 0: Quest.repeatableQuests[2].types.push(Arrays.Types[0])
break;
case 1: Quest.repeatableQuests[2].types.push(Arrays.Types[1])
break;
case 2: Quest.repeatableQuests[2].types.push(Arrays.Types[0], Arrays.Types[1])
}
}
Quest.repeatableQuests[Digit].numQuests = Type.QuestAmount;
Quest.repeatableQuests[Digit].minPlayerLevel = Type.Access
Quest.repeatableQuests[Digit].rewardScaling.rewardSpread = Type.Spread;
Quest.repeatableQuests[Digit].questConfig.Exploration.maxExtracts = Type.Extracts;
Quest.repeatableQuests[Digit].questConfig.Completion.minRequestedAmount = Type.MinItems;
Quest.repeatableQuests[Digit].questConfig.Completion.maxRequestedAmount = Type.MaxItems;
Quest.repeatableQuests[Digit].questConfig.Elimination[0].minKills = Type.MinKillsLR1;
Quest.repeatableQuests[Digit].questConfig.Elimination[0].maxKills = Type.MaxKillsLR1;
Quest.repeatableQuests[Digit].questConfig.Elimination[1].minKills = Type.MinKillsLR2;
Quest.repeatableQuests[Digit].questConfig.Elimination[1].maxKills = Type.MaxKillsLR2;
if (Digit < 2) {
Quest.repeatableQuests[Digit].questConfig.Elimination[2].minKills = Type.MinKillsLR3;
Quest.repeatableQuests[Digit].questConfig.Elimination[2].maxKills = Type.MaxKillsLR3;
}
}
function AirdropContents(DBType, Type) {
if (Airdrop.loot[DBType] != undefined) {
Airdrop.loot[DBType].itemCount.min = Type.BarterMin
Airdrop.loot[DBType].itemCount.max = Type.BarterMax
Airdrop.loot[DBType].weaponPresetCount.min = Type.PresetMin
Airdrop.loot[DBType].weaponPresetCount.max = Type.PresetMax
Airdrop.loot[DBType].armorPresetCount.min = Type.ArmorMin
Airdrop.loot[DBType].armorPresetCount.max = Type.ArmorMax
Airdrop.loot[DBType].weaponCrateCount.min = Type.CratesMin
Airdrop.loot[DBType].weaponCrateCount.max = Type.CratesMax
}
}
function QuestReward(Type, Digit) {
try {
let Levels = Type.Levels.split(",");
let Exp = Type.Experience.split(",");
let Reputation = Type.Reputation.split(",");
let ItemsReward = Type.ItemsReward.split(",");
let Roubles = Type.Roubles.split(",");
let GPcoins = Type.GPcoins.split(",");
let SkillChance = Type.SkillChance.split(",");
let SkillPoint = Type.SkillPoint.split(",");
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);
}
else {
Logger.error("[SVM] REPEATABLE QUESTS - Daily rewards scales written wrongly, read FAQ, changes ignored.")
}
}
catch {
Logger.error("[SVM] REPEATABLE QUESTS - Daily rewards scales written wrongly, read FAQ, changes ignored.")
}
}
function isJSONValueDefined(value) {
return value !== undefined && !value.isNaN;
}
function FreeExit(Exit) {
Exit.PassageRequirement = "None";
Exit.ExfiltrationType = "Individual";
Exit.Id = '';
Exit.Count = 0;
Exit.PlayersCount = 0;
Exit.RequirementTip = '';
if (Exit.RequiredSlot) {
delete Exit.RequiredSlot;
}
}
function IDChanger(Variables) {
try {
switch (Variables.length) {
case 3:
items[Variables[0]]._props[Variables[1]] = CheckType(Variables[2])
break;
case 4:
if (SymbolCheck(Variables[2])) {
items[Variables[0]]._props[Variables[1]] = Calculus(items[Variables[0]]._props[Variables[1]], Variables[2], Variables[3])
}
else {
items[Variables[0]]._props[Variables[1]][Variables[2]] = CheckType(Variables[3])
}
break;
case 5:
if (SymbolCheck(Variables[3])) {
items[Variables[0]]._props[Variables[1]][Variables[2]] = Calculus(items[Variables[0]]._props[Variables[1]][Variables[2]], Variables[3], Variables[4])
}
else {
items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]] = CheckType(Variables[4])
}
break;
case 6:
if (SymbolCheck(Variables[4])) {
items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]] = Calculus(items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]], Variables[4], Variables[5])
}
else {
items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]][Variables[4]] = CheckType(Variables[5])
}
break;
case 7:
items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]][Variables[4]][Variables[5]] = CheckType(Variables[6])
break;
case 8:
items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]][Variables[4]][Variables[5]][Variables[6]] = CheckType(Variables[7])
break;
case 9:
items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]][Variables[4]][Variables[5]][Variables[6]][Variables[7]] = CheckType(Variables[8])
break;
case 10:
items[Variables[0]]._props[Variables[1]][Variables[2]][Variables[3]][Variables[4]][Variables[5]][Variables[6]][Variables[7]][Variables[8]] = CheckType(Variables[9])
break;
default:
Logger.error("[SVM] INVENTORY AND ITEMS - Custom properties line failed, More than 10 or less than 3 variables?")
break;
}
}
catch (e) {
Logger.error("[SVM] INVENTORY AND ITEMS - Custom properties line failed, something ain't right\n" + e)
}
}
function CheckType(object) {
if (object.includes(",") || object.includes("[")) {
return Filter(object)
}
else if (isNaN(object) && object !== 'true' && object !== 'false') {
return object;
}
else {
return JSON.parse(object)
}
}
function SymbolCheck(Value) {
return (Value == "*" || Value == "/" || Value == "+" || Value == "-");
}
function Calculus(Field, Operand, Value) {
switch (Operand) {
case "/":
Field = parseInt(parseInt(Field) / parseFloat(Value))
break;
case "*":
Field = parseInt(parseInt(Field) * parseFloat(Value))
break;
case "+":
Field = parseInt(parseInt(Field) + parseFloat(Value))
break;
case "-":
Field = parseInt(parseInt(Field) - parseFloat(Value))
break;
}
return Field
}
function AmmoFilter(AID, Comp) {
for (let ID in AID) {
if (Comp.includes(AID[ID])) {
return true;
}
}
return false;
}
//initialise complete logger
const Misc = require('../src/Misc.json');
Logger.log(`[SVM] Initialization complete. ` + Misc.funni[Math.floor(Math.random() * Misc.funni.length)], "blue");
if (PresetLoader.CurrentlySelectedPreset != "" && PresetLoader.CurrentlySelectedPreset != undefined) {
Logger.log("[SVM] Preset - " + PresetLoader.CurrentlySelectedPreset + " - successfully loaded", "blue");
}
}
}
module.exports = {
mod: new MainSVM
};