Compare commits
3 commits
a01b279998
...
081b038df5
| Author | SHA1 | Date | |
|---|---|---|---|
| 081b038df5 | |||
| 7aa7ac1092 | |||
| b6ba8aea5d |
156 changed files with 18146 additions and 134309 deletions
9
BepInEx/config/HealingAutoCancel.cfg
Normal file
9
BepInEx/config/HealingAutoCancel.cfg
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
## Settings file was created by plugin HealingAutoCancel v1.0.0
|
||||
## Plugin GUID: HealingAutoCancel
|
||||
|
||||
[Heal]
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Enable automatic heal canceling = true
|
||||
|
||||
77
BepInEx/config/IhanaMies.LootValue.cfg
Normal file
77
BepInEx/config/IhanaMies.LootValue.cfg
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
## Settings file was created by plugin LootValue v5.0.2
|
||||
## Plugin GUID: IhanaMies.LootValue
|
||||
|
||||
[Colours]
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: false
|
||||
Use custom colours = false
|
||||
|
||||
## Colouring bound is marked as [int:hexcolor] e.q. [lower than this value : will be this hexcolor]
|
||||
## The values should incremental from lower to higher and last value should be valueless.
|
||||
## For example [5000:#ff0000],[10000:#ffff00],[:#ffffff] means three different bounds.
|
||||
## Anything under 5000 rubles, will be red.
|
||||
## Anything under 10000 rubles, will be yellow.
|
||||
## The third is marked as the ultimate color. Anything over 10000 rubles would be white.
|
||||
##
|
||||
# Setting type: String
|
||||
# Default value: [5000:#ff0000],[10000:#ffff00],[:#ffffff]
|
||||
Custom colours = [5000:#ff0000],[10000:#ffff00],[:#ffffff]
|
||||
|
||||
[Flea]
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: false
|
||||
Show flea price before having access to flea (character level 15) = false
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: false
|
||||
Ignore flea max offer count = false
|
||||
|
||||
[General]
|
||||
|
||||
## Modifier to enable quickselling. Two button mode: Left Mouse Button sell to trader. Right Mouse Button sell to flea. One button mode: Left Mouse Button both
|
||||
# Setting type: KeyboardShortcut
|
||||
# Default value: LeftAlt + LeftShift
|
||||
Modifier to enable quickselling = LeftAlt + LeftShift
|
||||
|
||||
[Quick Sell]
|
||||
|
||||
## Selling is done using LMB only. Attempts to sell to flea and then to trader if the option is enabled
|
||||
# Setting type: Boolean
|
||||
# Default value: false
|
||||
One button quick sell = false
|
||||
|
||||
## Does nothing if 'Ignore flea max offer count' is enabled
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Sell to trader if no flea slots left = true
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: false
|
||||
Only show total value = false
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Enable quick selling = true
|
||||
|
||||
## Does nothing if quick selling is disabled
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Enable quick selling to flea = true
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Show flea prices in raid = true
|
||||
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Show prices = true
|
||||
|
||||
[Traders]
|
||||
|
||||
## Separate values by comma, must use trader's id which is usually their name. The trader Id can also be found in user/mods/%trader_name%/db/base.json
|
||||
# Setting type: String
|
||||
# Default value:
|
||||
Traders to ignore =
|
||||
|
||||
18
BepInEx/config/com.inory.agonysfx.cfg
Normal file
18
BepInEx/config/com.inory.agonysfx.cfg
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
## Settings file was created by plugin inory-agonysfx v1.1.4
|
||||
## Plugin GUID: com.inory.agonysfx
|
||||
|
||||
[]
|
||||
|
||||
## Chance of playing the agony sound effects
|
||||
# Setting type: Single
|
||||
# Default value: 0.5
|
||||
# Acceptable value range: From 0 to 1
|
||||
Agony Sound Chance = 0.5
|
||||
|
||||
[Debug]
|
||||
|
||||
## Enable debug logs
|
||||
# Setting type: Boolean
|
||||
# Default value: false
|
||||
Debug = false
|
||||
|
||||
22
BepInEx/config/com.lacyway.ch.cfg
Normal file
22
BepInEx/config/com.lacyway.ch.cfg
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
## Settings file was created by plugin ContinuousHealing v1.3.0
|
||||
## Plugin GUID: com.lacyway.ch
|
||||
|
||||
[1. Settings]
|
||||
|
||||
## If using surgery kits should also be continuous.
|
||||
## NOTE: Animation does not loop.
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Heal Limbs = true
|
||||
|
||||
## The delay between every heal on each limb. Game default is 2, set to 0 to use intended Continuous Healing behavior.
|
||||
# Setting type: Int32
|
||||
# Default value: 0
|
||||
# Acceptable value range: From 0 to 5
|
||||
Heal Delay = 0
|
||||
|
||||
## If a new animaton should be played between every limb being healed. This does not affect the speed at which you heal.
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Reset Animations = true
|
||||
|
||||
10
BepInEx/config/com.mpstark.PlayerEncumbranceBar.cfg
Normal file
10
BepInEx/config/com.mpstark.PlayerEncumbranceBar.cfg
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
## Settings file was created by plugin PlayerEncumbranceBar v1.1.3
|
||||
## Plugin GUID: com.mpstark.PlayerEncumbranceBar
|
||||
|
||||
[1. General]
|
||||
|
||||
## If text for each tick mark breakpoint should be displayed
|
||||
# Setting type: Boolean
|
||||
# Default value: true
|
||||
Display Breakpoint Text = true
|
||||
|
||||
Binary file not shown.
8
user/mods/BotCallsigns/config/bear_extra_names.json
Normal file
8
user/mods/BotCallsigns/config/bear_extra_names.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Names": [
|
||||
"extra",
|
||||
"names",
|
||||
"go",
|
||||
"here"
|
||||
]
|
||||
}
|
||||
20
user/mods/BotCallsigns/config/scav_names.json
Normal file
20
user/mods/BotCallsigns/config/scav_names.json
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"firstNames": [
|
||||
"put",
|
||||
"your",
|
||||
"first names",
|
||||
"here",
|
||||
"or",
|
||||
"add",
|
||||
"more"
|
||||
],
|
||||
"lastNames": [
|
||||
"put",
|
||||
"your",
|
||||
"last names",
|
||||
"here",
|
||||
"or",
|
||||
"add",
|
||||
"more"
|
||||
]
|
||||
}
|
||||
8
user/mods/BotCallsigns/config/usec_extra_names.json
Normal file
8
user/mods/BotCallsigns/config/usec_extra_names.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Names": [
|
||||
"extra",
|
||||
"names",
|
||||
"go",
|
||||
"here"
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,67 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CustomAssortSchemeService = void 0;
|
||||
const customAssortSchemes = __importStar(require("../db/CustomAssortSchemes/CustomAssortSchemes.json"));
|
||||
const configConsts_1 = require("./references/configConsts");
|
||||
class CustomAssortSchemeService {
|
||||
instanceManager;
|
||||
preSptLoad(instanceManager) {
|
||||
this.instanceManager = instanceManager;
|
||||
}
|
||||
postDBLoad() {
|
||||
const tables = this.instanceManager.database;
|
||||
for (const traderId in customAssortSchemes) {
|
||||
const traderIdFromMap = configConsts_1.traderIDs[traderId];
|
||||
const finalTraderId = traderIdFromMap || traderId;
|
||||
const trader = tables.traders[finalTraderId];
|
||||
if (!trader) {
|
||||
return;
|
||||
}
|
||||
const newAssort = customAssortSchemes[traderId];
|
||||
for (const item of newAssort.items) {
|
||||
trader.assort.items.push(item);
|
||||
}
|
||||
for (const [itemName, scheme] of Object.entries(newAssort.barter_scheme)) {
|
||||
trader.assort.barter_scheme[itemName] = scheme;
|
||||
}
|
||||
for (const [itemName, count] of Object.entries(newAssort.loyal_level_items)) {
|
||||
trader.assort.loyal_level_items[itemName] = count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.CustomAssortSchemeService = CustomAssortSchemeService;
|
||||
//# sourceMappingURL=CustomAssortSchemeService.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "CustomAssortSchemeService.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"CustomAssortSchemeService.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,wGAA0F;AAC1F,4DAAsD;AAEtD,MAAa,yBAAyB;IAE1B,eAAe,CAAqB;IAErC,UAAU,CAAC,eAAmC;QAEjD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IAC3C,CAAC;IAEM,UAAU;QAEb,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;QAC7C,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAC1C,CAAC;YACG,MAAM,eAAe,GAAG,wBAAS,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,eAAe,IAAI,QAAQ,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE7C,IAAI,CAAC,MAAM,EACX,CAAC;gBACG,OAAO;YACX,CAAC;YAED,MAAM,SAAS,GAAmB,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAEhE,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAClC,CAAC;gBACG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,EACxE,CAAC;gBACG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YACnD,CAAC;YAED,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAC3E,CAAC;gBACG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YACtD,CAAC;QAEL,CAAC;IACL,CAAC;CAGJ;AA3CD,8DA2CC"
|
||||
}
|
||||
|
|
@ -0,0 +1,321 @@
|
|||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CustomClothingService = void 0;
|
||||
const configConsts_1 = require("./references/configConsts");
|
||||
const node_fs_1 = __importDefault(require("node:fs"));
|
||||
const node_path_1 = __importDefault(require("node:path"));
|
||||
class CustomClothingService {
|
||||
instanceManager;
|
||||
preSptLoad(instanceManager) {
|
||||
this.instanceManager = instanceManager;
|
||||
}
|
||||
postDBLoad() {
|
||||
const clothingJsonsPath = node_path_1.default.join(__dirname, "../db/clothing");
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Scanning directory for clothing JSON files: ${clothingJsonsPath}`);
|
||||
}
|
||||
const jsonFiles = node_fs_1.default.readdirSync(clothingJsonsPath).filter(file => file.endsWith(".json"));
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Found ${jsonFiles.length} JSON file(s) in ${clothingJsonsPath}`);
|
||||
}
|
||||
for (const jsonFile of jsonFiles) {
|
||||
const filePath = node_path_1.default.join(clothingJsonsPath, jsonFile);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Processing file: ${jsonFile} at path: ${filePath}`);
|
||||
}
|
||||
try {
|
||||
// Read and parse the JSON file
|
||||
const clothingConfigs = this.readJsonFile(filePath);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Parsed JSON content from ${jsonFile}:`, clothingConfigs);
|
||||
}
|
||||
// Process the parsed content
|
||||
for (const clothingConfig of clothingConfigs) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing clothing config:", clothingConfig);
|
||||
}
|
||||
try {
|
||||
this.processClothingConfig(clothingConfig);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Successfully processed clothing config:", clothingConfig);
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error processing config in ${jsonFile}:`, error);
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully processed all configs in ${jsonFile}.`);
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error reading or parsing ${jsonFile}:`, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
processClothingConfig(clothingConfig) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Processing config of type: ${clothingConfig.type}`);
|
||||
}
|
||||
if (clothingConfig.type === "top") {
|
||||
this.addTop(clothingConfig);
|
||||
}
|
||||
else if (clothingConfig.type === "bottom") {
|
||||
this.addBottom(clothingConfig);
|
||||
}
|
||||
else {
|
||||
console.error("Unknown config type:", clothingConfig.type);
|
||||
}
|
||||
}
|
||||
addSuiteToTrader(traderId, outfitId, suiteId, loyaltyLevel, profileLevel, standing, currencyId, price) {
|
||||
const traderIdFromEnum = configConsts_1.traderIDs[traderId] || traderId;
|
||||
const currencyIdFromEnum = configConsts_1.currencyIDs[currencyId] || currencyId;
|
||||
this.instanceManager.database.traders[traderIdFromEnum].base.customization_seller = true;
|
||||
if (!this.instanceManager.database.traders[traderIdFromEnum].suits) {
|
||||
this.instanceManager.database.traders[traderIdFromEnum].suits = [];
|
||||
}
|
||||
const newTraderOutfit = {
|
||||
"_id": outfitId,
|
||||
"tid": traderIdFromEnum,
|
||||
"suiteId": suiteId,
|
||||
"isActive": true,
|
||||
"isHiddenInPVE": false,
|
||||
"externalObtain": false,
|
||||
"internalObtain": false,
|
||||
"requirements": {
|
||||
"loyaltyLevel": loyaltyLevel,
|
||||
"profileLevel": profileLevel,
|
||||
"standing": standing,
|
||||
"skillRequirements": [],
|
||||
"questRequirements": [],
|
||||
"achievementRequirements": [],
|
||||
"itemRequirements": [
|
||||
{
|
||||
"id": null,
|
||||
"type": "ItemRequirement",
|
||||
"count": price,
|
||||
"_tpl": currencyIdFromEnum,
|
||||
"onlyFunctional": true
|
||||
}
|
||||
],
|
||||
"requiredTid": traderIdFromEnum
|
||||
}
|
||||
};
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Adding new trader outfit:", newTraderOutfit);
|
||||
}
|
||||
this.instanceManager.database.traders[traderIdFromEnum].suits.push(newTraderOutfit);
|
||||
}
|
||||
addTop(clothingConfig) {
|
||||
const { side, suiteId, topId, handsId, outfitId, topBundlePath, handsBundlePath, traderId, loyaltyLevel, profileLevel, standing, currencyId, price, watchPrefab, watchPosition, watchRotation } = clothingConfig;
|
||||
try {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Adding top");
|
||||
}
|
||||
const DefaultWatchPrefab = {
|
||||
"path": "",
|
||||
"rcid": ""
|
||||
};
|
||||
const DefaultWatchPosition = {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
};
|
||||
const DefaultWatchRotation = {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
};
|
||||
const newTop = {
|
||||
"_id": topId,
|
||||
"_name": `${topId}_name`,
|
||||
"_parent": "5cc0868e14c02e000c6bea68",
|
||||
"_type": "Item",
|
||||
"_props": {
|
||||
"Description": `${topId}_desc`,
|
||||
"Name": `${topId}_name`,
|
||||
"ShortName": `${topId}_shortName`,
|
||||
"Side": [
|
||||
"Usec"
|
||||
],
|
||||
"BodyPart": "Body",
|
||||
"IntegratedArmorVest": false,
|
||||
"Prefab": {
|
||||
"path": topBundlePath,
|
||||
"rcid": ""
|
||||
},
|
||||
"WatchPosition": watchPosition ?? DefaultWatchPosition,
|
||||
"WatchPrefab": watchPrefab ?? DefaultWatchPrefab,
|
||||
"WatchRotation": watchRotation ?? DefaultWatchRotation
|
||||
},
|
||||
"_proto": "5cde95d97d6c8b647a3769b0"
|
||||
};
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added top for ${topId}:`, newTop);
|
||||
}
|
||||
this.instanceManager.database.templates.customization[topId] = newTop;
|
||||
// add hands
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Adding hands for topId: ${topId}`);
|
||||
}
|
||||
const newHands = {
|
||||
"_id": handsId,
|
||||
"_name": `${handsId}_name`,
|
||||
"_parent": "5cc086a314c02e000c6bea69",
|
||||
"_type": "Item",
|
||||
"_props": {
|
||||
"Description": `${handsId}_desc`,
|
||||
"Name": `${handsId}_name`,
|
||||
"ShortName": `${handsId}_shortName`,
|
||||
"Side": [
|
||||
"Usec"
|
||||
],
|
||||
"BodyPart": "Hands",
|
||||
"IntegratedArmorVest": false,
|
||||
"Prefab": {
|
||||
"path": handsBundlePath,
|
||||
"rcid": ""
|
||||
},
|
||||
"WatchPosition": watchPosition ?? DefaultWatchPosition,
|
||||
"WatchPrefab": watchPrefab ?? DefaultWatchPrefab,
|
||||
"WatchRotation": watchRotation ?? DefaultWatchRotation
|
||||
},
|
||||
"_proto": "5cde95fa7d6c8b04737c2d13"
|
||||
};
|
||||
this.instanceManager.database.templates.customization[handsId] = newHands;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added hands for ${handsId}:`, newHands);
|
||||
}
|
||||
const newSuite = {
|
||||
"_id": suiteId,
|
||||
"_name": `${suiteId}_name`,
|
||||
"_parent": "5cd944ca1388ce03a44dc2a4",
|
||||
"_type": "Item",
|
||||
"_props": {
|
||||
"Description": "DefaultUsecUpperSuite",
|
||||
"Name": "DefaultUsecUpperSuite",
|
||||
"ShortName": "DefaultUsecUpperSuite",
|
||||
"Side": side ?? ["Usec", "Bear", "Savage"],
|
||||
"AvailableAsDefault": false,
|
||||
"Game": [
|
||||
"eft",
|
||||
"arena"
|
||||
],
|
||||
"Body": topId,
|
||||
"Hands": handsId
|
||||
},
|
||||
"_proto": "5cde9ec17d6c8b04723cf479"
|
||||
};
|
||||
this.instanceManager.database.templates.customization[suiteId] = newSuite;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added suite for ${suiteId}`, newSuite);
|
||||
}
|
||||
this.handleLocale(clothingConfig, suiteId);
|
||||
this.addSuiteToTrader(traderId, outfitId, suiteId, loyaltyLevel, profileLevel, standing, currencyId, price);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error adding top for outfitId: ${outfitId}:`, error);
|
||||
}
|
||||
}
|
||||
addBottom(clothingConfig) {
|
||||
const { side, bottomId, suiteId, outfitId, bottomBundlePath, traderId, loyaltyLevel, profileLevel, standing, currencyId, price } = clothingConfig;
|
||||
// add Bottom
|
||||
const newBottom = {
|
||||
"_id": bottomId,
|
||||
"_name": `${bottomId}_name`,
|
||||
"_parent": "5cc0869814c02e000a4cad94",
|
||||
"_type": "Item",
|
||||
"_props": {
|
||||
"Description": `${bottomId}_desc`,
|
||||
"Name": `${bottomId}_name`,
|
||||
"ShortName": `${bottomId}_shortName`,
|
||||
"Side": side ?? ["Usec", "Bear", "Savage"],
|
||||
"BodyPart": "Feet",
|
||||
"IntegratedArmorVest": false,
|
||||
"Prefab": {
|
||||
"path": bottomBundlePath,
|
||||
"rcid": ""
|
||||
},
|
||||
"WatchPosition": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"WatchPrefab": {
|
||||
"path": "",
|
||||
"rcid": ""
|
||||
},
|
||||
"WatchRotation": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
}
|
||||
},
|
||||
"_proto": "5cdea3c47d6c8b0475341734"
|
||||
};
|
||||
this.instanceManager.database.templates.customization[bottomId] = newBottom;
|
||||
const newSuite = {
|
||||
"_id": suiteId,
|
||||
"_name": `${suiteId}_name`,
|
||||
"_parent": "5cd944d01388ce000a659df9",
|
||||
"_type": "Item",
|
||||
"_props": {
|
||||
"Description": `${suiteId}_desc`,
|
||||
"Name": `${suiteId}_name`,
|
||||
"ShortName": `${suiteId}_shortName`,
|
||||
"Side": side ?? ["Usec", "Bear", "Savage"],
|
||||
"AvailableAsDefault": false,
|
||||
"Game": [
|
||||
"eft",
|
||||
"arena"
|
||||
],
|
||||
"Feet": bottomId
|
||||
},
|
||||
"_proto": "5cd946231388ce000d572fe3"
|
||||
};
|
||||
// add suite
|
||||
this.instanceManager.database.templates.customization[suiteId] = newSuite;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added suite for ${suiteId}`, newSuite);
|
||||
}
|
||||
this.handleLocale(clothingConfig, suiteId);
|
||||
this.addSuiteToTrader(traderId, outfitId, suiteId, loyaltyLevel, profileLevel, standing, currencyId, price);
|
||||
}
|
||||
handleLocale(clothingConfig, clothingId) {
|
||||
for (const localeID in this.instanceManager.database.locales.global) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing localeID:", localeID);
|
||||
}
|
||||
try {
|
||||
const itemName = `${clothingId} Name`;
|
||||
// Check if the locale exists, else fallback to 'en'
|
||||
const localeValue = clothingConfig.locales[localeID] || clothingConfig.locales["en"];
|
||||
if (localeValue && this.instanceManager.database.locales.global[localeID]) {
|
||||
this.instanceManager.database.locales.global[localeID][itemName] = localeValue;
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error handling locale for ${localeID}: ${error}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
readJsonFile(filePath) {
|
||||
const content = node_fs_1.default.readFileSync(filePath, "utf-8");
|
||||
try {
|
||||
const parsedContent = JSON.parse(content);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Custom Clothing Service: Parsed JSON Content:", parsedContent); // Logging the parsed JSON content
|
||||
}
|
||||
return parsedContent;
|
||||
}
|
||||
catch (error) {
|
||||
console.error("Error parsing JSON content:", error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.CustomClothingService = CustomClothingService;
|
||||
//# sourceMappingURL=CustomClothingService.js.map
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,706 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CustomItemService = void 0;
|
||||
const configConsts_1 = require("./references/configConsts");
|
||||
const configConsts_2 = require("./references/configConsts");
|
||||
const configConsts_3 = require("./references/configConsts");
|
||||
const items_1 = require("./references/items");
|
||||
const itemBaseClasses_1 = require("./references/itemBaseClasses");
|
||||
const itemHandbookCategories_1 = require("./references/itemHandbookCategories");
|
||||
const LogTextColor_1 = require("C:/snapshot/project/obj/models/spt/logging/LogTextColor");
|
||||
const fs = __importStar(require("node:fs"));
|
||||
const path = __importStar(require("node:path"));
|
||||
class CustomItemService {
|
||||
instanceManager;
|
||||
preSptLoad(instanceManager) {
|
||||
this.instanceManager = instanceManager;
|
||||
}
|
||||
postDBLoad() {
|
||||
const configPath = path.join(__dirname, "../db/items");
|
||||
const configFiles = fs
|
||||
.readdirSync(configPath)
|
||||
.filter((file) => !file.includes("BaseItemReplacement"));
|
||||
let numItemsAdded = 0;
|
||||
for (const file of configFiles) {
|
||||
const filePath = path.join(configPath, file);
|
||||
try {
|
||||
const fileContents = fs.readFileSync(filePath, "utf-8");
|
||||
const config = JSON.parse(fileContents);
|
||||
for (const itemId in config) {
|
||||
const itemConfig = config[itemId];
|
||||
try {
|
||||
const { exampleCloneItem, finalItemTplToClone } = this.createExampleCloneItem(itemConfig, itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Processing file: ${file}, Item ID: ${itemId}`);
|
||||
console.log(`Prefab Path: ${exampleCloneItem.overrideProperties?.Prefab.path}`);
|
||||
}
|
||||
this.instanceManager.customItem.createItemFromClone(exampleCloneItem);
|
||||
this.processStaticLootContainers(itemConfig, itemId);
|
||||
this.processModSlots(itemConfig, [finalItemTplToClone], itemId);
|
||||
this.processInventorySlots(itemConfig, itemId);
|
||||
this.processMasterySections(itemConfig, itemId);
|
||||
this.processWeaponPresets(itemConfig, itemId);
|
||||
this.processTraders(itemConfig, itemId);
|
||||
this.addtoHallofFame(itemConfig, itemId);
|
||||
this.addtoSpecialSlots(itemConfig, itemId);
|
||||
numItemsAdded++;
|
||||
}
|
||||
catch (itemError) {
|
||||
console.error(`Error processing item ID: ${itemId} in file: ${file}`);
|
||||
console.error(itemError);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (fileError) {
|
||||
console.error(`Error processing config file: ${file}`);
|
||||
console.error(fileError);
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
if (numItemsAdded > 0) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] Database: Loaded ${numItemsAdded} custom items.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
else {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] Database: No custom items loaded.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
// Post-item processing (e.g., bot inventories, quest modifications)
|
||||
for (const file of configFiles) {
|
||||
const filePath = path.join(configPath, file);
|
||||
try {
|
||||
const fileContents = fs.readFileSync(filePath, "utf-8");
|
||||
const config = JSON.parse(fileContents);
|
||||
for (const itemId in config) {
|
||||
const itemConfig = config[itemId];
|
||||
this.processBotInventories(itemConfig, itemConfig.itemTplToClone, itemId);
|
||||
}
|
||||
}
|
||||
catch (fileError) {
|
||||
console.error(`Error processing bot inventories for file: ${file}`);
|
||||
console.error(fileError);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Creates an example clone item with the provided item configuration and item ID.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration of the item to clone.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @return {{ exampleCloneItem: NewItemFromCloneDetails, finalItemTplToClone: string }} The created example clone item and the final item template to clone.
|
||||
*/
|
||||
createExampleCloneItem(itemConfig, itemId) {
|
||||
const itemTplToCloneFromMap = items_1.ItemMap[itemConfig.itemTplToClone] || itemConfig.itemTplToClone;
|
||||
const finalItemTplToClone = itemTplToCloneFromMap;
|
||||
const parentIdFromMap = itemBaseClasses_1.ItemBaseClassMap[itemConfig.parentId] || itemConfig.parentId;
|
||||
const finalParentId = parentIdFromMap;
|
||||
const handbookParentIdFromMap = itemHandbookCategories_1.ItemHandbookCategoryMap[itemConfig.handbookParentId] ||
|
||||
itemConfig.handbookParentId;
|
||||
const finalHandbookParentId = handbookParentIdFromMap;
|
||||
const itemPrefabPath = `customItems/${itemId}.bundle`;
|
||||
const exampleCloneItem = {
|
||||
itemTplToClone: finalItemTplToClone,
|
||||
overrideProperties: itemConfig.overrideProperties
|
||||
? {
|
||||
...itemConfig.overrideProperties,
|
||||
Prefab: {
|
||||
path: itemConfig.overrideProperties.Prefab?.path || itemPrefabPath,
|
||||
rcid: ""
|
||||
}
|
||||
}
|
||||
: undefined,
|
||||
parentId: finalParentId,
|
||||
newId: itemId,
|
||||
fleaPriceRoubles: itemConfig.fleaPriceRoubles,
|
||||
handbookPriceRoubles: itemConfig.handbookPriceRoubles,
|
||||
handbookParentId: finalHandbookParentId,
|
||||
locales: itemConfig.locales
|
||||
};
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Cloning item ${finalItemTplToClone} for itemID: ${itemId}`);
|
||||
}
|
||||
return { exampleCloneItem, finalItemTplToClone };
|
||||
}
|
||||
/**
|
||||
* Adds an item to a static loot container with a given probability.
|
||||
*
|
||||
* @param {string} containerID - The ID of the loot container.
|
||||
* @param {string} itemToAdd - The item to add to the loot container.
|
||||
* @param {number} probability - The probability of the item being added.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
addToStaticLoot(containerID, itemToAdd, probability) {
|
||||
const locations = this.instanceManager.database.locations;
|
||||
for (const locationID in locations) {
|
||||
if (!Object.prototype.hasOwnProperty.call(locations, locationID)) {
|
||||
continue; // Skip invalid locations
|
||||
}
|
||||
const location = locations[locationID];
|
||||
if (!location.staticLoot) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.warn(`Warning: No static loot found in location: ${locationID}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const staticLoot = location.staticLoot;
|
||||
if (!Object.prototype.hasOwnProperty.call(staticLoot, containerID)) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Error: Loot container ID ${containerID} not found in location: ${locationID}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const lootContainer = staticLoot[containerID];
|
||||
if (!lootContainer) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Error: Loot container ID ${containerID} is null in location: ${locationID}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const templateFromMap = items_1.ItemMap[itemToAdd];
|
||||
const finalTemplate = templateFromMap || itemToAdd;
|
||||
const newLoot = [
|
||||
{
|
||||
tpl: finalTemplate,
|
||||
relativeProbability: probability,
|
||||
},
|
||||
];
|
||||
lootContainer.itemDistribution.push(...newLoot);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added ${itemToAdd} to loot container: ${containerID} in location: ${locationID}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the static loot containers for a given item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration object for the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processStaticLootContainers(itemConfig, itemId) {
|
||||
if (itemConfig.addtoStaticLootContainers) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing static loot containers for item:", itemId);
|
||||
}
|
||||
if (Array.isArray(itemConfig.StaticLootContainers)) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Adding item to multiple static loot containers:");
|
||||
}
|
||||
for (const container of itemConfig.StaticLootContainers) {
|
||||
const staticLootContainer = items_1.ItemMap[container.ContainerName] || container.ContainerName;
|
||||
this.addToStaticLoot(staticLootContainer, itemId, container.Probability);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added to container '${staticLootContainer}' with probability ${container.Probability}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
const staticLootContainer = items_1.ItemMap[itemConfig.StaticLootContainers] ||
|
||||
itemConfig.StaticLootContainers;
|
||||
this.addToStaticLoot(staticLootContainer, itemId, itemConfig.Probability);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added to container '${staticLootContainer}' with probability ${itemConfig.Probability}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the mod slots of an item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration of the item.
|
||||
* @param {string[]} finalItemTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @returns {void}
|
||||
*/
|
||||
processModSlots(itemConfig, finalItemTplToClone, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
const moddableItemWhitelistIds = Array.isArray(itemConfig.ModdableItemWhitelist)
|
||||
? itemConfig.ModdableItemWhitelist.map((shortname) => items_1.ItemMap[shortname])
|
||||
: itemConfig.ModdableItemWhitelist
|
||||
? [items_1.ItemMap[itemConfig.ModdableItemWhitelist]]
|
||||
: [];
|
||||
const moddableItemBlacklistIds = Array.isArray(itemConfig.ModdableItemBlacklist)
|
||||
? itemConfig.ModdableItemBlacklist.map((shortname) => items_1.ItemMap[shortname])
|
||||
: itemConfig.ModdableItemBlacklist
|
||||
? [items_1.ItemMap[itemConfig.ModdableItemBlacklist]]
|
||||
: [];
|
||||
const modSlots = Array.isArray(itemConfig.modSlot)
|
||||
? itemConfig.modSlot
|
||||
: itemConfig.modSlot
|
||||
? [itemConfig.modSlot]
|
||||
: [];
|
||||
const lowercaseModSlots = modSlots.map((modSlotName) => modSlotName.toLowerCase());
|
||||
if (itemConfig.addtoModSlots) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing mod slots for item:", itemId);
|
||||
}
|
||||
for (const parentItemId in tables.templates.items) {
|
||||
const parentItem = tables.templates.items[parentItemId];
|
||||
if (!parentItem._props.Slots) {
|
||||
continue;
|
||||
}
|
||||
const isBlacklisted = moddableItemBlacklistIds.includes(parentItemId);
|
||||
const isWhitelisted = moddableItemWhitelistIds.includes(parentItemId);
|
||||
if (isBlacklisted) {
|
||||
continue;
|
||||
}
|
||||
let addToModSlots = false;
|
||||
if (isWhitelisted && itemConfig.modSlot) {
|
||||
addToModSlots = true;
|
||||
}
|
||||
else if (!isBlacklisted && itemConfig.modSlot) {
|
||||
for (const modSlot of parentItem._props.Slots) {
|
||||
if (modSlot._props.filters?.[0].Filter.some((filterItem) => finalItemTplToClone.includes(filterItem))) {
|
||||
if (lowercaseModSlots.includes(modSlot._name.toLowerCase())) {
|
||||
addToModSlots = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addToModSlots) {
|
||||
for (const modSlot of parentItem._props.Slots) {
|
||||
if (lowercaseModSlots.includes(modSlot._name.toLowerCase())) {
|
||||
if (!modSlot._props.filters) {
|
||||
modSlot._props.filters = [
|
||||
{
|
||||
AnimationIndex: 0,
|
||||
Filter: []
|
||||
}
|
||||
];
|
||||
}
|
||||
if (!modSlot._props.filters[0].Filter.includes(itemId)) {
|
||||
modSlot._props.filters[0].Filter.push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the filter of mod slot ${modSlot._name} for parent item ${parentItemId}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the inventory slots for a given item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration object for the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @param {any} defaultInventorySlots - The default inventory slots.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processInventorySlots(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (itemConfig.addtoInventorySlots) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing inventory slots for item:", itemId);
|
||||
}
|
||||
const defaultInventorySlots = tables.templates.items["55d7217a4bdc2d86028b456d"]._props.Slots;
|
||||
const allowedSlots = Array.isArray(itemConfig.addtoInventorySlots)
|
||||
? itemConfig.addtoInventorySlots
|
||||
: [itemConfig.addtoInventorySlots];
|
||||
// Iterate over the slots and push the item into the filters per the config
|
||||
for (const slot of defaultInventorySlots) {
|
||||
const slotName = configConsts_3.inventorySlots[slot._name];
|
||||
const slotId = Object.keys(configConsts_3.inventorySlots).find((key) => configConsts_3.inventorySlots[key] === slot._name);
|
||||
if (allowedSlots.includes(slot._name) ||
|
||||
allowedSlots.includes(slotName) ||
|
||||
allowedSlots.includes(slotId)) {
|
||||
if (!slot._props.filters[0].Filter.includes(itemId)) {
|
||||
slot._props.filters[0].Filter.push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the filter of slot ${slot._name}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the mastery sections for an item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration object for the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @param {any} tables - The tables object containing global configuration.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processMasterySections(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (itemConfig.masteries) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing mastery sections for item:", itemId);
|
||||
}
|
||||
const masterySections = Array.isArray(itemConfig.masterySections)
|
||||
? itemConfig.masterySections
|
||||
: [itemConfig.masterySections];
|
||||
for (const mastery of masterySections) {
|
||||
const existingMastery = tables.globals.config.Mastering.find((existing) => existing.Name === mastery.Name);
|
||||
if (existingMastery) {
|
||||
existingMastery.Templates.push(...mastery.Templates);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Adding to existing mastery section for item: ${itemId}`);
|
||||
}
|
||||
}
|
||||
else {
|
||||
tables.globals.config.Mastering.push(mastery);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Adding new mastery section for item: ${itemId}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes weapon presets based on the provided item configuration and tables.
|
||||
*
|
||||
* @param {any} itemConfig - The item configuration.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processWeaponPresets(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
const { addweaponpreset, weaponpresets } = itemConfig;
|
||||
const itemPresets = tables.globals.ItemPresets;
|
||||
if (addweaponpreset) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing weapon presets for item:", itemId);
|
||||
}
|
||||
for (const presetData of weaponpresets) {
|
||||
const preset = {
|
||||
_changeWeaponName: presetData._changeWeaponName,
|
||||
_encyclopedia: presetData._encyclopedia || undefined,
|
||||
_id: presetData._id,
|
||||
_items: presetData._items.map((itemData) => {
|
||||
const item = {
|
||||
_id: itemData._id,
|
||||
_tpl: itemData._tpl
|
||||
};
|
||||
// Add parentId and slotId only if they are present in itemData
|
||||
if (itemData.parentId) {
|
||||
item.parentId = itemData.parentId;
|
||||
}
|
||||
if (itemData.slotId) {
|
||||
item.slotId = itemData.slotId;
|
||||
}
|
||||
return item;
|
||||
}),
|
||||
_name: presetData._name,
|
||||
_parent: presetData._parent,
|
||||
_type: "Preset"
|
||||
};
|
||||
itemPresets[preset._id] = preset;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added weapon preset: ${preset._name}`);
|
||||
console.log(` - Preset: ${JSON.stringify(preset)}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes traders based on the item configuration.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration of the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processTraders(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (!itemConfig.addtoTraders) {
|
||||
return;
|
||||
}
|
||||
const { traderId, traderItems, barterScheme } = itemConfig;
|
||||
const traderIdFromMap = configConsts_1.traderIDs[traderId];
|
||||
const finalTraderId = traderIdFromMap || traderId;
|
||||
const trader = tables.traders[finalTraderId];
|
||||
if (!trader) {
|
||||
return;
|
||||
}
|
||||
for (const item of traderItems) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing traders for item:", itemId);
|
||||
}
|
||||
const newItem = {
|
||||
_id: itemId,
|
||||
_tpl: itemId,
|
||||
parentId: "hideout",
|
||||
slotId: "hideout",
|
||||
upd: {
|
||||
UnlimitedCount: item.unlimitedCount,
|
||||
StackObjectsCount: item.stackObjectsCount
|
||||
}
|
||||
};
|
||||
trader.assort.items.push(newItem);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the trader ${traderId}`);
|
||||
}
|
||||
}
|
||||
trader.assort.barter_scheme[itemId] = [];
|
||||
for (const scheme of barterScheme) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing trader barter scheme for item:", itemId);
|
||||
}
|
||||
const count = scheme.count;
|
||||
const tpl = configConsts_2.currencyIDs[scheme._tpl] || items_1.ItemMap[scheme._tpl];
|
||||
if (!tpl) {
|
||||
throw new Error(`Invalid _tpl value in barterScheme for item: ${itemId}`);
|
||||
}
|
||||
trader.assort.barter_scheme[itemId].push([
|
||||
{
|
||||
count: count,
|
||||
_tpl: tpl
|
||||
}
|
||||
]);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the barter scheme of trader ${traderId}`);
|
||||
}
|
||||
}
|
||||
trader.assort.loyal_level_items[itemId] = itemConfig.loyallevelitems;
|
||||
}
|
||||
addtoHallofFame(itemConfig, itemId) {
|
||||
const hallofFame1 = this.instanceManager.database.templates.items["63dbd45917fff4dee40fe16e"];
|
||||
const hallofFame2 = this.instanceManager.database.templates.items["65424185a57eea37ed6562e9"];
|
||||
const hallofFame3 = this.instanceManager.database.templates.items["6542435ea57eea37ed6562f0"];
|
||||
// Add to Hall of Fame filters
|
||||
if (itemConfig.addtoHallOfFame) {
|
||||
const hallOfFames = [hallofFame1, hallofFame2, hallofFame3];
|
||||
for (const hall of hallOfFames) {
|
||||
for (const slot of hall._props.Slots) {
|
||||
for (const filter of slot._props.filters) {
|
||||
if (!filter.Filter.includes(itemId)) {
|
||||
filter.Filter.push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added item ${itemId} to filter Hall of Fame ${hall._name}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
addtoSpecialSlots(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (itemConfig.addtoSpecialSlots) {
|
||||
const pockets = tables.templates.items["627a4e6b255f7527fb05a0f6"];
|
||||
for (const slot of pockets._props.Slots) {
|
||||
if (!slot._props.filters[0].Filter.includes(itemId)) {
|
||||
slot._props.filters[0].Filter.push(itemId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the bot inventories based on the given item configuration.
|
||||
*
|
||||
* @param {ConfigItem[string]} itemConfig - The item configuration.
|
||||
* @param {string} finalItemTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processBotInventories(itemConfig, finalItemTplToClone, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (!itemConfig.addtoBots)
|
||||
return;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing bot inventories for item:", itemId);
|
||||
}
|
||||
// Iterate through bot types
|
||||
for (const botId in tables.bots.types) {
|
||||
const botType = botId;
|
||||
const botInventory = tables.bots.types[botId].inventory;
|
||||
botInventory.Ammo = botInventory.Ammo || {};
|
||||
// Process items and equipment
|
||||
this.processInventoryType(botInventory.items, finalItemTplToClone, itemId, botType, "items");
|
||||
this.processInventoryType(botInventory.equipment, finalItemTplToClone, itemId, botType, "equipment");
|
||||
// Process mods if applicable
|
||||
if (itemConfig.addtoModSlots && itemConfig.modSlot) {
|
||||
this.processBotModSlots(finalItemTplToClone, itemId, botType, itemConfig.modSlot);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes inventory type (items or equipment) and gathers mods based on Slots.
|
||||
*
|
||||
* @param {any} inventoryType - The inventory type to process.
|
||||
* @param {string} finalTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @param {string} typeLabel - Label indicating items or equipment.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processInventoryType(
|
||||
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
||||
inventoryType, finalTplToClone, itemId, botType, typeLabel) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (typeLabel === "equipment" && ((inventoryType.FirstPrimaryWeapon?.[finalTplToClone]) ||
|
||||
(inventoryType.SecondPrimaryWeapon?.[finalTplToClone]) ||
|
||||
(inventoryType.Holster?.[finalTplToClone]))) {
|
||||
if (!this.ensureValidWeaponPreset(itemId)) {
|
||||
return;
|
||||
}
|
||||
this.processAmmoAndChambers(tables.bots.types[botType].inventory, tables.templates.items[itemId]._props, itemId, botType);
|
||||
}
|
||||
for (const lootSlot in inventoryType) {
|
||||
const items = inventoryType[lootSlot];
|
||||
if (items && items[finalTplToClone] !== undefined) {
|
||||
const weight = items[finalTplToClone];
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Adding item to bot ${typeLabel} for bot type: ${botType} in loot slot: ${lootSlot} with weight: ${weight}`);
|
||||
}
|
||||
items[itemId] = weight;
|
||||
this.addModsToItem(tables, itemId, botType);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Adds mods to an item based on its Slots configuration.
|
||||
*
|
||||
* @param {any} tables - The database tables.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
addModsToItem(tables, itemId, botType) {
|
||||
const itemProps = tables.templates.items[itemId]._props;
|
||||
if (itemProps?.Slots) {
|
||||
for (const slot of itemProps.Slots) {
|
||||
const slotName = slot._name;
|
||||
const filters = slot._props.filters;
|
||||
if (filters && filters.length > 0) {
|
||||
for (const filter of filters) {
|
||||
for (const modId of filter.Filter) {
|
||||
if (modId && tables.templates.items[modId]) {
|
||||
tables.bots.types[botType].inventory.mods[itemId] = tables.bots.types[botType].inventory.mods[itemId] || {};
|
||||
tables.bots.types[botType].inventory.mods[itemId][slotName] = tables.bots.types[botType].inventory.mods[itemId][slotName] || [];
|
||||
if (!tables.bots.types[botType].inventory.mods[itemId][slotName].includes(modId)) {
|
||||
tables.bots.types[botType].inventory.mods[itemId][slotName].push(modId);
|
||||
if (tables.templates.items[modId]._props) {
|
||||
if (tables.templates.items[modId]._props.Slots.length > 0) {
|
||||
this.addModsToItem(tables, modId, botType);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added mod ${modId} to ${itemId}'s ${slotName} of bot type ${botType}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes mod slots and adds itemId to specified slots if finalItemTplToClone is present.
|
||||
*
|
||||
* @param {any} mods - The mods inventory.
|
||||
* @param {string} finalItemTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @param {string[]} modSlots - The list of mod slots to process.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processBotModSlots(finalItemTplToClone, itemId, botType, modSlots) {
|
||||
const mods = this.instanceManager.database.bots.types[botType].inventory.mods;
|
||||
for (const item in mods) {
|
||||
const itemMods = mods[item];
|
||||
for (const modSlot of modSlots) {
|
||||
if (itemMods[modSlot]?.includes(finalItemTplToClone)) {
|
||||
itemMods[modSlot].push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added item ${itemId} to mod slot ${modSlot} for bot type ${botType} in item ${item}`);
|
||||
}
|
||||
// Adding nested mods for the new item
|
||||
this.addModsToItem(this.instanceManager.database, itemId, botType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes ammo and chambers, adding calibers and chamber filters if needed.
|
||||
*
|
||||
* @param {any} botInventory - The bot's inventory.
|
||||
* @param {any} itemProps - The properties of the item.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processAmmoAndChambers(botInventory, itemProps, itemId, botType) {
|
||||
const ammoCaliber = itemProps.ammoCaliber;
|
||||
if (!ammoCaliber)
|
||||
return;
|
||||
botInventory.Ammo[ammoCaliber] = botInventory.Ammo[ammoCaliber] || {};
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added new caliber ${ammoCaliber} to bot inventory for bot type ${botType}`);
|
||||
}
|
||||
if (itemProps.Chambers) {
|
||||
for (const chamber of itemProps.Chambers) {
|
||||
const filters = chamber._props.filters;
|
||||
if (filters && filters.length > 0) {
|
||||
for (const filter of filters) {
|
||||
for (const filterItem of filter.Filter) {
|
||||
botInventory.Ammo[ammoCaliber][filterItem] = botInventory.Ammo[ammoCaliber][filterItem] || 0;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added filter item ${filterItem} to caliber ${ammoCaliber} in bot inventory for bot type ${botType}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Ensures the weapon has a valid preset in the global ItemPresets.
|
||||
*
|
||||
* @param {string} itemId - The item ID.
|
||||
* @return {boolean} True if the weapon has a valid preset, false otherwise.
|
||||
*/
|
||||
ensureValidWeaponPreset(itemId) {
|
||||
const db = this.instanceManager.database;
|
||||
const presets = db.globals.ItemPresets;
|
||||
for (const presetObj of Object.values(presets)) {
|
||||
if (presetObj._items[0]._tpl === itemId) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Valid preset found for item ${itemId}`);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.warn(`No valid preset found for item ${itemId} in globals.ItemPresets`);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
exports.CustomItemService = CustomItemService;
|
||||
//# sourceMappingURL=CustomItemService.js.map
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,107 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CustomWeaponPresets = void 0;
|
||||
const WeaponPresets_json_1 = __importDefault(require("../db/CustomWeaponPresets/WeaponPresets.json"));
|
||||
const path = __importStar(require("node:path"));
|
||||
const modPath = path.normalize(path.join(__dirname, ".."));
|
||||
const weaponPresets = WeaponPresets_json_1.default;
|
||||
class CustomWeaponPresets {
|
||||
Instance;
|
||||
preSptLoad(Instance) {
|
||||
this.Instance = Instance;
|
||||
}
|
||||
postDBLoad() {
|
||||
if (weaponPresets.ItemPresets) {
|
||||
this.addWeaponPresets();
|
||||
this.addWeaponPresetLocales();
|
||||
}
|
||||
else {
|
||||
if (this.Instance.debug) {
|
||||
console.log("CustomWeaponPresets: ItemPresets not found in weaponPresets.json");
|
||||
}
|
||||
}
|
||||
}
|
||||
addWeaponPresets() {
|
||||
for (const preset in weaponPresets.ItemPresets) {
|
||||
this.Instance.database.globals.ItemPresets[preset] = weaponPresets.ItemPresets[preset];
|
||||
}
|
||||
}
|
||||
addWeaponPresetLocales() {
|
||||
const serverLocales = ["ch", "cz", "en", "es", "es-mx", "fr", "ge", "hu", "it", "jp", "kr", "pl", "po", "ru", "sk", "tu"];
|
||||
const addedLocales = {};
|
||||
for (const locale of serverLocales) {
|
||||
let localeFile;
|
||||
try {
|
||||
// Attempt to require the locale file
|
||||
localeFile = require(`${modPath}/db/locales/${locale}.json`);
|
||||
}
|
||||
catch (error) {
|
||||
// Log an error if the file cannot be found, but continue to the next iteration
|
||||
if (this.Instance.debug) {
|
||||
console.error(`Error loading locale file for '${locale}':`, error);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// Proceed with adding locales if the file was successfully loaded
|
||||
if (Object.keys(localeFile).length < 1)
|
||||
continue;
|
||||
for (const currentItem in localeFile) {
|
||||
this.Instance.database.locales.global[locale][currentItem] = localeFile[currentItem];
|
||||
if (!addedLocales[locale])
|
||||
addedLocales[locale] = {};
|
||||
addedLocales[locale][currentItem] = localeFile[currentItem];
|
||||
}
|
||||
}
|
||||
// Placeholders
|
||||
for (const locale of serverLocales) {
|
||||
if (locale === "en")
|
||||
continue;
|
||||
const englishItems = addedLocales["en"];
|
||||
if (!(locale in addedLocales)) {
|
||||
for (const englishItem in englishItems) {
|
||||
if (this.Instance.database.locales.global[locale] && !(englishItem in this.Instance.database.locales.global[locale])) {
|
||||
this.Instance.database.locales.global[locale][englishItem] = englishItems[englishItem];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.CustomWeaponPresets = CustomWeaponPresets;
|
||||
//# sourceMappingURL=CustomWeaponPresets.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "CustomWeaponPresets.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"CustomWeaponPresets.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": "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"
|
||||
}
|
||||
187
user/mods/Echoes-of-Tarkov---Requisitions/src/EpicsEdits.js
Normal file
187
user/mods/Echoes-of-Tarkov---Requisitions/src/EpicsEdits.js
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.epicItemClass = void 0;
|
||||
const WTTInstanceManager_1 = require("./WTTInstanceManager");
|
||||
class epicItemClass {
|
||||
Instance = new WTTInstanceManager_1.WTTInstanceManager(); // Based upon EpicRangeTime's edits. Cheers, epic! --Maple
|
||||
preSptLoad(Instance) {
|
||||
this.Instance = Instance;
|
||||
}
|
||||
postDBLoad() {
|
||||
this.epicEdits();
|
||||
}
|
||||
epicEdits() {
|
||||
const db = this.Instance.database;
|
||||
const dbItems = db.templates.items;
|
||||
for (let file in dbItems) {
|
||||
let fileData = dbItems[file];
|
||||
if (fileData._id === "5d25a6538abbc306c62e630d") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25a4a98abbc30b917421a4") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25a7b88abbc3054f3e60bc") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5ce69cbad7f00c00b61c5098") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25a6a48abbc306c62e6310") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25af8f8abbc3055079fec5") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5cf12a15d7f00c05464b293f") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5bfeaa0f0db834001b734927") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5bfea7ad0db834001c38f1ee") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5df8f535bb49d91fb446d6b0") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "5df8f541c41b2312ea3335e3") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "5a3501acc4a282000d72293a") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "65293c38fc460e50a509cb25") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "65293c7a17e14363030ad308") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "6761770e48fa5c377e06fc3c") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "683997f125039545c12878e9") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "683998905b1e1abba12906fa") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "683998a2a3d4391d033bfd14") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "683998dc60787632112a564b") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683246a74073e586d112af9f", "68325a63730b17c69ee176eb", "6833baea86387d71b68abd6f", "6833bae4baa31474639bea7d", "6833ba38a1c9ff155c04e56f", "6833b8cb54aa764b2deefdfe", "6834e6f28f5570aec23ca0c2");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "5d25a6538abbc306c62e630d") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25a4a98abbc30b917421a4") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25a7b88abbc3054f3e60bc") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5ce69cbad7f00c00b61c5098") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25a6a48abbc306c62e6310") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5d25af8f8abbc3055079fec5") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5cf12a15d7f00c05464b293f") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5bfeaa0f0db834001b734927") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5bfea7ad0db834001c38f1ee") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to M700 Mags
|
||||
if (fileData._id === "5df8f535bb49d91fb446d6b0") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "5df8f541c41b2312ea3335e3") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "5a3501acc4a282000d72293a") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "65293c38fc460e50a509cb25") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "65293c7a17e14363030ad308") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "6761770e48fa5c377e06fc3c") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to SR-25 Mags
|
||||
if (fileData._id === "683997f125039545c12878e9") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "683998905b1e1abba12906fa") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "683998a2a3d4391d033bfd14") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "683998dc60787632112a564b") {
|
||||
fileData._props.Cartridges[0]._props.filters[0].Filter.push("683d1ec4f7164f4f77ea7a85", "683d1e142cee4317689e75e4", "683d1ba7b5a2063de35a8c39");
|
||||
} //Pushing 6.5x48mm to L7AWM Retextured Mags
|
||||
if (fileData._id === "5fbbfacda56d053a3543f799") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68343b29f48104d3a6265db3", "68343c10334d72dc0066a8f3");
|
||||
} //Pushing Smoke Stack Suppressor to .300BLK
|
||||
if (fileData._id === "5fbbfabed5cb881a7363194e") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68343b29f48104d3a6265db3", "68343c10334d72dc0066a8f3");
|
||||
} //Pushing Smoke Stack Suppressor to .300BLK
|
||||
if (fileData._id === "5fbbfacda56d053a3543f799") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to .300BLK (5/8"x24)
|
||||
if (fileData._id === "5fbbfabed5cb881a7363194e") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to .300BLK (5/8"x24)
|
||||
if (fileData._id === "652910565ae2ae97b80fdf35") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to 6.8 (5/8"x24)
|
||||
if (fileData._id === "5dcbe9431e1f4616d354987e") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to 308 MDR (5/8"x24)
|
||||
if (fileData._id === "6183b084a112697a4b3a6e6c") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to SCAR-H (5/8"x24)
|
||||
if (fileData._id === "618168b350224f204c1da4d8") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to SCAR-H (5/8"x24)
|
||||
if (fileData._id === "6183b0711cb55961fa0fdcad") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to SCAR-H (5/8"x24)
|
||||
if (fileData._id === "5bfebc320db8340019668d79") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to M700 (5/8"x24)
|
||||
if (fileData._id === "5d2703038abbc3105103d94c") {
|
||||
fileData._props.Slots[0]._props.filters[0].Filter.push("68395bb9f92a92ea0555e4a1", "68395c7abb2e79c208842d7e", "56ea6fafd2720b844b8b4593");
|
||||
} //Pushing Noveske KX3 to M700 (5/8"x24)
|
||||
if (fileData._id === "63dbd45917fff4dee40fe16e") {
|
||||
fileData._props.Slots[9]._props.filters[0].Filter.push("683b619a7d4aa2d4645e369e");
|
||||
} //Pushing large barters to large trophy case
|
||||
if (fileData._id === "63dbd45917fff4dee40fe16e") {
|
||||
fileData._props.Slots[10]._props.filters[0].Filter.push("683b619a7d4aa2d4645e369e");
|
||||
} //Pushing large barters to large trophy case
|
||||
if (fileData._id === "63dbd45917fff4dee40fe16e") {
|
||||
fileData._props.Slots[11]._props.filters[0].Filter.push("683b619a7d4aa2d4645e369e");
|
||||
} //Pushing large barters to large trophy case
|
||||
if (fileData._id === "63dbd45917fff4dee40fe16e") {
|
||||
fileData._props.Slots[12]._props.filters[0].Filter.push("683b619a7d4aa2d4645e369e");
|
||||
} //Pushing large barters to large trophy case
|
||||
if (fileData._id === "63dbd45917fff4dee40fe16e") {
|
||||
fileData._props.Slots[13]._props.filters[0].Filter.push("683b619a7d4aa2d4645e369e");
|
||||
} //Pushing large barters to large trophy case
|
||||
if (fileData._id === "63dbd45917fff4dee40fe16e") {
|
||||
fileData._props.Slots[14]._props.filters[0].Filter.push("683b619a7d4aa2d4645e369e");
|
||||
} //Pushing large barters to large trophy case
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.epicItemClass = epicItemClass;
|
||||
//# sourceMappingURL=EpicsEdits.js.map
|
||||
File diff suppressed because one or more lines are too long
208
user/mods/Echoes-of-Tarkov---Requisitions/src/QuestModifier.js
Normal file
208
user/mods/Echoes-of-Tarkov---Requisitions/src/QuestModifier.js
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.QuestModifier = void 0;
|
||||
class QuestModifier {
|
||||
instanceManager;
|
||||
preSptLoad(Instance) {
|
||||
this.instanceManager = Instance;
|
||||
}
|
||||
postDBLoad() {
|
||||
this.modifyQuests();
|
||||
}
|
||||
// Helper method to update items in all AvailableForFinish conditions
|
||||
updateItemsInAllAvailableForFinish(questID, items, type) {
|
||||
const quest = this.instanceManager.database.templates.quests[questID];
|
||||
if (quest) {
|
||||
try {
|
||||
const availableForFinish = quest.conditions.AvailableForFinish;
|
||||
let modified = false;
|
||||
for (const conditionGroup of availableForFinish) {
|
||||
const conditions = conditionGroup.counter.conditions[0];
|
||||
if (type === 'weapon') {
|
||||
const existingWeapons = this.instanceManager.jsonUtil.clone(conditions.weapon || []);
|
||||
const updatedWeapons = new Set(existingWeapons);
|
||||
for (const weapon of items) {
|
||||
if (!updatedWeapons.has(weapon)) {
|
||||
updatedWeapons.add(weapon);
|
||||
modified = true;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added new weapon ${weapon} to AvailableForFinish condition in quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (this.instanceManager.debug) {
|
||||
console.log(`AvailableForFinish condition in quest ${questID} already has the weapon ${weapon}`);
|
||||
}
|
||||
}
|
||||
if (modified) {
|
||||
conditions.weapon = Array.from(updatedWeapons);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Modified AvailableForFinish conditions in quest ${questID}:`, conditions.weapon);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type === 'weaponModsInclusive' || type === 'weaponModsExclusive') {
|
||||
const existingWeaponModsInclusive = this.instanceManager.jsonUtil.clone(conditions.weaponModsInclusive || []);
|
||||
const updatedWeaponModsInclusive = new Set(existingWeaponModsInclusive.flat());
|
||||
for (const weaponModArray of items) {
|
||||
for (const weaponMod of weaponModArray) {
|
||||
if (!updatedWeaponModsInclusive.has(weaponMod)) {
|
||||
updatedWeaponModsInclusive.add(weaponMod);
|
||||
modified = true;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added new weapon mod ${weaponMod} to AvailableForFinish condition in quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (this.instanceManager.debug) {
|
||||
console.log(`AvailableForFinish condition in quest ${questID} already has the weapon mod ${weaponMod}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modified) {
|
||||
conditions.weaponModsInclusive = Array.from(updatedWeaponModsInclusive).map(mod => [mod]);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Modified AvailableForFinish conditions in quest ${questID}:`, conditions.weaponModsInclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error modifying items in AvailableForFinish conditions for quest ${questID}:`, error);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
// Method to update quest data based on type, optionally push to all AvailableForFinish
|
||||
updateQuestData(questID, items, type, pushToAllAvailableForFinish, availableForFinishIndex = 0 // New parameter to specify the index
|
||||
) {
|
||||
if (pushToAllAvailableForFinish) {
|
||||
this.updateItemsInAllAvailableForFinish(questID, items, type);
|
||||
}
|
||||
else {
|
||||
const quest = this.instanceManager.database.templates.quests[questID];
|
||||
if (quest) {
|
||||
if (type === 'weapon') {
|
||||
this.updateQuestWeapons(questID, items, availableForFinishIndex // Pass the index to the helper method
|
||||
);
|
||||
}
|
||||
else if (type === 'weaponModsInclusive' || type === 'weaponModsExclusive') {
|
||||
this.updateQuestWeaponMods(questID, items, availableForFinishIndex // Pass the index to the helper method
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Method to update weapons in the quest
|
||||
updateQuestWeapons(questID, weapons, availableForFinishIndex = 0 // New parameter to specify the index
|
||||
) {
|
||||
const quest = this.instanceManager.database.templates.quests[questID];
|
||||
if (quest) {
|
||||
try {
|
||||
// Extract existing weapons based on the specified index
|
||||
const existingWeapons = quest.conditions.AvailableForFinish[availableForFinishIndex].counter.conditions[0].weapon;
|
||||
// Clone the existing weapons array
|
||||
const updatedWeapons = this.instanceManager.jsonUtil.clone(existingWeapons);
|
||||
let modified = false;
|
||||
// Add new weapons if they do not already exist
|
||||
for (const weapon of weapons) {
|
||||
if (!updatedWeapons.includes(weapon)) {
|
||||
updatedWeapons.push(weapon);
|
||||
modified = true;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added new weapon ${weapon} to quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (this.instanceManager.debug) {
|
||||
console.log(`Quest ${questID} already has the weapon ${weapon}`);
|
||||
}
|
||||
}
|
||||
// Only update the quest if modifications were made
|
||||
if (modified) {
|
||||
quest.conditions.AvailableForFinish[availableForFinishIndex].counter.conditions[0].weapon = updatedWeapons;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Modified quest ${questID}:`, updatedWeapons);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error modifying quest ${questID} weapons:`, error);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
// Method to update weapon mods inclusive in the quest
|
||||
updateQuestWeaponMods(questID, weaponModsInclusive, availableForFinishIndex = 0 // New parameter to specify the index
|
||||
) {
|
||||
const quest = this.instanceManager.database.templates.quests[questID];
|
||||
if (quest) {
|
||||
try {
|
||||
// Extract existing weapon mods inclusive based on the specified index
|
||||
const availableForFinish = quest.conditions.AvailableForFinish;
|
||||
if (availableForFinish.length <= availableForFinishIndex) {
|
||||
console.warn(`Index ${availableForFinishIndex} is out of bounds for AvailableForFinish in quest ${questID}.`);
|
||||
return;
|
||||
}
|
||||
const existingWeaponModsInclusive = availableForFinish[availableForFinishIndex].counter.conditions[0].weaponModsInclusive;
|
||||
// Clone the existing weapon mods inclusive array
|
||||
const updatedWeaponModsInclusive = this.instanceManager.jsonUtil.clone(existingWeaponModsInclusive);
|
||||
let modified = false;
|
||||
// Add new weapon mods if they do not already exist
|
||||
for (const weaponModArray of weaponModsInclusive) {
|
||||
for (const weaponMod of weaponModArray) {
|
||||
if (!updatedWeaponModsInclusive.flat().includes(weaponMod)) {
|
||||
updatedWeaponModsInclusive.push(weaponModArray);
|
||||
modified = true;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added new weapon mod ${weaponMod} to quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (this.instanceManager.debug) {
|
||||
console.log(`Quest ${questID} already has the weapon mod ${weaponMod}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Only update the quest if modifications were made
|
||||
if (modified) {
|
||||
availableForFinish[availableForFinishIndex].counter.conditions[0].weaponModsInclusive = updatedWeaponModsInclusive;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Modified quest ${questID}:`, updatedWeaponModsInclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error modifying quest ${questID} weapon mods inclusive:`, error);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
// Method to modify quests with specific items and updates
|
||||
modifyQuests() {
|
||||
// Define new items
|
||||
const newAKs = [
|
||||
"0cb4a36dd2e587b46e813dbe"
|
||||
];
|
||||
const newCarbinesandAssaultRifles = [
|
||||
"0cb4a36dd2e587b46e813dbe"
|
||||
];
|
||||
// Update each quest individually with specific items
|
||||
this.updateQuestData("61e6e60223374d168a4576a6", // Compensation for damage - wager
|
||||
newAKs, 'weapon', false, 0);
|
||||
this.updateQuestData("64e7b9bffd30422ed03dad38", // Gendarmerie district patrol
|
||||
newCarbinesandAssaultRifles, 'weapon', false, 0);
|
||||
// Debug output
|
||||
if (this.instanceManager.debug) {
|
||||
console.log('Updated quests with new items.');
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.QuestModifier = QuestModifier;
|
||||
//# sourceMappingURL=QuestModifier.js.map
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,76 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.References = void 0;
|
||||
class References {
|
||||
modName;
|
||||
debug;
|
||||
container;
|
||||
preSptModLoader;
|
||||
configServer;
|
||||
saveServer;
|
||||
itemHelper;
|
||||
logger;
|
||||
staticRouter;
|
||||
onUpdateModService;
|
||||
database;
|
||||
customItem;
|
||||
imageRouter;
|
||||
jsonUtil;
|
||||
profileHelper;
|
||||
ragfairPriceService;
|
||||
importerUtil;
|
||||
tables;
|
||||
botHelper;
|
||||
randomUtil;
|
||||
hashUtil;
|
||||
probHelper;
|
||||
traderHelper;
|
||||
botController;
|
||||
httpResponse;
|
||||
preSptLoad(container) {
|
||||
this.container = container;
|
||||
this.preSptModLoader = container.resolve("PreSptModLoader");
|
||||
this.imageRouter = container.resolve("ImageRouter");
|
||||
this.configServer = container.resolve("ConfigServer");
|
||||
this.saveServer = container.resolve("SaveServer");
|
||||
this.itemHelper = container.resolve("ItemHelper");
|
||||
this.logger = container.resolve("WinstonLogger");
|
||||
this.staticRouter = container.resolve("StaticRouterModService");
|
||||
this.onUpdateModService = container.resolve("OnUpdateModService");
|
||||
this.randomUtil = container.resolve("RandomUtil");
|
||||
this.database = container.resolve("DatabaseServer");
|
||||
this.tables = container.resolve("DatabaseServer").getTables();
|
||||
this.customItem = container.resolve("CustomItemService");
|
||||
this.jsonUtil = container.resolve("JsonUtil");
|
||||
this.profileHelper = container.resolve("ProfileHelper");
|
||||
this.ragfairPriceService = container.resolve("RagfairPriceService");
|
||||
this.importerUtil = container.resolve("ImporterUtil");
|
||||
this.botHelper = container.resolve("BotHelper");
|
||||
this.hashUtil = container.resolve("HashUtil");
|
||||
this.probHelper = container.resolve("ProbabilityHelper");
|
||||
this.traderHelper = container.resolve("TraderHelper");
|
||||
this.botController = container.resolve("BotController");
|
||||
this.httpResponse = container.resolve("HttpResponseUtil");
|
||||
}
|
||||
postDBLoad(container) {
|
||||
this.container = container;
|
||||
this.database = container.resolve("DatabaseServer");
|
||||
this.imageRouter = container.resolve("ImageRouter");
|
||||
this.logger = container.resolve("WinstonLogger");
|
||||
this.tables = container.resolve("DatabaseServer").getTables();
|
||||
this.customItem = container.resolve("CustomItemService");
|
||||
this.jsonUtil = container.resolve("JsonUtil");
|
||||
this.profileHelper = container.resolve("ProfileHelper");
|
||||
this.ragfairPriceService = container.resolve("RagfairPriceService");
|
||||
this.importerUtil = container.resolve("ImporterUtil");
|
||||
this.botHelper = container.resolve("BotHelper");
|
||||
this.randomUtil = container.resolve("RandomUtil");
|
||||
this.itemHelper = container.resolve("ItemHelper");
|
||||
this.hashUtil = container.resolve("HashUtil");
|
||||
this.probHelper = container.resolve("ProbabilityHelper");
|
||||
this.botController = container.resolve("BotController");
|
||||
this.httpResponse = container.resolve("HttpResponseUtil");
|
||||
}
|
||||
}
|
||||
exports.References = References;
|
||||
//# sourceMappingURL=References.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "References.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"References.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": "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"
|
||||
}
|
||||
75
user/mods/Echoes-of-Tarkov---Requisitions/src/Refs/Utils.js
Normal file
75
user/mods/Echoes-of-Tarkov---Requisitions/src/Refs/Utils.js
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.TraderUtils = void 0;
|
||||
class TraderUtils {
|
||||
/**
|
||||
* Add profile picture to our trader
|
||||
* @param baseJson json file for trader (db/base.json)
|
||||
* @param preAkiModLoader mod loader class - used to get the mods file path
|
||||
* @param imageRouter image router class - used to register the trader image path so we see their image on trader page
|
||||
* @param traderImageName Filename of the trader icon to use
|
||||
*/
|
||||
registerProfileImage(baseJson, modName, preSptModLoader, imageRouter, traderImageName) {
|
||||
// Reference the mod "res" folder
|
||||
const imageFilepath = `./${preSptModLoader.getModPath(modName)}res`;
|
||||
// Register a route to point to the profile picture - remember to remove the .jpg from it
|
||||
imageRouter.addRoute(baseJson.avatar.replace(".jpg", ".png"), `${imageFilepath}/${traderImageName}`);
|
||||
}
|
||||
/**
|
||||
* Add record to trader config to set the refresh time of trader in seconds (default is 60 minutes)
|
||||
* @param traderConfig trader config to add our trader to
|
||||
* @param baseJson json file for trader (db/base.json)
|
||||
* @param refreshTimeSeconds How many sections between trader stock refresh
|
||||
*/
|
||||
setTraderUpdateTime(traderConfig, baseJson, minSeconds, maxSeconds) {
|
||||
const traderRefreshRecord = {
|
||||
traderId: baseJson._id,
|
||||
seconds: {
|
||||
min: minSeconds,
|
||||
max: maxSeconds,
|
||||
},
|
||||
};
|
||||
traderConfig.updateTime.push(traderRefreshRecord);
|
||||
}
|
||||
/**
|
||||
* Add our new trader to the database
|
||||
* @param traderDetailsToAdd trader details
|
||||
* @param tables database
|
||||
* @param jsonUtil json utility class
|
||||
*/
|
||||
// rome-ignore lint/suspicious/noExplicitAny: traderDetailsToAdd comes from base.json, so no type
|
||||
addTraderToDb(traderDetailsToAdd, assort, tables, jsonUtil) {
|
||||
tables.traders[traderDetailsToAdd._id] = {
|
||||
assort: jsonUtil.deserialize(jsonUtil.serialize(assort)),
|
||||
base: jsonUtil.deserialize(jsonUtil.serialize(traderDetailsToAdd)),
|
||||
questassort: {
|
||||
started: {},
|
||||
success: {},
|
||||
fail: {},
|
||||
},
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Add traders name/location/description to the locale table
|
||||
* @param baseJson json file for trader (db/base.json)
|
||||
* @param tables database tables
|
||||
* @param fullName Complete name of trader
|
||||
* @param firstName First name of trader
|
||||
* @param nickName Nickname of trader
|
||||
* @param location Location of trader (e.g. "Here in the cat shop")
|
||||
* @param description Description of trader
|
||||
*/
|
||||
addTraderToLocales(baseJson, tables, fullName, firstName, nickName, location, description) {
|
||||
// For each language, add locale for the new trader
|
||||
const locales = Object.values(tables.locales.global);
|
||||
for (const locale of locales) {
|
||||
locale[`${baseJson._id} FullName`] = fullName;
|
||||
locale[`${baseJson._id} FirstName`] = firstName;
|
||||
locale[`${baseJson._id} Nickname`] = nickName;
|
||||
locale[`${baseJson._id} Location`] = location;
|
||||
locale[`${baseJson._id} Description`] = description;
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.TraderUtils = TraderUtils;
|
||||
//# sourceMappingURL=Utils.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "Utils.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"Utils.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AAOA,MAAa,WAAW;IACvB;;;;;;OAMG;IACI,oBAAoB,CAAC,QAAa,EAAE,OAAe,EAAE,eAAgC,EAAE,WAAwB,EAAE,eAAuB;QAC9I,iCAAiC;QACjC,MAAM,aAAa,GAAG,KAAK,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAA;QAEnE,yFAAyF;QACzF,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,aAAa,IAAI,eAAe,EAAE,CAAC,CAAA;IACrG,CAAC;IAED;;;;;OAKG;IACI,mBAAmB,CAAC,YAA2B,EAAE,QAAa,EAAE,UAAkB,EAAE,UAAkB;QAC5G,MAAM,mBAAmB,GAAe;YACvC,QAAQ,EAAE,QAAQ,CAAC,GAAG;YACtB,OAAO,EAAE;gBACR,GAAG,EAAE,UAAU;gBACf,GAAG,EAAE,UAAU;aACf;SACD,CAAA;QACD,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAClD,CAAC;IAED;;;;;OAKG;IACH,iGAAiG;IAC1F,aAAa,CAAC,kBAAuB,EAAE,MAAM,EAAE,MAAuB,EAAE,QAAkB;QAChG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG;YACxC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAkB;YACzE,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAgB;YACjF,WAAW,EAAE;gBACZ,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,EAAE;aACR;SACD,CAAA;IACF,CAAC;IAED;;;;;;;;;OASG;IACI,kBAAkB,CACxB,QAAa,EACb,MAAuB,EACvB,QAAgB,EAChB,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,WAAmB;QAEnB,mDAAmD;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAA6B,CAAA;QAChF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAA;YAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,CAAA;YAC/C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAA;YAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAA;YAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,cAAc,CAAC,GAAG,WAAW,CAAA;QACpD,CAAC;IACF,CAAC;CACD;AAjFD,kCAiFC"
|
||||
}
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.WTTInstanceManager = void 0;
|
||||
const path = __importStar(require("node:path"));
|
||||
class WTTInstanceManager {
|
||||
//#region Accessible in or after preSptLoad
|
||||
modName;
|
||||
debug;
|
||||
// Useful Paths
|
||||
profilePath = path.join(process.cwd(), "\\user\\profiles");
|
||||
dbPath = path.join(__dirname, "../db");
|
||||
// Instances
|
||||
container;
|
||||
PreSptModLoader;
|
||||
configServer;
|
||||
saveServer;
|
||||
itemHelper;
|
||||
logger;
|
||||
staticRouter;
|
||||
dynamicRouter;
|
||||
profileController;
|
||||
profileCallbacks;
|
||||
//#endregion
|
||||
//#region Acceessible in or after postDBLoad
|
||||
database;
|
||||
customItem;
|
||||
imageRouter;
|
||||
jsonUtil;
|
||||
profileHelper;
|
||||
eventOutputHolder;
|
||||
ragfairPriceService;
|
||||
importerUtil;
|
||||
traderAssortService;
|
||||
applicationContext;
|
||||
//#endregion
|
||||
// Call at the start of the mods postDBLoad method
|
||||
preSptLoad(container, mod) {
|
||||
this.modName = mod;
|
||||
this.container = container;
|
||||
this.PreSptModLoader = container.resolve("PreSptModLoader");
|
||||
this.imageRouter = container.resolve("ImageRouter");
|
||||
this.configServer = container.resolve("ConfigServer");
|
||||
this.saveServer = container.resolve("SaveServer");
|
||||
this.itemHelper = container.resolve("ItemHelper");
|
||||
this.eventOutputHolder = container.resolve("EventOutputHolder");
|
||||
this.profileController = container.resolve("ProfileController");
|
||||
this.profileCallbacks = container.resolve("ProfileCallbacks");
|
||||
this.logger = container.resolve("WinstonLogger");
|
||||
this.staticRouter = container.resolve("StaticRouterModService");
|
||||
this.dynamicRouter = container.resolve("DynamicRouterModService");
|
||||
this.traderAssortService = container.resolve("TraderAssortService");
|
||||
}
|
||||
postDBLoad(container) {
|
||||
this.database = container.resolve("DatabaseServer").getTables();
|
||||
this.customItem = container.resolve("CustomItemService");
|
||||
this.jsonUtil = container.resolve("JsonUtil");
|
||||
this.profileHelper = container.resolve("ProfileHelper");
|
||||
this.ragfairPriceService = container.resolve("RagfairPriceService");
|
||||
this.importerUtil = container.resolve("ImporterUtil");
|
||||
this.applicationContext = container.resolve("ApplicationContext");
|
||||
}
|
||||
colorLog(message, color) {
|
||||
const colorCodes = {
|
||||
red: "\x1b[31m",
|
||||
green: "\x1b[32m",
|
||||
yellow: "\x1b[33m",
|
||||
blue: "\x1b[34m",
|
||||
magenta: "\x1b[35m",
|
||||
cyan: "\x1b[36m",
|
||||
white: "\x1b[37m",
|
||||
gray: "\x1b[90m",
|
||||
brightRed: "\x1b[91m",
|
||||
brightGreen: "\x1b[92m",
|
||||
brightYellow: "\x1b[93m",
|
||||
brightBlue: "\x1b[94m",
|
||||
brightMagenta: "\x1b[95m",
|
||||
brightCyan: "\x1b[96m",
|
||||
brightWhite: "\x1b[97m"
|
||||
};
|
||||
const resetCode = "\x1b[0m";
|
||||
const colorCode = colorCodes[color] || "\x1b[37m"; // Default to white if color is invalid.
|
||||
//console.log(`${colorCode}${message}${resetCode}`); // Log the colored message here
|
||||
}
|
||||
}
|
||||
exports.WTTInstanceManager = WTTInstanceManager;
|
||||
//# sourceMappingURL=WTTInstanceManager.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "WTTInstanceManager.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"WTTInstanceManager.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": "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"
|
||||
}
|
||||
91
user/mods/Echoes-of-Tarkov---Requisitions/src/mod.js
Normal file
91
user/mods/Echoes-of-Tarkov---Requisitions/src/mod.js
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
"use strict";
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fs = __importStar(require("fs"));
|
||||
const path = __importStar(require("path"));
|
||||
// WTT / Viper Item Imports
|
||||
const WTTInstanceManager_1 = require("./WTTInstanceManager");
|
||||
const EpicsEdits_1 = require("./EpicsEdits");
|
||||
const CustomItemService_1 = require("./CustomItemService");
|
||||
const CustomAssortSchemeService_1 = require("./CustomAssortSchemeService");
|
||||
const CustomWeaponPresets_1 = require("./CustomWeaponPresets");
|
||||
// Trader Imports
|
||||
const References_1 = require("./Refs/References");
|
||||
class EchoesOfTarkovMod {
|
||||
modName = "Echoes of Tarkov - Requisitions & hoser";
|
||||
version;
|
||||
debug = false;
|
||||
// WTT-related Services
|
||||
Instance = new WTTInstanceManager_1.WTTInstanceManager();
|
||||
customItemService = new CustomItemService_1.CustomItemService();
|
||||
customAssortSchemeService = new CustomAssortSchemeService_1.CustomAssortSchemeService();
|
||||
customWeaponPresets = new CustomWeaponPresets_1.CustomWeaponPresets();
|
||||
epicItemClass = new EpicsEdits_1.epicItemClass();
|
||||
// Trader-related Services
|
||||
ref = new References_1.References();
|
||||
preSptLoad(container) {
|
||||
// WTT Initializations
|
||||
this.Instance.preSptLoad(container, this.modName);
|
||||
this.Instance.debug = this.debug;
|
||||
this.getVersionFromJson();
|
||||
this.customItemService.preSptLoad(this.Instance);
|
||||
this.customAssortSchemeService.preSptLoad(this.Instance);
|
||||
this.customWeaponPresets.preSptLoad(this.Instance);
|
||||
this.epicItemClass.preSptLoad(this.Instance);
|
||||
}
|
||||
postDBLoad(container) {
|
||||
// WTT Initializations
|
||||
this.Instance.postDBLoad(container);
|
||||
console.log(`\x1b[94m[Echoes of Tarkov] \x1b[93m Requisitions Loaded | Got something I'm supposed to deliver - your hands only.`);
|
||||
this.customItemService.postDBLoad();
|
||||
this.customAssortSchemeService.postDBLoad();
|
||||
this.customWeaponPresets.postDBLoad();
|
||||
this.epicItemClass.postDBLoad();
|
||||
}
|
||||
getVersionFromJson() {
|
||||
const packageJsonPath = path.join(__dirname, "../package.json");
|
||||
fs.readFile(packageJsonPath, "utf-8", (err, data) => {
|
||||
if (err) {
|
||||
console.error("Error reading file:", err);
|
||||
return;
|
||||
}
|
||||
const jsonData = JSON.parse(data);
|
||||
this.version = jsonData.version;
|
||||
});
|
||||
}
|
||||
}
|
||||
module.exports = { mod: new EchoesOfTarkovMod() };
|
||||
//# sourceMappingURL=mod.js.map
|
||||
10
user/mods/Echoes-of-Tarkov---Requisitions/src/mod.js.map
Normal file
10
user/mods/Echoes-of-Tarkov---Requisitions/src/mod.js.map
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "mod.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"mod.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";AAAA,yDAAyD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEzD,uCAAyB;AACzB,2CAA6B;AAS7B,2BAA2B;AAC3B,6DAA0D;AAC1D,6CAA6C;AAC7C,2DAAwD;AACxD,2EAAwE;AACxE,+DAA4D;AAE5D,iBAAiB;AACjB,kDAA+C;AAM/C,MAAM,iBAAiB;IACd,OAAO,GAAG,yCAAyC,CAAC;IACpD,OAAO,CAAS;IAChB,KAAK,GAAG,KAAK,CAAC;IAEtB,uBAAuB;IACf,QAAQ,GAAuB,IAAI,uCAAkB,EAAE,CAAC;IACxD,iBAAiB,GAAsB,IAAI,qCAAiB,EAAE,CAAC;IAC/D,yBAAyB,GAA8B,IAAI,qDAAyB,EAAE,CAAC;IACvF,mBAAmB,GAAwB,IAAI,yCAAmB,EAAE,CAAC;IACrE,aAAa,GAAkB,IAAI,0BAAa,EAAE,CAAC;IAE3D,0BAA0B;IAClB,GAAG,GAAe,IAAI,uBAAU,EAAE,CAAC;IAEpC,UAAU,CAAC,SAA8B;QAC/C,sBAAsB;QACtB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,UAAU,CAAC,SAA8B;QAC/C,sBAAsB;QACtB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,CAAC,oHAAoH,CAAC,CAAC;QAElI,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,CAAC;QAC5C,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;IAIjC,CAAC;IAEO,kBAAkB;QACzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAEhE,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACnD,IAAI,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;gBAC1C,OAAO;YACR,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,iBAAiB,EAAE,EAAE,CAAC"
|
||||
}
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Stashes = exports.inventorySlots = exports.allBotTypes = exports.currencyIDs = exports.traderIDs = void 0;
|
||||
;
|
||||
// Traders and Task related items
|
||||
//#region Enums
|
||||
var traderIDs;
|
||||
(function (traderIDs) {
|
||||
traderIDs["MECHANIC"] = "5a7c2eca46aef81a7ca2145d";
|
||||
traderIDs["SKIER"] = "58330581ace78e27b8b10cee";
|
||||
traderIDs["PEACEKEEPER"] = "5935c25fb3acc3127c3d8cd9";
|
||||
traderIDs["THERAPIST"] = "54cb57776803fa99248b456e";
|
||||
traderIDs["PRAPOR"] = "54cb50c76803fa8b248b4571";
|
||||
traderIDs["JAEGAR"] = "5c0647fdd443bc2504c2d371";
|
||||
traderIDs["RAGMAN"] = "5ac3b934156ae10c4430e83c";
|
||||
traderIDs["FENCE"] = "579dc571d53a0658a154fbec";
|
||||
traderIDs["GOBLINKING"] = "GoblinKing";
|
||||
traderIDs["CONDUCTOR"] = "Conductor";
|
||||
traderIDs["COURIER"] = "Courier";
|
||||
traderIDs["CROW"] = "Crow";
|
||||
traderIDs["WOLF"] = "Wolf";
|
||||
traderIDs["JUNKDEALER"] = "JunkDealer";
|
||||
traderIDs["WTTDATABASE"] = "WTTDatabase";
|
||||
})(traderIDs || (exports.traderIDs = traderIDs = {}));
|
||||
var currencyIDs;
|
||||
(function (currencyIDs) {
|
||||
currencyIDs["ROUBLES"] = "5449016a4bdc2d6f028b456f";
|
||||
currencyIDs["EUROS"] = "569668774bdc2da2298b4568";
|
||||
currencyIDs["DOLLARS"] = "5696686a4bdc2da3298b456a";
|
||||
})(currencyIDs || (exports.currencyIDs = currencyIDs = {}));
|
||||
var allBotTypes;
|
||||
(function (allBotTypes) {
|
||||
allBotTypes["ARENAFIGHTER"] = "arenafighter";
|
||||
allBotTypes["ARENAFIGHTEREVENT"] = "arenafighterevent";
|
||||
allBotTypes["ASSAULT"] = "assault";
|
||||
allBotTypes["BEAR"] = "bear";
|
||||
allBotTypes["RESHALA"] = "bossbully";
|
||||
allBotTypes["GLUHAR"] = "bossgluhar";
|
||||
allBotTypes["KILLA"] = "bosskilla";
|
||||
allBotTypes["KNIGHT"] = "bossknight";
|
||||
allBotTypes["SHTURMAN"] = "bosskojaniy";
|
||||
allBotTypes["SANITAR"] = "bosssanitar";
|
||||
allBotTypes["TAGILLA"] = "bosstagilla";
|
||||
allBotTypes["ZRYACHIY"] = "bosszryachiy";
|
||||
allBotTypes["CRAZYASSAULTEVENT"] = "crazyassaultevent";
|
||||
allBotTypes["CURSEDASSAULT"] = "cursedassault";
|
||||
allBotTypes["EXUSEC"] = "exusec";
|
||||
allBotTypes["FOLLOWERBIGPIPE"] = "followerbigpipe";
|
||||
allBotTypes["FOLLOWERBIRDEYE"] = "followerbirdeye";
|
||||
allBotTypes["FOLLOWERRESHALA"] = "followerbully";
|
||||
allBotTypes["FOLLOWERGLUHARASSAULT"] = "followergluharassault";
|
||||
allBotTypes["FOLLOWERGLUHARSCOUT"] = "followergluharscout";
|
||||
allBotTypes["FOLLOWERGLUHARSECURITY"] = "followergluharsecurity";
|
||||
allBotTypes["FOLLOWERGLUHARSNIPER"] = "followergluharsnipe";
|
||||
allBotTypes["FOLLOWERSHTURMAN"] = "followerkojaniy";
|
||||
allBotTypes["FOLLOWERSANITAR"] = "followersanitar";
|
||||
allBotTypes["FOLLOWERTAGILLA"] = "followertagilla";
|
||||
allBotTypes["FOLLOWERZRYACHIY"] = "followerzryachiy";
|
||||
allBotTypes["GIFTER"] = "gifter";
|
||||
allBotTypes["MARKSMAN"] = "marksman";
|
||||
allBotTypes["PMC"] = "pmcbot";
|
||||
allBotTypes["CULTISTPRIEST"] = "sectantpriest";
|
||||
allBotTypes["CULTISTWARRIOR"] = "sectantwarrior";
|
||||
allBotTypes["USEC"] = "usec";
|
||||
})(allBotTypes || (exports.allBotTypes = allBotTypes = {}));
|
||||
var inventorySlots;
|
||||
(function (inventorySlots) {
|
||||
inventorySlots["FirstPrimaryWeapon"] = "55d729c64bdc2d89028b4570";
|
||||
inventorySlots["SecondPrimaryWeapon"] = "55d729d14bdc2d86028b456e";
|
||||
inventorySlots["Holster"] = "55d729d84bdc2de3098b456b";
|
||||
inventorySlots["Scabbard"] = "55d729e34bdc2d1b198b456d";
|
||||
inventorySlots["FaceCover"] = "55d729e84bdc2d8a028b4569";
|
||||
inventorySlots["Headwear"] = "55d729ef4bdc2d3a168b456c";
|
||||
inventorySlots["TacticalVest"] = "55d729f74bdc2d87028b456e";
|
||||
inventorySlots["SecuredContainer"] = "55d72a054bdc2d88028b456e";
|
||||
inventorySlots["Backpack"] = "55d72a104bdc2d89028b4571";
|
||||
inventorySlots["ArmorVest"] = "55d72a194bdc2d86028b456f";
|
||||
inventorySlots["Pockets"] = "55d72a274bdc2de3098b456c";
|
||||
inventorySlots["Earpiece"] = "5665b7164bdc2d144c8b4570";
|
||||
inventorySlots["Dogtag"] = "59f0be1e86f77453be490939";
|
||||
inventorySlots["Eyewear"] = "5a0ad9313f1241000e072755";
|
||||
inventorySlots["ArmBand"] = "5b3f583786f77411d552fb2b";
|
||||
})(inventorySlots || (exports.inventorySlots = inventorySlots = {}));
|
||||
var Stashes;
|
||||
(function (Stashes) {
|
||||
Stashes["LEVEL1"] = "566abbc34bdc2d92178b4576";
|
||||
Stashes["LEVEL2"] = "5811ce572459770cba1a34ea";
|
||||
Stashes["LEVEL3"] = "5811ce662459770f6f490f32";
|
||||
Stashes["LEVEL4"] = "5811ce772459770e9e5f9532";
|
||||
})(Stashes || (exports.Stashes = Stashes = {}));
|
||||
//#endregion
|
||||
//# sourceMappingURL=configConsts.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "configConsts.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"configConsts.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AA0DC,CAAC;AAiCF,iCAAiC;AAEjC,eAAe;AACf,IAAY,SAgBX;AAhBD,WAAY,SAAS;IACjB,kDAAqC,CAAA;IACrC,+CAAkC,CAAA;IAClC,qDAAwC,CAAA;IACxC,mDAAsC,CAAA;IACtC,gDAAmC,CAAA;IACnC,gDAAmC,CAAA;IACnC,gDAAmC,CAAA;IACnC,+CAAkC,CAAA;IAClC,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,gCAAmB,CAAA;IACnB,0BAAa,CAAA;IACb,0BAAa,CAAA;IACb,sCAAyB,CAAA;IACzB,wCAA2B,CAAA;AAC/B,CAAC,EAhBW,SAAS,yBAAT,SAAS,QAgBpB;AAED,IAAY,WAIX;AAJD,WAAY,WAAW;IACnB,mDAAoC,CAAA;IACpC,iDAAkC,CAAA;IAClC,mDAAoC,CAAA;AACxC,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,IAAY,WAiCX;AAjCD,WAAY,WAAW;IACnB,4CAA6B,CAAA;IAC7B,sDAAuC,CAAA;IACvC,kCAAmB,CAAA;IACnB,4BAAa,CAAA;IACb,oCAAqB,CAAA;IACrB,oCAAqB,CAAA;IACrB,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,uCAAwB,CAAA;IACxB,sCAAuB,CAAA;IACvB,sCAAuB,CAAA;IACvB,wCAAyB,CAAA;IACzB,sDAAuC,CAAA;IACvC,8CAA+B,CAAA;IAC/B,gCAAiB,CAAA;IACjB,kDAAmC,CAAA;IACnC,kDAAmC,CAAA;IACnC,gDAAiC,CAAA;IACjC,8DAA+C,CAAA;IAC/C,0DAA2C,CAAA;IAC3C,gEAAiD,CAAA;IACjD,2DAA4C,CAAA;IAC5C,mDAAoC,CAAA;IACpC,kDAAmC,CAAA;IACnC,kDAAmC,CAAA;IACnC,oDAAqC,CAAA;IACrC,gCAAiB,CAAA;IACjB,oCAAqB,CAAA;IACrB,6BAAc,CAAA;IACd,8CAA+B,CAAA;IAC/B,gDAAiC,CAAA;IACjC,4BAAa,CAAA;AACjB,CAAC,EAjCW,WAAW,2BAAX,WAAW,QAiCtB;AAED,IAAY,cAgBX;AAhBD,WAAY,cAAc;IACtB,iEAA+C,CAAA;IAC/C,kEAAgD,CAAA;IAChD,sDAAoC,CAAA;IACpC,uDAAqC,CAAA;IACrC,wDAAsC,CAAA;IACtC,uDAAqC,CAAA;IACrC,2DAAyC,CAAA;IACzC,+DAA6C,CAAA;IAC7C,uDAAqC,CAAA;IACrC,wDAAsC,CAAA;IACtC,sDAAoC,CAAA;IACpC,uDAAqC,CAAA;IACrC,qDAAmC,CAAA;IACnC,sDAAoC,CAAA;IACpC,sDAAoC,CAAA;AACxC,CAAC,EAhBW,cAAc,8BAAd,cAAc,QAgBzB;AAED,IAAY,OAKX;AALD,WAAY,OAAO;IACf,8CAAmC,CAAA;IACnC,8CAAmC,CAAA;IACnC,8CAAmC,CAAA;IACnC,8CAAmC,CAAA;AACvC,CAAC,EALW,OAAO,uBAAP,OAAO,QAKlB;AA4BD,YAAY"
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ItemBaseClassMap = void 0;
|
||||
exports.ItemBaseClassMap = {
|
||||
"AMMO": "5485a8684bdc2da71d8b4567",
|
||||
"AMMO_CONTAINER": "543be5cb4bdc2deb348b4568",
|
||||
"ARMORED_EQUIPMENT": "57bef4c42459772e8d35a53b",
|
||||
"ARMBAND": "5b3f15d486f77432d0509248",
|
||||
"ARMOR": "5448e54d4bdc2dcc718b4568",
|
||||
"ASSAULT_CARBINE": "5447b5fc4bdc2d87278b4567",
|
||||
"ASSAULT_RIFLE": "5447b5f14bdc2d61278b4567",
|
||||
"BACKPACK": "5448e53e4bdc2d60728b4567",
|
||||
"BARREL": "555ef6e44bdc2de9068b457e",
|
||||
"BATTERY": "57864ee62459775490116fc1",
|
||||
"BUILDING_MATERIAL": "57864ada245977548638de91",
|
||||
"CHARGING_HANDLE": "55818a6f4bdc2db9688b456b",
|
||||
"CHEST_RIG": "5448e5284bdc2dcb718b4567",
|
||||
"COMMON_CONTAINER": "5795f317245977243854e041",
|
||||
"COMPACT_REFLEX_SIGHT": "55818acf4bdc2dde698b456b",
|
||||
"COMPASS": "5f4fbaaca5573a5ac31db429",
|
||||
"DRINK": "5448e8d64bdc2dce718b4568",
|
||||
"DRUG": "5448f3a14bdc2d27728b4569",
|
||||
"ELECTRONICS": "57864a66245977548f04a81f",
|
||||
"FACECOVER": "5a341c4686f77469e155819e",
|
||||
"FLASHLIGHT": "55818b084bdc2d5b648b4571",
|
||||
"FLASHHIDER": "550aa4bf4bdc2dd6348b456b",
|
||||
"FOOD": "5448e8d04bdc2ddf718b4569",
|
||||
"FOREGRIP": "55818af64bdc2d5b648b4570",
|
||||
"FUEL": "5d650c3e815116009f6201d2",
|
||||
"GAS_BLOCK": "56ea9461d2720b67698b456f",
|
||||
"GRENADE_LAUNCHER": "5447bedf4bdc2d87278b4568",
|
||||
"HANDGUN": "5447b5cf4bdc2d65278b4567",
|
||||
"HANDGUARD": "55818a104bdc2db9688b4569",
|
||||
"HEADPHONES": "5645bcb74bdc2ded0b8b4578",
|
||||
"HEADWEAR": "5a341c4086f77401f2541505",
|
||||
"INFO": "5448ecbe4bdc2d60728b4568",
|
||||
"INVENTORY": "55d720f24bdc2d88028b456d",
|
||||
"KEYCARD": "5c164d2286f774194c5e69fa",
|
||||
"KEYMECHANICAL": "5c99f98d86f7745c314214b3",
|
||||
"KEY_CARD": "5c164d2286f774194c5e69fa",
|
||||
"KNIFE": "5447e1d04bdc2dff2f8b4567",
|
||||
"LOCKING_CONTAINER": "5671435f4bdc2d96058b4569",
|
||||
"LOOT_CONTAINER": "566965d44bdc2d814c8b4571",
|
||||
"LUBRICANT": "57864e4c24597754843f8723",
|
||||
"MACHINEGUN": "5447bed64bdc2d97278b4568",
|
||||
"MAGAZINE": "5448bc234bdc2d3c308b4569",
|
||||
"MAP": "567849dd4bdc2d150f8b456e",
|
||||
"MEDICAL_ITEM": "5448f3ac4bdc2dce718b4569",
|
||||
"MEDICAL_SUPPLIES": "57864c8c245977548867e7f1",
|
||||
"MEDITKIT": "5448f39d4bdc2d0a728b4568",
|
||||
"MONEY": "543be5dd4bdc2deb348b4569",
|
||||
"NIGHTVISION": "5a2c3a9486f774688b05e574",
|
||||
"OTHER": "590c745b86f7743cc433c5f2",
|
||||
"PISTOLGRIP": "55818a684bdc2ddd698b456d",
|
||||
"POCKETS": "557596e64bdc2dc2118b4571",
|
||||
"PORTABLE_RANGEFINDER": "61605ddea09d851a0a0c1bbc",
|
||||
"RANDOMLOOTCONTAINER": "62f109593b54472778797866",
|
||||
"RECEIVER": "55818a304bdc2db5418b457d",
|
||||
"REFLEX_SIGHT": "55818ad54bdc2ddc698b4569",
|
||||
"REPAIRKITS": "616eb7aea207f41933308f46",
|
||||
"SCOPE": "55818ae44bdc2dde698b456c",
|
||||
"SHOTGUN": "5447b6094bdc2dc3278b4567",
|
||||
"SILENCER": "550aa4cd4bdc2dd8348b456c",
|
||||
"SNIPER_RIFLE": "5447b6254bdc2dc3278b4568",
|
||||
"SPECIAL_ITEM": "5447e0e74bdc2d3c308b4567",
|
||||
"STASH": "566abbb64bdc2d144c8b457d",
|
||||
"STATIONARY_CONT.": "567583764bdc2d98058b456e",
|
||||
"STIMULANT": "5448f3a64bdc2d60728b456a",
|
||||
"STOCK": "55818a594bdc2db9688b456a",
|
||||
"THROWABLE_WEAPON": "543be6564bdc2df4348b4568",
|
||||
"THERMALVISION": "5d21f59b6dbe99052b54ef83",
|
||||
"TOOL": "57864bb7245977548b3b66c2",
|
||||
"UBGL": "55818b014bdc2ddc698b456b",
|
||||
"VIS_OBSERV_DEVICE": "5448e5724bdc2ddf718b4568",
|
||||
};
|
||||
//# sourceMappingURL=itemBaseClasses.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "itemBaseClasses.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"itemBaseClasses.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AAAa,QAAA,gBAAgB,GAAmC;IAC9D,MAAM,EAAE,0BAA0B;IAClC,gBAAgB,EAAE,0BAA0B;IAC5C,mBAAmB,EAAE,0BAA0B;IAC/C,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,0BAA0B;IACnC,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,UAAU,EAAE,0BAA0B;IACtC,QAAQ,EAAE,0BAA0B;IACpC,SAAS,EAAE,0BAA0B;IACrC,mBAAmB,EAAE,0BAA0B;IAC/C,iBAAiB,EAAE,0BAA0B;IAC7C,WAAW,EAAE,0BAA0B;IACvC,kBAAkB,EAAE,0BAA0B;IAC9C,sBAAsB,EAAE,0BAA0B;IAClD,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,0BAA0B;IACnC,MAAM,EAAE,0BAA0B;IAClC,aAAa,EAAE,0BAA0B;IACzC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,0BAA0B;IACxC,MAAM,EAAE,0BAA0B;IAClC,UAAU,EAAE,0BAA0B;IACtC,MAAM,EAAE,0BAA0B;IAClC,WAAW,EAAE,0BAA0B;IACvC,kBAAkB,EAAE,0BAA0B;IAC9C,SAAS,EAAE,0BAA0B;IACrC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,UAAU,EAAE,0BAA0B;IACtC,MAAM,EAAE,0BAA0B;IAClC,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,0BAA0B;IACrC,eAAe,EAAE,0BAA0B;IAC3C,UAAU,EAAE,0BAA0B;IACtC,OAAO,EAAE,0BAA0B;IACnC,mBAAmB,EAAE,0BAA0B;IAC/C,gBAAgB,EAAE,0BAA0B;IAC5C,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,UAAU,EAAE,0BAA0B;IACtC,KAAK,EAAE,0BAA0B;IACjC,cAAc,EAAE,0BAA0B;IAC1C,kBAAkB,EAAE,0BAA0B;IAC9C,UAAU,EAAE,0BAA0B;IACtC,OAAO,EAAE,0BAA0B;IACnC,aAAa,EAAE,0BAA0B;IACzC,OAAO,EAAE,0BAA0B;IACnC,YAAY,EAAE,0BAA0B;IACxC,SAAS,EAAE,0BAA0B;IACrC,sBAAsB,EAAE,0BAA0B;IAClD,qBAAqB,EAAE,0BAA0B;IACjD,UAAU,EAAE,0BAA0B;IACtC,cAAc,EAAE,0BAA0B;IAC1C,YAAY,EAAE,0BAA0B;IACxC,OAAO,EAAE,0BAA0B;IACnC,SAAS,EAAE,0BAA0B;IACrC,UAAU,EAAE,0BAA0B;IACtC,cAAc,EAAE,0BAA0B;IAC1C,cAAc,EAAE,0BAA0B;IAC1C,OAAO,EAAE,0BAA0B;IACnC,kBAAkB,EAAE,0BAA0B;IAC9C,WAAW,EAAE,0BAA0B;IACvC,OAAO,EAAE,0BAA0B;IACnC,kBAAkB,EAAE,0BAA0B;IAC9C,eAAe,EAAE,0BAA0B;IAC3C,MAAM,EAAE,0BAA0B;IAClC,MAAM,EAAE,0BAA0B;IAClC,mBAAmB,EAAE,0BAA0B;CAChD,CAAC"
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ItemHandbookCategoryMap = void 0;
|
||||
exports.ItemHandbookCategoryMap = {
|
||||
"AMMO": "5b47574386f77428ca22b346",
|
||||
"AMMO_BOXES": "5b47574386f77428ca22b33c",
|
||||
"AMMO_ROUNDS": "5b47574386f77428ca22b33b",
|
||||
"BARTER": "5b47574386f77428ca22b33e",
|
||||
"BARTER_BUILDING": "5b47574386f77428ca22b2ee",
|
||||
"BARTER_ELECTRONICS": "5b47574386f77428ca22b2ef",
|
||||
"BARTER_ENERGY": "5b47574386f77428ca22b2ed",
|
||||
"BARTER_FLAMMABLE": "5b47574386f77428ca22b2f2",
|
||||
"BARTER_HOUSEHOLD": "5b47574386f77428ca22b2f0",
|
||||
"BARTER_MEDICAL": "5b47574386f77428ca22b2f3",
|
||||
"BARTER_OTHERS": "5b47574386f77428ca22b2f4",
|
||||
"BARTER_TOOLS": "5b47574386f77428ca22b2f6",
|
||||
"BARTER_VALUABLES": "5b47574386f77428ca22b2f1",
|
||||
"GEAR": "5b47574386f77428ca22b33f",
|
||||
"GEAR_ARMOR": "5b5f701386f774093f2ecf0f",
|
||||
"GEAR_BACKPACKS": "5b5f6f6c86f774093f2ecf0b",
|
||||
"GEAR_CASES": "5b5f6fa186f77409407a7eb7",
|
||||
"GEAR_COMPONENTS": "5b5f704686f77447ec5d76d7",
|
||||
"GEAR_FACECOVERS": "5b47574386f77428ca22b32f",
|
||||
"GEAR_HEADSETS": "5b5f6f3c86f774094242ef87",
|
||||
"GEAR_HEADWEAR": "5b47574386f77428ca22b330",
|
||||
"GEAR_RIGS": "5b5f6f8786f77447ed563642",
|
||||
"GEAR_SECURED": "5b5f6fd286f774093f2ecf0d",
|
||||
"GEAR_VISORS": "5b47574386f77428ca22b331",
|
||||
"INFO": "5b47574386f77428ca22b341",
|
||||
"KEYS": "5b47574386f77428ca22b342",
|
||||
"KEYS_ELECTRONIC": "5c518ed586f774119a772aee",
|
||||
"KEYS_MECHANIC": "5c518ec986f7743b68682ce2",
|
||||
"MAPS": "5b47574386f77428ca22b343",
|
||||
"MEDICAL": "5b47574386f77428ca22b344",
|
||||
"MEDICAL_INJECTORS": "5b47574386f77428ca22b33a",
|
||||
"MEDICAL_INJURY": "5b47574386f77428ca22b339",
|
||||
"MEDICAL_MEDKITS": "5b47574386f77428ca22b338",
|
||||
"MEDICAL_PILLS": "5b47574386f77428ca22b337",
|
||||
"MODS": "5b5f71a686f77447ed5636ab",
|
||||
"MODS_FUNCTIONAL": "5b5f71b386f774093f2ecf11",
|
||||
"MODS_GEAR": "5b5f750686f774093e6cb503",
|
||||
"MODS_VITAL": "5b5f75b986f77447ec5d7710",
|
||||
"MOD_AUX": "5b5f74cc86f77447ec5d770a",
|
||||
"MOD_BARREL": "5b5f75c686f774094242f19f",
|
||||
"MOD_BIPOD": "5b5f71c186f77409407a7ec0",
|
||||
"MOD_CHARGE": "5b5f751486f77447ec5d770c",
|
||||
"MOD_GASBLOCK": "5b5f760586f774093e6cb509",
|
||||
"MOD_HANDGUARD": "5b5f75e486f77447ec5d7712",
|
||||
"MOD_LAUNCHER": "5b5f752e86f774093e6cb505",
|
||||
"MOD_LIGHTLASER": "5b5f736886f774094242f193",
|
||||
"MOD_MAGAZINE": "5b5f754a86f774094242f19b",
|
||||
"MOD_MOUNT": "5b5f755f86f77447ec5d770e",
|
||||
"MOD_MUZZLE": "5b5f724186f77447ed5636ad",
|
||||
"MOD_PISTOLGRIP": "5b5f761f86f774094242f1a1",
|
||||
"MOD_RECEIVER": "5b5f764186f77447ec5d7714",
|
||||
"MOD_SIGHT": "5b5f73ec86f774093e6cb4fd",
|
||||
"MOD_STOCK": "5b5f757486f774093e6cb507",
|
||||
"MONEY": "5b5f78b786f77447ed5636af",
|
||||
"PROVISIONS": "5b47574386f77428ca22b340",
|
||||
"PROVISIONS_DRINKS": "5b47574386f77428ca22b335",
|
||||
"PROVISIONS_FOOD": "5b47574386f77428ca22b336",
|
||||
"QUEST": "5b619f1a86f77450a702a6f3",
|
||||
"SPEC": "5b47574386f77428ca22b345",
|
||||
"WEAPONS": "5b5f78dc86f77409407a7f8e",
|
||||
"WEAPONS_ASSAULTRIFLES": "5b5f78fc86f77409407a7f90",
|
||||
"WEAPONS_BOTACTION": "5b5f798886f77447ed5636b5",
|
||||
"WEAPONS_CARBINES": "5b5f78e986f77447ed5636b1",
|
||||
"WEAPONS_DMR": "5b5f791486f774093f2ed3be",
|
||||
"WEAPONS_GL": "5b5f79d186f774093f2ed3c2",
|
||||
"WEAPONS_MG": "5b5f79a486f77409407a7f94",
|
||||
"WEAPONS_MELEE": "5b5f7a0886f77409407a7f96",
|
||||
"WEAPONS_PISTOLS": "5b5f792486f77447ed5636b3",
|
||||
"WEAPONS_SHOTGUNS": "5b5f794b86f77409407a7f92",
|
||||
"WEAPONS_SMG": "5b5f796a86f774093f2ed3c0",
|
||||
"WEAPONS_SPECIAL": "5b5f79eb86f77447ed5636b7",
|
||||
"WEAPONS_THROW": "5b5f7a2386f774093f2ed3c4",
|
||||
};
|
||||
//# sourceMappingURL=itemHandbookCategories.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "itemHandbookCategories.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"itemHandbookCategories.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AAAa,QAAA,uBAAuB,GAAmC;IACrE,MAAM,EAAE,0BAA0B;IAClC,YAAY,EAAE,0BAA0B;IACxC,aAAa,EAAE,0BAA0B;IACzC,QAAQ,EAAE,0BAA0B;IACpC,iBAAiB,EAAE,0BAA0B;IAC7C,oBAAoB,EAAE,0BAA0B;IAChD,eAAe,EAAE,0BAA0B;IAC3C,kBAAkB,EAAE,0BAA0B;IAC9C,kBAAkB,EAAE,0BAA0B;IAC9C,gBAAgB,EAAE,0BAA0B;IAC5C,eAAe,EAAE,0BAA0B;IAC3C,cAAc,EAAE,0BAA0B;IAC1C,kBAAkB,EAAE,0BAA0B;IAC9C,MAAM,EAAE,0BAA0B;IAClC,YAAY,EAAE,0BAA0B;IACxC,gBAAgB,EAAE,0BAA0B;IAC5C,YAAY,EAAE,0BAA0B;IACxC,iBAAiB,EAAE,0BAA0B;IAC7C,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,eAAe,EAAE,0BAA0B;IAC3C,WAAW,EAAE,0BAA0B;IACvC,cAAc,EAAE,0BAA0B;IAC1C,aAAa,EAAE,0BAA0B;IACzC,MAAM,EAAE,0BAA0B;IAClC,MAAM,EAAE,0BAA0B;IAClC,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,MAAM,EAAE,0BAA0B;IAClC,SAAS,EAAE,0BAA0B;IACrC,mBAAmB,EAAE,0BAA0B;IAC/C,gBAAgB,EAAE,0BAA0B;IAC5C,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,MAAM,EAAE,0BAA0B;IAClC,iBAAiB,EAAE,0BAA0B;IAC7C,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,SAAS,EAAE,0BAA0B;IACrC,YAAY,EAAE,0BAA0B;IACxC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,cAAc,EAAE,0BAA0B;IAC1C,eAAe,EAAE,0BAA0B;IAC3C,cAAc,EAAE,0BAA0B;IAC1C,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,WAAW,EAAE,0BAA0B;IACvC,WAAW,EAAE,0BAA0B;IACvC,OAAO,EAAE,0BAA0B;IACnC,YAAY,EAAE,0BAA0B;IACxC,mBAAmB,EAAE,0BAA0B;IAC/C,iBAAiB,EAAE,0BAA0B;IAC7C,OAAO,EAAE,0BAA0B;IACnC,MAAM,EAAE,0BAA0B;IAClC,SAAS,EAAE,0BAA0B;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,mBAAmB,EAAE,0BAA0B;IAC/C,kBAAkB,EAAE,0BAA0B;IAC9C,aAAa,EAAE,0BAA0B;IACzC,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,0BAA0B;IACxC,eAAe,EAAE,0BAA0B;IAC3C,iBAAiB,EAAE,0BAA0B;IAC7C,kBAAkB,EAAE,0BAA0B;IAC9C,aAAa,EAAE,0BAA0B;IACzC,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;CAC5C,CAAC"
|
||||
}
|
||||
2976
user/mods/Echoes-of-Tarkov---Requisitions/src/references/items.js
Normal file
2976
user/mods/Echoes-of-Tarkov---Requisitions/src/references/items.js
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,67 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CustomAssortSchemeService = void 0;
|
||||
const customAssortSchemes = __importStar(require("../db/CustomAssortSchemes/CustomAssortSchemes.json"));
|
||||
const configConsts_1 = require("./references/configConsts");
|
||||
class CustomAssortSchemeService {
|
||||
Instance;
|
||||
preSptLoad(Instance) {
|
||||
this.Instance = Instance;
|
||||
}
|
||||
postDBLoad() {
|
||||
const tables = this.Instance.database;
|
||||
for (const traderId in customAssortSchemes) {
|
||||
const traderIdFromMap = configConsts_1.traderIDs[traderId];
|
||||
const finalTraderId = traderIdFromMap || traderId;
|
||||
const trader = tables.traders[finalTraderId];
|
||||
if (!trader) {
|
||||
return;
|
||||
}
|
||||
const newAssort = customAssortSchemes[traderId];
|
||||
for (const item of newAssort.items) {
|
||||
trader.assort.items.push(item);
|
||||
}
|
||||
for (const [itemName, scheme] of Object.entries(newAssort.barter_scheme)) {
|
||||
trader.assort.barter_scheme[itemName] = scheme;
|
||||
}
|
||||
for (const [itemName, count] of Object.entries(newAssort.loyal_level_items)) {
|
||||
trader.assort.loyal_level_items[itemName] = count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.CustomAssortSchemeService = CustomAssortSchemeService;
|
||||
//# sourceMappingURL=CustomAssortSchemeService.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "CustomAssortSchemeService.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"CustomAssortSchemeService.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,wGAA0F;AAC1F,4DAAsD;AAEtD,MAAa,yBAAyB;IAE1B,QAAQ,CAAqB;IAE9B,UAAU,CAAC,QAA4B;QAE1C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAEM,UAAU;QAEb,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAC1C,CAAC;YACG,MAAM,eAAe,GAAG,wBAAS,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,eAAe,IAAI,QAAQ,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAE7C,IAAI,CAAC,MAAM,EACX,CAAC;gBACG,OAAO;YACX,CAAC;YAED,MAAM,SAAS,GAAmB,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAEhE,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAClC,CAAC;gBACG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,EACxE,CAAC;gBACG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YACnD,CAAC;YAED,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAC3E,CAAC;gBACG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YACtD,CAAC;QAEL,CAAC;IACL,CAAC;CAGJ;AA3CD,8DA2CC"
|
||||
}
|
||||
666
user/mods/EpicRangeTime-Weapons/src/CustomItemService.js
Normal file
666
user/mods/EpicRangeTime-Weapons/src/CustomItemService.js
Normal file
|
|
@ -0,0 +1,666 @@
|
|||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CustomItemService = void 0;
|
||||
const configConsts_1 = require("./references/configConsts");
|
||||
const configConsts_2 = require("./references/configConsts");
|
||||
const configConsts_3 = require("./references/configConsts");
|
||||
const items_1 = require("./references/items");
|
||||
const itemBaseClasses_1 = require("./references/itemBaseClasses");
|
||||
const itemHandbookCategories_1 = require("./references/itemHandbookCategories");
|
||||
const LogTextColor_1 = require("C:/snapshot/project/obj/models/spt/logging/LogTextColor");
|
||||
const node_fs_1 = __importDefault(require("node:fs"));
|
||||
const node_path_1 = __importDefault(require("node:path"));
|
||||
class CustomItemService {
|
||||
instanceManager;
|
||||
preSptLoad(instanceManager) {
|
||||
this.instanceManager = instanceManager;
|
||||
}
|
||||
postDBLoad() {
|
||||
const configPath = node_path_1.default.join(__dirname, "../db/Items");
|
||||
const configFiles = node_fs_1.default
|
||||
.readdirSync(configPath)
|
||||
.filter((file) => !file.includes("BaseItemReplacement"));
|
||||
let numItemsAdded = 0;
|
||||
for (const file of configFiles) {
|
||||
const filePath = node_path_1.default.join(configPath, file);
|
||||
try {
|
||||
const fileContents = node_fs_1.default.readFileSync(filePath, "utf-8");
|
||||
const config = JSON.parse(fileContents);
|
||||
for (const itemId in config) {
|
||||
const itemConfig = config[itemId];
|
||||
try {
|
||||
const { exampleCloneItem, finalItemTplToClone } = this.createExampleCloneItem(itemConfig, itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Processing file: ${file}, Item ID: ${itemId}`);
|
||||
console.log(`Prefab Path: ${exampleCloneItem.overrideProperties?.Prefab.path}`);
|
||||
}
|
||||
this.instanceManager.customItem.createItemFromClone(exampleCloneItem);
|
||||
this.processStaticLootContainers(itemConfig, itemId);
|
||||
this.processModSlots(itemConfig, finalItemTplToClone, itemId);
|
||||
this.processInventorySlots(itemConfig, itemId);
|
||||
this.processMasterySections(itemConfig, itemId);
|
||||
this.processWeaponPresets(itemConfig, itemId);
|
||||
this.processTraders(itemConfig, itemId);
|
||||
this.addtoHallofFame(itemConfig, itemId);
|
||||
this.addtoSpecialSlots(itemConfig, itemId);
|
||||
numItemsAdded++;
|
||||
}
|
||||
catch (itemError) {
|
||||
console.error(`Error processing item ID: ${itemId} in file: ${file}`);
|
||||
console.error(itemError);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (fileError) {
|
||||
console.error(`Error processing config file: ${file}`);
|
||||
console.error(fileError);
|
||||
}
|
||||
}
|
||||
if (numItemsAdded > 0) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] Database: Loaded ${numItemsAdded} custom items.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
else {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] Database: No custom items loaded.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
// Post-item processing (e.g., bot inventories, quest modifications)
|
||||
for (const file of configFiles) {
|
||||
const filePath = node_path_1.default.join(configPath, file);
|
||||
try {
|
||||
const fileContents = node_fs_1.default.readFileSync(filePath, "utf-8");
|
||||
const config = JSON.parse(fileContents);
|
||||
for (const itemId in config) {
|
||||
const itemConfig = config[itemId];
|
||||
this.processBotInventories(itemConfig, itemConfig.itemTplToClone, itemId);
|
||||
}
|
||||
}
|
||||
catch (fileError) {
|
||||
console.error(`Error processing bot inventories for file: ${file}`);
|
||||
console.error(fileError);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Creates an example clone item with the provided item configuration and item ID.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration of the item to clone.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @return {{ exampleCloneItem: NewItemFromCloneDetails, finalItemTplToClone: string }} The created example clone item and the final item template to clone.
|
||||
*/
|
||||
createExampleCloneItem(itemConfig, itemId) {
|
||||
const itemTplToCloneFromMap = items_1.ItemMap[itemConfig.itemTplToClone] || itemConfig.itemTplToClone;
|
||||
const finalItemTplToClone = itemTplToCloneFromMap;
|
||||
const parentIdFromMap = itemBaseClasses_1.ItemBaseClassMap[itemConfig.parentId] || itemConfig.parentId;
|
||||
const finalParentId = parentIdFromMap;
|
||||
const handbookParentIdFromMap = itemHandbookCategories_1.ItemHandbookCategoryMap[itemConfig.handbookParentId] ||
|
||||
itemConfig.handbookParentId;
|
||||
const finalHandbookParentId = handbookParentIdFromMap;
|
||||
const itemPrefabPath = `customItems/${itemId}.bundle`;
|
||||
const exampleCloneItem = {
|
||||
itemTplToClone: finalItemTplToClone,
|
||||
overrideProperties: itemConfig.overrideProperties
|
||||
? {
|
||||
...itemConfig.overrideProperties,
|
||||
Prefab: {
|
||||
path: itemConfig.overrideProperties.Prefab?.path || itemPrefabPath,
|
||||
rcid: ""
|
||||
}
|
||||
}
|
||||
: undefined,
|
||||
parentId: finalParentId,
|
||||
newId: itemId,
|
||||
fleaPriceRoubles: itemConfig.fleaPriceRoubles,
|
||||
handbookPriceRoubles: itemConfig.handbookPriceRoubles,
|
||||
handbookParentId: finalHandbookParentId,
|
||||
locales: itemConfig.locales
|
||||
};
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Cloning item ${finalItemTplToClone} for itemID: ${itemId}`);
|
||||
}
|
||||
return { exampleCloneItem, finalItemTplToClone };
|
||||
}
|
||||
/**
|
||||
* Adds an item to a static loot container with a given probability.
|
||||
*
|
||||
* @param {string} containerID - The ID of the loot container.
|
||||
* @param {string} itemToAdd - The item to add to the loot container.
|
||||
* @param {number} probability - The probability of the item being added.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
addToStaticLoot(containerID, itemToAdd, probability) {
|
||||
const locations = this.instanceManager.database.locations;
|
||||
for (const locationID in locations) {
|
||||
if (!Object.prototype.hasOwnProperty.call(locations, locationID)) {
|
||||
continue; // Skip invalid locations
|
||||
}
|
||||
const location = locations[locationID];
|
||||
if (!location.staticLoot) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.warn(`Warning: No static loot found in location: ${locationID}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const staticLoot = location.staticLoot;
|
||||
if (!Object.prototype.hasOwnProperty.call(staticLoot, containerID)) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Error: Loot container ID ${containerID} not found in location: ${locationID}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const lootContainer = staticLoot[containerID];
|
||||
if (!lootContainer) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Error: Loot container ID ${containerID} is null in location: ${locationID}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const templateFromMap = items_1.ItemMap[itemToAdd];
|
||||
const finalTemplate = templateFromMap || itemToAdd;
|
||||
const newLoot = [
|
||||
{
|
||||
tpl: finalTemplate,
|
||||
relativeProbability: probability,
|
||||
},
|
||||
];
|
||||
lootContainer.itemDistribution.push(...newLoot);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added ${itemToAdd} to loot container: ${containerID} in location: ${locationID}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the static loot containers for a given item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration object for the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processStaticLootContainers(itemConfig, itemId) {
|
||||
if (itemConfig.addtoStaticLootContainers) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing static loot containers for item:", itemId);
|
||||
}
|
||||
if (Array.isArray(itemConfig.StaticLootContainers)) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Adding item to multiple static loot containers:");
|
||||
}
|
||||
for (const container of itemConfig.StaticLootContainers) {
|
||||
const staticLootContainer = items_1.ItemMap[container.ContainerName] || container.ContainerName;
|
||||
this.addToStaticLoot(staticLootContainer, itemId, container.Probability);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added to container '${staticLootContainer}' with probability ${container.Probability}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
const staticLootContainer = items_1.ItemMap[itemConfig.StaticLootContainers] ||
|
||||
itemConfig.StaticLootContainers;
|
||||
this.addToStaticLoot(staticLootContainer, itemId, itemConfig.Probability);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added to container '${staticLootContainer}' with probability ${itemConfig.Probability}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the mod slots of an item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration of the item.
|
||||
* @param {string[]} finalItemTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @returns {void}
|
||||
*/
|
||||
processModSlots(itemConfig, finalItemTplToClone, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
const moddableItemWhitelistIds = Array.isArray(itemConfig.ModdableItemWhitelist)
|
||||
? itemConfig.ModdableItemWhitelist.map((shortname) => items_1.ItemMap[shortname])
|
||||
: itemConfig.ModdableItemWhitelist
|
||||
? [items_1.ItemMap[itemConfig.ModdableItemWhitelist]]
|
||||
: [];
|
||||
const moddableItemBlacklistIds = Array.isArray(itemConfig.ModdableItemBlacklist)
|
||||
? itemConfig.ModdableItemBlacklist.map((shortname) => items_1.ItemMap[shortname])
|
||||
: itemConfig.ModdableItemBlacklist
|
||||
? [items_1.ItemMap[itemConfig.ModdableItemBlacklist]]
|
||||
: [];
|
||||
const modSlots = Array.isArray(itemConfig.modSlot)
|
||||
? itemConfig.modSlot
|
||||
: itemConfig.modSlot
|
||||
? [itemConfig.modSlot]
|
||||
: [];
|
||||
const lowercaseModSlots = modSlots.map((modSlotName) => modSlotName.toLowerCase());
|
||||
if (itemConfig.addtoModSlots) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing mod slots for item:", itemId);
|
||||
}
|
||||
for (const parentItemId in tables.templates.items) {
|
||||
const parentItem = tables.templates.items[parentItemId];
|
||||
if (!parentItem._props.Slots) {
|
||||
continue;
|
||||
}
|
||||
const isBlacklisted = moddableItemBlacklistIds.includes(parentItemId);
|
||||
const isWhitelisted = moddableItemWhitelistIds.includes(parentItemId);
|
||||
if (isBlacklisted) {
|
||||
continue;
|
||||
}
|
||||
let addToModSlots = false;
|
||||
if (isWhitelisted && itemConfig.modSlot) {
|
||||
addToModSlots = true;
|
||||
}
|
||||
else if (!isBlacklisted && itemConfig.modSlot) {
|
||||
for (const modSlot of parentItem._props.Slots) {
|
||||
if (modSlot._props.filters?.[0].Filter.some((filterItem) => finalItemTplToClone.includes(filterItem))) {
|
||||
if (lowercaseModSlots.includes(modSlot._name.toLowerCase())) {
|
||||
addToModSlots = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addToModSlots) {
|
||||
for (const modSlot of parentItem._props.Slots) {
|
||||
if (lowercaseModSlots.includes(modSlot._name.toLowerCase())) {
|
||||
if (!modSlot._props.filters[0].Filter.includes(itemId) && modSlot._props.filters?.[0]?.Filter?.includes(finalItemTplToClone)) {
|
||||
modSlot._props.filters[0].Filter.push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the filter of mod slot ${modSlot._name} for parent item ${parentItemId}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the inventory slots for a given item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration object for the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @param {any} defaultInventorySlots - The default inventory slots.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processInventorySlots(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (itemConfig.addtoInventorySlots) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing inventory slots for item:", itemId);
|
||||
}
|
||||
const defaultInventorySlots = tables.templates.items["55d7217a4bdc2d86028b456d"]._props.Slots;
|
||||
const allowedSlots = Array.isArray(itemConfig.addtoInventorySlots)
|
||||
? itemConfig.addtoInventorySlots
|
||||
: [itemConfig.addtoInventorySlots];
|
||||
// Iterate over the slots and push the item into the filters per the config
|
||||
for (const slot of defaultInventorySlots) {
|
||||
const slotName = configConsts_3.inventorySlots[slot._name];
|
||||
const slotId = Object.keys(configConsts_3.inventorySlots).find((key) => configConsts_3.inventorySlots[key] === slot._name);
|
||||
if (allowedSlots.includes(slot._name) ||
|
||||
allowedSlots.includes(slotName) ||
|
||||
allowedSlots.includes(slotId)) {
|
||||
if (!slot._props.filters[0].Filter.includes(itemId)) {
|
||||
slot._props.filters[0].Filter.push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the filter of slot ${slot._name}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the mastery sections for an item.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration object for the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @param {any} tables - The tables object containing global configuration.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processMasterySections(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (itemConfig.masteries) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing mastery sections for item:", itemId);
|
||||
}
|
||||
const masterySections = Array.isArray(itemConfig.masterySections)
|
||||
? itemConfig.masterySections
|
||||
: [itemConfig.masterySections];
|
||||
for (const mastery of masterySections) {
|
||||
const existingMastery = tables.globals.config.Mastering.find((existing) => existing.Name === mastery.Name);
|
||||
if (existingMastery) {
|
||||
existingMastery.Templates.push(...mastery.Templates);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Adding to existing mastery section for item: ${itemId}`);
|
||||
}
|
||||
}
|
||||
else {
|
||||
tables.globals.config.Mastering.push(mastery);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Adding new mastery section for item: ${itemId}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes weapon presets based on the provided item configuration and tables.
|
||||
*
|
||||
* @param {any} itemConfig - The item configuration.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processWeaponPresets(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
const { addweaponpreset, weaponpresets } = itemConfig;
|
||||
const itemPresets = tables.globals.ItemPresets;
|
||||
if (addweaponpreset) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing weapon presets for item:", itemId);
|
||||
}
|
||||
for (const presetData of weaponpresets) {
|
||||
const preset = {
|
||||
_changeWeaponName: presetData._changeWeaponName,
|
||||
_encyclopedia: presetData._encyclopedia || undefined,
|
||||
_id: presetData._id,
|
||||
_items: presetData._items.map((itemData) => {
|
||||
const item = {
|
||||
_id: itemData._id,
|
||||
_tpl: itemData._tpl
|
||||
};
|
||||
// Add parentId and slotId only if they are present in itemData
|
||||
if (itemData.parentId) {
|
||||
item.parentId = itemData.parentId;
|
||||
}
|
||||
if (itemData.slotId) {
|
||||
item.slotId = itemData.slotId;
|
||||
}
|
||||
return item;
|
||||
}),
|
||||
_name: presetData._name,
|
||||
_parent: presetData._parent,
|
||||
_type: "Preset"
|
||||
};
|
||||
itemPresets[preset._id] = preset;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added weapon preset: ${preset._name}`);
|
||||
console.log(` - Preset: ${JSON.stringify(preset)}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes traders based on the item configuration.
|
||||
*
|
||||
* @param {any} itemConfig - The configuration of the item.
|
||||
* @param {string} itemId - The ID of the item.
|
||||
* @return {void} This function does not return a value.
|
||||
*/
|
||||
processTraders(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (!itemConfig.addtoTraders) {
|
||||
return;
|
||||
}
|
||||
const { traderId, traderItems, barterScheme } = itemConfig;
|
||||
const traderIdFromMap = configConsts_1.traderIDs[traderId];
|
||||
const finalTraderId = traderIdFromMap || traderId;
|
||||
const trader = tables.traders[finalTraderId];
|
||||
if (!trader) {
|
||||
return;
|
||||
}
|
||||
for (const item of traderItems) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing traders for item:", itemId);
|
||||
}
|
||||
const newItem = {
|
||||
_id: itemId,
|
||||
_tpl: itemId,
|
||||
parentId: "hideout",
|
||||
slotId: "hideout",
|
||||
upd: {
|
||||
UnlimitedCount: item.unlimitedCount,
|
||||
StackObjectsCount: item.stackObjectsCount
|
||||
}
|
||||
};
|
||||
trader.assort.items.push(newItem);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the trader ${traderId}`);
|
||||
}
|
||||
}
|
||||
trader.assort.barter_scheme[itemId] = [];
|
||||
for (const scheme of barterScheme) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing trader barter scheme for item:", itemId);
|
||||
}
|
||||
const count = scheme.count;
|
||||
const tpl = configConsts_2.currencyIDs[scheme._tpl] || items_1.ItemMap[scheme._tpl];
|
||||
if (!tpl) {
|
||||
throw new Error(`Invalid _tpl value in barterScheme for item: ${itemId}`);
|
||||
}
|
||||
trader.assort.barter_scheme[itemId].push([
|
||||
{
|
||||
count: count,
|
||||
_tpl: tpl
|
||||
}
|
||||
]);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Successfully added item ${itemId} to the barter scheme of trader ${traderId}`);
|
||||
}
|
||||
}
|
||||
trader.assort.loyal_level_items[itemId] = itemConfig.loyallevelitems;
|
||||
}
|
||||
addtoHallofFame(itemConfig, itemId) {
|
||||
const hallofFame1 = this.instanceManager.database.templates.items["63dbd45917fff4dee40fe16e"];
|
||||
const hallofFame2 = this.instanceManager.database.templates.items["65424185a57eea37ed6562e9"];
|
||||
const hallofFame3 = this.instanceManager.database.templates.items["6542435ea57eea37ed6562f0"];
|
||||
// Add to Hall of Fame filters
|
||||
if (itemConfig.addtoHallOfFame) {
|
||||
const hallOfFames = [hallofFame1, hallofFame2, hallofFame3];
|
||||
for (const hall of hallOfFames) {
|
||||
for (const slot of hall._props.Slots) {
|
||||
for (const filter of slot._props.filters) {
|
||||
if (!filter.Filter.includes(itemId)) {
|
||||
filter.Filter.push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Added item ${itemId} to filter Hall of Fame ${hall._name}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
addtoSpecialSlots(itemConfig, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (itemConfig.addtoSpecialSlots) {
|
||||
const pockets = tables.templates.items["627a4e6b255f7527fb05a0f6"];
|
||||
for (const slot of pockets._props.Slots) {
|
||||
if (!slot._props.filters[0].Filter.includes(itemId)) {
|
||||
slot._props.filters[0].Filter.push(itemId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes the bot inventories based on the given item configuration.
|
||||
*
|
||||
* @param {ConfigItem[string]} itemConfig - The item configuration.
|
||||
* @param {string} finalItemTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processBotInventories(itemConfig, finalItemTplToClone, itemId) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (!itemConfig.addtoBots)
|
||||
return;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("Processing bot inventories for item:", itemId);
|
||||
}
|
||||
// Iterate through bot types
|
||||
for (const botId in tables.bots.types) {
|
||||
const botType = botId;
|
||||
const botInventory = tables.bots.types[botId].inventory;
|
||||
botInventory.Ammo = botInventory.Ammo || {};
|
||||
// Process items and equipment
|
||||
this.processInventoryType(botInventory.items, finalItemTplToClone, itemId, botType, "items");
|
||||
this.processInventoryType(botInventory.equipment, finalItemTplToClone, itemId, botType, "equipment");
|
||||
// Process mods if applicable
|
||||
if (itemConfig.addtoModSlots && itemConfig.modSlot) {
|
||||
this.processBotModSlots(finalItemTplToClone, itemId, botType, itemConfig.modSlot);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes inventory type (items or equipment) and gathers mods based on Slots.
|
||||
*
|
||||
* @param {any} inventoryType - The inventory type to process.
|
||||
* @param {string} finalTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @param {string} typeLabel - Label indicating items or equipment.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processInventoryType(
|
||||
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
||||
inventoryType, finalTplToClone, itemId, botType, typeLabel) {
|
||||
const tables = this.instanceManager.database;
|
||||
if (typeLabel === "equipment" && ((inventoryType.FirstPrimaryWeapon?.[finalTplToClone]) ||
|
||||
(inventoryType.SecondPrimaryWeapon?.[finalTplToClone]) ||
|
||||
(inventoryType.Holster?.[finalTplToClone]))) {
|
||||
if (!this.ensureValidWeaponPreset(itemId)) {
|
||||
return;
|
||||
}
|
||||
this.processAmmoAndChambers(tables.bots.types[botType].inventory, tables.templates.items[itemId]._props, itemId, botType);
|
||||
}
|
||||
for (const lootSlot in inventoryType) {
|
||||
const items = inventoryType[lootSlot];
|
||||
if (items && items[finalTplToClone] !== undefined) {
|
||||
const weight = items[finalTplToClone];
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Adding item to bot ${typeLabel} for bot type: ${botType} in loot slot: ${lootSlot} with weight: ${weight}`);
|
||||
}
|
||||
items[itemId] = weight;
|
||||
this.addModsToItem(tables, itemId, botType);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Adds mods to an item based on its Slots configuration.
|
||||
*
|
||||
* @param {any} tables - The database tables.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
addModsToItem(tables, itemId, botType) {
|
||||
const itemProps = tables.templates.items[itemId]._props;
|
||||
if (itemProps?.Slots) {
|
||||
for (const slot of itemProps.Slots) {
|
||||
const slotName = slot._name;
|
||||
const filters = slot._props.filters;
|
||||
if (filters && filters.length > 0) {
|
||||
for (const filter of filters) {
|
||||
for (const modId of filter.Filter) {
|
||||
if (modId && tables.templates.items[modId]) {
|
||||
tables.bots.types[botType].inventory.mods[itemId] = tables.bots.types[botType].inventory.mods[itemId] || {};
|
||||
tables.bots.types[botType].inventory.mods[itemId][slotName] = tables.bots.types[botType].inventory.mods[itemId][slotName] || [];
|
||||
if (!tables.bots.types[botType].inventory.mods[itemId][slotName].includes(modId)) {
|
||||
tables.bots.types[botType].inventory.mods[itemId][slotName].push(modId);
|
||||
if (tables.templates.items[modId]._props) {
|
||||
if (tables.templates.items[modId]._props.Slots.length > 0) {
|
||||
this.addModsToItem(tables, modId, botType);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added mod ${modId} to ${itemId}'s ${slotName} of bot type ${botType}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes mod slots and adds itemId to specified slots if finalItemTplToClone is present.
|
||||
*
|
||||
* @param {any} mods - The mods inventory.
|
||||
* @param {string} finalItemTplToClone - The final item template to clone.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @param {string[]} modSlots - The list of mod slots to process.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processBotModSlots(finalItemTplToClone, itemId, botType, modSlots) {
|
||||
const mods = this.instanceManager.database.bots.types[botType].inventory.mods;
|
||||
for (const item in mods) {
|
||||
const itemMods = mods[item];
|
||||
for (const modSlot of modSlots) {
|
||||
if (itemMods[modSlot]?.includes(finalItemTplToClone)) {
|
||||
itemMods[modSlot].push(itemId);
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added item ${itemId} to mod slot ${modSlot} for bot type ${botType} in item ${item}`);
|
||||
}
|
||||
// Adding nested mods for the new item
|
||||
this.addModsToItem(this.instanceManager.database, itemId, botType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Processes ammo and chambers, adding calibers and chamber filters if needed.
|
||||
*
|
||||
* @param {any} botInventory - The bot's inventory.
|
||||
* @param {any} itemProps - The properties of the item.
|
||||
* @param {string} itemId - The item ID.
|
||||
* @param {string} botType - The bot type identifier.
|
||||
* @return {void} This function does not return anything.
|
||||
*/
|
||||
processAmmoAndChambers(botInventory, itemProps, itemId, botType) {
|
||||
const ammoCaliber = itemProps.ammoCaliber;
|
||||
if (!ammoCaliber)
|
||||
return;
|
||||
botInventory.Ammo[ammoCaliber] = botInventory.Ammo[ammoCaliber] || {};
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added new caliber ${ammoCaliber} to bot inventory for bot type ${botType}`);
|
||||
}
|
||||
if (itemProps.Chambers) {
|
||||
for (const chamber of itemProps.Chambers) {
|
||||
const filters = chamber._props.filters;
|
||||
if (filters && filters.length > 0) {
|
||||
for (const filter of filters) {
|
||||
for (const filterItem of filter.Filter) {
|
||||
botInventory.Ammo[ammoCaliber][filterItem] = botInventory.Ammo[ammoCaliber][filterItem] || 0;
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Added filter item ${filterItem} to caliber ${ammoCaliber} in bot inventory for bot type ${botType}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Ensures the weapon has a valid preset in the global ItemPresets.
|
||||
*
|
||||
* @param {string} itemId - The item ID.
|
||||
* @return {boolean} True if the weapon has a valid preset, false otherwise.
|
||||
*/
|
||||
ensureValidWeaponPreset(itemId) {
|
||||
const db = this.instanceManager.database;
|
||||
const presets = db.globals.ItemPresets;
|
||||
for (const presetObj of Object.values(presets)) {
|
||||
if (presetObj._items[0]._tpl === itemId) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(` - Valid preset found for item ${itemId}`);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.warn(`No valid preset found for item ${itemId} in globals.ItemPresets`);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
exports.CustomItemService = CustomItemService;
|
||||
//# sourceMappingURL=CustomItemService.js.map
|
||||
10
user/mods/EpicRangeTime-Weapons/src/CustomItemService.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/CustomItemService.js.map
Normal file
File diff suppressed because one or more lines are too long
107
user/mods/EpicRangeTime-Weapons/src/CustomWeaponPresets.js
Normal file
107
user/mods/EpicRangeTime-Weapons/src/CustomWeaponPresets.js
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CustomWeaponPresets = void 0;
|
||||
const WeaponPresets_json_1 = __importDefault(require("../db/CustomWeaponPresets/WeaponPresets.json"));
|
||||
const path = __importStar(require("path"));
|
||||
const modPath = path.normalize(path.join(__dirname, ".."));
|
||||
const weaponPresets = WeaponPresets_json_1.default;
|
||||
class CustomWeaponPresets {
|
||||
Instance;
|
||||
preSptLoad(Instance) {
|
||||
this.Instance = Instance;
|
||||
}
|
||||
postDBLoad() {
|
||||
if (weaponPresets.ItemPresets) {
|
||||
this.addWeaponPresets();
|
||||
this.addWeaponPresetLocales();
|
||||
}
|
||||
else {
|
||||
if (this.Instance.debug) {
|
||||
console.log("CustomWeaponPresets: ItemPresets not found in weaponPresets.json");
|
||||
}
|
||||
}
|
||||
}
|
||||
addWeaponPresets() {
|
||||
for (const preset in weaponPresets.ItemPresets) {
|
||||
this.Instance.database.globals.ItemPresets[preset] = weaponPresets.ItemPresets[preset];
|
||||
}
|
||||
}
|
||||
addWeaponPresetLocales() {
|
||||
const serverLocales = ["ch", "cz", "en", "es", "es-mx", "fr", "ge", "hu", "it", "jp", "kr", "pl", "po", "ru", "sk", "tu"];
|
||||
const addedLocales = {};
|
||||
for (const locale of serverLocales) {
|
||||
let localeFile;
|
||||
try {
|
||||
// Attempt to require the locale file
|
||||
localeFile = require(`${modPath}/db/locales/${locale}.json`);
|
||||
}
|
||||
catch (error) {
|
||||
// Log an error if the file cannot be found, but continue to the next iteration
|
||||
if (this.Instance.debug) {
|
||||
console.error(`Error loading locale file for '${locale}':`, error);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// Proceed with adding locales if the file was successfully loaded
|
||||
if (Object.keys(localeFile).length < 1)
|
||||
continue;
|
||||
for (const currentItem in localeFile) {
|
||||
this.Instance.database.locales.global[locale][currentItem] = localeFile[currentItem];
|
||||
if (!addedLocales[locale])
|
||||
addedLocales[locale] = {};
|
||||
addedLocales[locale][currentItem] = localeFile[currentItem];
|
||||
}
|
||||
}
|
||||
// Placeholders
|
||||
for (const locale of serverLocales) {
|
||||
if (locale === "en")
|
||||
continue;
|
||||
const englishItems = addedLocales["en"];
|
||||
if (!(locale in addedLocales)) {
|
||||
for (const englishItem in englishItems) {
|
||||
if (this.Instance.database.locales.global[locale] && !(englishItem in this.Instance.database.locales.global[locale])) {
|
||||
this.Instance.database.locales.global[locale][englishItem] = englishItems[englishItem];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.CustomWeaponPresets = CustomWeaponPresets;
|
||||
//# sourceMappingURL=CustomWeaponPresets.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "CustomWeaponPresets.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"CustomWeaponPresets.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": "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"
|
||||
}
|
||||
1061
user/mods/EpicRangeTime-Weapons/src/EpicsEdits.js
Normal file
1061
user/mods/EpicRangeTime-Weapons/src/EpicsEdits.js
Normal file
File diff suppressed because it is too large
Load diff
10
user/mods/EpicRangeTime-Weapons/src/EpicsEdits.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/EpicsEdits.js.map
Normal file
File diff suppressed because one or more lines are too long
240
user/mods/EpicRangeTime-Weapons/src/QuestAPI.js
Normal file
240
user/mods/EpicRangeTime-Weapons/src/QuestAPI.js
Normal file
|
|
@ -0,0 +1,240 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.QuestAPI = void 0;
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
const path = __importStar(require("node:path"));
|
||||
const fs = __importStar(require("node:fs"));
|
||||
const LogTextColor_1 = require("C:/snapshot/project/obj/models/spt/logging/LogTextColor");
|
||||
const ConfigTypes_1 = require("C:/snapshot/project/obj/models/enums/ConfigTypes");
|
||||
class QuestAPI {
|
||||
instanceManager;
|
||||
/**
|
||||
* Call inside traders preSptLoad method.
|
||||
*
|
||||
* @param {ILogger} logger Logger
|
||||
* @param {string} mod mod name
|
||||
* @return {void}
|
||||
*/
|
||||
preSptLoad(Instance) {
|
||||
this.instanceManager = Instance;
|
||||
}
|
||||
postDBLoad() {
|
||||
// biome-ignore lint/complexity/useLiteralKeys: <explanation>
|
||||
this.instanceManager.database.globals["QuestZones"] = [];
|
||||
// biome-ignore lint/complexity/useLiteralKeys: <explanation>
|
||||
this.instanceManager.database.globals["FlareZones"] = [];
|
||||
// biome-ignore lint/complexity/useLiteralKeys: <explanation>
|
||||
this.instanceManager.database.globals["BotKillZones"] = [];
|
||||
this.importQuestSideConfig();
|
||||
}
|
||||
/**
|
||||
* Loads all quest files from disk.
|
||||
* \user\mods\WelcomeToTarkov\db\quests\{trader}
|
||||
* \user\mods\WelcomeToTarkov\db\quests\{trader}\locales
|
||||
*
|
||||
* @param {string} trader Trader to load quests for.
|
||||
* @return {any[]} Returns an array of parsed json objects
|
||||
*/
|
||||
loadQuestsFromDirectory(trader) {
|
||||
const jsonQuestFiles = [];
|
||||
const jsonLocaleFiles = [];
|
||||
const jsonImageFiles = [];
|
||||
const questFiles = fs.readdirSync(path.join(this.instanceManager.dbPath, "Quests", trader));
|
||||
const questLocalesFiles = fs.readdirSync(path.join(this.instanceManager.dbPath, "Quests", trader, "locales"));
|
||||
const questImageFiles = fs.readdirSync(path.join(this.instanceManager.dbPath, "Quests", trader, "images"));
|
||||
if (this.instanceManager.debug) {
|
||||
console.log("---------------------------------------------------------");
|
||||
console.log(`Trader: ${trader} quest files:`);
|
||||
console.log(questFiles);
|
||||
console.log(`Trader: ${trader} locale files:`);
|
||||
console.log(questLocalesFiles);
|
||||
console.log(`Trader: ${trader} image files:`);
|
||||
console.log(questImageFiles);
|
||||
console.log("---------------------------------------------------------");
|
||||
}
|
||||
// Load quest data from disk
|
||||
for (const file of questFiles) {
|
||||
const filePath = path.join(this.instanceManager.dbPath, "Quests", trader, file);
|
||||
const itemStats = fs.lstatSync(filePath);
|
||||
let fileContent;
|
||||
if (itemStats.isFile()) {
|
||||
fileContent = fs.readFileSync(filePath, "utf-8");
|
||||
try {
|
||||
const jsonData = JSON.parse(fileContent);
|
||||
jsonQuestFiles.push(jsonData);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error parsing JSON from file ${filePath}: ${error}`);
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Trader: ${trader} quest file path:`);
|
||||
console.log(filePath);
|
||||
}
|
||||
}
|
||||
// Load locale data from disk
|
||||
for (const locale of questLocalesFiles) {
|
||||
const filePath = path.join(this.instanceManager.dbPath.concat(`\/Quests\/${trader}\/locales`), locale);
|
||||
const itemStats = fs.lstatSync(filePath);
|
||||
let fileContent;
|
||||
if (itemStats.isFile()) {
|
||||
fileContent = fs.readFileSync(filePath, "utf-8");
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Trader: ${trader} quest locale file path:`);
|
||||
console.log(filePath);
|
||||
}
|
||||
try {
|
||||
const jsonData = JSON.parse(fileContent);
|
||||
jsonLocaleFiles.push(jsonData);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error parsing JSON from file ${filePath}: ${error}`);
|
||||
}
|
||||
}
|
||||
// Load image paths from disk
|
||||
for (const image of questImageFiles) {
|
||||
const filePath = path.join(this.instanceManager.dbPath.concat(`\/Quests\/${trader}\/images`), image);
|
||||
const itemStats = fs.lstatSync(filePath);
|
||||
if (itemStats.isFile()) {
|
||||
jsonImageFiles.push(filePath);
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(`Trader: ${trader} quest image file path:`);
|
||||
console.log(filePath);
|
||||
}
|
||||
}
|
||||
this.importQuestData(jsonQuestFiles, trader);
|
||||
this.importLocaleData(jsonLocaleFiles, trader);
|
||||
this.importImageData(jsonImageFiles, trader);
|
||||
}
|
||||
/**
|
||||
* Import quest zones.
|
||||
*
|
||||
* @param {QuestZone} questZones Trader to load quests zones for.
|
||||
* @return {void} Returns nothing
|
||||
*/
|
||||
importQuestZones(questZones, trader) {
|
||||
let zones = 0;
|
||||
for (const zone of questZones) {
|
||||
if (this.instanceManager.debug) {
|
||||
console.log(zone);
|
||||
}
|
||||
// biome-ignore lint/complexity/useLiteralKeys: <explanation>
|
||||
this.instanceManager.database.globals["QuestZones"].push(zone);
|
||||
zones++;
|
||||
}
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} Loaded ${zones} quest zones.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
/**
|
||||
* Import Quest data from json files
|
||||
*/
|
||||
importQuestData(jsonQuestFiles, trader) {
|
||||
if (Object.keys(jsonQuestFiles).length < 1) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} No quest files.`, LogTextColor_1.LogTextColor.RED);
|
||||
return;
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} Loading ${Object.keys(jsonQuestFiles).length} quest files.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
// Import quest data to the database
|
||||
let questCount = 0;
|
||||
for (const file of jsonQuestFiles) {
|
||||
for (const quest in file) {
|
||||
this.instanceManager.database.templates.quests[quest] = file[quest];
|
||||
questCount++;
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} Loaded ${questCount} tasks.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Import Quest side data into the config server
|
||||
*/
|
||||
importQuestSideConfig() {
|
||||
const questConfig = this.instanceManager.configServer.getConfig(ConfigTypes_1.ConfigTypes.QUEST);
|
||||
const questSideFile = fs.readFileSync(this.instanceManager.dbPath.concat("/Quests/QuestSideData.json"), "utf-8");
|
||||
const questSideJson = JSON.parse(questSideFile);
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${questSideJson["UsecOnly"]}`, LogTextColor_1.LogTextColor.BLUE);
|
||||
}
|
||||
for (const entry of questSideJson["UsecOnly"]) {
|
||||
questConfig.usecOnlyQuests.push(entry);
|
||||
}
|
||||
for (const entry of questSideJson["BearOnly"]) {
|
||||
questConfig.bearOnlyQuests.push(entry);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Import locale data into the database
|
||||
*/
|
||||
importLocaleData(jsonLocaleFiles, trader) {
|
||||
if (Object.keys(jsonLocaleFiles).length < 1) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} No quest locale files.`, LogTextColor_1.LogTextColor.RED);
|
||||
return;
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} Loading ${Object.keys(jsonLocaleFiles).length} locale files.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
// Import quest locales to the database
|
||||
let localeCount = 0;
|
||||
for (const file of jsonLocaleFiles) {
|
||||
for (const locale in file) {
|
||||
this.instanceManager.database.locales.global["en"][locale] = file[locale];
|
||||
localeCount++;
|
||||
}
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} Loaded ${localeCount} locales.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Set up routes for image data
|
||||
*/
|
||||
importImageData(jsonImageFiles, trader) {
|
||||
let imageCount = 0;
|
||||
for (const imagePath of jsonImageFiles) {
|
||||
this.instanceManager.imageRouter.addRoute(`/files/quest/icon/${path.basename(imagePath, path.extname(imagePath))}`, imagePath);
|
||||
imageCount++;
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] QuestAPI: ${trader} Loaded ${imageCount} images.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.QuestAPI = QuestAPI;
|
||||
//# sourceMappingURL=QuestAPI.js.map
|
||||
10
user/mods/EpicRangeTime-Weapons/src/QuestAPI.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/QuestAPI.js.map
Normal file
File diff suppressed because one or more lines are too long
374
user/mods/EpicRangeTime-Weapons/src/QuestModifier.js
Normal file
374
user/mods/EpicRangeTime-Weapons/src/QuestModifier.js
Normal file
|
|
@ -0,0 +1,374 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.QuestModifier = void 0;
|
||||
class QuestModifier {
|
||||
// Helper method to update items in all AvailableForFinish conditions
|
||||
updateItemsInAllAvailableForFinish(questID, items, type, tables, jsonUtil, debug) {
|
||||
const quest = tables.templates.quests[questID];
|
||||
if (quest) {
|
||||
try {
|
||||
const availableForFinish = quest.conditions.AvailableForFinish;
|
||||
let modified = false;
|
||||
for (const conditionGroup of availableForFinish) {
|
||||
const conditions = conditionGroup.counter.conditions[0];
|
||||
if (type === 'weapon') {
|
||||
const existingWeapons = jsonUtil.clone(conditions.weapon || []);
|
||||
const updatedWeapons = new Set(existingWeapons);
|
||||
for (const weapon of items) {
|
||||
if (!updatedWeapons.has(weapon)) {
|
||||
updatedWeapons.add(weapon);
|
||||
modified = true;
|
||||
if (debug) {
|
||||
console.log(`Added new weapon ${weapon} to AvailableForFinish condition in quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (debug) {
|
||||
console.log(`AvailableForFinish condition in quest ${questID} already has the weapon ${weapon}`);
|
||||
}
|
||||
}
|
||||
if (modified) {
|
||||
conditions.weapon = Array.from(updatedWeapons);
|
||||
if (debug) {
|
||||
console.log(`Modified AvailableForFinish conditions in quest ${questID}:`, conditions.weapon);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type === 'weaponModsInclusive' || type === 'weaponModsExclusive') {
|
||||
const existingWeaponModsInclusive = jsonUtil.clone(conditions.weaponModsInclusive || []);
|
||||
const updatedWeaponModsInclusive = new Set(existingWeaponModsInclusive.flat());
|
||||
for (const weaponModArray of items) {
|
||||
for (const weaponMod of weaponModArray) {
|
||||
if (!updatedWeaponModsInclusive.has(weaponMod)) {
|
||||
updatedWeaponModsInclusive.add(weaponMod);
|
||||
modified = true;
|
||||
if (debug) {
|
||||
console.log(`Added new weapon mod ${weaponMod} to AvailableForFinish condition in quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (debug) {
|
||||
console.log(`AvailableForFinish condition in quest ${questID} already has the weapon mod ${weaponMod}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modified) {
|
||||
conditions.weaponModsInclusive = Array.from(updatedWeaponModsInclusive).map(mod => [mod]);
|
||||
if (debug) {
|
||||
console.log(`Modified AvailableForFinish conditions in quest ${questID}:`, conditions.weaponModsInclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error modifying items in AvailableForFinish conditions for quest ${questID}:`, error);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
// Method to update quest data based on type, optionally push to all AvailableForFinish
|
||||
updateQuestData(questID, items, type, tables, jsonUtil, pushToAllAvailableForFinish, debug, availableForFinishIndex = 0 // New parameter to specify the index
|
||||
) {
|
||||
if (pushToAllAvailableForFinish) {
|
||||
this.updateItemsInAllAvailableForFinish(questID, items, type, tables, jsonUtil, debug);
|
||||
}
|
||||
else {
|
||||
const quest = tables.templates.quests[questID];
|
||||
if (quest) {
|
||||
if (type === 'weapon') {
|
||||
this.updateQuestWeapons(questID, items, tables, jsonUtil, debug, availableForFinishIndex // Pass the index to the helper method
|
||||
);
|
||||
}
|
||||
else if (type === 'weaponModsInclusive' || type === 'weaponModsExclusive') {
|
||||
this.updateQuestWeaponMods(questID, items, tables, jsonUtil, debug, availableForFinishIndex // Pass the index to the helper method
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Method to update weapons in the quest
|
||||
updateQuestWeapons(questID, weapons, tables, jsonUtil, debug, availableForFinishIndex = 0 // New parameter to specify the index
|
||||
) {
|
||||
const quest = tables.templates.quests[questID];
|
||||
if (quest) {
|
||||
try {
|
||||
// Extract existing weapons based on the specified index
|
||||
const existingWeapons = quest.conditions.AvailableForFinish[availableForFinishIndex].counter.conditions[0].weapon;
|
||||
// Clone the existing weapons array
|
||||
const updatedWeapons = jsonUtil.clone(existingWeapons);
|
||||
let modified = false;
|
||||
// Add new weapons if they do not already exist
|
||||
for (const weapon of weapons) {
|
||||
if (!updatedWeapons.includes(weapon)) {
|
||||
updatedWeapons.push(weapon);
|
||||
modified = true;
|
||||
if (debug) {
|
||||
console.log(`Added new weapon ${weapon} to quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (debug) {
|
||||
console.log(`Quest ${questID} already has the weapon ${weapon}`);
|
||||
}
|
||||
}
|
||||
// Only update the quest if modifications were made
|
||||
if (modified) {
|
||||
quest.conditions.AvailableForFinish[availableForFinishIndex].counter.conditions[0].weapon = updatedWeapons;
|
||||
if (debug) {
|
||||
console.log(`Modified quest ${questID}:`, updatedWeapons);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error modifying quest ${questID} weapons:`, error);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
// Method to update weapon mods inclusive in the quest
|
||||
updateQuestWeaponMods(questID, weaponModsInclusive, tables, jsonUtil, debug, availableForFinishIndex = 0 // New parameter to specify the index
|
||||
) {
|
||||
const quest = tables.templates.quests[questID];
|
||||
if (quest) {
|
||||
try {
|
||||
// Extract existing weapon mods inclusive based on the specified index
|
||||
const availableForFinish = quest.conditions.AvailableForFinish;
|
||||
if (availableForFinish.length <= availableForFinishIndex) {
|
||||
console.warn(`Index ${availableForFinishIndex} is out of bounds for AvailableForFinish in quest ${questID}.`);
|
||||
return;
|
||||
}
|
||||
const existingWeaponModsInclusive = availableForFinish[availableForFinishIndex].counter.conditions[0].weaponModsInclusive;
|
||||
// Clone the existing weapon mods inclusive array
|
||||
const updatedWeaponModsInclusive = jsonUtil.clone(existingWeaponModsInclusive);
|
||||
let modified = false;
|
||||
// Add new weapon mods if they do not already exist
|
||||
for (const weaponModArray of weaponModsInclusive) {
|
||||
for (const weaponMod of weaponModArray) {
|
||||
if (!updatedWeaponModsInclusive.flat().includes(weaponMod)) {
|
||||
updatedWeaponModsInclusive.push(weaponModArray);
|
||||
modified = true;
|
||||
if (debug) {
|
||||
console.log(`Added new weapon mod ${weaponMod} to quest ${questID}`);
|
||||
}
|
||||
}
|
||||
else if (debug) {
|
||||
console.log(`Quest ${questID} already has the weapon mod ${weaponMod}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Only update the quest if modifications were made
|
||||
if (modified) {
|
||||
availableForFinish[availableForFinishIndex].counter.conditions[0].weaponModsInclusive = updatedWeaponModsInclusive;
|
||||
if (debug) {
|
||||
console.log(`Modified quest ${questID}:`, updatedWeaponModsInclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error(`Error modifying quest ${questID} weapon mods inclusive:`, error);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.warn(`Quest with ID ${questID} not found.`);
|
||||
}
|
||||
}
|
||||
// Method to modify quests with specific items and updates
|
||||
modifyQuests(tables, jsonUtil, debug) {
|
||||
// Define new items
|
||||
const newSuppressors = [
|
||||
["21592d3fa4a2a0fa07fc5c2e"],
|
||||
["21cc9c10a1749109db74b288"],
|
||||
["ee43d2dd34047cbe88ccf551"],
|
||||
["ba84e1c4ee4d504cb0bdbb0d"],
|
||||
["40c62378fa93a829532ecc5e"],
|
||||
["6d9f22a75064ebb92b3ece1c"],
|
||||
["10a09a7adb949d7516c96c2f"],
|
||||
["ea0407e322d619bdb163795c"],
|
||||
["9f56d67e30b6ee14fbd99821"],
|
||||
["f8e4f114d51be3084526ebdd"],
|
||||
["71da7f0c9145e92bd1022c53"],
|
||||
["6504516826a65f22fcb408bb"],
|
||||
["bd88c49e7facfbf335cbc734"],
|
||||
["46985a823edd7a01b03450ed"],
|
||||
["4129c7c9c0669b718451b168"],
|
||||
["5285550299ccac9d530a7ed1"],
|
||||
["8a25358a28252c3b7fcb7e4a"],
|
||||
["d9c2ce5c957a54390a795cb9"],
|
||||
["f1d4272393162487b5896f2f"],
|
||||
["aac2e5628ec0f31213f1f53b"],
|
||||
["96c3f1dba8c2038398a29d47"],
|
||||
["48b2b70316ee11cd78074149"],
|
||||
["82144d6a0be3285243f60c50"],
|
||||
["0d26a697d357f0ea3f8f9a83"],
|
||||
["1d145684ac5119451eec9699"],
|
||||
["d29f21dabbdb6a8577bd5a4c"],
|
||||
["55d267e876b4709cc2115736"],
|
||||
["b9a6137901c6b1dd27c0c0cd"],
|
||||
["68ecc6afc9baacad535b09b5"],
|
||||
["cc4134b4c122adad37aa342a"],
|
||||
["6efbc3fc36558fb085bbc36e"],
|
||||
["3cc1a01be7839321ab030074"],
|
||||
["f07b843f00a254d10d80ea5a"],
|
||||
["9c8b54c2f8c843fe7ce6c6ca"],
|
||||
["a6a1f3e9ff8c9bddaf8ab5f3"],
|
||||
["21db41fa34f997937c78b9d1"],
|
||||
["0a4fce1b6ffcba383df0def7"],
|
||||
["b02e5f84df2f2f062a309ef9"],
|
||||
["09b44a7e34b49045e3308e58"],
|
||||
["edb383eec77614c936e627ec"],
|
||||
["08ce1f8189bcb4aa4a490d28"],
|
||||
["dfb4f1c3e5b85305c24ed2bc"],
|
||||
["bfa234cc36aac6c9e1190ab1"],
|
||||
["8d28d2b0bc17dad17f09676d"],
|
||||
["a1fd0589018e71233daeb331"],
|
||||
["45b07217916365a3171c079e"],
|
||||
["005ea36cedb4cf3ed6503746"],
|
||||
["34811b81bb2bf7d6ecc8685d"],
|
||||
["9911241c521cf272e28138ab"],
|
||||
["79b662be6504a4c5c58b662e"],
|
||||
["07e6732878542a85411811df"],
|
||||
["67a198d04e36e7c17ead7f55"],
|
||||
["81cae3ac1c35a1f46157c891"],
|
||||
["908aacf3d6a56a7a0d1ade69"],
|
||||
["bf593ba2155d31edd2b421c7"],
|
||||
["d461f4916807b7599b22f284"],
|
||||
["0b33e835730e05c6a996f452"],
|
||||
["24a57da0bf24002c1b8b31d9"],
|
||||
["e37c8df358fdec9a8780ea8c"],
|
||||
["e0070ec5799a2d6228eca115"],
|
||||
["5cc125555c98bf150a4fd068"],
|
||||
["c55bf7b1464db07d86ea62e8"]
|
||||
];
|
||||
const newScopesExcluded = [
|
||||
["5eb8a73e2c5eae1c5118afcb"],
|
||||
["a87b4ff0e4df1af49c4d48b7"],
|
||||
["bf8cf7b9d0f73ce039591c65"],
|
||||
["09f8fed0abd75fbd0f81cd91"],
|
||||
["c3ad313c8108f49a65187daf"],
|
||||
["aad949705aece28fb98b820f"],
|
||||
["08eb2cce6b620c5c8550a0b5"],
|
||||
["cd1f0458b18b79f2da3ad03f"],
|
||||
["f5a80c63c2845fbc7c0c00b0"],
|
||||
["e9341af94ccbdf828aac2ed4"],
|
||||
["1e3c5a570c1c628376877232"],
|
||||
["530c92166b34a8f2c2c96732"],
|
||||
["5518037d5b8964f16bd7fa0b"],
|
||||
["765efc3218305b91ce279f7c"],
|
||||
["86509ab9a719ec35d68335ec"],
|
||||
["427426766389fca83151e49a"],
|
||||
["8e91893cd97979e31dc69ff4"],
|
||||
["ee7de8251099e046b66a27a8"],
|
||||
["98faf3e813c71c69fdc058a6"],
|
||||
["5114ba0ec07b64d2027476c3"],
|
||||
["028cf9570b14453d61753a76"],
|
||||
["0433f01e906bc793e94272dd"],
|
||||
["f4792fb5785c3cbfcd5e8e42"],
|
||||
["6d875b085e791a94448f6373"],
|
||||
["ed3ce625f8d5660361ffaf30"],
|
||||
["96cff8d59fab622a65e41136"],
|
||||
["a9567853f9fc33f38c4180ac"],
|
||||
["51054b0249f56482df575434"],
|
||||
["a1552040390284f58de50a7a"],
|
||||
["797e1ab4422217d7cfe3d299"],
|
||||
["9936df6f6d9d13591df75e06"],
|
||||
["c5042b1c75088ddfc6c196f4"],
|
||||
["4af1cb09ea310f1fcf94d32a"],
|
||||
["12f2d58f76f9629580851b6f"],
|
||||
["3f18b9a4a43e2c071b08179a"],
|
||||
["dd7caf9bd203b146528c8da4"],
|
||||
["36c4b709b7b9465d6e875d35"],
|
||||
["35adebfd2014a2861056138b"],
|
||||
["20c6ee849ac15cb4e31472c9"],
|
||||
["2589a5a2424122404cf3a94c"],
|
||||
["026dfdb287f69c3025f0f728"],
|
||||
["013a6d4ff28f8e4331898d68"]
|
||||
];
|
||||
const new74Us = [
|
||||
"ed05294ed53c0400ae0e8a55"
|
||||
];
|
||||
const newM4s = [
|
||||
"4b81488c78c8a8ac7d37f9b9"
|
||||
];
|
||||
const newBolties = [
|
||||
"0af5f6a5aa9712e11c733fb9"
|
||||
];
|
||||
const newAKs = [
|
||||
"d672109946fe88b803449054",
|
||||
"939c742f7dad852286188029",
|
||||
"627c4fe34b0a558e8a3642a1",
|
||||
"ed05294ed53c0400ae0e8a55",
|
||||
"ffc95b9d143f52202a311820",
|
||||
"3dc691f607ffed3228bf6ca2",
|
||||
"52500592c7109667abb6cbeb"
|
||||
];
|
||||
const newCarbinesandAssaultRifles = [
|
||||
"d672109946fe88b803449054",
|
||||
"939c742f7dad852286188029",
|
||||
"627c4fe34b0a558e8a3642a1",
|
||||
"ed05294ed53c0400ae0e8a55",
|
||||
"ffc95b9d143f52202a311820",
|
||||
"3dc691f607ffed3228bf6ca2",
|
||||
"93bcdfda236122e67c098847",
|
||||
"57f28a7ffb22e277b0234219",
|
||||
"e895575bcd1fa1de36d301b6",
|
||||
"4b81488c78c8a8ac7d37f9b9",
|
||||
"52ce1b65b13e1035808c4fd2",
|
||||
"96f5c38a676e11e13544dfba",
|
||||
"52500592c7109667abb6cbeb"
|
||||
];
|
||||
// Update each quest individually with specific items
|
||||
this.updateQuestData("59c512ad86f7741f0d09de9b", // Punisher 3
|
||||
new74Us, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("61e6e60223374d168a4576a6", // Compensation for damage - wager
|
||||
newAKs, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("64e7b9bffd30422ed03dad38", // Gendarmerie district patrol
|
||||
newCarbinesandAssaultRifles, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc4856986f77454c317bea7", // The Tarkov shooter Part 7
|
||||
newSuppressors, 'weaponModsInclusive', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("59c50c8886f7745fed3193bf", // The Punisher Part 2
|
||||
newSuppressors, 'weaponModsInclusive', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5a27bb8386f7741c770d2d0a", // Wet Job Part 1
|
||||
newSuppressors, 'weaponModsInclusive', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5c0d4c12d09282029f539173", // Peacekeeping mission
|
||||
newM4s, 'weapon', tables, jsonUtil, true, debug, 0);
|
||||
this.updateQuestData("63a9b229813bba58a50c9ee5", // Worst Job in the World
|
||||
newM4s, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5a27bb8386f7741c770d2d0a", // Wet Job Part 1
|
||||
newM4s, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc4776586f774512d07cf05", // The Tarkov shooter Part 1
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc479e586f7747f376c7da3", // The Tarkov shooter Part 2
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc47dbf86f7741ee74e93b9", // The Tarkov shooter Part 3
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc480a686f7741af0342e29", // The Tarkov shooter Part 4
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc4826c86f774106d22d88b", // The Tarkov shooter Part 5
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc4836986f7740c0152911c", // The Tarkov shooter Part 6
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc4856986f77454c317bea7", // The Tarkov shooter Part 7
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc4893c86f774626f5ebf3e", // The Tarkov shooter Part 8
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5c0bde0986f77479cf22c2f8", // A Shooter Born in Heaven
|
||||
newBolties, 'weapon', tables, jsonUtil, true, debug);
|
||||
this.updateQuestData("5c0be13186f7746f016734aa", // Psycho Sniper
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 1);
|
||||
this.updateQuestData("5d25e4ca86f77409dd5cdf2c", // Hunting trip
|
||||
newBolties, 'weapon', tables, jsonUtil, false, debug, 0);
|
||||
this.updateQuestData("5bc4776586f774512d07cf05", // The Tarkov shooter Part 1
|
||||
newScopesExcluded, 'weaponModsExclusive', tables, jsonUtil, false, debug, 0);
|
||||
// Debug output
|
||||
if (debug) {
|
||||
console.log('Updated quests with new items.');
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.QuestModifier = QuestModifier;
|
||||
//# sourceMappingURL=QuestModifier.js.map
|
||||
10
user/mods/EpicRangeTime-Weapons/src/QuestModifier.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/QuestModifier.js.map
Normal file
File diff suppressed because one or more lines are too long
29
user/mods/EpicRangeTime-Weapons/src/RouterService.js
Normal file
29
user/mods/EpicRangeTime-Weapons/src/RouterService.js
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.WTTRouterService = void 0;
|
||||
const LogTextColor_1 = require("C:/snapshot/project/obj/models/spt/logging/LogTextColor");
|
||||
class WTTRouterService {
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
instanceManager;
|
||||
preSptLoad(instance) {
|
||||
this.instanceManager = instance;
|
||||
this.registerQuestZoneRoute();
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] WTTRouter: Initialized and registered routes.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
registerQuestZoneRoute() {
|
||||
this.instanceManager.staticRouter.registerStaticRouter("GetZones", [
|
||||
{
|
||||
url: "/quests/zones/getZones",
|
||||
action: async (url, info, sessionId, output) => {
|
||||
const json = JSON.stringify(this.instanceManager.database.globals["QuestZones"]);
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] WTTRouter: Zones requested by client`, LogTextColor_1.LogTextColor.GREEN);
|
||||
return json;
|
||||
}
|
||||
}
|
||||
], "");
|
||||
}
|
||||
}
|
||||
exports.WTTRouterService = WTTRouterService;
|
||||
//# sourceMappingURL=RouterService.js.map
|
||||
10
user/mods/EpicRangeTime-Weapons/src/RouterService.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/RouterService.js.map
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "RouterService.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"RouterService.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AAAA,0FAAuF;AAIvF,MAAa,gBAAgB;IAEzB,gEAAgE;IACxD,eAAe,CAAqB;IAErC,UAAU,CAAC,QAA4B;QAE1C,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,iDAAiD,EAAE,2BAAY,CAAC,KAAK,CAAC,CAAC;QACvI,CAAC;IACL,CAAC;IAEO,sBAAsB;QAE1B,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,oBAAoB,CAClD,UAAU,EACV;YACI;gBACI,GAAG,EAAE,wBAAwB;gBAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;oBAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CACvB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CACtD,CAAC;oBACF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,wCAAwC,EAAE,2BAAY,CAAC,KAAK,CAAC,CAAC;oBAC9H,OAAO,IAAI,CAAC;gBAChB,CAAC;aACJ;SACJ,EACD,EAAE,CACL,CAAC;IACN,CAAC;CAEJ;AAnCD,4CAmCC"
|
||||
}
|
||||
134
user/mods/EpicRangeTime-Weapons/src/TraderAPI.js
Normal file
134
user/mods/EpicRangeTime-Weapons/src/TraderAPI.js
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.TraderAPI = void 0;
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
const path_1 = __importDefault(require("path"));
|
||||
const fs_1 = __importDefault(require("fs"));
|
||||
const Traders_1 = require("C:/snapshot/project/obj/models/enums/Traders");
|
||||
const ConfigTypes_1 = require("C:/snapshot/project/obj/models/enums/ConfigTypes");
|
||||
const LogTextColor_1 = require("C:/snapshot/project/obj/models/spt/logging/LogTextColor");
|
||||
class TraderAPI {
|
||||
instanceManager;
|
||||
dbPath;
|
||||
preSptLoad(Instance) {
|
||||
this.instanceManager = Instance;
|
||||
this.dbPath = path_1.default.join(this.instanceManager.dbPath, "\/Traders");
|
||||
}
|
||||
postDBLoad() {
|
||||
}
|
||||
/**
|
||||
* Trader to load database for
|
||||
* db/Traders/@param trader/{content}
|
||||
* @returns
|
||||
*/
|
||||
async loadTraderDbRecursive(trader) {
|
||||
const mydb = await this.instanceManager.importerUtil.loadAsync(path_1.default.join(this.dbPath, `\/${trader}\/`));
|
||||
return mydb;
|
||||
}
|
||||
/**
|
||||
* Load base.json for trader
|
||||
* db/Traders/@param trader/@param trader-base.json
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
loadTraderBaseJson(trader) {
|
||||
const file = fs_1.default.readFileSync(path_1.default.join(this.dbPath, `\/${trader}\/${trader}_Base.json`), "utf8");
|
||||
const json = JSON.parse(file);
|
||||
return json;
|
||||
}
|
||||
/**
|
||||
* Load Assort.json for trader
|
||||
* db/Traders/@param trader/@param trader-Assort.json
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
loadTraderAssortJson(trader) {
|
||||
const file = fs_1.default.readFileSync(path_1.default.join(this.dbPath, `\/${trader}\/${trader}_Assort.json`), "utf8");
|
||||
const json = JSON.parse(file);
|
||||
return json;
|
||||
}
|
||||
/**
|
||||
* Load QuestAssort.json for trader
|
||||
* db/Traders/@param trader/@param trader-Assort.json
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
loadTraderQuestAssortJson(trader) {
|
||||
const file = fs_1.default.readFileSync(path_1.default.join(this.dbPath, `\/${trader}\/${trader}_QuestAssort.json`), "utf8");
|
||||
const json = JSON.parse(file);
|
||||
return json;
|
||||
}
|
||||
setupTrader(trader, baseJson) {
|
||||
const traderConfig = this.instanceManager.configServer.getConfig(ConfigTypes_1.ConfigTypes.TRADER);
|
||||
const refreshTimeSecondsMin = 3600;
|
||||
const refreshTimeSecondsMax = 4000;
|
||||
// Add refresh time in seconds to config
|
||||
const traderRefreshRecord = {
|
||||
traderId: baseJson._id,
|
||||
seconds: {
|
||||
min: refreshTimeSecondsMin,
|
||||
max: refreshTimeSecondsMax
|
||||
}
|
||||
};
|
||||
traderConfig.updateTime.push(traderRefreshRecord);
|
||||
this.registerProfileImage(trader, baseJson);
|
||||
Traders_1.Traders[baseJson._id] = baseJson._id;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param mydb traders database
|
||||
* @param trader traders name Ex. "GoblinKing"
|
||||
* @param baseJson traders base.json
|
||||
* @param assortJson traders assort.json
|
||||
* @param questAssortJson Traders quest assort
|
||||
*/
|
||||
addTraderToDb(mydb, trader, baseJson, assortJson, questAssortJson) {
|
||||
this.instanceManager.database.traders[baseJson._id] = {
|
||||
assort: this.instanceManager.jsonUtil.deserialize(this.instanceManager.jsonUtil.serialize(assortJson)),
|
||||
base: JSON.parse(JSON.stringify({ ...baseJson, unlockedByDefault: true })),
|
||||
questassort: JSON.parse(JSON.stringify(questAssortJson))
|
||||
};
|
||||
const ragfairConfig = this.instanceManager.configServer.getConfig(ConfigTypes_1.ConfigTypes.RAGFAIR);
|
||||
ragfairConfig.traders[baseJson._id] = true;
|
||||
const locales = this.instanceManager.database.locales.global;
|
||||
locales.en = {
|
||||
...locales.en,
|
||||
...mydb?.locales?.en
|
||||
};
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] TraderAPI: ${trader} added item locales.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
this.addTraderToLocales(trader, baseJson);
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] TraderAPI: ${trader} successfully added to database.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param trader traders name "GoblinKing"
|
||||
* @param baseJson traders base.json
|
||||
*/
|
||||
addTraderToLocales(trader, baseJson) {
|
||||
const locales = this.instanceManager.database.locales.global;
|
||||
let count = 0;
|
||||
for (const locale in locales) {
|
||||
locales[locale][`${baseJson._id} FullName`] = baseJson.name;
|
||||
locales[locale][`${baseJson._id} FirstName`] = baseJson.firstname;
|
||||
locales[locale][`${baseJson._id} Nickname`] = baseJson.nickname;
|
||||
locales[locale][`${baseJson._id} Location`] = baseJson.location;
|
||||
locales[locale][`${baseJson._id} Description`] = baseJson.description;
|
||||
count++;
|
||||
}
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] TraderAPI: ${trader} loaded ${count} locales`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
registerProfileImage(trader, baseJson) {
|
||||
const imageFilepath = `./${this.instanceManager.preSptModLoader.getModPath(this.instanceManager.modName)}res`;
|
||||
this.instanceManager.imageRouter.addRoute(baseJson.avatar.replace(".png", ""), `${imageFilepath}/${trader}.png`);
|
||||
}
|
||||
}
|
||||
exports.TraderAPI = TraderAPI;
|
||||
//# sourceMappingURL=TraderAPI.js.map
|
||||
10
user/mods/EpicRangeTime-Weapons/src/TraderAPI.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/TraderAPI.js.map
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "TraderAPI.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"TraderAPI.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": "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"
|
||||
}
|
||||
40
user/mods/EpicRangeTime-Weapons/src/Traders/TraderBadger.js
Normal file
40
user/mods/EpicRangeTime-Weapons/src/Traders/TraderBadger.js
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.TraderBadger = void 0;
|
||||
const ConfigTypes_1 = require("C:/snapshot/project/obj/models/enums/ConfigTypes");
|
||||
const LogTextColor_1 = require("C:/snapshot/project/obj/models/spt/logging/LogTextColor");
|
||||
class TraderBadger {
|
||||
mydb;
|
||||
instanceManager;
|
||||
BadgerBaseJson;
|
||||
BadgerAssort;
|
||||
BadgerQuestAssort;
|
||||
/**
|
||||
* Some work needs to be done prior to SPT code being loaded, registering the profile image + setting trader update time inside the trader config json
|
||||
* @param Instance WTTInstanceManager
|
||||
*/
|
||||
preSptLoad(Instance) {
|
||||
this.instanceManager = Instance;
|
||||
this.BadgerBaseJson = this.instanceManager.traderApi.loadTraderBaseJson("bd3a8b28356d9c6509966546");
|
||||
this.BadgerAssort = this.instanceManager.traderApi.loadTraderAssortJson("bd3a8b28356d9c6509966546");
|
||||
this.BadgerQuestAssort = this.instanceManager.traderApi.loadTraderQuestAssortJson("bd3a8b28356d9c6509966546");
|
||||
this.instanceManager.traderApi.setupTrader("bd3a8b28356d9c6509966546", this.BadgerBaseJson);
|
||||
if (this.instanceManager.debug) {
|
||||
this.instanceManager.logger.log(`[${this.instanceManager.modName}] Trader: Badger Active`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Majority of trader-related work occurs after the aki database has been loaded but prior to SPT code being run
|
||||
*/
|
||||
postDBLoad() {
|
||||
this.mydb = this.instanceManager.traderApi.loadTraderDbRecursive("bd3a8b28356d9c6509966546");
|
||||
this.instanceManager.traderApi.addTraderToDb(this.mydb, "bd3a8b28356d9c6509966546", this.BadgerBaseJson, this.BadgerAssort, this.BadgerQuestAssort);
|
||||
//Load quests
|
||||
this.instanceManager.questApi.loadQuestsFromDirectory("bd3a8b28356d9c6509966546");
|
||||
//this.instanceManager.questApi.importQuestZones(BadgerZones, "Badger");
|
||||
const insuranceConfig = this.instanceManager.configServer.getConfig(ConfigTypes_1.ConfigTypes.INSURANCE);
|
||||
insuranceConfig.returnChancePercent["bd3a8b28356d9c6509966546"] = 95;
|
||||
}
|
||||
}
|
||||
exports.TraderBadger = TraderBadger;
|
||||
//# sourceMappingURL=TraderBadger.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "TraderBadger.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"TraderBadger.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AAGA,kFAA+E;AAE/E,0FAAuF;AAEvF,MAAa,YAAY;IAErB,IAAI,CAAM;IACF,eAAe,CAAqB;IACpC,cAAc,CAAC;IACf,YAAY,CAAC;IACb,iBAAiB,CAAC;IAE1B;;;OAGG;IACH,UAAU,CAAC,QAA4B;QAEnC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAEhC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;QACpG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,CAAC;QACpG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,yBAAyB,CAAC,0BAA0B,CAAC,CAAC;QAC9G,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,0BAA0B,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,yBAAyB,EAAE,2BAAY,CAAC,KAAK,CAAC,CAAC;QAC/G,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU;QAEN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,CAAC;QAE7F,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,0BAA0B,EAC9E,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEpE,aAAa;QACb,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,uBAAuB,CAAC,0BAA0B,CAAC,CAAC;QAClF,wEAAwE;QAExE,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAmB,yBAAW,CAAC,SAAS,CAAC,CAAC;QAE7G,eAAe,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,GAAG,EAAE,CAAC;IACzE,CAAC;CACJ;AA3CD,oCA2CC"
|
||||
}
|
||||
109
user/mods/EpicRangeTime-Weapons/src/WTTInstanceManager.js
Normal file
109
user/mods/EpicRangeTime-Weapons/src/WTTInstanceManager.js
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || (function () {
|
||||
var ownKeys = function(o) {
|
||||
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||||
var ar = [];
|
||||
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||||
return ar;
|
||||
};
|
||||
return ownKeys(o);
|
||||
};
|
||||
return function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.WTTInstanceManager = void 0;
|
||||
const path = __importStar(require("node:path"));
|
||||
const RouterService_1 = require("./RouterService");
|
||||
const QuestAPI_1 = require("./QuestAPI");
|
||||
const TraderAPI_1 = require("./TraderAPI");
|
||||
class WTTInstanceManager {
|
||||
//#region Accessible in or after preSptLoad
|
||||
modName;
|
||||
debug;
|
||||
// Useful Paths
|
||||
modPath = path.join(process.cwd(), "\/user\/mods\/EpicRangeTime-Weapons\/");
|
||||
dbPath = path.join(process.cwd(), "\/user\/mods\/EpicRangeTime-Weapons\/db");
|
||||
profilePath = path.join(process.cwd(), "\/user\/profiles");
|
||||
// Instances
|
||||
container;
|
||||
preSptModLoader;
|
||||
configServer;
|
||||
saveServer;
|
||||
itemHelper;
|
||||
logger;
|
||||
staticRouter;
|
||||
dynamicRouter;
|
||||
profileController;
|
||||
profileCallbacks;
|
||||
routerService = new RouterService_1.WTTRouterService();
|
||||
//#endregion
|
||||
//#region Acceessible in or after postDBLoad
|
||||
database;
|
||||
customItem;
|
||||
imageRouter;
|
||||
jsonUtil;
|
||||
profileHelper;
|
||||
eventOutputHolder;
|
||||
ragfairPriceService;
|
||||
importerUtil;
|
||||
traderAssortService;
|
||||
applicationContext;
|
||||
questApi = new QuestAPI_1.QuestAPI();
|
||||
traderApi = new TraderAPI_1.TraderAPI();
|
||||
//#endregion
|
||||
// Call at the start of the mods postDBLoad method
|
||||
preSptLoad(container, mod) {
|
||||
this.modName = mod;
|
||||
this.container = container;
|
||||
this.preSptModLoader = container.resolve("PreSptModLoader");
|
||||
this.imageRouter = container.resolve("ImageRouter");
|
||||
this.configServer = container.resolve("ConfigServer");
|
||||
this.saveServer = container.resolve("SaveServer");
|
||||
this.itemHelper = container.resolve("ItemHelper");
|
||||
this.eventOutputHolder = container.resolve("EventOutputHolder");
|
||||
this.profileController = container.resolve("ProfileController");
|
||||
this.profileCallbacks = container.resolve("ProfileCallbacks");
|
||||
this.logger = container.resolve("WinstonLogger");
|
||||
this.staticRouter = container.resolve("StaticRouterModService");
|
||||
this.dynamicRouter = container.resolve("DynamicRouterModService");
|
||||
this.traderAssortService = container.resolve("TraderAssortService");
|
||||
this.questApi.preSptLoad(this);
|
||||
this.traderApi.preSptLoad(this);
|
||||
this.routerService.preSptLoad(this);
|
||||
}
|
||||
postDBLoad(container) {
|
||||
this.database = container.resolve("DatabaseServer").getTables();
|
||||
this.customItem = container.resolve("CustomItemService");
|
||||
this.jsonUtil = container.resolve("JsonUtil");
|
||||
this.profileHelper = container.resolve("ProfileHelper");
|
||||
this.ragfairPriceService = container.resolve("RagfairPriceService");
|
||||
this.importerUtil = container.resolve("ImporterUtil");
|
||||
this.applicationContext = container.resolve("ApplicationContext");
|
||||
this.traderApi.postDBLoad();
|
||||
this.questApi.postDBLoad();
|
||||
}
|
||||
}
|
||||
exports.WTTInstanceManager = WTTInstanceManager;
|
||||
//# sourceMappingURL=WTTInstanceManager.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "WTTInstanceManager.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"WTTInstanceManager.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": "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"
|
||||
}
|
||||
93
user/mods/EpicRangeTime-Weapons/src/mod.js
Normal file
93
user/mods/EpicRangeTime-Weapons/src/mod.js
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
"use strict";
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const node_fs_1 = __importDefault(require("node:fs"));
|
||||
const node_path_1 = __importDefault(require("node:path"));
|
||||
const LogTextColor_1 = require("C:/snapshot/project/obj/models/spt/logging/LogTextColor");
|
||||
// WTT imports
|
||||
const WTTInstanceManager_1 = require("./WTTInstanceManager");
|
||||
const CustomItemService_1 = require("./CustomItemService");
|
||||
const EpicsEdits_1 = require("./EpicsEdits");
|
||||
const TraderBadger_1 = require("./Traders/TraderBadger");
|
||||
// Custom Trader Assort Items
|
||||
const CustomAssortSchemeService_1 = require("./CustomAssortSchemeService");
|
||||
const CustomWeaponPresets_1 = require("./CustomWeaponPresets");
|
||||
class EpicRangeTimeWeapons {
|
||||
Instance = new WTTInstanceManager_1.WTTInstanceManager();
|
||||
version;
|
||||
modName = "EpicRangeTime-Weapons";
|
||||
config;
|
||||
customItemService = new CustomItemService_1.CustomItemService();
|
||||
epicItemClass = new EpicsEdits_1.epicItemClass();
|
||||
traderBadger = new TraderBadger_1.TraderBadger();
|
||||
customAssortSchemeService = new CustomAssortSchemeService_1.CustomAssortSchemeService();
|
||||
customWeaponPresets = new CustomWeaponPresets_1.CustomWeaponPresets();
|
||||
debug = false;
|
||||
// Anything that needs done on preSptLoad, place here.
|
||||
preSptLoad(container) {
|
||||
// Initialize the instance manager DO NOTHING ELSE BEFORE THIS
|
||||
this.Instance.preSptLoad(container, this.modName);
|
||||
this.Instance.debug = this.debug;
|
||||
// EVERYTHING AFTER HERE MUST USE THE INSTANCE
|
||||
this.getVersionFromJson();
|
||||
this.displayCreditBanner();
|
||||
this.customItemService.preSptLoad(this.Instance);
|
||||
this.epicItemClass.preSptLoad(this.Instance);
|
||||
this.traderBadger.preSptLoad(this.Instance);
|
||||
this.customAssortSchemeService.preSptLoad(this.Instance);
|
||||
this.customWeaponPresets.preSptLoad(this.Instance);
|
||||
}
|
||||
// Anything that needs done on postDBLoad, place here.
|
||||
async postDBLoadAsync(container) {
|
||||
// Initialize the instance manager DO NOTHING ELSE BEFORE THIS
|
||||
this.Instance.postDBLoad(container);
|
||||
// EVERYTHING AFTER HERE MUST USE THE INSTANCE
|
||||
this.epicItemClass.postDBLoad();
|
||||
await this.traderBadger.postDBLoad();
|
||||
this.customItemService.postDBLoad();
|
||||
this.customAssortSchemeService.postDBLoad();
|
||||
this.customWeaponPresets.postDBLoad();
|
||||
this.Instance.logger.log(`[${this.modName}] Database: Loading complete.`, LogTextColor_1.LogTextColor.GREEN);
|
||||
}
|
||||
getVersionFromJson() {
|
||||
const packageJsonPath = node_path_1.default.join(__dirname, "../package.json");
|
||||
node_fs_1.default.readFile(packageJsonPath, "utf-8", (err, data) => {
|
||||
if (err) {
|
||||
console.error("Error reading file:", err);
|
||||
return;
|
||||
}
|
||||
const jsonData = JSON.parse(data);
|
||||
this.version = jsonData.version;
|
||||
});
|
||||
}
|
||||
colorLog(message, color) {
|
||||
const colorCodes = {
|
||||
red: "\x1b[31m",
|
||||
green: "\x1b[32m",
|
||||
yellow: "\x1b[33m",
|
||||
blue: "\x1b[34m",
|
||||
magenta: "\x1b[35m",
|
||||
cyan: "\x1b[36m",
|
||||
white: "\x1b[37m",
|
||||
gray: "\x1b[90m",
|
||||
brightRed: "\x1b[91m",
|
||||
brightGreen: "\x1b[92m",
|
||||
brightYellow: "\x1b[93m",
|
||||
brightBlue: "\x1b[94m",
|
||||
brightMagenta: "\x1b[95m",
|
||||
brightCyan: "\x1b[96m",
|
||||
brightWhite: "\x1b[97m"
|
||||
};
|
||||
const resetCode = "\x1b[0m";
|
||||
const colorCode = colorCodes[color] || "\x1b[37m"; // Default to white if color is invalid.
|
||||
console.log(`${colorCode}${message}${resetCode}`); // Log the colored message here
|
||||
}
|
||||
displayCreditBanner() {
|
||||
this.colorLog(`[${this.modName}] Developers: EpicRangeTime Code Framework: GroovypenguinX - Thank you guys for everything.`, "green");
|
||||
}
|
||||
}
|
||||
module.exports = { mod: new EpicRangeTimeWeapons() };
|
||||
//# sourceMappingURL=mod.js.map
|
||||
10
user/mods/EpicRangeTime-Weapons/src/mod.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/mod.js.map
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "mod.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"mod.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": "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"
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Stashes = exports.inventorySlots = exports.allBotTypes = exports.currencyIDs = exports.traderIDs = void 0;
|
||||
;
|
||||
// Traders and Task related items
|
||||
//#region Enums
|
||||
var traderIDs;
|
||||
(function (traderIDs) {
|
||||
traderIDs["MECHANIC"] = "5a7c2eca46aef81a7ca2145d";
|
||||
traderIDs["SKIER"] = "58330581ace78e27b8b10cee";
|
||||
traderIDs["PEACEKEEPER"] = "5935c25fb3acc3127c3d8cd9";
|
||||
traderIDs["THERAPIST"] = "54cb57776803fa99248b456e";
|
||||
traderIDs["PRAPOR"] = "54cb50c76803fa8b248b4571";
|
||||
traderIDs["JAEGER"] = "5c0647fdd443bc2504c2d371";
|
||||
traderIDs["RAGMAN"] = "5ac3b934156ae10c4430e83c";
|
||||
traderIDs["FENCE"] = "579dc571d53a0658a154fbec";
|
||||
traderIDs["GOBLINKING"] = "GoblinKing";
|
||||
traderIDs["CONDUCTOR"] = "Conductor";
|
||||
traderIDs["COURIER"] = "Courier";
|
||||
traderIDs["CROW"] = "Crow";
|
||||
traderIDs["WOLF"] = "Wolf";
|
||||
traderIDs["JUNKDEALER"] = "JunkDealer";
|
||||
traderIDs["WTTDATABASE"] = "WTTDatabase";
|
||||
traderIDs["BADGER"] = "bd3a8b28356d9c6509966546";
|
||||
})(traderIDs || (exports.traderIDs = traderIDs = {}));
|
||||
var currencyIDs;
|
||||
(function (currencyIDs) {
|
||||
currencyIDs["ROUBLES"] = "5449016a4bdc2d6f028b456f";
|
||||
currencyIDs["EUROS"] = "569668774bdc2da2298b4568";
|
||||
currencyIDs["DOLLARS"] = "5696686a4bdc2da3298b456a";
|
||||
})(currencyIDs || (exports.currencyIDs = currencyIDs = {}));
|
||||
var allBotTypes;
|
||||
(function (allBotTypes) {
|
||||
allBotTypes["ARENAFIGHTER"] = "arenafighter";
|
||||
allBotTypes["ARENAFIGHTEREVENT"] = "arenafighterevent";
|
||||
allBotTypes["ASSAULT"] = "assault";
|
||||
allBotTypes["BEAR"] = "bear";
|
||||
allBotTypes["RESHALA"] = "bossbully";
|
||||
allBotTypes["GLUHAR"] = "bossgluhar";
|
||||
allBotTypes["KILLA"] = "bosskilla";
|
||||
allBotTypes["KNIGHT"] = "bossknight";
|
||||
allBotTypes["SHTURMAN"] = "bosskojaniy";
|
||||
allBotTypes["SANITAR"] = "bosssanitar";
|
||||
allBotTypes["TAGILLA"] = "bosstagilla";
|
||||
allBotTypes["ZRYACHIY"] = "bosszryachiy";
|
||||
allBotTypes["CRAZYASSAULTEVENT"] = "crazyassaultevent";
|
||||
allBotTypes["CURSEDASSAULT"] = "cursedassault";
|
||||
allBotTypes["EXUSEC"] = "exusec";
|
||||
allBotTypes["FOLLOWERBIGPIPE"] = "followerbigpipe";
|
||||
allBotTypes["FOLLOWERBIRDEYE"] = "followerbirdeye";
|
||||
allBotTypes["FOLLOWERRESHALA"] = "followerbully";
|
||||
allBotTypes["FOLLOWERGLUHARASSAULT"] = "followergluharassault";
|
||||
allBotTypes["FOLLOWERGLUHARSCOUT"] = "followergluharscout";
|
||||
allBotTypes["FOLLOWERGLUHARSECURITY"] = "followergluharsecurity";
|
||||
allBotTypes["FOLLOWERGLUHARSNIPER"] = "followergluharsnipe";
|
||||
allBotTypes["FOLLOWERSHTURMAN"] = "followerkojaniy";
|
||||
allBotTypes["FOLLOWERSANITAR"] = "followersanitar";
|
||||
allBotTypes["FOLLOWERTAGILLA"] = "followertagilla";
|
||||
allBotTypes["FOLLOWERZRYACHIY"] = "followerzryachiy";
|
||||
allBotTypes["GIFTER"] = "gifter";
|
||||
allBotTypes["MARKSMAN"] = "marksman";
|
||||
allBotTypes["PMC"] = "pmcbot";
|
||||
allBotTypes["CULTISTPRIEST"] = "sectantpriest";
|
||||
allBotTypes["CULTISTWARRIOR"] = "sectantwarrior";
|
||||
allBotTypes["USEC"] = "usec";
|
||||
})(allBotTypes || (exports.allBotTypes = allBotTypes = {}));
|
||||
var inventorySlots;
|
||||
(function (inventorySlots) {
|
||||
inventorySlots["FirstPrimaryWeapon"] = "55d729c64bdc2d89028b4570";
|
||||
inventorySlots["SecondPrimaryWeapon"] = "55d729d14bdc2d86028b456e";
|
||||
inventorySlots["Holster"] = "55d729d84bdc2de3098b456b";
|
||||
inventorySlots["Scabbard"] = "55d729e34bdc2d1b198b456d";
|
||||
inventorySlots["FaceCover"] = "55d729e84bdc2d8a028b4569";
|
||||
inventorySlots["Headwear"] = "55d729ef4bdc2d3a168b456c";
|
||||
inventorySlots["TacticalVest"] = "55d729f74bdc2d87028b456e";
|
||||
inventorySlots["SecuredContainer"] = "55d72a054bdc2d88028b456e";
|
||||
inventorySlots["Backpack"] = "55d72a104bdc2d89028b4571";
|
||||
inventorySlots["ArmorVest"] = "55d72a194bdc2d86028b456f";
|
||||
inventorySlots["Pockets"] = "55d72a274bdc2de3098b456c";
|
||||
inventorySlots["Earpiece"] = "5665b7164bdc2d144c8b4570";
|
||||
inventorySlots["Dogtag"] = "59f0be1e86f77453be490939";
|
||||
inventorySlots["Eyewear"] = "5a0ad9313f1241000e072755";
|
||||
inventorySlots["ArmBand"] = "5b3f583786f77411d552fb2b";
|
||||
})(inventorySlots || (exports.inventorySlots = inventorySlots = {}));
|
||||
var Stashes;
|
||||
(function (Stashes) {
|
||||
Stashes["LEVEL1"] = "566abbc34bdc2d92178b4576";
|
||||
Stashes["LEVEL2"] = "5811ce572459770cba1a34ea";
|
||||
Stashes["LEVEL3"] = "5811ce662459770f6f490f32";
|
||||
Stashes["LEVEL4"] = "5811ce772459770e9e5f9532";
|
||||
})(Stashes || (exports.Stashes = Stashes = {}));
|
||||
//#endregion
|
||||
//# sourceMappingURL=configConsts.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "configConsts.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"configConsts.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AA4DK,CAAC;AAmCN,iCAAiC;AAEjC,eAAe;AACf,IAAY,SAkBX;AAlBD,WAAY,SAAS;IAEjB,kDAAqC,CAAA;IACrC,+CAAkC,CAAA;IAClC,qDAAwC,CAAA;IACxC,mDAAsC,CAAA;IACtC,gDAAmC,CAAA;IACnC,gDAAmC,CAAA;IACnC,gDAAmC,CAAA;IACnC,+CAAkC,CAAA;IAClC,sCAAyB,CAAA;IACzB,oCAAuB,CAAA;IACvB,gCAAmB,CAAA;IACnB,0BAAa,CAAA;IACb,0BAAa,CAAA;IACb,sCAAyB,CAAA;IACzB,wCAA2B,CAAA;IAC3B,gDAAmC,CAAA;AACvC,CAAC,EAlBW,SAAS,yBAAT,SAAS,QAkBpB;AAED,IAAY,WAKX;AALD,WAAY,WAAW;IAEnB,mDAAoC,CAAA;IACpC,iDAAkC,CAAA;IAClC,mDAAoC,CAAA;AACxC,CAAC,EALW,WAAW,2BAAX,WAAW,QAKtB;AAED,IAAY,WAkCX;AAlCD,WAAY,WAAW;IAEnB,4CAA8B,CAAA;IAC9B,sDAAuC,CAAA;IACvC,kCAAmB,CAAA;IACnB,4BAAa,CAAA;IACb,oCAAqB,CAAA;IACrB,oCAAqB,CAAA;IACrB,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,uCAAwB,CAAA;IACxB,sCAAuB,CAAA;IACvB,sCAAuB,CAAA;IACvB,wCAAyB,CAAA;IACzB,sDAAuC,CAAA;IACvC,8CAA+B,CAAA;IAC/B,gCAAiB,CAAA;IACjB,kDAAmC,CAAA;IACnC,kDAAmC,CAAA;IACnC,gDAAiC,CAAA;IACjC,8DAA+C,CAAA;IAC/C,0DAA2C,CAAA;IAC3C,gEAAiD,CAAA;IACjD,2DAA4C,CAAA;IAC5C,mDAAoC,CAAA;IACpC,kDAAmC,CAAA;IACnC,kDAAmC,CAAA;IACnC,oDAAqC,CAAA;IACrC,gCAAiB,CAAA;IACjB,oCAAqB,CAAA;IACrB,6BAAc,CAAA;IACd,8CAA+B,CAAA;IAC/B,gDAAiC,CAAA;IACjC,4BAAa,CAAA;AACjB,CAAC,EAlCW,WAAW,2BAAX,WAAW,QAkCtB;AAED,IAAY,cAiBX;AAjBD,WAAY,cAAc;IAEtB,iEAA+C,CAAA;IAC/C,kEAAgD,CAAA;IAChD,sDAAoC,CAAA;IACpC,uDAAqC,CAAA;IACrC,wDAAsC,CAAA;IACtC,uDAAqC,CAAA;IACrC,2DAAyC,CAAA;IACzC,+DAA6C,CAAA;IAC7C,uDAAqC,CAAA;IACrC,wDAAsC,CAAA;IACtC,sDAAoC,CAAA;IACpC,uDAAqC,CAAA;IACrC,qDAAmC,CAAA;IACnC,sDAAoC,CAAA;IACpC,sDAAoC,CAAA;AACxC,CAAC,EAjBW,cAAc,8BAAd,cAAc,QAiBzB;AAED,IAAY,OAMX;AAND,WAAY,OAAO;IAEf,8CAAmC,CAAA;IACnC,8CAAmC,CAAA;IACnC,8CAAmC,CAAA;IACnC,8CAAmC,CAAA;AACvC,CAAC,EANW,OAAO,uBAAP,OAAO,QAMlB;AA6BD,YAAY"
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ItemBaseClassMap = void 0;
|
||||
exports.ItemBaseClassMap = {
|
||||
"AMMO": "5485a8684bdc2da71d8b4567",
|
||||
"AMMO_CONTAINER": "543be5cb4bdc2deb348b4568",
|
||||
"ARMORED_EQUIPMENT": "57bef4c42459772e8d35a53b",
|
||||
"ARMBAND": "5b3f15d486f77432d0509248",
|
||||
"ARMOR": "5448e54d4bdc2dcc718b4568",
|
||||
"ARMORPLATE": "644120aa86ffbe10ee032b6f",
|
||||
"ASSAULT_CARBINE": "5447b5fc4bdc2d87278b4567",
|
||||
"ASSAULT_RIFLE": "5447b5f14bdc2d61278b4567",
|
||||
"ASSAULT_SCOPE": "55818add4bdc2d5b648b456f",
|
||||
"BACKPACK": "5448e53e4bdc2d60728b4567",
|
||||
"BARREL": "555ef6e44bdc2de9068b457e",
|
||||
"BATTERY": "57864ee62459775490116fc1",
|
||||
"BIPOD": "55818afb4bdc2dde698b456d",
|
||||
"BUILDING_MATERIAL": "57864ada245977548638de91",
|
||||
"CHARGING_HANDLE": "55818a6f4bdc2db9688b456b",
|
||||
"CHEST_RIG": "5448e5284bdc2dcb718b4567",
|
||||
"COMMON_CONTAINER": "5795f317245977243854e041",
|
||||
"COMPACT_REFLEX_SIGHT": "55818acf4bdc2dde698b456b",
|
||||
"COMPASS": "5f4fbaaca5573a5ac31db429",
|
||||
"DRINK": "5448e8d64bdc2dce718b4568",
|
||||
"DRUG": "5448f3a14bdc2d27728b4569",
|
||||
"ELECTRONICS": "57864a66245977548f04a81f",
|
||||
"FACECOVER": "5a341c4686f77469e155819e",
|
||||
"FLASHLIGHT": "55818b084bdc2d5b648b4571",
|
||||
"FLASHHIDER": "550aa4bf4bdc2dd6348b456b",
|
||||
"FOOD": "5448e8d04bdc2ddf718b4569",
|
||||
"FOREGRIP": "55818af64bdc2d5b648b4570",
|
||||
"FUEL": "5d650c3e815116009f6201d2",
|
||||
"GAS_BLOCK": "56ea9461d2720b67698b456f",
|
||||
"GRENADE_LAUNCHER": "5447bedf4bdc2d87278b4568",
|
||||
"HANDGUN": "5447b5cf4bdc2d65278b4567",
|
||||
"HANDGUARD": "55818a104bdc2db9688b4569",
|
||||
"HEADPHONES": "5645bcb74bdc2ded0b8b4578",
|
||||
"HEADWEAR": "5a341c4086f77401f2541505",
|
||||
"INFO": "5448ecbe4bdc2d60728b4568",
|
||||
"INVENTORY": "55d720f24bdc2d88028b456d",
|
||||
"IRON_SIGHT": "55818ac54bdc2d5b648b456e",
|
||||
"KEYCARD": "5c164d2286f774194c5e69fa",
|
||||
"KEYMECHANICAL": "5c99f98d86f7745c314214b3",
|
||||
"KEY_CARD": "5c164d2286f774194c5e69fa",
|
||||
"KNIFE": "5447e1d04bdc2dff2f8b4567",
|
||||
"LOCKING_CONTAINER": "5671435f4bdc2d96058b4569",
|
||||
"LOOT_CONTAINER": "566965d44bdc2d814c8b4571",
|
||||
"LUBRICANT": "57864e4c24597754843f8723",
|
||||
"MACHINEGUN": "5447bed64bdc2d97278b4568",
|
||||
"MAGAZINE": "5448bc234bdc2d3c308b4569",
|
||||
"MAP": "567849dd4bdc2d150f8b456e",
|
||||
"MARKSMAN_RIFLE": "5447b6194bdc2d67278b4567",
|
||||
"MEDICAL_ITEM": "5448f3ac4bdc2dce718b4569",
|
||||
"MEDICAL_SUPPLIES": "57864c8c245977548867e7f1",
|
||||
"MEDITKIT": "5448f39d4bdc2d0a728b4568",
|
||||
"MONEY": "543be5dd4bdc2deb348b4569",
|
||||
"MUZZLECOMBO": "550aa4dd4bdc2dc9348b4569",
|
||||
"MOUNT": "55818b224bdc2dde698b456f",
|
||||
"NIGHTVISION": "5a2c3a9486f774688b05e574",
|
||||
"OTHER": "590c745b86f7743cc433c5f2",
|
||||
"PISTOLGRIP": "55818a684bdc2ddd698b456d",
|
||||
"POCKETS": "557596e64bdc2dc2118b4571",
|
||||
"PORTABLE_RANGEFINDER": "61605ddea09d851a0a0c1bbc",
|
||||
"RANDOMLOOTCONTAINER": "62f109593b54472778797866",
|
||||
"RECEIVER": "55818a304bdc2db5418b457d",
|
||||
"REFLEX_SIGHT": "55818ad54bdc2ddc698b4569",
|
||||
"REPAIRKITS": "616eb7aea207f41933308f46",
|
||||
"SCOPE": "55818ae44bdc2dde698b456c",
|
||||
"SHOTGUN": "5447b6094bdc2dc3278b4567",
|
||||
"SILENCER": "550aa4cd4bdc2dd8348b456c",
|
||||
"SNIPER_RIFLE": "5447b6254bdc2dc3278b4568",
|
||||
"SPECIAL_ITEM": "5447e0e74bdc2d3c308b4567",
|
||||
"STASH": "566abbb64bdc2d144c8b457d",
|
||||
"STATIONARY_CONT.": "567583764bdc2d98058b456e",
|
||||
"STIMULANT": "5448f3a64bdc2d60728b456a",
|
||||
"STOCK": "55818a594bdc2db9688b456a",
|
||||
"THROWABLE_WEAPON": "543be6564bdc2df4348b4568",
|
||||
"THERMALVISION": "5d21f59b6dbe99052b54ef83",
|
||||
"TOOL": "57864bb7245977548b3b66c2",
|
||||
"UBGL": "55818b014bdc2ddc698b456b",
|
||||
"VIS_OBSERV_DEVICE": "5448e5724bdc2ddf718b4568",
|
||||
};
|
||||
//# sourceMappingURL=itemBaseClasses.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "itemBaseClasses.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"itemBaseClasses.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AAAa,QAAA,gBAAgB,GAAmC;IAC9D,MAAM,EAAE,0BAA0B;IAClC,gBAAgB,EAAE,0BAA0B;IAC5C,mBAAmB,EAAE,0BAA0B;IAC/C,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,0BAA0B;IACnC,YAAY,EAAE,0BAA0B;IACxC,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,eAAe,EAAE,0BAA0B;IAC3C,UAAU,EAAE,0BAA0B;IACtC,QAAQ,EAAE,0BAA0B;IACpC,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,0BAA0B;IACnC,mBAAmB,EAAE,0BAA0B;IAC/C,iBAAiB,EAAE,0BAA0B;IAC7C,WAAW,EAAE,0BAA0B;IACvC,kBAAkB,EAAE,0BAA0B;IAC9C,sBAAsB,EAAE,0BAA0B;IAClD,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,0BAA0B;IACnC,MAAM,EAAE,0BAA0B;IAClC,aAAa,EAAE,0BAA0B;IACzC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,0BAA0B;IACxC,MAAM,EAAE,0BAA0B;IAClC,UAAU,EAAE,0BAA0B;IACtC,MAAM,EAAE,0BAA0B;IAClC,WAAW,EAAE,0BAA0B;IACvC,kBAAkB,EAAE,0BAA0B;IAC9C,SAAS,EAAE,0BAA0B;IACrC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,UAAU,EAAE,0BAA0B;IACtC,MAAM,EAAE,0BAA0B;IAClC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,SAAS,EAAE,0BAA0B;IACrC,eAAe,EAAE,0BAA0B;IAC3C,UAAU,EAAE,0BAA0B;IACtC,OAAO,EAAE,0BAA0B;IACnC,mBAAmB,EAAE,0BAA0B;IAC/C,gBAAgB,EAAE,0BAA0B;IAC5C,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,UAAU,EAAE,0BAA0B;IACtC,KAAK,EAAE,0BAA0B;IACjC,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,kBAAkB,EAAE,0BAA0B;IAC9C,UAAU,EAAE,0BAA0B;IACtC,OAAO,EAAE,0BAA0B;IACnC,aAAa,EAAE,0BAA0B;IACzC,OAAO,EAAE,0BAA0B;IACnC,aAAa,EAAE,0BAA0B;IACzC,OAAO,EAAE,0BAA0B;IACnC,YAAY,EAAE,0BAA0B;IACxC,SAAS,EAAE,0BAA0B;IACrC,sBAAsB,EAAE,0BAA0B;IAClD,qBAAqB,EAAE,0BAA0B;IACjD,UAAU,EAAE,0BAA0B;IACtC,cAAc,EAAE,0BAA0B;IAC1C,YAAY,EAAE,0BAA0B;IACxC,OAAO,EAAE,0BAA0B;IACnC,SAAS,EAAE,0BAA0B;IACrC,UAAU,EAAE,0BAA0B;IACtC,cAAc,EAAE,0BAA0B;IAC1C,cAAc,EAAE,0BAA0B;IAC1C,OAAO,EAAE,0BAA0B;IACnC,kBAAkB,EAAE,0BAA0B;IAC9C,WAAW,EAAE,0BAA0B;IACvC,OAAO,EAAE,0BAA0B;IACnC,kBAAkB,EAAE,0BAA0B;IAC9C,eAAe,EAAE,0BAA0B;IAC3C,MAAM,EAAE,0BAA0B;IAClC,MAAM,EAAE,0BAA0B;IAClC,mBAAmB,EAAE,0BAA0B;CAChD,CAAC"
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ItemHandbookCategoryMap = void 0;
|
||||
exports.ItemHandbookCategoryMap = {
|
||||
"AMMO": "5b47574386f77428ca22b346",
|
||||
"AMMO_BOXES": "5b47574386f77428ca22b33c",
|
||||
"AMMO_ROUNDS": "5b47574386f77428ca22b33b",
|
||||
"BARTER": "5b47574386f77428ca22b33e",
|
||||
"BARTER_BUILDING": "5b47574386f77428ca22b2ee",
|
||||
"BARTER_ELECTRONICS": "5b47574386f77428ca22b2ef",
|
||||
"BARTER_ENERGY": "5b47574386f77428ca22b2ed",
|
||||
"BARTER_FLAMMABLE": "5b47574386f77428ca22b2f2",
|
||||
"BARTER_HOUSEHOLD": "5b47574386f77428ca22b2f0",
|
||||
"BARTER_MEDICAL": "5b47574386f77428ca22b2f3",
|
||||
"BARTER_OTHERS": "5b47574386f77428ca22b2f4",
|
||||
"BARTER_TOOLS": "5b47574386f77428ca22b2f6",
|
||||
"BARTER_VALUABLES": "5b47574386f77428ca22b2f1",
|
||||
"GEAR": "5b47574386f77428ca22b33f",
|
||||
"GEAR_ARMOR": "5b5f701386f774093f2ecf0f",
|
||||
"GEAR_BACKPACKS": "5b5f6f6c86f774093f2ecf0b",
|
||||
"GEAR_CASES": "5b5f6fa186f77409407a7eb7",
|
||||
"GEAR_COMPONENTS": "5b5f704686f77447ec5d76d7",
|
||||
"GEAR_FACECOVERS": "5b47574386f77428ca22b32f",
|
||||
"GEAR_HEADSETS": "5b5f6f3c86f774094242ef87",
|
||||
"GEAR_HEADWEAR": "5b47574386f77428ca22b330",
|
||||
"GEAR_RIGS": "5b5f6f8786f77447ed563642",
|
||||
"GEAR_SECURED": "5b5f6fd286f774093f2ecf0d",
|
||||
"GEAR_VISORS": "5b47574386f77428ca22b331",
|
||||
"INFO": "5b47574386f77428ca22b341",
|
||||
"KEYS": "5b47574386f77428ca22b342",
|
||||
"KEYS_ELECTRONIC": "5c518ed586f774119a772aee",
|
||||
"KEYS_MECHANIC": "5c518ec986f7743b68682ce2",
|
||||
"MAPS": "5b47574386f77428ca22b343",
|
||||
"MEDICAL": "5b47574386f77428ca22b344",
|
||||
"MEDICAL_INJECTORS": "5b47574386f77428ca22b33a",
|
||||
"MEDICAL_INJURY": "5b47574386f77428ca22b339",
|
||||
"MEDICAL_MEDKITS": "5b47574386f77428ca22b338",
|
||||
"MEDICAL_PILLS": "5b47574386f77428ca22b337",
|
||||
"MODS": "5b5f71a686f77447ed5636ab",
|
||||
"MODS_FUNCTIONAL": "5b5f71b386f774093f2ecf11",
|
||||
"MODS_GEAR": "5b5f750686f774093e6cb503",
|
||||
"MODS_VITAL": "5b5f75b986f77447ec5d7710",
|
||||
"MOD_ASSAULT_SCOPE": "5b5f740a86f77447ec5d7706",
|
||||
"MOD_AUX": "5b5f74cc86f77447ec5d770a",
|
||||
"MOD_BARREL": "5b5f75c686f774094242f19f",
|
||||
"MOD_BIPOD": "5b5f71c186f77409407a7ec0",
|
||||
"MOD_CHARGE": "5b5f751486f77447ec5d770c",
|
||||
"MOD_FLASHHIDER": "5b5f724c86f774093f2ecf15",
|
||||
"MOD_FOREGRIP": "5b5f71de86f774093f2ecf13",
|
||||
"MOD_GASBLOCK": "5b5f760586f774093e6cb509",
|
||||
"MOD_HANDGUARD": "5b5f75e486f77447ec5d7712",
|
||||
"MOD_IRON_SIGHT": "5b5f746686f77447ec5d7708",
|
||||
"MOD_LAUNCHER": "5b5f752e86f774093e6cb505",
|
||||
"MOD_LIGHTLASER": "5b5f736886f774094242f193",
|
||||
"MOD_MAGAZINE": "5b5f754a86f774094242f19b",
|
||||
"MOD_MOUNT": "5b5f755f86f77447ec5d770e",
|
||||
"MOD_MICRO_DOT": "5b5f744786f774094242f197",
|
||||
"MOD_MUZZLE": "5b5f724186f77447ed5636ad",
|
||||
"MOD_OPTIC": "5b5f748386f774093e6cb501",
|
||||
"MOD_PISTOLGRIP": "5b5f761f86f774094242f1a1",
|
||||
"MOD_RECEIVER": "5b5f764186f77447ec5d7714",
|
||||
"MOD_SIGHT": "5b5f73ec86f774093e6cb4fd",
|
||||
"MOD_STOCK": "5b5f757486f774093e6cb507",
|
||||
"MOD_SUPPRESSOR": "5b5f731a86f774093e6cb4f9",
|
||||
"MONEY": "5b5f78b786f77447ed5636af",
|
||||
"PROVISIONS": "5b47574386f77428ca22b340",
|
||||
"PROVISIONS_DRINKS": "5b47574386f77428ca22b335",
|
||||
"PROVISIONS_FOOD": "5b47574386f77428ca22b336",
|
||||
"QUEST": "5b619f1a86f77450a702a6f3",
|
||||
"SPEC": "5b47574386f77428ca22b345",
|
||||
"WEAPONS": "5b5f78dc86f77409407a7f8e",
|
||||
"WEAPONS_ASSAULTRIFLES": "5b5f78fc86f77409407a7f90",
|
||||
"WEAPONS_BOLTACTION": "5b5f798886f77447ed5636b5",
|
||||
"WEAPONS_CARBINES": "5b5f78e986f77447ed5636b1",
|
||||
"WEAPONS_DMR": "5b5f791486f774093f2ed3be",
|
||||
"WEAPONS_GL": "5b5f79d186f774093f2ed3c2",
|
||||
"WEAPONS_MG": "5b5f79a486f77409407a7f94",
|
||||
"WEAPONS_MELEE": "5b5f7a0886f77409407a7f96",
|
||||
"WEAPONS_PISTOLS": "5b5f792486f77447ed5636b3",
|
||||
"WEAPONS_SHOTGUNS": "5b5f794b86f77409407a7f92",
|
||||
"WEAPONS_SMG": "5b5f796a86f774093f2ed3c0",
|
||||
"WEAPONS_SPECIAL": "5b5f79eb86f77447ed5636b7",
|
||||
"WEAPONS_THROW": "5b5f7a2386f774093f2ed3c4",
|
||||
};
|
||||
//# sourceMappingURL=itemHandbookCategories.js.map
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "itemHandbookCategories.js",
|
||||
"sourceRoot": "",
|
||||
"sources": [
|
||||
"itemHandbookCategories.ts"
|
||||
],
|
||||
"names": [],
|
||||
"mappings": ";;;AAAa,QAAA,uBAAuB,GAAmC;IACrE,MAAM,EAAE,0BAA0B;IAClC,YAAY,EAAE,0BAA0B;IACxC,aAAa,EAAE,0BAA0B;IACzC,QAAQ,EAAE,0BAA0B;IACpC,iBAAiB,EAAE,0BAA0B;IAC7C,oBAAoB,EAAE,0BAA0B;IAChD,eAAe,EAAE,0BAA0B;IAC3C,kBAAkB,EAAE,0BAA0B;IAC9C,kBAAkB,EAAE,0BAA0B;IAC9C,gBAAgB,EAAE,0BAA0B;IAC5C,eAAe,EAAE,0BAA0B;IAC3C,cAAc,EAAE,0BAA0B;IAC1C,kBAAkB,EAAE,0BAA0B;IAC9C,MAAM,EAAE,0BAA0B;IAClC,YAAY,EAAE,0BAA0B;IACxC,gBAAgB,EAAE,0BAA0B;IAC5C,YAAY,EAAE,0BAA0B;IACxC,iBAAiB,EAAE,0BAA0B;IAC7C,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,eAAe,EAAE,0BAA0B;IAC3C,WAAW,EAAE,0BAA0B;IACvC,cAAc,EAAE,0BAA0B;IAC1C,aAAa,EAAE,0BAA0B;IACzC,MAAM,EAAE,0BAA0B;IAClC,MAAM,EAAE,0BAA0B;IAClC,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,MAAM,EAAE,0BAA0B;IAClC,SAAS,EAAE,0BAA0B;IACrC,mBAAmB,EAAE,0BAA0B;IAC/C,gBAAgB,EAAE,0BAA0B;IAC5C,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;IAC3C,MAAM,EAAE,0BAA0B;IAClC,iBAAiB,EAAE,0BAA0B;IAC7C,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,mBAAmB,EAAE,0BAA0B;IAC/C,SAAS,EAAE,0BAA0B;IACrC,YAAY,EAAE,0BAA0B;IACxC,WAAW,EAAE,0BAA0B;IACvC,YAAY,EAAE,0BAA0B;IACxC,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,cAAc,EAAE,0BAA0B;IAC1C,eAAe,EAAE,0BAA0B;IAC3C,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,WAAW,EAAE,0BAA0B;IACvC,eAAe,EAAE,0BAA0B;IAC3C,YAAY,EAAE,0BAA0B;IACxC,WAAW,EAAE,0BAA0B;IACvC,gBAAgB,EAAE,0BAA0B;IAC5C,cAAc,EAAE,0BAA0B;IAC1C,WAAW,EAAE,0BAA0B;IACvC,WAAW,EAAE,0BAA0B;IACvC,gBAAgB,EAAE,0BAA0B;IAC5C,OAAO,EAAE,0BAA0B;IACnC,YAAY,EAAE,0BAA0B;IACxC,mBAAmB,EAAE,0BAA0B;IAC/C,iBAAiB,EAAE,0BAA0B;IAC7C,OAAO,EAAE,0BAA0B;IACnC,MAAM,EAAE,0BAA0B;IAClC,SAAS,EAAE,0BAA0B;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,oBAAoB,EAAE,0BAA0B;IAChD,kBAAkB,EAAE,0BAA0B;IAC9C,aAAa,EAAE,0BAA0B;IACzC,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,0BAA0B;IACxC,eAAe,EAAE,0BAA0B;IAC3C,iBAAiB,EAAE,0BAA0B;IAC7C,kBAAkB,EAAE,0BAA0B;IAC9C,aAAa,EAAE,0BAA0B;IACzC,iBAAiB,EAAE,0BAA0B;IAC7C,eAAe,EAAE,0BAA0B;CAC5C,CAAC"
|
||||
}
|
||||
2976
user/mods/EpicRangeTime-Weapons/src/references/items.js
Normal file
2976
user/mods/EpicRangeTime-Weapons/src/references/items.js
Normal file
File diff suppressed because it is too large
Load diff
10
user/mods/EpicRangeTime-Weapons/src/references/items.js.map
Normal file
10
user/mods/EpicRangeTime-Weapons/src/references/items.js.map
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +0,0 @@
|
|||
# TheGambler
|
||||
SPT mod
|
||||
https://hub.sp-tarkov.com/files/file/2013-the-gambler-trader/
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
|
||||
{
|
||||
"manifest": []
|
||||
}
|
||||
|
|
@ -1,965 +0,0 @@
|
|||
{
|
||||
// Note: The Config stores all values that are configurable to personal preferences. You can manipulate Mystery Container prices, stock, and odd here
|
||||
// PS: Sorry for the long and ugly file, I will try to make it more readable in the future.
|
||||
|
||||
|
||||
|
||||
// Debug Option: Every Mystery Box opening will post its item information in the console before opening.
|
||||
// This option is extremely verbose and will clutter your console with info
|
||||
//
|
||||
"debug": false, // Default is false
|
||||
|
||||
// Custom Trader Settings
|
||||
//
|
||||
// Trader Refresh time In Seconds. Trader will refresh inventory stock somewhere between Min-Max seconds .
|
||||
"trader_update_min_time": 3600, // 3600 Seconds
|
||||
"trader_update_max_time": 4000, // 4000 Seconds
|
||||
|
||||
// Custom Gambling Price And Stock Settings
|
||||
//
|
||||
// Setting Price_Multiplier for example to 1.20 will make all mystery containers 20% more expensive. Setting it to 0.80 will make all mystery containers 20% cheaper.
|
||||
// this is meant as a quick and easy way to make all containers more expensive or cheaper if you wish. individual container prices can be changed below...
|
||||
"price_multiplier": 1.0,
|
||||
|
||||
// All Mystery Container individual settings: price, stock, ... etc
|
||||
// Configuarable Options:
|
||||
// - container_enable:
|
||||
// - If false, mystery box will be disabled, and NOT be sold by the trader
|
||||
//
|
||||
// - container_manual_pricing:
|
||||
// - If true, the 'container_price' option will be used as the price of the Mystery Container, if false, the Automatic Price Balancer will
|
||||
// determine the price of the Mystery Container based on the 'container_profit_percentage' option, odds, and flea price of all rewards.
|
||||
//
|
||||
// - container_price:
|
||||
// - The price of the Mystery Container ONLY if 'container_manual_pricing' is set to true, will be overridden by the Automatic Price Balancer if false
|
||||
//
|
||||
// - container_unlimited_stock:
|
||||
// - If false, the container stock will be limited to the value of 'container_stock' option. if true, the container will have unlimited stock
|
||||
//
|
||||
// - container_stock:
|
||||
// - Amount of mystery containers available for purchase, only used if container_unlimited_stock is set to false
|
||||
//
|
||||
// - container_rewards_found_in_raid_status:
|
||||
// - If true, the rewards in the Mystery Container will have the found in raid status. If false, rewards will NOT have the found in raid status
|
||||
//
|
||||
"container_config": {
|
||||
// Mystery Wallet
|
||||
"wallet_enable": true,
|
||||
"wallet_manual_pricing": false,
|
||||
"wallet_price": 100000,
|
||||
"wallet_unlimited_stock": true,
|
||||
"wallet_stock": 50,
|
||||
"wallet_rewards_found_in_raid_status": true,
|
||||
|
||||
// 100k Coin Flip
|
||||
"100k_enable": true,
|
||||
"100k_manual_pricing": false,
|
||||
"100k_price": 100000,
|
||||
"100k_unlimited_stock": true,
|
||||
"100k_stock": 50,
|
||||
"100k_rewards_found_in_raid_status": true,
|
||||
|
||||
// 500k Coin Flip
|
||||
"500k_enable": true,
|
||||
"500k_manual_pricing": false,
|
||||
"500k_price": 500000,
|
||||
"500k_unlimited_stock": true,
|
||||
"500k_stock": 50,
|
||||
"500k_rewards_found_in_raid_status": true,
|
||||
|
||||
// 1 Million Coin Flip
|
||||
"1mil_enable": true,
|
||||
"1mil_manual_pricing": false,
|
||||
"1mil_price": 1000000,
|
||||
"1mil_unlimited_stock": true,
|
||||
"1mil_stock": 50,
|
||||
"1mil_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Key
|
||||
"key_enable": true,
|
||||
"key_manual_pricing": false,
|
||||
"key_price": 250000,
|
||||
"key_unlimited_stock": true,
|
||||
"key_stock": 20,
|
||||
"key_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Stimulant
|
||||
"stim_enable": true,
|
||||
"stim_manual_pricing": false,
|
||||
"stim_price": 36500,
|
||||
"stim_unlimited_stock": true,
|
||||
"stim_stock": 10,
|
||||
"stim_found_in_raid_status": true,
|
||||
|
||||
// Mystery Medical Kit
|
||||
"medical_enable": true,
|
||||
"medical_manual_pricing": false,
|
||||
"medical_price": 60000,
|
||||
"medical_unlimited_stock": false,
|
||||
"medical_stock": 1,
|
||||
"medical_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Food
|
||||
"food_enable": true,
|
||||
"food_manual_pricing": false,
|
||||
"food_price": 33000,
|
||||
"food_unlimited_stock": true,
|
||||
"food_stock": 50,
|
||||
"food_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Bitcoin
|
||||
"bitcoin_enable": true,
|
||||
"bitcoin_unlimited_stock": true,
|
||||
"bitcoin_stock": 20,
|
||||
"bitcoin_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery GP Coin
|
||||
"gpcoin_enable": true,
|
||||
"gpcoin_unlimited_stock": true,
|
||||
"gpcoin_stock": 20,
|
||||
"gpcoin_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Keycard
|
||||
"keycard_enable": true,
|
||||
"keycard_manual_pricing": false,
|
||||
"keycard_price": 330000,
|
||||
"keycard_unlimited_stock": true,
|
||||
"keycard_stock": 30,
|
||||
"keycard_rewards_found_in_raid_status": true,
|
||||
|
||||
// 50/50 Case
|
||||
"fiftyfifty_enable": true,
|
||||
"fiftyfifty_manual_pricing": true,
|
||||
"fiftyfifty_price": 2500000,
|
||||
"fiftyfifty_unlimited_stock": true,
|
||||
"fiftyfifty_stock": 5,
|
||||
"fiftyfifty_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Melee
|
||||
"melee_enable": true,
|
||||
"melee_manual_pricing": false,
|
||||
"melee_price": 78500,
|
||||
"melee_unlimited_stock": true,
|
||||
"melee_stock": 50,
|
||||
"melee_rewards_found_in_raid_status": true,
|
||||
|
||||
// Weapon Mystery Box
|
||||
"weapon_enable": true,
|
||||
"weapon_manual_pricing": false,
|
||||
"weapon_price": 150000,
|
||||
"weapon_unlimited_stock": true,
|
||||
"weapon_stock": 30,
|
||||
"weapon_rewards_found_in_raid_status": false,
|
||||
|
||||
/* DOES NOTHING
|
||||
// default_weapon Mystery Box
|
||||
"default_weapon_enable": true,
|
||||
"default_weapon_manual_pricing": false,
|
||||
"default_weapon_price": 150000,
|
||||
"default_weapon_unlimited_stock": true,
|
||||
"default_weapon_stock": 999,
|
||||
"default_weapon_rewards_found_in_raid_status": false,
|
||||
|
||||
// average_weapon Mystery Box
|
||||
"average_weapon_enable": true,
|
||||
"average_weapon_manual_pricing": false,
|
||||
"average_weapon_price": 150000,
|
||||
"average_weapon_unlimited_stock": true,
|
||||
"average_weapon_stock": 999,
|
||||
"average_weapon_rewards_found_in_raid_status": false,
|
||||
*/
|
||||
|
||||
// Premium Weapon Mystery Box
|
||||
"premium_weapon_enable": true,
|
||||
"premium_weapon_manual_pricing": false,
|
||||
"premium_weapon_price": 245000,
|
||||
"premium_weapon_unlimited_stock": false,
|
||||
"premium_weapon_stock": 15,
|
||||
"premium_weapon_rewards_found_in_raid_status": false,
|
||||
|
||||
// Mystery Helmet
|
||||
"helmet_enable": true,
|
||||
"helmet_manual_pricing": false,
|
||||
"helmet_price": 65000,
|
||||
"helmet_unlimited_stock": true,
|
||||
"helmet_stock": 25,
|
||||
"helmet_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Headset
|
||||
"headset_enable": true,
|
||||
"headset_manual_pricing": false,
|
||||
"headset_price": 55000,
|
||||
"headset_unlimited_stock": true,
|
||||
"headset_stock": 25,
|
||||
"headset_rewards_found_in_raid_status": true,
|
||||
|
||||
// Armor Mystery Box
|
||||
"armor_enable": true,
|
||||
"armor_manual_pricing": false,
|
||||
"armor_price": 115000,
|
||||
"armor_unlimited_stock": true,
|
||||
"armor_stock": 25,
|
||||
"armor_rewards_found_in_raid_status": true,
|
||||
|
||||
// Premium Armor Mystery Box
|
||||
"premium_armor_enable": true,
|
||||
"premium_armor_manual_pricing": false,
|
||||
"premium_armor_price": 375000,
|
||||
"premium_armor_unlimited_stock": false,
|
||||
"premium_armor_stock": 10,
|
||||
"premium_armor_rewards_found_in_raid_status": true,
|
||||
|
||||
// Sealed Weapon Case
|
||||
"sealed_enable": true,
|
||||
"sealed_manual_pricing": true,
|
||||
"sealed_price": 350000,
|
||||
"sealed_unlimited_stock": false,
|
||||
"sealed_stock": 3,
|
||||
"sealed_rewards_found_in_raid_status": true,
|
||||
|
||||
// Backpack Mystery Bag
|
||||
"backpack_enable": true,
|
||||
"backpack_manual_pricing": false,
|
||||
"backpack_price": 45000,
|
||||
"backpack_unlimited_stock": true,
|
||||
"backpack_stock": 25,
|
||||
"backpack_rewards_found_in_raid_status": true,
|
||||
|
||||
// Mystery Loadout
|
||||
"loadout_enable": true,
|
||||
"loadout_manual_pricing": true,
|
||||
"loadout_price": 400000,
|
||||
"loadout_unlimited_stock": true,
|
||||
"loadout_stock": 15,
|
||||
"loadout_rewards_found_in_raid_status": false,
|
||||
|
||||
// Premium Mystery premium_loadout
|
||||
"premium_loadout_enable": true,
|
||||
"premium_loadout_manual_pricing": true,
|
||||
"premium_loadout_price": 650000,
|
||||
"premium_loadout_unlimited_stock": true,
|
||||
"premium_loadout_stock": 10,
|
||||
"premium_loadout_rewards_found_in_raid_status": false,
|
||||
|
||||
// Tactical Rig Mystery Box
|
||||
"rig_enable": true,
|
||||
"rig_manual_pricing": false,
|
||||
"rig_price": 45000,
|
||||
"rig_unlimited_stock": true,
|
||||
"rig_stock": 15,
|
||||
"rig_rewards_found_in_raid_status": true,
|
||||
|
||||
// All Mystery Ammo Container settings
|
||||
//
|
||||
//
|
||||
//
|
||||
"all_ammo_enable": true, // This will enable or disable trader from selling all Mystery Ammo containers
|
||||
"all_ammo_rewards_found_in_raid_status": true, // found in raid status of all Mystery Ammo containers
|
||||
|
||||
// Mystery 7.62x25
|
||||
"7.62x25_enable": false,
|
||||
"7.62x25_manual_pricing": false,
|
||||
"7.62x25_price": 6000,
|
||||
"7.62x25_unlimited_stock": false,
|
||||
"7.62x25_stock": 15,
|
||||
|
||||
// Mystery 9x18
|
||||
"9x18_enable": true,
|
||||
"9x18_manual_pricing": false,
|
||||
"9x18_price": 6000,
|
||||
"9x18_unlimited_stock": false,
|
||||
"9x18_stock": 15,
|
||||
|
||||
// Mystery 9x19
|
||||
"9x19_enable": true,
|
||||
"9x19_manual_pricing": false,
|
||||
"9x19_price": 9000,
|
||||
"9x19_unlimited_stock": false,
|
||||
"9x19_stock": 15,
|
||||
|
||||
// Mystery 9x21
|
||||
"9x21_enable": true,
|
||||
"9x21_manual_pricing": false,
|
||||
"9x21_price": 10000,
|
||||
"9x21_unlimited_stock": false,
|
||||
"9x21_stock": 15,
|
||||
|
||||
// Mystery .357
|
||||
".357_enable": true,
|
||||
".357_manual_pricing": false,
|
||||
".357_price": 5000,
|
||||
".357_unlimited_stock": false,
|
||||
".357_stock": 15,
|
||||
|
||||
// Mystery .45_ACP
|
||||
".45_enable": true,
|
||||
".45_manual_pricing": false,
|
||||
".45_price": 8000,
|
||||
".45_unlimited_stock": false,
|
||||
".45_stock": 15,
|
||||
|
||||
// Mystery 4.6x30
|
||||
"4.6x30_enable": true,
|
||||
"4.6x30_manual_pricing": false,
|
||||
"4.6x30_price": 9000,
|
||||
"4.6x30_unlimited_stock": false,
|
||||
"4.6x30_stock": 15,
|
||||
|
||||
// Mystery 5.7x28
|
||||
"5.7x28_enable": true,
|
||||
"5.7x28_manual_pricing": false,
|
||||
"5.7x28_price": 10000,
|
||||
"5.7x28_unlimited_stock": false,
|
||||
"5.7x28_stock": 15,
|
||||
|
||||
// Mystery 5.45x39
|
||||
"5.45x39_enable": true,
|
||||
"5.45x39_manual_pricing": false,
|
||||
"5.45x39_price": 10500,
|
||||
"5.45x39_unlimited_stock": false,
|
||||
"5.45x39_stock": 15,
|
||||
|
||||
// Mystery 5.56x45
|
||||
"5.56x45_enable": true,
|
||||
"5.56x45_manual_pricing": false,
|
||||
"5.56x45_price": 15000,
|
||||
"5.56x45_unlimited_stock": false,
|
||||
"5.56x45_stock": 15,
|
||||
|
||||
// Mystery .300_Blackout
|
||||
".300_enable": true,
|
||||
".300_manual_pricing": false,
|
||||
".300_price": 14000,
|
||||
".300_unlimited_stock": false,
|
||||
".300_stock": 15,
|
||||
|
||||
// Mystery 7.62x39
|
||||
"7.62x39_enable": true,
|
||||
"7.62x39_manual_pricing": false,
|
||||
"7.62x39_price": 15000,
|
||||
"7.62x39_unlimited_stock": false,
|
||||
"7.62x39_stock": 15,
|
||||
|
||||
// Mystery 7.62x51
|
||||
"7.62x51_enable": true,
|
||||
"7.62x51_manual_pricing": false,
|
||||
"7.62x51_price": 16000,
|
||||
"7.62x51_unlimited_stock": false,
|
||||
"7.62x51_stock": 15,
|
||||
|
||||
// Mystery 7.62x54
|
||||
"7.62x54_enable": true,
|
||||
"7.62x54_manual_pricing": false,
|
||||
"7.62x54_price": 19000,
|
||||
"7.62x54_unlimited_stock": false,
|
||||
"7.62x54_stock": 15,
|
||||
|
||||
// Mystery 9x39
|
||||
".338_enable": true,
|
||||
".338_manual_pricing": false,
|
||||
".338_price": 50000,
|
||||
".338_unlimited_stock": false,
|
||||
".338_stock": 8,
|
||||
|
||||
// Mystery 9x39
|
||||
"9x39_enable": true,
|
||||
"9x39_manual_pricing": false,
|
||||
"9x39_price": 13000,
|
||||
"9x39_unlimited_stock": false,
|
||||
"9x39_stock": 15,
|
||||
|
||||
// Mystery .366
|
||||
".366_enable": true,
|
||||
".366_manual_pricing": false,
|
||||
".366_price": 6000,
|
||||
".366_unlimited_stock": false,
|
||||
".366_stock": 15,
|
||||
|
||||
// Mystery 12.7x55
|
||||
"12.7x55_enable": true,
|
||||
"12.7x55_manual_pricing": false,
|
||||
"12.7x55_price": 16000,
|
||||
"12.7x55_unlimited_stock": false,
|
||||
"12.7x55_stock": 15,
|
||||
|
||||
// Mystery 12/70
|
||||
"12/70_enable": true,
|
||||
"12/70_manual_pricing": false,
|
||||
"12/70_price": 6000,
|
||||
"12/70_unlimited_stock": false,
|
||||
"12/70_stock": 15,
|
||||
|
||||
// Mystery 20/70
|
||||
"20/70_enable": true,
|
||||
"20/70_manual_pricing": false,
|
||||
"20/70_price": 6000,
|
||||
"20/70_unlimited_stock": false,
|
||||
"20/70_stock": 15,
|
||||
|
||||
// Mystery 23x75
|
||||
"23x75_enable": true,
|
||||
"23x75_manual_pricing": false,
|
||||
"23x75_price": 7000,
|
||||
"23x75_unlimited_stock": false,
|
||||
"23x75_stock": 10
|
||||
},
|
||||
|
||||
// GAMBLING ODDS SECTION
|
||||
//
|
||||
// README:
|
||||
// - Each Mystery Container has odds that you can manipulate yourself if you so choose.
|
||||
//
|
||||
// Example: (This is not the Mystery Wallet actual odds, just an example)
|
||||
// 'Mystery Wallet' Odds: 0.5 + 2.5 + 4.0 + 8.0 + 15.0 + 35.0 + 0 = 65% chance at recieving a reward!
|
||||
// 100.0% - 65.0% = 35% chance at recieving nothing!
|
||||
//
|
||||
// - Keep in mind this applies to ALL mystery containers
|
||||
//
|
||||
//
|
||||
// Odds Definitions:
|
||||
// - container_profit_percentage:
|
||||
// - This is how profitable the mystery container will be, and is used as a calculation by the Automatic Price Balancer when determining the mystery container price.
|
||||
// - The higher the percentage, the more expensive and less profitable the container will be, and vice versa. setting it to 1.0 will make the container in theory average out to 0% profit or break even. This however does not account for the flea market fee. So in reality, around 0.98-0.96 is the break even point.
|
||||
//
|
||||
// - container_extremely_rare / container_rare / container_uncommon / container_common / container_extra_common / container_base:
|
||||
// - Theses are the odds for each rarity of a mystery container, increasing or decreasing odds will alter the mystery container price generation and the the chances at recieving a reward of that rarity.
|
||||
// - If you manually change these values, make sure the total odds for each container DON'T go over 100%, anything under 100% will result in a chance at recieving nothing.
|
||||
// - Manipulating the odds values will also alter the generated mystery container price
|
||||
//
|
||||
// - ammo_min: (Whole numbers only, no decimals)
|
||||
// - The minimum amount of rounds generated during a mystery ammo opening, is also used as a calculation by the Automatic Price Balancer when determining the mystery ammo price
|
||||
// - ammo_max: (Whole numbers only, no decimals)
|
||||
// - The maximum amount of rounds generated during a mystery ammo opening, is also used as a calculation by the Automatic Price Balancer when determining the mystery ammo price
|
||||
//
|
||||
//
|
||||
// Loadout Mystery Container Odds:
|
||||
// - Currently the Mystery Loadout Container uses many of the below containers to generate a loadout, so manipulating any of these odds will also manipulate the loadout container generation in some way.
|
||||
// I plan on changing this in the future to have more specific odds for the loadout container, but for now, this is how it works.
|
||||
//
|
||||
//
|
||||
"odds": {
|
||||
// Mystery Wallet
|
||||
// Chance for each possibility in percentage from rarest to most common
|
||||
"wallet_kinda_rare": 2.5, // 2 Million Roubles
|
||||
"wallet_rare": 5.0, // 1 Million Roubles
|
||||
"wallet_extra_uncommon": 7.5, // 500k Roubles
|
||||
"wallet_more_uncommon": 10.0, // 250k Roubles
|
||||
"wallet_uncommon": 15.0, // 100k Roubles
|
||||
"wallet_common": 20.0, // 50k Roubles
|
||||
"wallet_extra_common": 20.0, // 25K Roubles
|
||||
"wallet_base": 20.0, // 0k Roubles
|
||||
"wallet_profit_percentage": 0.95, //Container Profitability
|
||||
|
||||
// 100k Coin Flip
|
||||
"100k_success": 50.0, // 200K Roubles
|
||||
"100k_failure": 50.0, // 0 Roubles
|
||||
|
||||
// 500k Coin Flip
|
||||
"500k_success": 50.0, // 1 Million Roubles
|
||||
"500k_failure": 50.0, // 0 Roubles
|
||||
|
||||
// 1 Million Coin Flip
|
||||
"1mil_success": 50.0, // 2 Million Roubles
|
||||
"1mil_failure": 50.0, // 0 Roubles
|
||||
|
||||
// Mystery Keycard
|
||||
"keycard_red": 0.1, // Red Keycard
|
||||
"keycard_green": 0.2, // Green Keycard
|
||||
"keycard_blue": 0.4, // Blue Keycard
|
||||
"keycard_violet": 1.0, // Violet Keycard
|
||||
"keycard_black": 2.0, // Black Keycard
|
||||
"keycard_yellow": 3.0, // Yellow Keycard
|
||||
"keycard_blue_marking": 4.0, // Keycard with blue marking
|
||||
"keycard_21WS": 8.0, // 21WS Keycard
|
||||
"keycard_11SR": 8.0, // 11SR Keycard
|
||||
"keycard_access": 40.0, // Access Keycard
|
||||
"keycard_profit_percentage": 0.93, // Container Profitability
|
||||
|
||||
|
||||
// Mystery Key
|
||||
"key_extremely_rare": 0.5, // Extremely Rare Key
|
||||
"key_rare": 2.5, // Rare Key
|
||||
"key_uncommon": 24.5, // Uncommon Key
|
||||
"key_common": 72.5, // Common Key
|
||||
"key_profit_percentage": 0.93,// Container Profitability
|
||||
|
||||
// Mystery Stimulant
|
||||
"stim_extremely_rare": 10.0, // Extremely Rare Key
|
||||
"stim_rare": 15.0, // Rare Stim
|
||||
"stim_uncommon": 25.0, // Uncommon Stim
|
||||
"stim_common": 50.0, // Common Stim
|
||||
"stim_profit_percentage": 0.93,// Container Profitability
|
||||
|
||||
// Mystery Medical Box
|
||||
"medical_rare": 12.0, // Rare Meds
|
||||
"medical_uncommon": 30.0, // Uncommon Meds
|
||||
"medical_common": 58.0, // Common Meds
|
||||
"medical_profit_percentage": 1.00,// Container Profitability DOESN'T WORK AS THIS CONTAINER IS BOUGHT BY BARTER
|
||||
|
||||
// Mystery Food
|
||||
"food_rare": 5.0, // Rare Food
|
||||
"food_uncommon": 35.0, // Uncommon Food
|
||||
"food_common": 60.0, // Common Food
|
||||
"food_profit_percentage": 0.88,// Container Profitability
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The following odds are for the Mystery Loadout Generation
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
// Loadout Grenade
|
||||
// Chance for receiving Grenade with loadout
|
||||
"loadout_grenade_rare": 30.0, // Rare Loadout Grenade supply
|
||||
"loadout_grenade_uncommon": 40.0, // Uncommon Loadout Grenade supply
|
||||
"loadout_grenade_common": 30.0, // Common Loadout Grenade supply
|
||||
|
||||
// Loadout facecovers
|
||||
// Chance for receiving facecover with loadout
|
||||
"loadout_facecovers_rare": 30.0, // Rare Loadout facecover supply
|
||||
"loadout_facecovers_uncommon": 40.0, // Uncommon Loadout facecover supply
|
||||
"loadout_facecovers_common": 30.0, // Common Loadout facecover supply
|
||||
|
||||
// Loadout Food
|
||||
// Chance for receiving food with loadout
|
||||
"loadout_food_rare": 30.0, // Rare Loadout Food supply
|
||||
"loadout_food_uncommon": 40.0, // Uncommon Loadout Food supply
|
||||
"loadout_food_common": 30.0, // Common Loadout Food supply
|
||||
|
||||
// Loadout Drink
|
||||
// Chance for receiving drink with loadout
|
||||
"loadout_drink_rare": 30.0, // Rare Loadout Drink supply
|
||||
"loadout_drink_uncommon": 40.0, // Uncommon Loadout Drink supply
|
||||
"loadout_drink_common": 30.0, // Common Loadout Drink supply
|
||||
|
||||
// Loadout Light Bleed
|
||||
"loadout_light_bleed_rare": 30, // Rare Loadout Light Bleed supply
|
||||
"loadout_light_bleed_uncommon": 40, // Uncommon Loadout Light Bleed supply
|
||||
"loadout_light_bleed_common": 30, // Common Loadout Light Bleed supply
|
||||
|
||||
// Loadout Heavy Bleed
|
||||
"loadout_heavy_bleed_rare": 30, // Rare Loadout heavy Bleed supply
|
||||
"loadout_heavy_bleed_uncommon": 40, // Uncommon Loadout heavy Bleed supply
|
||||
"loadout_heavy_bleed_common": 30, // Common Loadout heavy Bleed supply
|
||||
|
||||
// Loadout Stim
|
||||
"loadout_stim_rare": 30, // Rare Loadout Stim supply
|
||||
"loadout_stim_uncommon": 40, // Uncommon Loadout Stim supply
|
||||
"loadout_stim_common": 30, // Common Loadout Stim supply
|
||||
|
||||
// Loadout Splint
|
||||
"loadout_splint_rare": 30, // Rare Loadout Splint supply
|
||||
"loadout_splint_uncommon": 40, // Uncommon Loadout Splint supply
|
||||
"loadout_splint_common": 30, // Common Loadout Splint supply
|
||||
|
||||
// Loadout Headling
|
||||
"loadout_healing_rare": 30, // Rare Loadout headling supply
|
||||
"loadout_healing_uncommon": 40, // Uncommon Loadout headling supply
|
||||
"loadout_healing_common": 30, // Common Loadout headling supply
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// 5,000,000 Roubles 50/50
|
||||
"roubles_success": 50.0, // 50/50 Success
|
||||
"roubles_failure": 50.0, // 50/50 Failure
|
||||
|
||||
// Mystery Bitcoin 50/50
|
||||
"bitcoin_success": 50.0, // Two Bitcoins
|
||||
"bitcoin_failure": 50.0, // Two Bitcoins
|
||||
|
||||
// Mystery GP Coin 50/50
|
||||
"gpcoin_success": 50.0, // Two Bitcoins
|
||||
"gpcoin_failure": 50.0, // Two Bitcoins
|
||||
|
||||
// Mystery Melee
|
||||
"melee_extremely_rare": 0.25, // Extremely Rare melee
|
||||
"melee_rare": 2.0, // Rare melee
|
||||
"melee_uncommon": 22.75, // Uncommon melee
|
||||
"melee_common": 75.0, // Common melee
|
||||
"melee_profit_percentage": 0.92, // Container Profitability
|
||||
|
||||
// Mystery Backpack
|
||||
"backpack_extremely_rare": 5.0, // Extremely Rare backpack
|
||||
"backpack_rare": 20.0, // Rare backpack
|
||||
"backpack_uncommon": 35.0, // Uncommon backpack
|
||||
"backpack_common": 40.0, // Common backpack
|
||||
"backpack_profit_percentage": 0.86, // Container Profitability
|
||||
|
||||
// Mystery Tactical Rig
|
||||
"rig_boss": 5.0, // Extremely Rare rig
|
||||
"rig_late_wipe": 30.0, // Rare rig
|
||||
"rig_early_wipe": 40.0, // Uncommon rig
|
||||
"rig_scav": 25.0, // Common rig
|
||||
"rig_profit_percentage": 0.93, // Container Profitability
|
||||
|
||||
// Weapon Mystery Box
|
||||
"weapon_meta": 20.0, // Meta Weapon
|
||||
"weapon_decent": 30.0, // Semi-modded Weapon
|
||||
"weapon_scav": 22.3, // Scav Weapon
|
||||
"weapon_meme": 7.7, // Meme Weapon
|
||||
"weapon_base": 20.0, // Default Weapon
|
||||
"weapon_profit_percentage": 0.74, // Container Profitability
|
||||
|
||||
|
||||
/*
|
||||
// These settings do not work yet...
|
||||
// Default Weapon Mystery Box
|
||||
//"default_weapon_base": 100.0, // Default Weapon
|
||||
//"default_weapon_profit_percentage": 0.80, // Container Profitability
|
||||
|
||||
// Average Weapon Mystery Box
|
||||
//"average_weapon_meta": 22.0, // Meta Weapon
|
||||
//"average_weapon_decent": 75.0, // Semi-modded Weapon
|
||||
//"average_weapon_profit_percentage": 0.78, // Container Profitability
|
||||
*/
|
||||
|
||||
// Premium Weapon Mystery Box
|
||||
"premium_weapon_meta": 100.0, // Rare Weapon
|
||||
"premium_weapon_profit_percentage": 0.74, // Container Profitability
|
||||
|
||||
|
||||
// Mystery Helmet
|
||||
"helmet_extremely_rare": 0.25, // Extremely Rare Helmet
|
||||
"helmet_rare": 17.5, // Rare Helmet
|
||||
"helmet_uncommon": 27.65, // Uncommon Helmet
|
||||
"helmet_common": 54.65, // Common Helmet
|
||||
"helmet_profit_percentage": 0.85, // Container Profitability
|
||||
|
||||
// Mystery Headset
|
||||
"headset_rare": 15.0, // Rare Headset
|
||||
"headset_uncommon": 40.0, // Uncommon Headset
|
||||
"headset_common": 45.0, // Common Headset
|
||||
"headset_profit_percentage": 0.93, // Container Profitability
|
||||
|
||||
// Armor Mystery Box
|
||||
"armor_rare": 20.0, // Rare Armor
|
||||
"armor_uncommon": 40.0, // Uncommon Armor
|
||||
"armor_common": 40.5, // Common Armor
|
||||
"armor_profit_percentage": 0.90, // Container Profitability
|
||||
|
||||
// Premium Armor Mystery Box
|
||||
"premium_armor_rare": 100.0, // Rare Armor
|
||||
"premium_armor_profit_percentage": 0.88, // Container Profitability
|
||||
|
||||
// Mystery 7.62x25 NOT SOLD BY TRADER CURRENTLY, ONLY USED FOR LOADOUT AMMO GENERATION
|
||||
"7.62x25_common": 45.0, // Common Round 7.62x25
|
||||
"7.62x25_uncommon": 35.0, // Uncommon Round 7.62x25
|
||||
"7.62x25_rare": 20.0, // Rare Round 7.62x25
|
||||
"7.62x25_min": 15, // Minimum Rounds Generated
|
||||
"7.62x25_max": 30, // Maximum Rounds Generated
|
||||
"7.62x25_profit_percentage": 1.00,// Container Profitability
|
||||
|
||||
// Mystery 9x18
|
||||
"9x18_common": 45.0, // Common Round 9x18mm
|
||||
"9x18_uncommon": 35.0, // Uncommon Round 9x18mm
|
||||
"9x18_rare": 20.0, // Rare Round 9x18mm
|
||||
"9x18_min": 15, // Minimum Rounds Generated
|
||||
"9x18_max": 30, // Maximum Rounds Generated
|
||||
"9x18_profit_percentage": 1.00, // Container Profitability
|
||||
|
||||
// Mystery 9x19
|
||||
"9x19_common": 45.0, // Common Round 9x19
|
||||
"9x19_uncommon": 35.0, // Uncommon Round 9x19
|
||||
"9x19_rare": 20.0, // Rare Round 9x19
|
||||
"9x19_min": 15, // Minimum Rounds Generated
|
||||
"9x19_max": 30, // Maximum Rounds Generated
|
||||
"9x19_profit_percentage": 0.96, // Container Profitability
|
||||
|
||||
// Mystery 9x21
|
||||
"9x21_common": 45.0, // Common Round 9x21
|
||||
"9x21_uncommon": 35.0, // Uncommon Round 9x21
|
||||
"9x21_rare": 20.0, // Rare Round 9x21
|
||||
"9x21_min": 15, // Minimum Rounds Generated
|
||||
"9x21_max": 30, // Maximum Rounds Generated
|
||||
"9x21_profit_percentage": 0.94, // Container Profitability
|
||||
|
||||
// Mystery .357
|
||||
".357_common": 45.0, // Common Round .357
|
||||
".357_uncommon": 35.0, // Uncommon Round .357
|
||||
".357_rare": 20.0, // Rare Round .357
|
||||
".357_min": 3, // Minimum Rounds Generated
|
||||
".357_max": 10, // Maximum Rounds Generated
|
||||
".357_profit_percentage": 2.0, // Container Profitability
|
||||
|
||||
// Mystery .45_ACP
|
||||
".45_common": 45.0, // Common Round .45
|
||||
".45_uncommon": 35.0, // Uncommon Round .45
|
||||
".45_rare": 20.0, // Rare Round .45
|
||||
".45_min": 15, // Minimum Rounds Generated
|
||||
".45_max": 30, // Maximum Rounds Generated
|
||||
".45_profit_percentage": 1.04, // Container Profitability
|
||||
|
||||
// Mystery 4.6x30
|
||||
"4.6x30_common": 45.0, // Common Round 4.6x30
|
||||
"4.6x30_uncommon": 35.0, // Uncommon Round 4.6x30
|
||||
"4.6x30_rare": 20.0, // Rare Round 4.6x30
|
||||
"4.6x30_min": 15, // Minimum Rounds Generated
|
||||
"4.6x30_max": 30, // Maximum Rounds Generated
|
||||
"4.6x30_profit_percentage": 1.04,// Container Profitability
|
||||
|
||||
// Mystery 5.7x28
|
||||
"5.7x28_common": 45.0, // Common Round 5.7x28
|
||||
"5.7x28_uncommon": 35.0, // Uncommon Round 5.7x28
|
||||
"5.7x28_rare": 20.0, // Rare Round 5.7x28
|
||||
"5.7x28_min": 15, // Minimum Rounds Generated
|
||||
"5.7x28_max": 30, // Maximum Rounds Generated
|
||||
"5.7x28_profit_percentage": 0.94, // Container Profitability
|
||||
|
||||
// Mystery 5.45x39
|
||||
"5.45x39_common": 45.0, // Common Round 5.45x39
|
||||
"5.45x39_uncommon": 35.0, // Uncommon Round 5.45x39
|
||||
"5.45x39_rare": 20.0, // Rare Round 5.45x39
|
||||
"5.45x39_min": 15, // Minimum Rounds Generated
|
||||
"5.45x39_max": 30, // Maximum Rounds Generated
|
||||
"5.45x39_profit_percentage": 1.01,// Container Profitability
|
||||
|
||||
// Mystery 5.56x45
|
||||
"5.56x45_common": 45.0, // Common Round 5.56x45
|
||||
"5.56x45_uncommon": 35.0, // Uncommon Round 5.56x45
|
||||
"5.56x45_rare": 20.0, // Rare Round 5.56x45
|
||||
"5.56x45_min": 15, // Minimum Rounds Generated
|
||||
"5.56x45_max": 30, // Maximum Rounds Generated
|
||||
"5.56x45_profit_percentage": 0.94,// Container Profitability
|
||||
|
||||
// Mystery .300_Blackout
|
||||
".300_common": 45.0, // Common Round .300
|
||||
".300_uncommon": 35.0, // Uncommon Round .300
|
||||
".300_rare": 20.0, // Rare Round .300
|
||||
".300_min": 15, // Minimum Rounds Generated
|
||||
".300_max": 30, // Maximum Rounds Generated
|
||||
".300_profit_percentage": 0.95, // Container Profitability
|
||||
|
||||
// Mystery 6.8x51 NOT SOLD BY TRADER CURRENTLY, ONLY USED FOR LOADOUT AMMO GENERATION
|
||||
"6.8x51_common": 45.0, // Common Round 6.8x51
|
||||
"6.8x51_uncommon": 25.0, // Uncommon Round 6.8x51
|
||||
"6.8x51_rare": 30.0, // Rare Round 6.8x51
|
||||
"6.8x51_min": 15, // Minimum Rounds Generated
|
||||
"6.8x51_max": 30, // Maximum Rounds Generated
|
||||
"6.8x51_profit_percentage": 0.97, // Container Profitability
|
||||
|
||||
// Mystery 7.62x39
|
||||
"7.62x39_common": 45.0, // Common Round 7.62x39
|
||||
"7.62x39_uncommon": 35.0, // Uncommon Round 7.62x39
|
||||
"7.62x39_rare": 20.0, // Rare Round 7.62x39
|
||||
"7.62x39_min": 15, // Minimum Rounds Generated
|
||||
"7.62x39_max": 30, // Maximum Rounds Generated
|
||||
"7.62x39_profit_percentage": 0.88,// Container Profitability
|
||||
|
||||
// Mystery 7.62x51
|
||||
"7.62x51_common": 45.0, // Common Round 7.62x51
|
||||
"7.62x51_uncommon": 35.0, // Uncommon Round 7.62x51
|
||||
"7.62x51_rare": 20.0, // Rare Round 7.62x51
|
||||
"7.62x51_min": 15, // Minimum Rounds Generated
|
||||
"7.62x51_max": 25, // Maximum Rounds Generated
|
||||
"7.62x51_profit_percentage": 0.95,// Container Profitability
|
||||
|
||||
// Mystery 7.62x54
|
||||
"7.62x54_common": 45.0, // Common Round 7.62x54
|
||||
"7.62x54_uncommon": 35.0, // Uncommon Round 7.62x54
|
||||
"7.62x54_rare": 20.0, // Rare Round 7.62x54
|
||||
"7.62x54_min": 15, // Minimum Rounds Generated
|
||||
"7.62x54_max": 25, // Maximum Rounds Generated
|
||||
"7.62x54_profit_percentage": 0.90,// Container Profitability
|
||||
|
||||
// Mystery .338
|
||||
".338_common": 62.5, // Common Round .338
|
||||
".338_uncommon": 25.0, // Uncommon Round .338
|
||||
".338_rare": 12.5, // Rare Round .338
|
||||
".338_min": 5, // Minimum Rounds Generated
|
||||
".338_max": 10, // Maximum Rounds Generated
|
||||
".338_profit_percentage": 0.91, // Container Profitability
|
||||
|
||||
// Mystery 9x39
|
||||
"9x39_common": 45.0, // Common Round 9x39
|
||||
"9x39_uncommon": 35.0, // Uncommon Round 9x39
|
||||
"9x39_rare": 20.0, // Rare Round 9x39
|
||||
"9x39_min": 15, // Minimum Rounds Generated
|
||||
"9x39_max": 30, // Maximum Rounds Generated
|
||||
"9x39_profit_percentage": 0.97, // Container Profitability
|
||||
|
||||
// Mystery .366
|
||||
".366_common": 45.0, // Common Round .366
|
||||
".366_uncommon": 35.0, // Uncommon Round .366
|
||||
".366_rare": 20.0, // Rare Round .366
|
||||
".366_min": 15, // Minimum Rounds Generated
|
||||
".366_max": 30, // Maximum Rounds Generated
|
||||
".366_profit_percentage": 0.97, // Container Profitability
|
||||
|
||||
// Mystery 12.7x55
|
||||
"12.7x55_common": 45.0, // Common Round 12.7x55
|
||||
"12.7x55_uncommon": 35.0, // Uncommon Round 12.7x55
|
||||
"12.7x55_rare": 20.0, // Rare Round 12.7x55
|
||||
"12.7x55_min": 15, // Minimum Rounds Generated
|
||||
"12.7x55_max": 25, // Maximum Rounds Generated
|
||||
"12.7x55_profit_percentage": 0.98,// Container Profitability
|
||||
|
||||
// Mystery 12/70
|
||||
"12/70_common": 45.0, // Common Round 12/70
|
||||
"12/70_uncommon": 35.0, // Uncommon Round 12/70
|
||||
"12/70_rare": 20.0, // Rare Round 12/70
|
||||
"12/70_min": 5, // Minimum Rounds Generated
|
||||
"12/70_max": 10, // Maximum Rounds Generated
|
||||
"12/70_profit_percentage": 1.25, // Container Profitability
|
||||
|
||||
// Mystery 20/70
|
||||
"20/70_common": 45.0, // Common Round 20/70
|
||||
"20/70_uncommon": 35.0, // Uncommon Round 20/70
|
||||
"20/70_rare": 20.0, // Rare Round 20/70
|
||||
"20/70_min": 5, // Minimum Rounds Generated
|
||||
"20/70_max": 10, // Maximum Rounds Generated
|
||||
"20/70_profit_percentage": 7.0, // Container Profitability (Rounds are extremely cheap in general)
|
||||
|
||||
// Mystery 23x75
|
||||
"23x75_common": 45.0, // Common Round 23x75
|
||||
"23x75_uncommon": 35.0, // Uncommon Round 23x75
|
||||
"23x75_rare": 20.0, // Rare Round 23x75
|
||||
"23x75_min": 2, // Minimum Rounds Generated
|
||||
"23x75_max": 4, // Maximum Rounds Generated
|
||||
"23x75_profit_percentage": 2.5 // Container Profitability
|
||||
|
||||
},
|
||||
//
|
||||
//
|
||||
//
|
||||
// Mystery Container Automatic Price Balancer uses override prices (if applicable) instead of the items actual flea market price when generating optimal mystery container prices.
|
||||
// Raising or lowering any of the values will manipulate the mystery container price in that direction
|
||||
// - Why?:
|
||||
// - I made this override section as I felt ammo and a few blacklisted items handbook prices were way too cheap.
|
||||
// These changes are meant to help realistically balance mystery containers further.
|
||||
// - Blacklisted ammo/armor should be expensive and I have created override prices reflecting this
|
||||
//
|
||||
// Enable or Disable override prices
|
||||
// NOTE: If you use the Blacklist Mod and are satisfied with the flea market price of ammos and armors you can try setting this to 'false'
|
||||
"mystery_container_override_enable": true, // Default 'true' - Automatic Balancer will use prices from "mystery_container_override_price" if applicable
|
||||
// If 'false' - Automatic Balancer will only use items' flea market price (or handbook price if item is blacklisted)
|
||||
|
||||
"mystery_container_override_price": {
|
||||
"ammo": { // Priced in Roubles
|
||||
"57371aab2459775a77142f22": 205, // 9x18mm PMM PstM gzh
|
||||
"573719df2459775a626ccbc2": 300, // 9x18mm PM PBM gzh
|
||||
"5c0d56a986f774449d5de529": 500, // 9x19mm RIP
|
||||
"5c925fa22e221601da359b7b": 450, // 9x19mm AP 6.3
|
||||
"5efb0da7a29a85116f6ea05f": 1200, // 9x19mm PBP gzh
|
||||
"6576f93989f0062e741ba952": 350, // 9x21mm 7U4
|
||||
"5a26ac0ec4a28200741e1e18": 800, // 9x21mm BT gzh
|
||||
"6576f4708ca9c4381d16cd9d": 950, // 9x21mm 7N42 "Zubilo"
|
||||
"62330c18744e5e31df12f516": 260, // .357 Magnum JHP
|
||||
"62330b3ed4dc74626d570b95": 300, // .357 Magnum FMJ
|
||||
"5efb0d4f4bc50b58e81710f3": 110, // .45 ACP Lasermatch FMJ
|
||||
"5e81f423763d9f754677bf2e": 150, // .45 ACP Match FMJ
|
||||
"5efb0fc6aeb21837e749c801": 350, // .45 ACP Hydra-Shok
|
||||
"5ea2a8e200685063ec28c05a": 600, // .45 ACP RIP
|
||||
"5efb0cabfb3e451d70735af5": 950, // .45 ACP AP
|
||||
"64b6979341772715af0f9c39": 320, // 4.6x30mm JSP SX
|
||||
"5ba2678ad4351e44f824b344": 950, // 4.6x30mm FMJ SX
|
||||
"5ba26835d4351e0035628ff5": 1800, // 4.6x30mm AP SX
|
||||
"5cc80f67e4a949035e43bbba": 500, // 5.7x28mm SB193
|
||||
"5cc80f53e4a949000e1ea4f8": 420, // 5.7x28mm L191
|
||||
"5cc80f38e4a949001152b560": 700, // 5.7x28mm SS190
|
||||
"56dff3afd2720bba668b4567": 200, // 5.45x39mm PS gs
|
||||
"56dff2ced2720bb4668b4567": 350, // 5.45x39mm PP gs
|
||||
"56dff061d2720bb5668b4567": 550, // 5.45x39mm BT gs
|
||||
"56dfef82d2720bbd668b4567": 850, // 5.45x39mm BP gs
|
||||
"61962b617c6c7b169525f168": 1000, // 5.45x39mm 7N40
|
||||
"56dff026d2720bb8668b4567": 1350, // 5.45x39mm BS gs
|
||||
"5c0d5e4486f77478390952fe": 1450, // 5.45x39mm PPBS gs "Igolnik"
|
||||
"60194943740c5d77f6705eea": 500, // 5.56x45mm MK 318 Mod 0 (SOST)
|
||||
"59e6906286f7746c9f75e847": 1000, // 5.56x45mm M856A1
|
||||
"54527ac44bdc2d36668b4567": 1550, // 5.56x45mm M855A1
|
||||
"59e690b686f7746c9f75e848": 1850, // 5.56x45mm M995
|
||||
"601949593ae8f707c4608daa": 2000, // 5.56x45mm SSA AP
|
||||
"5fbe3ffdf8b6a877a729ea82": 340, // .300 Blackout BCP FMJ
|
||||
"619636be6db0f2477964e710": 800, // .300 Blackout M62 Tracer
|
||||
"64b8725c4b75259c590fa899": 1100, // .300 Blackout CBJ
|
||||
"5fd20ff893a8961fc660a954": 1400, // .300 Blackout AP
|
||||
"5656d7c34bdc2d9d198b4587": 315, // 7.62x39mm PS gzh
|
||||
"64b7af434b75259c590fa893": 650, // 7.62x39mm PP gzh
|
||||
"59e0d99486f7744a32234762": 1500, // 7.62x39mm BP gzh
|
||||
"601aa3d2b2bcb34913271e6d": 1650, // 7.62x39mm MAI AP
|
||||
"58dd3ad986f77403051cba8f": 600, // 7.62x51mm M80
|
||||
"5a608bf24f39f98ffc77720e": 850, // 7.62x51mm M62 Tracer
|
||||
"5a6086ea4f39f99cd479502f": 2250, // 7.62x51mm M61
|
||||
"5efb0c1bd79ff02a1f5e68d9": 2500, // 7.62x51mm M993
|
||||
"5e023d34e8a400319a28ed44": 1500, // 7.62x54mm R BT gzh
|
||||
"560d61e84bdc2da74d8b4571": 2000, // 7.62x54mm R SNB gzh
|
||||
"5e023d48186a883be655e551": 2500, // 7.62x54mm R BS gs
|
||||
"5fc382a9d724d907e2077dab": 50000,// .338 Lapua Magnum AP
|
||||
"57a0dfb82459774d3078b56c": 239, // 9x39mm SP-5 gs
|
||||
"5c0d668f86f7747ccb7f13b2": 517, // 9x39mm SPP gs
|
||||
"61962d879bb3d20b0946d385": 850, // 9x39mm PAB-9 gs
|
||||
"57a0e5022459774d1673f889": 1450, // 9x39mm SP-6 gs
|
||||
"5c0d688c86f77413ae3407b2": 1600, // 9x39mm BP gs
|
||||
"59e655cb86f77411dc52a77b": 150, // .366 TKM EKO
|
||||
"5f0596629e22f464da6bbdd9": 1250, // .366 TKM AP-M
|
||||
"5cadf6e5ae921500113bb973": 250, // 12.7x55mm PS12A // Prapor LL2
|
||||
"5cadf6ddae9215051e1c23b2": 400, // 12.7x55mm PS12
|
||||
"5cadf6eeae921500134b2799": 2250, // 12.7x55mm PS12B
|
||||
"5d6e6806a4b936088465b17e": 670, // 12/70 8.5mm Magnum buckshot
|
||||
"64b8ee384b75259c590fa89b": 403, // 12/70 Piranha
|
||||
"5d6e6911a4b9361bd5780d52": 800, // 12/70 flechette
|
||||
"5c0d591486f7744c505b416f": 900, // 12/70 RIP
|
||||
"5d6e68c4a4b9361b93413f79": 600, // 12/70 makeshift .50 BMG slug
|
||||
"5d6e68a8a4b9360b6c0d54e2": 1250, // 12/70 AP-20 armor-piercing slug
|
||||
"5d6e69b9a4b9361bc8618958": 95, // 20/70 6.2mm buckshot
|
||||
"5d6e6a5fa4b93614ec501745": 250, // 20/70 Devastator slug
|
||||
"5d6e6a05a4b93618084f58d0": 120, // 20/70 Star slug
|
||||
"5d6e6a42a4b9364f07165f52": 100, // 20/70 "Poleva-6u" slug
|
||||
"5e85a9f4add9fe03027d9bf1": 4000, // 23x75mm Zvezda flashbang round
|
||||
"5f647f31b6238e5dd066e196": 240, // 23x75mm Shrapnel-25 buckshot
|
||||
"5e85a9a6eacf8c039e4e2ac1": 630, // 23x75mm Shrapnel-10 buckshot
|
||||
"5e85aa1a988a8701445df1f5": 550 // 23x75mm Barrikada
|
||||
},
|
||||
"armor": {
|
||||
// Uncommon Armors
|
||||
"5ab8e79e86f7742d8b372e78": 175000, // BNTI Gzhel-K body armor
|
||||
"63737f448b28897f2802b874": 155000, // Hexatac HPC Plate Carrier (MultiCam Black)
|
||||
"5c0e655586f774045612eeb2": 165000, // HighCom Trooper TFO body armor (MultiCam)
|
||||
"5ab8dced86f774646209ec87": 165000, // ANA Tactical M2 plate carrier (Digital Flora)
|
||||
"5d5d87f786f77427997cfaef": 175000, // Ars Arma A18 Skanda plate carrier (MultiCam)
|
||||
"544a5caa4bdc2d1a388b4568": 155000, // Crye Precision AVS plate carrier (Ranger Green)
|
||||
|
||||
// Rare Armors
|
||||
"60a283193cb70855c43a381d": 475000, // NFM THOR Integrated Carrier body armor
|
||||
"545cdb794bdc2d3a198b456a": 400000, // 6B43 Zabralo-Sh body armor (Digital Flora)
|
||||
"5ca21c6986f77479963115a7": 350000, // FORT Redut-T5 body armor (Smog)
|
||||
"5b44cd8b86f774503d30cba2": 300000, // IOTV Gen4 body armor (Full Protection Kit, MultiCam)
|
||||
"5c0e541586f7747fa54205c9": 295000, // 6B13 M assault armor (Killa Edition)
|
||||
"5ca2151486f774244a3b8d30": 235000, // FORT Redut-M body armor
|
||||
"5e4abb5086f77406975c9342": 375000, // LBT-6094A Slick Plate Carrier (Black)
|
||||
"6038b4b292ec1c3103795a0b": 300000, // LBT-6094A Slick Plate Carrier (Coyote Tan)
|
||||
"6038b4ca92ec1c3103795a0d": 300000, // LBT-6094A Slick Plate Carrier (Olive Drab)
|
||||
"5fd4c474dd870108a754b241": 325000, // 5.11 Tactical Hexgrid plate carrier
|
||||
"5e9dacf986f774054d6b89f4": 225000, // FORT Defender-2 body armor
|
||||
"5b44cf1486f77431723e3d05": 215000, // IOTV Gen4 body armor (Assault Kit, MultiCam)
|
||||
"5b44d0de86f774503d30cba8": 200000, // IOTV Gen4 body armor (High Mobility Kit, MultiCam)
|
||||
"5b44cad286f77402a54ae7e5": 245000, // 5.11 Tactical TacTec plate carrier (Ranger Green)
|
||||
"5e4ac41886f77406a511c9a8": 195000, // Ars Arma CPC MOD.1 plate carrier (A-TACS FG)
|
||||
"60a3c68c37ea821725773ef5": 195000, // CQC Osprey MK4A plate carrier (Protection, MTP)
|
||||
"609e860ebd219504d8507525": 235000, // Crye Precision AVS plate carrier (Tagilla Edition)
|
||||
"628b9c7d45122232a872358f": 295000, // Crye Precision CPC plate carrier (Goons Edition)
|
||||
"64a5366719bab53bd203bf33": 285000, // Eagle Allied Industries MBSS plate carrier (Coyote Brown)
|
||||
"628b9784bcf6e2659e09b8a2": 245000, // S&S Precision PlateFrame plate carrier (Goons Edition)
|
||||
"628cd624459354321c4b7fa2": 185000, // Tasmanian Tiger SK plate carrier (MultiCam Black)
|
||||
"5c0e625a86f7742d77340f62": 225000 // BNTI Zhuk body armor (Digital Flora)
|
||||
},
|
||||
"weapon": {
|
||||
"5580223e4bdc2d1c128b457f": 30179, // MP-43-1C 12ga double-barrel shotgun
|
||||
"5fc3f2d5900b1d5091531e57": 151318, // TDI KRISS Vector Gen.2 9x19 submachine gun
|
||||
"5b3b713c5acfc4330140bd8d": 158152, // TT-33 7.62x25 TT pistol (Golden)
|
||||
"579204f224597773d619e051": 79363, // Makarov PM (t) 9x18PM pistol
|
||||
"5ae08f0a5acfc408fb1398a1": 68358, // Mosin 7.62x54R bolt-action rifle (Sniper)
|
||||
"59d6088586f774275f37482f": 78000, // Kalashnikov AKM 7.62x39 assault rifle
|
||||
"5b0bbe4e5acfc40dc528a72d": 115192, // DS Arms SA-58 7.62x51 assault rifle
|
||||
"5447a9cd4bdc2dbd208b4567": 65730, // Colt M4A1 5.56x45 assault rifle
|
||||
"57c44b372459772d2b39b8ce": 135210, // AS VAL 9x39 special assault rifle
|
||||
"5c07c60e0db834002330051f": 33000 // ADAR 2-15 5.56x45 carbine
|
||||
},
|
||||
"helmet": {
|
||||
"5c110624d174af029e69734c": 4000000, // T-7 Thermal Goggles with a Night Vision mount
|
||||
"5a154d5cfcdbcb001a3b00da": 120000 // Fast MT Black variant
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
{
|
||||
"_id": "67b7b52a4767af842e0521d0",
|
||||
"working": true,
|
||||
"availableInRaid": false,
|
||||
"items_buy": {
|
||||
"category": [
|
||||
"5422acb9af1c889c16000029",
|
||||
"5448e8d04bdc2ddf718b4569"
|
||||
],
|
||||
"id_list": []
|
||||
},
|
||||
"items_buy_prohibited": {
|
||||
"category": [],
|
||||
"id_list": []
|
||||
},
|
||||
"customization_seller": false,
|
||||
"name": "Gambler",
|
||||
"surname": " ",
|
||||
"nickname": "Gambler",
|
||||
"location": "Streets of Tarkov Casino",
|
||||
"avatar": "/files/trader/avatar/thegambler.jpg",
|
||||
"balance_rub": 5000000,
|
||||
"balance_dol": 0,
|
||||
"balance_eur": 0,
|
||||
"unlockedByDefault": true,
|
||||
"discount": 0,
|
||||
"discount_end": 0,
|
||||
"buyer_up": true,
|
||||
"currency": "RUB",
|
||||
"nextResupply": 1615141448,
|
||||
"repair": {
|
||||
"availability": false,
|
||||
"quality": "2",
|
||||
"excluded_id_list": [],
|
||||
"excluded_category": [],
|
||||
"currency": "5449016a4bdc2d6f028b456f",
|
||||
"currency_coefficient": 1,
|
||||
"price_rate": 10
|
||||
},
|
||||
"insurance": {
|
||||
"availability": false,
|
||||
"min_payment": 0,
|
||||
"min_return_hour": 0,
|
||||
"max_return_hour": 0,
|
||||
"max_storage_time": 99,
|
||||
"excluded_category": []
|
||||
},
|
||||
"gridHeight": 150,
|
||||
"loyaltyLevels": [{
|
||||
"minLevel": 1,
|
||||
"minSalesSum": 0,
|
||||
"minStanding": 0,
|
||||
"buy_price_coef": 38,
|
||||
"repair_price_coef": 175,
|
||||
"insurance_price_coef": 10,
|
||||
"exchange_price_coef": 0,
|
||||
"heal_price_coef": 0
|
||||
}
|
||||
],
|
||||
"sell_category": [
|
||||
"82e7fac0b7495d72d4083356",
|
||||
"ac705d3440c1407645e33579",
|
||||
"dc97aee367144dc03389405d",
|
||||
"7ffcc96aa06c7e90940330c5",
|
||||
"e8f46e3ad74b9d862121f9dc",
|
||||
"5b47574386f77428ca22b33e",
|
||||
"5b47574386f77428ca22b33f",
|
||||
"5b5f78dc86f77409407a7f8e",
|
||||
"5b47574386f77428ca22b346",
|
||||
"5b47574386f77428ca22b340",
|
||||
"5b47574386f77428ca22b344",
|
||||
"5b47574386f77428ca22b342",
|
||||
"5b47574386f77428ca22b341",
|
||||
"5b47574386f77428ca22b345",
|
||||
"5b47574386f77428ca22b343",
|
||||
"5b5f71b386f774093f2ecf11",
|
||||
"5b5f71c186f77409407a7ec0",
|
||||
"5b5f71de86f774093f2ecf13",
|
||||
"5b5f724186f77447ed5636ad",
|
||||
"5b5f736886f774094242f193",
|
||||
"5b5f73ec86f774093e6cb4fd",
|
||||
"5b5f74cc86f77447ec5d770a",
|
||||
"5b5f750686f774093e6cb503",
|
||||
"5b5f751486f77447ec5d770c",
|
||||
"5b5f752e86f774093e6cb505",
|
||||
"5b5f754a86f774094242f19b",
|
||||
"5b5f755f86f77447ec5d770e",
|
||||
"5b5f757486f774093e6cb507",
|
||||
"5b5f75b986f77447ec5d7710",
|
||||
"5b5f75c686f774094242f19f",
|
||||
"5b5f75e486f77447ec5d7712",
|
||||
"5b5f760586f774093e6cb509",
|
||||
"5b5f761f86f774094242f1a1",
|
||||
"5b5f764186f77447ec5d7714"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
{
|
||||
"name": "GamblerTrader",
|
||||
"version": "0.2.8",
|
||||
"sptVersion": "~3.11",
|
||||
"loadBefore": [],
|
||||
"loadAfter": ["zzDrakiaXYZ-LiveFleaPrices", "platinum-theblacklist"],
|
||||
"incompatibilities": [],
|
||||
"isBundleMod": false,
|
||||
"main": "src/mod.js",
|
||||
"scripts": {
|
||||
"setup": "npm i",
|
||||
"build": "node ./build.mjs",
|
||||
"buildinfo": "node ./build.mjs --verbose"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "20.11",
|
||||
"@typescript-eslint/eslint-plugin": "7.2",
|
||||
"@typescript-eslint/parser": "7.2",
|
||||
"archiver": "^6.0",
|
||||
"eslint": "8.57",
|
||||
"fs-extra": "11.2",
|
||||
"ignore": "^5.2",
|
||||
"tsyringe": "4.8.0",
|
||||
"typescript": "5.4",
|
||||
"winston": "3.12"
|
||||
},
|
||||
"author": "Hood",
|
||||
"contributors": [],
|
||||
"license": "MIT"
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 64 KiB |
|
|
@ -1,414 +0,0 @@
|
|||
import { DependencyContainer } from "tsyringe";
|
||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
||||
import { RandomUtil } from "@spt/utils/RandomUtil";
|
||||
import { HashUtil } from "@spt/utils/HashUtil";
|
||||
import { IAddItemDirectRequest } from "@spt/models/eft/inventory/IAddItemsDirectRequest";
|
||||
import { Item } from "../common/tables/IItem";
|
||||
|
||||
|
||||
import { ItemCreator } from "./itemCreator";
|
||||
import { Keys } from "./containers/keys";
|
||||
import { Stims } from "./containers/Stims";
|
||||
import { Backpacks } from "./containers/Backpacks";
|
||||
import { Rigs } from "./containers/Rigs";
|
||||
import { Headsets } from "./containers/Headsets";
|
||||
import { Ammo } from "./containers/Ammo";
|
||||
import { Melees } from "./containers/Melees";
|
||||
import { MysteryContainer } from "./MysteryContainer";
|
||||
import { Foods } from "./containers/Foods";
|
||||
|
||||
|
||||
export class Gamble {
|
||||
|
||||
public newItemsRequest: IAddItemDirectRequest;
|
||||
public name: string;
|
||||
private count: number;
|
||||
private mysteryContainer: MysteryContainer;
|
||||
private currentID: string;
|
||||
private currentCaliber: string;
|
||||
private currentMagazine: string;
|
||||
private currentMagazineMaxAmmo: number;
|
||||
private currentWeaponType: string;
|
||||
private currentHeadsetCompatible: boolean;
|
||||
private container: DependencyContainer;
|
||||
private hashUtil: HashUtil;
|
||||
private logger: ILogger;
|
||||
private randomUtil: RandomUtil;
|
||||
private config: any;
|
||||
|
||||
constructor(container: DependencyContainer, config: any, logger: ILogger, name :string){
|
||||
this.name = name.replace('gambling_', '');
|
||||
this.logger = logger;
|
||||
this.container = container;
|
||||
this.config = config;
|
||||
this.count = 0;
|
||||
this.randomUtil = container.resolve<RandomUtil>("RandomUtil");
|
||||
this.hashUtil = container.resolve<HashUtil>("HashUtil");
|
||||
this.mysteryContainer = new MysteryContainer(config, logger);
|
||||
this.newItemsRequest = {
|
||||
itemsWithModsToAdd: [],
|
||||
foundInRaid: true,
|
||||
useSortingTable : true
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
public newGamble(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100)): []{
|
||||
//console.log('NEW GAMBLE: Creating ' + name + ' roll = ' + roll)
|
||||
|
||||
switch(name){
|
||||
case 'wallet':
|
||||
case '100k':
|
||||
case '500k':
|
||||
case '1mil':
|
||||
case 'roubles':
|
||||
case 'bitcoin':
|
||||
case 'gpcoin':
|
||||
case 'keycard':
|
||||
case 'key':
|
||||
case 'stim':
|
||||
case 'medical':
|
||||
case 'food':
|
||||
case 'loadout_grenade':
|
||||
case 'loadout_facecovers':
|
||||
case 'loadout_food':
|
||||
case 'loadout_drink':
|
||||
case 'loadout_light_bleed':
|
||||
case 'loadout_heavy_bleed':
|
||||
case 'loadout_stim':
|
||||
case 'loadout_splint':
|
||||
case 'loadout_healing':
|
||||
case 'melee':
|
||||
case 'headset':
|
||||
case 'backpack':
|
||||
case 'rig':
|
||||
case '7.62x25':
|
||||
case '9x18':
|
||||
case '9x19':
|
||||
case '9x21':
|
||||
case '.357':
|
||||
case '.45':
|
||||
case '4.6x30':
|
||||
case '5.7x28':
|
||||
case '5.45x39':
|
||||
case '5.56x45':
|
||||
case '.300':
|
||||
case '6.8x51':
|
||||
case '7.62x39':
|
||||
case '7.62x51':
|
||||
case '7.62x54':
|
||||
case '.338':
|
||||
case '9x39':
|
||||
case '.366':
|
||||
case '12.7x55':
|
||||
case '12/70':
|
||||
case '20/70':
|
||||
case '23x75':
|
||||
this.openReward(name, roll);
|
||||
break;
|
||||
case 'weapon':
|
||||
case 'average_weapon':
|
||||
case 'default_weapon':
|
||||
case 'premium_weapon':
|
||||
case 'helmet':
|
||||
case 'armor':
|
||||
case 'premium_armor':
|
||||
this.openPreset(name, roll);
|
||||
break;
|
||||
case 'loadout':
|
||||
this.openLoadoutContainer(name);
|
||||
break;
|
||||
case 'premium_loadout':
|
||||
this.openLoadoutContainer(name, 10.0);
|
||||
break;
|
||||
default:
|
||||
this.logger.error(`[GamblerTrader] This Mystery Container Doesn't exist! Contact Author!`);
|
||||
}
|
||||
|
||||
if (this.mysteryContainer.isAmmo(this.name)) {
|
||||
this.newItemsRequest.foundInRaid = this.config.container_config["all_ammo_rewards_found_in_raid_status"];
|
||||
} else {
|
||||
this.newItemsRequest.foundInRaid = this.config.container_config[this.name + "_rewards_found_in_raid_status"];
|
||||
}
|
||||
return this.newItemsRequest;
|
||||
}
|
||||
|
||||
// Opens all rewards from the loadout container
|
||||
private openLoadoutContainer(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100)){ // 74.3 - 82 is meme // 82 MAX
|
||||
this.logger.info(`[GamblerTrader][${name}] The container roll is: ${roll}!`);
|
||||
const rewards = this.mysteryContainer.getGuaranteedRewards(name);
|
||||
const randomness = this.mysteryContainer.getGuaranteedRandomness(name);
|
||||
let currentCaliber: string, currentMagazine: string, currentMagazineMaxAmmo: number, currentWeaponType : string;
|
||||
|
||||
if (roll > 90) { // _scav
|
||||
roll = this.randomUtil.getFloat(44.3, 74.3);
|
||||
//roll = 65;
|
||||
} else if (roll > 82) { // _decent
|
||||
roll = this.randomUtil.getFloat(19.3, 44.3);
|
||||
//roll = 38;
|
||||
}
|
||||
|
||||
for(let i = 0; i < rewards.length; i++) {
|
||||
const current = rewards[i];
|
||||
|
||||
if (this.mysteryContainer.getName(current)) { // Rewards is a container
|
||||
|
||||
if(currentWeaponType == '_meme') {
|
||||
this.newGamble(current, this.randomUtil.getFloat(5,65));
|
||||
|
||||
} else if (this.currentWeaponType == '_meta') {
|
||||
|
||||
this.newGamble(current, this.randomUtil.getFloat(5,25));
|
||||
|
||||
} else if (this.currentWeaponType == '_decent') {
|
||||
|
||||
this.newGamble(current, this.randomUtil.getFloat(12,50));
|
||||
|
||||
}else if (this.currentWeaponType == '_scav') {
|
||||
|
||||
this.newGamble(current, this.randomUtil.getFloat(35,70));
|
||||
|
||||
}else{
|
||||
if (randomness[i]) {
|
||||
this.newGamble(current);
|
||||
} else {
|
||||
this.newGamble(current, roll);
|
||||
}
|
||||
}
|
||||
|
||||
if(current === 'helmet') {
|
||||
if (!this.currentHeadsetCompatible) {
|
||||
i++; // Skip the headset reward
|
||||
} else if (this.mysteryContainer.items['helmet'].headset_incompatible_helmets.includes(this.currentID)) {
|
||||
i++; // Skip the headset reward
|
||||
}
|
||||
}
|
||||
if (current === 'headset'){
|
||||
if (this.currentID == '5c06c6a80db834001b735491') {
|
||||
this.openReward('headset', roll, '5c06c6a80db834001b735491', false, 1);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (current === 'armor'){
|
||||
const currentID = this.currentID;
|
||||
let truth = false;
|
||||
if (currentID) {
|
||||
truth = true;
|
||||
}
|
||||
if (currentID && this.mysteryContainer.items['armor'].armor_rigs.includes(currentID)) {
|
||||
i++; // Skip the rig reward
|
||||
}
|
||||
}
|
||||
|
||||
if(current === 'weapon') { // Ammo and Magazine generation
|
||||
currentCaliber = this.currentCaliber;
|
||||
currentMagazine = this.currentMagazine;
|
||||
currentMagazineMaxAmmo = this.currentMagazineMaxAmmo
|
||||
currentWeaponType = this.currentWeaponType;
|
||||
let magazineCount = 3;
|
||||
|
||||
const badMagazines = [
|
||||
'633ec6ee025b096d320a3b15', // RSh-12 12.7x55 5-round cylinder
|
||||
'5ae0973a5acfc4001562206c', // Mosin Rifle 7.62x54R 5-round magazine
|
||||
'587df3a12459772c28142567' // SKS 7.62x39 10-round internal box magazine
|
||||
]
|
||||
|
||||
//push magazines and ammo
|
||||
const caliber = this.mysteryContainer.items['ammo'].BSGCalibers[currentCaliber];
|
||||
if (caliber != '20x70' && caliber != '23x75' && caliber != '12/70' && caliber != '.357' && !badMagazines.includes(currentMagazine)) {
|
||||
//console.log('caliber: ' + caliber + ' magazine: ' + currentMagazine)
|
||||
this.openReward(caliber, roll, currentMagazine, false, 1);
|
||||
this.openReward(caliber, roll, currentMagazine, false, 1);
|
||||
}
|
||||
|
||||
let tempRoll: number;
|
||||
let min, max = 0;
|
||||
// Depending on the ammo type, we want to generate a different rarity of ammo from the temproll
|
||||
switch(currentWeaponType) {
|
||||
case '_meme':
|
||||
min = 5;
|
||||
max = 30;
|
||||
break;
|
||||
case '_decent':
|
||||
min = 10;
|
||||
max = 45;
|
||||
break;
|
||||
case '_meta':
|
||||
min = 2;
|
||||
max = 26;
|
||||
break;
|
||||
default:
|
||||
min = 10;
|
||||
max = 90
|
||||
tempRoll = roll;
|
||||
break;
|
||||
}
|
||||
|
||||
if (caliber == '20x70' || caliber == '23x75' || caliber == '12/70') {
|
||||
currentMagazineMaxAmmo = 10;
|
||||
}
|
||||
|
||||
let ammoID: string;
|
||||
tempRoll = this.randomUtil.getFloat(min, max); // random roll for each ammo reward
|
||||
for(let i = 0; i < magazineCount; i++){
|
||||
|
||||
if (!ammoID) {
|
||||
this.openReward(caliber, tempRoll, 'NaN', true, currentMagazineMaxAmmo);
|
||||
ammoID = this.currentID;
|
||||
} else {
|
||||
this.openReward(caliber, tempRoll, ammoID, true, currentMagazineMaxAmmo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else { // Reward is an item
|
||||
const reward_amount = this.mysteryContainer.getRewardAmount(name, i);
|
||||
const stackable = this.mysteryContainer.getStackable(name, i);
|
||||
|
||||
if(!stackable){
|
||||
//console.log('OPEN GUARANTEED REWARDS: Item exists and NOT stackable... Adding to newItemsRequest...')
|
||||
for(let i = 0; i < reward_amount; i++){
|
||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(current)];
|
||||
this.count++;
|
||||
}
|
||||
|
||||
} else {
|
||||
//console.log('OPEN GUARANTEED REWARDS: Item exists and is stackable... Adding to newItemsRequest...')
|
||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(current, reward_amount)];
|
||||
this.count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private openReward(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100), id: string = 'NaN', stackable: boolean = false, reward_amount: number = undefined) {
|
||||
this.logger.info(`[GamblerTrader][${name}] The container roll is: ${roll}!`);
|
||||
const odds: Array<number> = this.mysteryContainer.getOdds(name);
|
||||
let guaranteed_rewards = this.mysteryContainer.getGuaranteedRewards(name);
|
||||
let reward_rolls: Array<number> = this.mysteryContainer.getRewardRolls(name);
|
||||
let generatedRewards = [];
|
||||
|
||||
/* // Not Implemented Yet...
|
||||
if (guaranteed_rewards) {
|
||||
this.openGuaranteedRewards(name, roll);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
// If there is no defined ID, we need to generate a random item with a determined amound of rolls for each rarity (i.e. Medical container)
|
||||
if (id === "NaN" && reward_rolls) {
|
||||
const rewards = this.mysteryContainer.getRewards(name);
|
||||
for(let i = 0; i < rewards.length; i++) {
|
||||
for(let j = 0; j < reward_rolls[i]; j++) {
|
||||
const item = this.mysteryContainer.getReward(name, i);
|
||||
if (item == "NaN") { // Nothing
|
||||
continue;
|
||||
}
|
||||
this.currentID = item;
|
||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(item)];
|
||||
this.count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there is no defined ID, we need to generate random reward(s) based off property (rolls)
|
||||
if (id === "NaN" && !reward_rolls) {
|
||||
for(let i = 0; i < odds.length; i++) {
|
||||
if(roll <= odds[i]) {
|
||||
//console.log('WIN! Creating ' + name + ' index = ' + i + ' rewards = ' + this.mysteryContainer.getReward(name, i))
|
||||
id = this.mysteryContainer.getReward(name, i);
|
||||
this.currentID = id;
|
||||
if(!reward_amount){ // determined amount to receive
|
||||
reward_amount = this.mysteryContainer.getRewardAmount(name, i);
|
||||
}
|
||||
if(!stackable){ // Item is not stackable
|
||||
stackable = this.mysteryContainer.getStackable(name, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(this.config.debug) {
|
||||
this.logger.info("[GamblerTrader] Weapon Mystery Box Information...");
|
||||
this.logger.info(id);
|
||||
}
|
||||
|
||||
if (id !== "NaN" && !reward_rolls) {
|
||||
if(!reward_amount){ // ammo has min and max amount instead of a fixed amount
|
||||
reward_amount = this.mysteryContainer.getRandomAmount(name);
|
||||
}
|
||||
if(!stackable){
|
||||
for(let i = 0; i < reward_amount; i++){
|
||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(id)];
|
||||
this.count++;
|
||||
}
|
||||
} else {
|
||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(id, reward_amount)];
|
||||
this.count++;
|
||||
}
|
||||
|
||||
} else {
|
||||
this.logger.info(`[GamblerTrader][${name}] Case Opened... Received Nothing... Better luck next time :)`);
|
||||
}
|
||||
}
|
||||
|
||||
private openPreset(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100)){
|
||||
this.logger.info(`[GamblerTrader][${name}] The container roll is: ${roll}!`);
|
||||
//console.log('\nopenPreset()');
|
||||
// ItemCreator stores all preset creation functions
|
||||
let item = new ItemCreator(this.container);
|
||||
let preset: Item[] = [];
|
||||
const odds: Array<number> = this.mysteryContainer.getOdds(name);
|
||||
|
||||
for(let i = 0; i < odds.length; i++) {
|
||||
if(roll <= odds[i]) {
|
||||
const parent = this.mysteryContainer.getParent(name);
|
||||
preset = item.createPreset(parent, this.mysteryContainer.getRarity(parent, i));
|
||||
this.currentID = preset[0]._tpl;
|
||||
|
||||
if (name === 'weapon' || name === 'premium_weapon') {
|
||||
// Store values for possible future use
|
||||
this.currentCaliber = item.caliber;
|
||||
this.currentMagazine = item.magazine;
|
||||
this.currentWeaponType = item.weaponType;
|
||||
this.currentMagazineMaxAmmo = item.magazineMaxAmmo;
|
||||
}
|
||||
if (name === 'helmet') {
|
||||
this.currentHeadsetCompatible = item.headsetCompatible;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(this.config.debug) {
|
||||
this.logger.info("[GamblerTrader] Weapon Mystery Box Information...");
|
||||
this.logger.info(preset);
|
||||
}
|
||||
|
||||
if (preset.length != 0) {
|
||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [...preset];
|
||||
this.count++;
|
||||
|
||||
} else {
|
||||
this.logger.info(`[GamblerTrader][Weapon] Case Opened... Received Nothing... Better luck next time :)`);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private newItemFormat(tpl: string, count = undefined) {
|
||||
|
||||
const item = {
|
||||
_id: this.hashUtil.generate(),
|
||||
_tpl: tpl,
|
||||
parentId: "hideout",
|
||||
slotId: "hideout",
|
||||
upd: {StackObjectsCount: count ? count : 1}
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,338 +0,0 @@
|
|||
import { Ammo } from "./containers/Ammo";
|
||||
import { Armors } from "./containers/Armors";
|
||||
import { Backpacks } from "./containers/Backpacks";
|
||||
import { Foods } from "./containers/Foods";
|
||||
import { Headsets } from "./containers/Headsets";
|
||||
import { Helmets } from "./containers/Helmets";
|
||||
import { Keycard } from "./containers/Keycard";
|
||||
import { Melees } from "./containers/Melees";
|
||||
import { PremiumArmors } from "./containers/PremiumArmors";
|
||||
import { PremiumWeapons } from "./containers/PremiumWeapons";
|
||||
import { Rigs } from "./containers/Rigs";
|
||||
import { Stims } from "./containers/Stims";
|
||||
import { Wallet } from "./containers/Wallet";
|
||||
import { Weapons } from "./containers/Weapons";
|
||||
import { Keys } from "./containers/keys";
|
||||
import { FlipRouble } from "./containers/FlipRouble";
|
||||
import { FlipGPCoin } from "./containers/FlipGPCoin";
|
||||
import { FlipBitcoin } from "./containers/FlipBitcoin";
|
||||
import { Loadouts } from "./containers/Loadouts";
|
||||
import { Medical } from "./containers/Medical";
|
||||
import { LoadoutFood } from "./containers/LoadoutFood";
|
||||
import { Loadoutdrink } from "./containers/LoadoutDrink";
|
||||
import { LoadoutLightBleed } from "./containers/LoadoutLightBleed";
|
||||
import { LoadoutHeavyBleed } from "./containers/LoadoutHeavyBleed";
|
||||
import { LoadoutHealing } from "./containers/LoadoutHealing";
|
||||
import { LoadoutGrenade } from "./containers/LoadoutGrenade";
|
||||
import { LoadoutSplit } from "./containers/LoadoutSplint";
|
||||
import { LoadoutFacecovers } from "./containers/LoadoutFacecovers";
|
||||
import { LoadoutStim } from "./containers/LoadoutStim";
|
||||
import type { itemProps } from "./MysteryContainerInfo";
|
||||
import { MysteryContainerInfo } from "./MysteryContainerInfo";
|
||||
import { CoinFlip500k } from "./containers/CoinFlip500k";
|
||||
import { CoinFlip100k } from "./containers/CoinFlip100k";
|
||||
import { CoinFlip1Mil } from "./containers/CoinFlip1Mil";
|
||||
//import { AverageWeapons } from "./containers/AverageWeapons";
|
||||
//import { DefaultWeapons } from "./containers/DefaultWeapons";
|
||||
|
||||
class Container {
|
||||
|
||||
public name: string;
|
||||
public parent: string
|
||||
public rarities: Array<string>;
|
||||
public odds: Array<number>;
|
||||
public stackable: Array<boolean>;
|
||||
public min: number;
|
||||
public max: number;
|
||||
public isAmmo: boolean;
|
||||
public isPreset: boolean;
|
||||
public override: {};
|
||||
public rolls: number;
|
||||
public rarity_average_profit: Array<number>;
|
||||
public profit_percentage: number;
|
||||
public guaranteed_rewards: Array<string>;
|
||||
public guaranteed_stackable: Array<boolean>;
|
||||
public guaranteed_reward_amount: Array<number>;
|
||||
public guaranteed_randomness: Array<boolean>;
|
||||
public reward_amount: Array<number>;
|
||||
public reward_rolls: Array<number>;
|
||||
public rewards: any;
|
||||
public presets_invalid_tpls: Array<string>;
|
||||
public calculate_preset_prices: boolean;
|
||||
public presets: Array<string>;
|
||||
|
||||
constructor(name: string) {
|
||||
this.name = name;
|
||||
this.parent = '';
|
||||
this.rarities = [];
|
||||
this.odds = [];
|
||||
this.stackable = [];
|
||||
this.override = {};
|
||||
this.rarity_average_profit = [];
|
||||
this.profit_percentage = 0;
|
||||
this.reward_amount = [];
|
||||
this.rewards = [];
|
||||
this.presets_invalid_tpls = [];
|
||||
this.presets = [];
|
||||
}
|
||||
}
|
||||
|
||||
export class MysteryContainer {
|
||||
|
||||
private config;
|
||||
private logger;
|
||||
private containers;
|
||||
private containerInfo: Record<string, itemProps>;
|
||||
private names;
|
||||
public items;
|
||||
public simulation;
|
||||
public override;
|
||||
|
||||
constructor(config, logger){
|
||||
this.config = config;
|
||||
this.logger = logger;
|
||||
this.containerInfo = MysteryContainerInfo(this.config);
|
||||
this.names = [
|
||||
'wallet', '100k', '500k', '1mil', 'keycard', 'key', 'stim', 'medical', 'food', 'melee',
|
||||
'backpack', 'rig', 'weapon', 'premium_weapon', 'helmet',
|
||||
'headset', 'armor', 'premium_armor', 'roubles', 'bitcoin', 'gpcoin',
|
||||
'loadout', 'premium_loadout', 'loadout_grenade', 'loadout_facecovers', 'loadout_food', 'loadout_drink', 'loadout_light_bleed', 'loadout_heavy_bleed', 'loadout_stim', 'loadout_splint', 'loadout_healing', 'ammo'
|
||||
];
|
||||
this.simulation = [] //['armor', 'premium_armor', 'headset', 'rig', 'backpack', 'key', 'melee', 'stim', 'food', 'keycard'];
|
||||
this.override = ['ammo', 'armor', 'weapon', 'helmet'];
|
||||
this.items = {
|
||||
wallet: new Wallet(),
|
||||
'100k': new CoinFlip100k(),
|
||||
'500k': new CoinFlip500k(),
|
||||
'1mil': new CoinFlip1Mil(),
|
||||
keycard: new Keycard(),
|
||||
key: new Keys(),
|
||||
stim: new Stims(),
|
||||
medical: new Medical(),
|
||||
food: new Foods(),
|
||||
melee: new Melees(),
|
||||
backpack: new Backpacks(),
|
||||
rig: new Rigs(),
|
||||
helmet: new Helmets(),
|
||||
headset: new Headsets(),
|
||||
weapon: new Weapons(),
|
||||
//default_weapon: new DefaultWeapons(),
|
||||
//average_weapon: new AverageWeapons(),
|
||||
premium_weapon: new PremiumWeapons(),
|
||||
armor: new Armors(),
|
||||
premium_armor: new PremiumArmors(),
|
||||
ammo: new Ammo(),
|
||||
roubles: new FlipRouble(),
|
||||
bitcoin: new FlipBitcoin(),
|
||||
gpcoin: new FlipGPCoin(),
|
||||
loadout: new Loadouts(),
|
||||
premium_loadout: new Loadouts(),
|
||||
loadout_grenade: new LoadoutGrenade(),
|
||||
loadout_facecovers: new LoadoutFacecovers(),
|
||||
loadout_food: new LoadoutFood(),
|
||||
loadout_drink: new Loadoutdrink(),
|
||||
loadout_light_bleed: new LoadoutLightBleed(),
|
||||
loadout_heavy_bleed: new LoadoutHeavyBleed(),
|
||||
loadout_stim: new LoadoutStim(),
|
||||
loadout_splint: new LoadoutSplit(),
|
||||
loadout_healing: new LoadoutHealing()
|
||||
}
|
||||
this.containers = this.setContainers()
|
||||
}
|
||||
|
||||
private setContainers(): { [key: string]: Container } {
|
||||
const containers: { [key: string]: Container } = {};
|
||||
|
||||
const generateAmount = (length: number, value: boolean | number) => new Array(length).fill(value);
|
||||
|
||||
const calculateOddsAndRewards = (container: Container, item: any) => {
|
||||
for(let j = 0; j < container.rarities.length; j++){
|
||||
const key = `${container.name}${container.rarities[j]}`;
|
||||
|
||||
if(j == 0) {
|
||||
container.odds[j] = this.config.odds[key];
|
||||
} else {
|
||||
container.odds[j] = this.config.odds[key] + container.odds[j-1];
|
||||
}
|
||||
container.rewards[j] = item.rewards? [...item.rewards[j]] : []
|
||||
}
|
||||
};
|
||||
|
||||
const applyOverrides = (container: Container, item: any, isAmmo: boolean) => {
|
||||
if (this.override.includes(container.name) || isAmmo) {
|
||||
container.override = this.config.mystery_container_override_price[container.parent];
|
||||
container.stackable = item.stackable || generateAmount(container.rarities.length, true);
|
||||
}
|
||||
if (!isAmmo) {
|
||||
container.reward_amount = item.reward_amount || generateAmount(container.rarities.length, 1);
|
||||
container.stackable = item.stackable || generateAmount(container.rarities.length, false);
|
||||
if (item.is_preset) container.isPreset = true;
|
||||
} else {
|
||||
container.isAmmo = true;
|
||||
}
|
||||
};
|
||||
|
||||
const setContainerProperties = (container: Container, name: string, item: any) => {
|
||||
container.min = this.config.odds[`${name}_min`] || 1;
|
||||
container.max = this.config.odds[`${name}_max`] || 1;
|
||||
container.profit_percentage = this.config.odds[`${name}_profit_percentage`];
|
||||
container.presets = item.presets? [...item.presets] : [];
|
||||
container.rolls = item.rolls? item.rolls : 1;
|
||||
container.guaranteed_stackable = item.guaranteed_stackable? item.guaranteed_stackable : undefined;
|
||||
container.guaranteed_reward_amount = item.guaranteed_reward_amount? item.guaranteed_reward_amount : undefined;
|
||||
container.guaranteed_rewards = item.guaranteed_rewards? item.guaranteed_rewards : undefined;
|
||||
container.guaranteed_randomness = item.guaranteed_randomness? item.guaranteed_randomness : undefined;
|
||||
container.reward_rolls = item.reward_rolls? item.reward_rolls : undefined;
|
||||
container.calculate_preset_prices = item.calculate_preset_prices? item.calculate_preset_prices : false;
|
||||
container.presets_invalid_tpls = item.presets_invalid_tpls? item.presets_invalid_tpls : undefined;
|
||||
|
||||
};
|
||||
|
||||
const createAndConfigureContainer = (name: string, item: any, isAmmo: boolean) => {
|
||||
const container = new Container(name);
|
||||
container.rarities = [...item.rarities];
|
||||
container.parent = item.parent;
|
||||
if (item.price_generate) this.simulation.push(name);
|
||||
|
||||
calculateOddsAndRewards(container, item);
|
||||
applyOverrides(container, item, isAmmo);
|
||||
setContainerProperties(container, name, item);
|
||||
|
||||
containers[name] = container;
|
||||
};
|
||||
|
||||
this.names.forEach(name => createAndConfigureContainer(name, this.items[name], false));
|
||||
this.items.ammo.names.forEach(name => createAndConfigureContainer(name, this.items.ammo.items[name], true));
|
||||
|
||||
//console.log('THE CONTAINER!!!');
|
||||
//console.log(containers);
|
||||
//console.log('TO SIMULATE NAMES')
|
||||
//console.log(this.simulation)
|
||||
return containers;
|
||||
}
|
||||
|
||||
// getRandomInt(3) returns 0, 1, or 2
|
||||
private getRandomInt(max: number) {
|
||||
return Math.floor(Math.random() * max);
|
||||
}
|
||||
|
||||
public getName(name: string): string{
|
||||
return this.containers[name].name;
|
||||
}
|
||||
|
||||
// Returns all containers that have presets to price calculate in the simulation
|
||||
public getPresetNames(): Array<string>{
|
||||
let names: Array<string> = [];
|
||||
for(const container in this.containers){
|
||||
if(this.containers[container].calculate_preset_prices){
|
||||
names.push(container);
|
||||
}
|
||||
}
|
||||
return names;
|
||||
}
|
||||
|
||||
public getParent(name: string): string{
|
||||
return this.containers[name].parent;
|
||||
}
|
||||
|
||||
public getOdds(name: string): Array<number>{
|
||||
return this.containers[name].odds;
|
||||
}
|
||||
|
||||
public getRarity(name: string, index: number): string{
|
||||
return this.containers[name].rarities[index];
|
||||
}
|
||||
public getRarities(name: string): Array<string>{
|
||||
return this.containers[name].rarities;
|
||||
}
|
||||
/*
|
||||
public getOpenAll(name: string): boolean{
|
||||
return this.containers[name].openAll? this.containers[name].openAll : false;
|
||||
}
|
||||
*/
|
||||
public getGuaranteedRewards(name: string): Array<string>{
|
||||
return this.containers[name].guaranteed_rewards? this.containers[name].guaranteed_rewards : undefined;
|
||||
}
|
||||
|
||||
public getGuaranteedRewardAmount(name: string, rarityIndex: number): any {
|
||||
return this.containers[name].guaranteed_reward_amount[rarityIndex];
|
||||
}
|
||||
|
||||
public getGuaranteedStackable(name: string, rarityIndex: number): boolean {
|
||||
return this.containers[name].guaranteed_stackable[rarityIndex];
|
||||
}
|
||||
|
||||
public getGuaranteedRandomness(name: string): Array<boolean> {
|
||||
return this.containers[name].guaranteed_randomness;
|
||||
}
|
||||
|
||||
|
||||
public getPreset(name: string, rarityIndex: number): any {
|
||||
return this.containers[name].presets[rarityIndex];
|
||||
}
|
||||
|
||||
// Returns random Reward from possible Rewards
|
||||
public getReward(name: string, rarityIndex: number): any {
|
||||
const rewards: [] = this.containers[name].rewards[rarityIndex];
|
||||
const randomNumber = this.getRandomInt(rewards.length);
|
||||
return rewards[randomNumber];
|
||||
}
|
||||
|
||||
// Returns the amount of rolls for each set of items in rewards
|
||||
public getRewardRolls(name: string): Array<number>{
|
||||
return this.containers[name].reward_rolls? this.containers[name].reward_rolls : undefined;
|
||||
}
|
||||
|
||||
// Returns all rewards from possible rewards
|
||||
public getRewards(name: string): Array<string> {
|
||||
return this.containers[name].rewards;
|
||||
|
||||
}
|
||||
|
||||
public getRewardAmount(name: string, rarityIndex: number): any {
|
||||
return this.containers[name].reward_amount[rarityIndex];
|
||||
}
|
||||
|
||||
public getStackable(name: string, rarityIndex: number): boolean {
|
||||
return this.containers[name].stackable[rarityIndex];
|
||||
}
|
||||
|
||||
public getRandomAmount(name: string): number {
|
||||
const min = this.containers[name].min;
|
||||
const max = this.containers[name].max;
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
|
||||
public getRarityAverageProfit(name:string): number {
|
||||
return this.containers[name].rarity_average_profit;
|
||||
}
|
||||
|
||||
public getProfitPercentage(name:string): number {
|
||||
return this.containers[name].profit_percentage;
|
||||
}
|
||||
|
||||
public getOverride(name:string, item: any): number {
|
||||
return this.containers[name].override[item];
|
||||
}
|
||||
|
||||
public setRarityAverageProfit(name:string, profit: Array<number>): void {
|
||||
//return this.containers[name]['override'][item];
|
||||
this.containers[name].rarity_average_profit = profit;
|
||||
}
|
||||
|
||||
public isAmmo(name: string): boolean {
|
||||
return this.containers[name].isAmmo;
|
||||
}
|
||||
|
||||
public isPreset(name: string): boolean {
|
||||
return this.containers[name].isPreset;
|
||||
}
|
||||
|
||||
public isMysteryContainer(name: string): boolean {
|
||||
return this.containerInfo[name] ? true : false;
|
||||
}
|
||||
|
||||
getMysteryContainerId(name: string): string {
|
||||
return this.containerInfo[name]._id;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,657 +0,0 @@
|
|||
export type itemProps = {
|
||||
_id: string,
|
||||
_name: string,
|
||||
quest_id: string,
|
||||
name: string,
|
||||
shortName: string,
|
||||
desc: string,
|
||||
fleaPriceRoubles: number,
|
||||
handbookPriceRoubles: number,
|
||||
prefab: string,
|
||||
width: number,
|
||||
height: number,
|
||||
barter?: Record<string, number> // barter cost object: {key=itemTpl, value=amount}
|
||||
}
|
||||
|
||||
export function MysteryContainerInfo(config: any): Record<string, itemProps> {
|
||||
return({
|
||||
wallet: {
|
||||
_id: "67b7b98b4767af842e0521e7",
|
||||
_name: "gambling_wallet",
|
||||
quest_id: "66b57e52fcf263f4d70af3e0",
|
||||
name: "Mystery Wallet",
|
||||
shortName: "Mystery Wallet",
|
||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n0 Roubles - ${config.odds['wallet_base']}%\n25K Roubles - ${config.odds['wallet_extra_common']}%\n50k Roubles - ${config.odds['wallet_common']}%\n100k Roubles - ${config.odds['wallet_uncommon']}%\n250k Roubles - ${config.odds['wallet_more_uncommon']}%\n500k Roubles - ${config.odds['wallet_extra_uncommon']}%\n1 Million Roubles - ${config.odds['wallet_rare']}%\n2 Million Roubles - ${config.odds['wallet_kinda_rare']}%`,
|
||||
fleaPriceRoubles: 130000,
|
||||
handbookPriceRoubles: 130000,
|
||||
prefab: "assets/content/items/barter/item_barter_walletwz/item_barter_walletwz.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
key: {
|
||||
_id: "67b7b98b4767af842e0521e8",
|
||||
_name: "gambling_key",
|
||||
quest_id: "66b57e52fcf263f4d70af3e1",
|
||||
name: "Mystery Key",
|
||||
shortName: "Mystery Key",
|
||||
desc: `So you want a brand-new key to your favorite looting spot? Or maybe you're looking for that pesky quest key. We have it all! (Seriously every single key found throughout Tarkov!) Try your luck!\n==============================\nCommon Key - ${config.odds['key_common']}%\nUncommon Key - ${config.odds['key_uncommon']}%\nRare Key - ${config.odds['key_rare']}%\nExtremely Rare Key - ${config.odds['key_extremely_rare']}%`,
|
||||
fleaPriceRoubles: 90000,
|
||||
handbookPriceRoubles: 90000,
|
||||
prefab: "assets/content/items/spec/keys/item_key_14.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
keycard: {
|
||||
_id: "67b7b98b4767af842e0521e9",
|
||||
_name: "gambling_keycard",
|
||||
quest_id: "66b57e52fcf263f4d70af3e2",
|
||||
name: "Mystery Keycard",
|
||||
shortName: "Mystery Keycard",
|
||||
desc: `So you want to get into labs? Well your in luck! I have a few gambles I can offer you for the right price. Maybe you get the card you've been dreaming of or maybe you don't!\n==============================\nAccess Keycard - ${config.odds['keycard_access']}%\nNothing - 33.3%\n21WS Keycard - ${config.odds['keycard_21WS']}%\n11SR Keycard - ${config.odds['keycard_11SR']}%\nKeycard with a blue marking - ${config.odds['keycard_blue_marking']}%\nYellow Keycard - ${config.odds['keycard_yellow']}%\nBlack Keycard - ${config.odds['keycard_black']}%\nViolet Keycard - ${config.odds['keycard_violet']}%\nBlue Keycard - ${config.odds['keycard_blue']}%\nGreen Keycard - ${config.odds['keycard_green']}%\nRed Keycard - ${config.odds['keycard_red']}%`,
|
||||
fleaPriceRoubles: 325000,
|
||||
handbookPriceRoubles: 325000,
|
||||
prefab: "assets/content/items/barter/item_container_cardholder/item_container_cardholder.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
bitcoin: {
|
||||
_id: "67b7b98b4767af842e0521ec",
|
||||
_name: "gambling_bitcoin",
|
||||
quest_id: "66b57e52fcf263f4d70af4e2", // NEED REPLACE
|
||||
name: "Bitcoin Coinflip",
|
||||
shortName: "Coinflip",
|
||||
desc: `Feeling lucky? Looking to double up your spoils? Try your luck at double or nothing!\n==============================\n2 Bitcoins - ${config.odds['bitcoin_success']}%\nNothing - ${config.odds['bitcoin_failure']}%`,
|
||||
fleaPriceRoubles: 1100000,
|
||||
handbookPriceRoubles: 1100000,
|
||||
prefab: "assets/content/items/barter/item_barter_valuable_bitcoin/item_barter_valuable_bitcoin.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: {
|
||||
"59faff1d86f7746c51718c9c": 1 // Bitcoin
|
||||
}
|
||||
},
|
||||
gpcoin: {
|
||||
_id: "67b7b98b4767af842e0521ed",
|
||||
_name: "gambling_gpcoin",
|
||||
quest_id: "66b57e52fcf263f4d70af5e2", // NEED REPLACE
|
||||
name: "GP Coin Coinflip",
|
||||
shortName: "Coinflip",
|
||||
desc: `Feeling lucky? Looking to double up your spoils? Try your luck at double or nothing!\n==============================\n50 GP Coin - ${config.odds['gpcoin_success']}%\nNothing - ${config.odds['gpcoin_failure']}%`,
|
||||
fleaPriceRoubles: 400000,
|
||||
handbookPriceRoubles: 125000,
|
||||
prefab: "assets/content/items/barter/item_barter_valuable_gp/item_barter_valuable_gp.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: {
|
||||
"5d235b4d86f7742e017bc88a": 25 // GP Coin
|
||||
}
|
||||
},
|
||||
medical: {
|
||||
_id: "67b7b98b4767af842e0521fc",
|
||||
_name: "gambling_medical",
|
||||
quest_id: "66b57e52fcf263f4d70af6e2", // NEED REPLACE
|
||||
name: "Mystery Medical Kit",
|
||||
shortName: "Mystery Medical Kit",
|
||||
desc: `Hey soldier, looking for some meds to help keep you alive out there? I have a business to run here and I don't have time to sort through all this stuff. Take a chance and see what you get!`,
|
||||
fleaPriceRoubles: 350000,
|
||||
handbookPriceRoubles: 350000,
|
||||
prefab: "assets/content/items/containers/item_container_meds/item_container_meds.bundle",
|
||||
width: 3,
|
||||
height: 3,
|
||||
barter: {
|
||||
"5d1b3a5d86f774252167ba22": 3, // Pile of meds
|
||||
"619cc01e0a7c3a1a2731940c": 2, // Medical tools
|
||||
"5b4335ba86f7744d2837a264": 1 // Bloodset
|
||||
}
|
||||
},
|
||||
sealed: {
|
||||
_id: "67b7b98b4767af842e0521e5",
|
||||
_name: "event_container_airdrop_01",
|
||||
quest_id: "66b57e52fcf263f4d70af3e3",
|
||||
name: "Sealed Weapon Case",
|
||||
shortName: "Sealed Weapon Case",
|
||||
desc: "Looking for a weapon with some attachments that are left for you to attach yourself? Well do we have the perfect container for you. This is the same Sealed Weapon Case you would find in an airdrop and is not custom in any way.",
|
||||
fleaPriceRoubles: 450000,
|
||||
handbookPriceRoubles: 450000,
|
||||
prefab: "assets/content/items/containers/item_container_weaponcase/item_container_weaponcase.bundle",
|
||||
width: 5,
|
||||
height: 2,
|
||||
barter: undefined
|
||||
},
|
||||
food: {
|
||||
_id: "67b7b98b4767af842e0521e6",
|
||||
_name: "gambling_food",
|
||||
quest_id: "66b57e52fcf263f4d70af3e4",
|
||||
name: "Mystery Food",
|
||||
shortName: "Mystery Food",
|
||||
desc: `Come along friend, you look a little hungry. Try your luck at scoring a delicious snack!\n==============================\nCommon Food - ${config.odds['food_common']}%\nUncommon Food - ${config.odds['food_uncommon']}%\nRare Food - ${config.odds['food_rare']}%`,
|
||||
fleaPriceRoubles: 35000,
|
||||
handbookPriceRoubles: 35000,
|
||||
prefab: "assets/content/weapons/usable_items/item_mre/item_mre_loot.bundle",
|
||||
width: 1,
|
||||
height: 2,
|
||||
barter: undefined
|
||||
},
|
||||
melee: {
|
||||
_id: "67b7b98b4767af842e0521ea",
|
||||
_name: "gambling_melee",
|
||||
quest_id: "66b57e52fcf263f4d70af3e5",
|
||||
name: "Mystery Melee",
|
||||
shortName: "Mystery Melee",
|
||||
desc: `Looking for a shiny new weapon to beat your foes with? Come test your luck!\n\n PS: These weapons may or may have not been stolen from a sad little Timmy who didn't shove this up their pouch in time... poor timmy :'(\n==============================\nCommon Melee - ${config.odds['melee_common']}%\nUncommon Melee - ${config.odds['melee_uncommon']}%\nRare Melee - ${config.odds['melee_rare']}%\nExtremely Rare Melee - ${config.odds['melee_extremely_rare']}%`,
|
||||
fleaPriceRoubles: 82500,
|
||||
handbookPriceRoubles: 82500,
|
||||
prefab: "assets/content/weapons/taiga/weapon_usvr_taiga_container.bundle",
|
||||
width: 1,
|
||||
height: 3,
|
||||
barter: undefined
|
||||
},
|
||||
stim: {
|
||||
_id: "67b7b98b4767af842e0521eb",
|
||||
_name: "gambling_stim",
|
||||
quest_id: "66b57e52fcf263f4d70af3e6",
|
||||
name: "Mystery Stimulant",
|
||||
shortName: "Mystery Stimulant",
|
||||
desc: `Looking for your next pick me up? We have all the drugs you could ask for!\n==============================\nCommon Stimulant - ${config.odds['stim_common']}%\nUncommon Stimulant - ${config.odds['stim_uncommon']}%\nRare Stimulant - ${config.odds['stim_rare']}%`,
|
||||
fleaPriceRoubles: 70000,
|
||||
handbookPriceRoubles: 70000,
|
||||
prefab: "assets/content/items/barter/item_container_injectorcase/item_container_injectorcase.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
fiftyfifty: {
|
||||
_id: "67b7b98b4767af842e0521f9",
|
||||
_name: "gambling_roubles",
|
||||
quest_id: "66b57e52fcf263f4d70af3e7",
|
||||
name: "50/50 Case",
|
||||
shortName: "50/50 Case",
|
||||
desc: `The true all in or nothing. This case was taken from Reshala's stash and has a 50% chance to double your money!. This could be your chance to win it all! "Scared money don't make money." -YG \n==============================\nDelicious Can of Beef Stew - 50.0%\n5 Million Roubles - 50.0%`,
|
||||
fleaPriceRoubles: 2750000,
|
||||
handbookPriceRoubles: 2750000,
|
||||
prefab: "assets/content/items/containers/item_container_money/item_container_money.bundle",
|
||||
width: 5,
|
||||
height: 4,
|
||||
barter: undefined
|
||||
},
|
||||
weapon: {
|
||||
_id: "67b7b98b4767af842e0521f0",
|
||||
_name: "gambling_weapon",
|
||||
quest_id: "66b57e52fcf263f4d70af3e8",
|
||||
name: "Weapon Mystery Box",
|
||||
shortName: "Weapon Mystery Box",
|
||||
desc: `Weapon Mystery Box, contains over 1000 different possible weapons ranging from premium meta weapons, early wipe weapons, scav weapons, meme/cursed weapons, and everything between... \n==============================\nFully Modded Weapon - ${config.odds['weapon_meta']}%\nSemi-modded Weapon - ${config.odds['weapon_decent']}%\nScav Weapon - ${config.odds['weapon_scav']}%\nDefault Weapon - ${config.odds['weapon_base']}%\nMeme Weapon - ${config.odds['weapon_meme']}%%`,
|
||||
fleaPriceRoubles: 200000,
|
||||
handbookPriceRoubles: 200000,
|
||||
prefab: "assets/content/items/spec/item_spec_weaprepair/item_spec_weaprepair.bundle",
|
||||
width: 4,
|
||||
height: 4,
|
||||
barter: undefined
|
||||
},
|
||||
'100k': {
|
||||
_id: "67b7b98b4767af842e0521f2",
|
||||
_name: "gambling_100k",
|
||||
quest_id: "66b57e52fcf233f4d70af7d4",
|
||||
name: "100K Coinflip",
|
||||
shortName: "Coinflip",
|
||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n200K Roubles - 50.0%\nNothing - 50.0%`,
|
||||
fleaPriceRoubles: 130000,
|
||||
handbookPriceRoubles: 130000,
|
||||
prefab: "assets/content/items/barter/wallet/item_wallet.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'500k': {
|
||||
_id: "67b7b98b4767af842e0521f3",
|
||||
_name: "gambling_500k",
|
||||
quest_id: "66b57e52fcf253f4d70af7d4",
|
||||
name: "500K Coinflip",
|
||||
shortName: "Coinflip",
|
||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n1 Million Roubles - 50.0%\nNothing - 50.0%`,
|
||||
fleaPriceRoubles: 650000,
|
||||
handbookPriceRoubles: 650000,
|
||||
prefab: "assets/content/items/barter/wallet/item_wallet.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'1mil': {
|
||||
_id: "67b7b98b4767af842e0521f4",
|
||||
_name: "gambling_1mil",
|
||||
quest_id: "66b57e52fcf244f4d70af7d4",
|
||||
name: "1 Million Coinflip",
|
||||
shortName: "Coinflip",
|
||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n2 Million Roubles - 50.0%\nNothing - 50.0%`,
|
||||
fleaPriceRoubles: 1200000,
|
||||
handbookPriceRoubles: 1200000,
|
||||
prefab: "assets/content/items/barter/wallet/item_wallet.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
backpack: {
|
||||
_id: "67b7b98b4767af842e0521f5",
|
||||
_name: "gambling_backpack",
|
||||
quest_id: "66b57e52fcf263f4d70af7d4",
|
||||
name: "Backpack Mystery Bag",
|
||||
shortName: "Backpack Mystery Bag",
|
||||
desc: `Need a new bag for your next loot run? Come try these bags for size!\n==============================\nCommon Backpack - ${config.odds['backpack_common']}%\nUncommon Backpack - ${config.odds['backpack_uncommon']}%\nRare Backpack - ${config.odds['backpack_rare']}%\nExtremely Rare Backpack - ${config.odds['backpack_extremely_rare']}%`,
|
||||
fleaPriceRoubles: 79750,
|
||||
handbookPriceRoubles: 79750,
|
||||
prefab: "assets/content/items/equipment/backpack_pilgrim/item_equipment_backpack_pilgrim_christmas.bundle",
|
||||
width: 5,
|
||||
height: 7,
|
||||
barter: undefined
|
||||
},
|
||||
loadout: {
|
||||
_id: "67b7b98b4767af842e0521f6",
|
||||
_name: "gambling_loadout",
|
||||
quest_id: "66b57e52fcf263f4d70af3ea",
|
||||
name: "Mystery Loadout",
|
||||
shortName: "Mystery Loadout",
|
||||
desc: `Contains a random tiered loadout with mostly premium items and gear. All loadouts are randomly generated and corelate by rarity, meaning scav loadouts will generate mostly scav gear with an added chance that gear and items can upgrade tiers for added randomness. Same with all tiers of loadout. which means you will never recieve the same loadout twice. Items unboxed include:\n Weapon, Extra Magazines, Ammo, Grenades, Armor, Rig, Helmet, Headset, Backpack, Food, Drink, and Medical Supplies.`,
|
||||
fleaPriceRoubles: 600000,
|
||||
handbookPriceRoubles: 600000,
|
||||
prefab: "assets/content/items/equipment/backpack_blackjack/item_equipment_backpack_blackjack.bundle",
|
||||
width: 5,
|
||||
height: 7,
|
||||
barter: undefined
|
||||
},
|
||||
premium_loadout: {
|
||||
_id: "67b7b98b4767af842e0521f7",
|
||||
_name: "gambling_premium_loadout",
|
||||
quest_id: "66b57e52fcf263f4d70af3f4",
|
||||
name: "Premium Mystery Loadout",
|
||||
shortName: "Premium Mystery Loadout",
|
||||
desc: `Containes a high-tier loadout with mostly premium items and gear. All loadouts are randomly generated and corelate by rarity, meaning high-tier loadouts will generate mostly rare gear with an added chance that gear and items can be downgraded to average tier for added randomness. All tiers of loadout can have some items and gear go up or down rarities as well. which means you will never recieve the same loadout twice. Items unboxed include:\n Weapon, Extra Magazines, Ammo, Grenades, Armor, Rig, Helmet, Headset, Backpack, Food, Drink, and Medical Supplies.`,
|
||||
fleaPriceRoubles: 850000,
|
||||
handbookPriceRoubles: 850000,
|
||||
prefab: "assets/content/items/equipment/backpack_6sh118/item_equipment_backpack_6sh118.bundle",
|
||||
width: 5,
|
||||
height: 7,
|
||||
barter: undefined
|
||||
},
|
||||
rig: {
|
||||
_id: "67b7b98b4767af842e0521f8",
|
||||
_name: "gambling_rig",
|
||||
quest_id: "66b57e52fcf263f4d70b0f45",
|
||||
name: "Tactical Rig Mystery Box",
|
||||
shortName: "Tactical Rig Mystery Box",
|
||||
desc: `Looking for a brand new Tactical Rig? From Scav rigs to Boss Rigs We've got you covered!\n==============================\nScav Rig - ${config.odds['rig_scav']}%\nEarly Wipe Rig - ${config.odds['rig_early_wipe']}%\nLate Wipe Rig - ${config.odds['rig_late_wipe']}%\nBoss Rig - ${config.odds['rig_boss']}%`,
|
||||
fleaPriceRoubles: 79750,
|
||||
handbookPriceRoubles: 79750,
|
||||
prefab: "assets/content/items/equipment/rig_boss_birdeye/item_equipment_rig_boss_birdeye.bundle",
|
||||
width: 2,
|
||||
height: 2,
|
||||
barter: undefined
|
||||
},
|
||||
helmet: {
|
||||
_id: "67b7b98b4767af842e0521fa",
|
||||
_name: "gambling_helmet",
|
||||
quest_id: "66b57e52fcf263f4d70af3ec",
|
||||
name: "Mystery Helmet",
|
||||
shortName: "Mystery Helmet",
|
||||
desc: `Are you tired of Chad PMCs one tapping the largest part of your player? Well I can offer protection for you! Purchase a Helmet Mystery Box today!\n==============================\nCommon Helmet - ${config.odds['helmet_common']}%\nUncommon Helmet - ${config.odds['helmet_uncommon']}%\nRare Helmet - ${config.odds['helmet_rare']}%\nExtremely Rare T-7 Thermal Helmet - ${config.odds['helmet_extremely_rare']}%`,
|
||||
fleaPriceRoubles: 100000,
|
||||
handbookPriceRoubles: 100000,
|
||||
prefab: "assets/content/items/equipment/helmet_altyn/item_equipment_helmet_altyn.bundle",
|
||||
width: 2,
|
||||
height: 2,
|
||||
barter: undefined
|
||||
},
|
||||
headset: {
|
||||
_id: "67b7b98b4767af842e0521fb",
|
||||
_name: "gambling_headset",
|
||||
quest_id: "66b57e52fcf263f4d70af3ed",
|
||||
name: "Mystery Headset",
|
||||
shortName: "Mystery Headset",
|
||||
desc: `You can't expect to hear that sneaky USEC with those flimsy pair of headphones. Buy a Mystery Headset today!\n==============================\nCommon Headset - ${config.odds['headset_common']}%\nUncommon Headset - ${config.odds['headset_uncommon']}%\nRare Headset - ${config.odds['headset_rare']}%`,
|
||||
fleaPriceRoubles: 79750,
|
||||
handbookPriceRoubles: 79750,
|
||||
prefab: "assets/content/items/equipment/headset_comtaciv/item_equipment_headset_comtaciv.bundle",
|
||||
width: 2,
|
||||
height: 2,
|
||||
barter: undefined
|
||||
},
|
||||
armor: {
|
||||
_id: "67b7b98b4767af842e0521ee",
|
||||
_name: "gambling_armor",
|
||||
quest_id: "66b57e52fcf263f4d70af3ee",
|
||||
name: "Armor Mystery Box",
|
||||
shortName: "Armor Mystery Box",
|
||||
desc: `Need protection? Better be safe than sorry. Otherwise, that Timmy will catch you lacking.\n==============================\nCommon Armor - ${config.odds['armor_common']}%\nUncommon Armor - ${config.odds['armor_uncommon']}%\nRare Armor - ${config.odds['armor_rare']}%`,
|
||||
fleaPriceRoubles: 130000,
|
||||
handbookPriceRoubles: 130000,
|
||||
prefab: "assets/content/items/spec/item_spec_armorrepair/item_spec_armorrepair.bundle",
|
||||
width: 4,
|
||||
height: 4,
|
||||
barter: undefined
|
||||
},
|
||||
premium_armor: {
|
||||
_id: "67b7b98b4767af842e0521ef",
|
||||
_name: "gambling_premium_armor",
|
||||
quest_id: "66b57e52fcf263f4d70af3ef",
|
||||
name: "Premium Armor Mystery Box",
|
||||
shortName: "Premium Armor Mystery Box",
|
||||
desc: `So you need something a little better than a PACA? Alright... sheesh.. Since I like you a little better than the rest, I have a sweet deal I can offer you. I don't have much of these left to offer, but you can try your luck.\n==============================\nRare Armor - ${config.odds['premium_armor_rare']}%`,
|
||||
fleaPriceRoubles: 350000,
|
||||
handbookPriceRoubles: 350000,
|
||||
prefab: "assets/content/items/spec/item_spec_armorrepair/item_spec_armorrepair.bundle",
|
||||
width: 4,
|
||||
height: 4,
|
||||
barter: undefined
|
||||
},
|
||||
premium_weapon: {
|
||||
_id: "67b7b98b4767af842e0521f1",
|
||||
_name: "gambling_premium_weapon",
|
||||
quest_id: "66b57e52fcf263f4d70af3eb",
|
||||
name: "Premium Weapon Mystery Box",
|
||||
shortName: "Premium Weapon Mystery Box",
|
||||
desc: `Contains a heavily modded weapon, currently contains 250+ weapons in the loot pool\n==============================\nRare Weapon - ${config.odds['premium_weapon_meta']}%`,
|
||||
fleaPriceRoubles: 300000,
|
||||
handbookPriceRoubles: 300000,
|
||||
prefab: "assets/content/items/spec/item_spec_weaprepair/item_spec_weaprepair.bundle",
|
||||
width: 4,
|
||||
height: 4,
|
||||
barter: undefined
|
||||
},
|
||||
'7.62x25': {
|
||||
_id: "67b7b98b4767af842e0521d0",
|
||||
_name: "gambling_7.62x25",
|
||||
quest_id: "66b59e1cfcf263f4d70af000",
|
||||
name: "Mystery 7.62x25mm",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Or maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nUnboxes ${config.odds['7.62x25_min']}%-${config.odds['7.62x25_max']}% Rounds\nCommon Rounds - ${config.odds["7.62x25_common"]}%\nUncommon Rounds - ${config.odds["7.62x25_uncommon"]}%\nRare Rounds - ${config.odds["7.62x25_rare"]}%`,
|
||||
fleaPriceRoubles: 10000,
|
||||
handbookPriceRoubles: 10000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_762x25tt_pst_gzh.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'9x18': {
|
||||
_id: "67b7b98b4767af842e0521d1",
|
||||
_name: "gambling_9x18",
|
||||
quest_id: "66b59e1cfcf263f4d70af421",
|
||||
name: "Mystery 9x18mm Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x18_min']}-${config.odds['9x18_max']} Rounds\nCommon Rounds - ${config.odds["9x18_common"]}%\nUncommon Rounds - ${config.odds["9x18_uncommon"]}%\nRare Rounds - ${config.odds["9x18_rare"]}%`,
|
||||
fleaPriceRoubles: 5000,
|
||||
handbookPriceRoubles: 5000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_9x18pm_pbm.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'9x19': {
|
||||
_id: "67b7b98b4767af842e0521d2",
|
||||
_name: "gambling_9x19",
|
||||
quest_id: "66b59e1cfcf263f4d70af422",
|
||||
name: "Mystery 9x19mm Parabellum Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x19_min']}-${config.odds['9x19_max']} Rounds\nCommon Rounds - ${config.odds["9x19_common"]}%\nUncommon Rounds - ${config.odds["9x19_uncommon"]}%\nRare Rounds - ${config.odds["9x19_rare"]}%`,
|
||||
fleaPriceRoubles: 10000,
|
||||
handbookPriceRoubles: 10000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_9x19_7n31.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'9x21': {
|
||||
_id: "67b7b98b4767af842e0521d3",
|
||||
_name: "gambling_9x21",
|
||||
quest_id: "66b59e1cfcf263f4d70af423",
|
||||
name: "Mystery 9x21mm Gyurza Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x21_min']}-${config.odds['9x21_max']} Rounds\nCommon Rounds - ${config.odds["9x21_common"]}%\nUncommon Rounds - ${config.odds["9x21_uncommon"]}%\nRare Rounds - ${config.odds["9x21_rare"]}%`,
|
||||
fleaPriceRoubles: 19000,
|
||||
handbookPriceRoubles: 19000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_9x21_7n42.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'.357': {
|
||||
_id: "67b7b98b4767af842e0521d4",
|
||||
_name: "gambling_.357",
|
||||
quest_id: "66b59e1cfcf263f4d70af424",
|
||||
name: "Mystery .357 Magnum Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.357_min']}-${config.odds['.357_max']} Rounds\nCommon Rounds - ${config.odds[".357_common"]}%\nUncommon Rounds - ${config.odds[".357_uncommon"]}%\nRare Rounds - ${config.odds[".357_rare"]}%`,
|
||||
fleaPriceRoubles: 13000,
|
||||
handbookPriceRoubles: 13000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_9x33r_fmj.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'.45': {
|
||||
_id: "67b7b98b4767af842e0521d5",
|
||||
_name: "gambling_.45",
|
||||
quest_id: "66b59e1cfcf263f4d70af425",
|
||||
name: "Mystery .45 ACP Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.45_min']}-${config.odds['.45_max']} Rounds\nCommon Rounds - ${config.odds[".45_common"]}%\nUncommon Rounds - ${config.odds[".45_uncommon"]}%\nRare Rounds - ${config.odds[".45_rare"]}%`,
|
||||
fleaPriceRoubles: 19000,
|
||||
handbookPriceRoubles: 19000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_1143x23_acp_ap.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'4.6x30': {
|
||||
_id: "67b7b98b4767af842e0521d6",
|
||||
_name: "gambling_4.6x30",
|
||||
quest_id: "66b59e1cfcf263f4d70af426",
|
||||
name: "Mystery 4.6x30mm HK Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['4.6x30_min']}-${config.odds['4.6x30_max']} Rounds\nCommon Rounds - ${config.odds["4.6x30_common"]}%\nUncommon Rounds - ${config.odds["4.6x30_uncommon"]}%\nRare Rounds - ${config.odds["4.6x30_rare"]}%`,
|
||||
fleaPriceRoubles: 23000,
|
||||
handbookPriceRoubles: 23000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_46x30_ap_sx.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'5.7x28': {
|
||||
_id: "67b7b98b4767af842e0521d7",
|
||||
_name: "gambling_5.7x28",
|
||||
quest_id: "66b59e1cfcf263f4d70af427",
|
||||
name: "Mystery 5.7x28mm FN Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['5.7x28_min']}-${config.odds['5.7x28_max']} Rounds\nCommon Rounds - ${config.odds["5.7x28_common"]}%\nUncommon Rounds - ${config.odds["5.7x28_uncommon"]}%\nRare Rounds - ${config.odds["5.7x28_rare"]}%`,
|
||||
fleaPriceRoubles: 20000,
|
||||
handbookPriceRoubles: 20000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_57x28_ss190.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'5.45x39': {
|
||||
_id: "67b7b98b4767af842e0521d8",
|
||||
_name: "gambling_5.45x39",
|
||||
quest_id: "66b59e1cfcf263f4d70af428",
|
||||
name: "Mystery 5.45x39mm Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['5.45x39_min']}-${config.odds['5.45x39_max']} Rounds\nCommon Rounds - ${config.odds["5.45x39_common"]}%\nUncommon Rounds - ${config.odds["5.45x39_uncommon"]}%\nRare Rounds - ${config.odds["5.45x39_rare"]}%`,
|
||||
fleaPriceRoubles: 20000,
|
||||
handbookPriceRoubles: 20000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_545x39_bs.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'5.56x45': {
|
||||
_id: "67b7b98b4767af842e0521d9",
|
||||
_name: "gambling_5.56x45",
|
||||
quest_id: "66b59e1cfcf263f4d70af429",
|
||||
name: "Mystery 5.56x45mm NATO Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['5.56x45_min']}-${config.odds['5.56x45_max']} Rounds\nCommon Rounds - ${config.odds["5.56x45_common"]}%\nUncommon Rounds - ${config.odds["5.56x45_uncommon"]}%\nRare Rounds - ${config.odds["5.56x45_rare"]}%`,
|
||||
fleaPriceRoubles: 25000,
|
||||
handbookPriceRoubles: 25000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_556x45_m995.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'.300': {
|
||||
_id: "67b7b98b4767af842e0521da",
|
||||
_name: "gambling_.300",
|
||||
quest_id: "66b59e1cfcf263f4d70af42a",
|
||||
name: "Mystery .300 Blackout Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.300_min']}-${config.odds['.300_max']} Rounds\nCommon Rounds - ${config.odds[".300_common"]}%\nUncommon Rounds - ${config.odds[".300_uncommon"]}%\nRare Rounds - ${config.odds[".300_rare"]}%`,
|
||||
fleaPriceRoubles: 22500,
|
||||
handbookPriceRoubles: 22500,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_762x35_ap.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'7.62x39': {
|
||||
_id: "67b7b98b4767af842e0521db",
|
||||
_name: "gambling_7.62x39",
|
||||
quest_id: "66b59e1cfcf263f4d70af42b",
|
||||
name: "Mystery 7.62x39mm Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['7.62x39_min']}-${config.odds['7.62x39_max']} Rounds\nCommon Rounds - ${config.odds["7.62x39_common"]}%\nUncommon Rounds - ${config.odds["7.62x39_uncommon"]}%\nRare Rounds - ${config.odds["7.62x39_rare"]}%`,
|
||||
fleaPriceRoubles: 22500,
|
||||
handbookPriceRoubles: 22500,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_762x39_bp.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'7.62x51': {
|
||||
_id: "67b7b98b4767af842e0521dc",
|
||||
_name: "gambling_7.62x51",
|
||||
quest_id: "66b59e1cfcf263f4d70af42c",
|
||||
name: "Mystery 7.62x51mm NATO Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['7.62x51_min']}-${config.odds['7.62x51_max']} Rounds\nCommon Rounds - ${config.odds["7.62x51_common"]}%\nUncommon Rounds - ${config.odds["7.62x51_uncommon"]}%\nRare Rounds - ${config.odds["7.62x51_rare"]}%`,
|
||||
fleaPriceRoubles: 24500,
|
||||
handbookPriceRoubles: 24500,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_762x51.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'7.62x54': {
|
||||
_id: "67b7b98b4767af842e0521dd",
|
||||
_name: "gambling_7.62x54",
|
||||
quest_id: "66b59e1cfcf263f4d70af42d",
|
||||
name: "Mystery 7.62x54mm Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['7.62x54_min']}-${config.odds['7.62x54_max']} Rounds\nCommon Rounds - ${config.odds["7.62x54_common"]}%\nUncommon Rounds - ${config.odds["7.62x54_uncommon"]}%\nRare Rounds - ${config.odds["7.62x54_rare"]}%`,
|
||||
fleaPriceRoubles: 26000,
|
||||
handbookPriceRoubles: 26000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_762x54r_7n14.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'.338': {
|
||||
_id: "67b7b98b4767af842e0521de",
|
||||
_name: "gambling_.338",
|
||||
quest_id: "66b59e1cfcf263f4d70af42e",
|
||||
name: "Mystery .338 Lapua Magnum Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.338_min']}-${config.odds['.338_max']} Rounds\nCommon Rounds - ${config.odds[".338_common"]}%\nUncommon Rounds - ${config.odds[".338_uncommon"]}%\nRare Rounds - ${config.odds[".338_rare"]}%`,
|
||||
fleaPriceRoubles: 80000,
|
||||
handbookPriceRoubles: 80000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_86x70_lapua_magnum.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'9x39': {
|
||||
_id: "67b7b98b4767af842e0521df",
|
||||
_name: "gambling_9x39",
|
||||
quest_id: "66b59e1cfcf263f4d70af42f",
|
||||
name: "Mystery 9x39mm Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x39_min']}-${config.odds['9x39_max']} Rounds\nCommon Rounds - ${config.odds["9x39_common"]}%\nUncommon Rounds - ${config.odds["9x39_uncommon"]}%\nRare Rounds - ${config.odds["9x39_rare"]}%`,
|
||||
fleaPriceRoubles: 22000,
|
||||
handbookPriceRoubles: 22000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_9x39_pab9.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'.366': {
|
||||
_id: "67b7b98b4767af842e0521e0",
|
||||
_name: "gambling_.366",
|
||||
quest_id: "66b59e1cfcf263f4d70af430",
|
||||
name: "Mystery .366 TKM Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.366_min']}-${config.odds['.366_max']} Rounds\nCommon Rounds - ${config.odds[".366_common"]}%\nUncommon Rounds - ${config.odds[".366_uncommon"]}%\nRare Rounds - ${config.odds[".366_rare"]}%`,
|
||||
fleaPriceRoubles: 17000,
|
||||
handbookPriceRoubles: 17000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_366_custom_ap.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'12.7x55': {
|
||||
_id: "67b7b98b4767af842e0521e1",
|
||||
_name: "gambling_12.7x55",
|
||||
quest_id: "66b59e1cfcf263f4d70af431",
|
||||
name: "Mystery 12.7x55mm Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['12.7x55_min']}-${config.odds['12.7x55_max']} Rounds\nCommon Rounds - ${config.odds["12.7x55_common"]}%\nUncommon Rounds - ${config.odds["12.7x55_uncommon"]}%\nRare Rounds - ${config.odds["12.7x55_rare"]}%`,
|
||||
fleaPriceRoubles: 25500,
|
||||
handbookPriceRoubles: 25500,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_12,7x55_ps12b.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'12/70': {
|
||||
_id: "67b7b98b4767af842e0521e2",
|
||||
_name: "gambling_12/70",
|
||||
quest_id: "66b59e1cfcf263f4d70af432",
|
||||
name: "Mystery 12/70 Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['12/70_min']}-${config.odds['12/70_max']} Rounds\nCommon Rounds - ${config.odds["12/70_common"]}%\nUncommon Rounds - ${config.odds["12/70_uncommon"]}%\nRare Rounds - ${config.odds["12/70_rare"]}%`,
|
||||
fleaPriceRoubles: 14500,
|
||||
handbookPriceRoubles: 14500,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_12x70.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'20/70': {
|
||||
_id: "67b7b98b4767af842e0521e3",
|
||||
_name: "gambling_20/70",
|
||||
quest_id: "66b59e1cfcf263f4d70af433",
|
||||
name: "Mystery 20/70 Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['20/70_min']}-${config.odds['20/70_max']} Rounds\nCommon Rounds - ${config.odds["20/70_common"]}%\nUncommon Rounds - ${config.odds["20/70_uncommon"]}%\nRare Rounds - ${config.odds["20/70_rare"]}%`,
|
||||
fleaPriceRoubles: 16000,
|
||||
handbookPriceRoubles: 16000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_20x70.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
'23x75': {
|
||||
_id: "67b7b98b4767af842e0521e4",
|
||||
_name: "gambling_23x75",
|
||||
quest_id: "66b59e1cfcf263f4d70af434",
|
||||
name: "Mystery 23x75 Rounds",
|
||||
shortName: "Mystery",
|
||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['23x75_min']}-${config.odds['23x75_max']} Rounds\nCommon Rounds - ${config.odds["23x75_common"]}%\nUncommon Rounds - ${config.odds["23x75_uncommon"]}%\nRare Rounds - ${config.odds["23x75_rare"]}%`,
|
||||
fleaPriceRoubles: 18000,
|
||||
handbookPriceRoubles: 18000,
|
||||
prefab: "assets/content/items/ammo/patrons/patron_23x75_shrapnel_25.bundle",
|
||||
width: 1,
|
||||
height: 1,
|
||||
barter: undefined
|
||||
},
|
||||
})
|
||||
};
|
||||
|
|
@ -1,311 +0,0 @@
|
|||
import { DependencyContainer } from "tsyringe";
|
||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
||||
import { DatabaseServer } from "@spt/servers/DatabaseServer";
|
||||
import { IDatabaseTables } from "@spt/models/spt/server/IDatabaseTables";
|
||||
import { ItemHelper } from "@spt/helpers/ItemHelper";
|
||||
import { RandomUtil } from "@spt/utils/RandomUtil";
|
||||
import { Ammo } from "./containers/Ammo";
|
||||
import { MysteryContainer } from "./MysteryContainer";
|
||||
import { Gamble } from "./Gamble";
|
||||
import { Weapons } from "./containers/Weapons";
|
||||
|
||||
export class Price{
|
||||
private container: DependencyContainer;
|
||||
private config: any;
|
||||
private logger: ILogger
|
||||
private randomUtil: any
|
||||
public MysteryContainer: MysteryContainer
|
||||
|
||||
constructor(container: DependencyContainer, config: any, logger: ILogger){
|
||||
this.container = container;
|
||||
this.config = config;
|
||||
this.logger = logger;
|
||||
this.MysteryContainer = new MysteryContainer(config, logger);
|
||||
this.randomUtil = this.container.resolve<RandomUtil>("RandomUtil");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the prices for the mystery containers.
|
||||
*
|
||||
* @returns An object containing the generated container prices.
|
||||
*/
|
||||
public generateContainerPrices(): {} {
|
||||
let containerPrices = {};
|
||||
const mysteryContainerNames = [...this.MysteryContainer.simulation, ...this.MysteryContainer.items.ammo.names];
|
||||
//console.log(mysteryContainerNames)
|
||||
|
||||
for (let i = 0; i < mysteryContainerNames.length; i++) {
|
||||
const name: string = this.MysteryContainer.getName(mysteryContainerNames[i]);
|
||||
const parent: string = this.MysteryContainer.getParent(name);
|
||||
const rarities: Array<string> = this.MysteryContainer.getRarities(name);
|
||||
const odds: Array<number> = this.MysteryContainer.getOdds(name);
|
||||
let currentPrices: Array<number> = [];
|
||||
let currentContainerPrice = this.config.container_config[name + "_price"];
|
||||
|
||||
if (this.MysteryContainer.isAmmo(mysteryContainerNames[i])) {
|
||||
const amount = ((this.config.odds[name + '_min'] + this.config.odds[name + '_max']) / 2);
|
||||
const items = this.MysteryContainer.items['ammo'].items[name];
|
||||
currentPrices = this.getMysteryContainerPrices(name, name, rarities, items, amount);
|
||||
} else if (this.MysteryContainer.isPreset(mysteryContainerNames[i])) {
|
||||
const items = this.MysteryContainer.items[parent];
|
||||
currentPrices = this.getContainerPresetPrices(name, parent, rarities, items);
|
||||
} else {
|
||||
const items = this.MysteryContainer.items[name];
|
||||
currentPrices = this.getMysteryContainerPrices(name, parent, rarities, items);
|
||||
}
|
||||
|
||||
currentContainerPrice = this.generatePrices(name, odds, currentPrices, this.MysteryContainer.getProfitPercentage(name));
|
||||
containerPrices[name + "_price"] = currentContainerPrice;
|
||||
}
|
||||
|
||||
//console.log("Mystery Container Prices")
|
||||
//console.log(containerPrices)
|
||||
return containerPrices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the price of an item based on the given parameters.
|
||||
*
|
||||
* @param parent - The parent item category.
|
||||
* @param currentItem - The current item.
|
||||
* @param amount - The quantity of the item.
|
||||
* @returns The calculated price of the item.
|
||||
*/
|
||||
private getItemPrice(parent: string, currentItem: string, amount: number): number {
|
||||
const itemHelper: ItemHelper = this.container.resolve<ItemHelper>("ItemHelper");
|
||||
const override: number = this.MysteryContainer.getOverride(parent, currentItem);
|
||||
let currentPrice: number = 0;
|
||||
|
||||
if (override && this.config['mystery_container_override_enable']) {
|
||||
currentPrice = override;
|
||||
|
||||
} else {
|
||||
|
||||
const traderPrice = this.traderAssortPrice(currentItem);
|
||||
const fleaPrice = itemHelper.getDynamicItemPrice(currentItem);
|
||||
|
||||
if (traderPrice != 0 && fleaPrice == 0) {
|
||||
currentPrice = traderPrice;
|
||||
} else if (traderPrice == 0 && fleaPrice != 0) {
|
||||
currentPrice = fleaPrice
|
||||
} else {
|
||||
currentPrice = Math.min(traderPrice, fleaPrice); // use cheapest option
|
||||
}
|
||||
|
||||
if (currentPrice == 0) { // Item is not sold by trader or flea, must use handbook price. Nuclear option.
|
||||
currentPrice = itemHelper.getItemMaxPrice(currentItem)
|
||||
//console.log(currentItem)
|
||||
//console.log(currentPrice)
|
||||
}
|
||||
}
|
||||
return currentPrice * amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the average income for a Mystery Container sorted by rarity
|
||||
*
|
||||
* @param name - The name of the container.
|
||||
* @param parent - The parent container.
|
||||
* @param rarities - An array of rarities.
|
||||
* @param items - The rewards in the container.
|
||||
* @param amount - The quantity of items.
|
||||
* @returns An array of prices.
|
||||
*/
|
||||
private getMysteryContainerPrices(name: string ,parent: string, rarities: Array<string>, items: any, amount: number = 1): Array<number> {
|
||||
let prices: Array<number> = [];
|
||||
let sum: number = 0;
|
||||
|
||||
for(let i = 0; i < rarities.length; i++){
|
||||
let count = 0;
|
||||
for (let j = 0; j < items.rewards[i].length; j++){
|
||||
const currentItem = items.rewards[i][j];
|
||||
let currentPrice: number = 0;
|
||||
|
||||
if (currentItem == '5449016a4bdc2d6f028b456f') { // isRoubles
|
||||
currentPrice = this.MysteryContainer.items[parent].reward_amount[i];
|
||||
//console.log('Roubles Price: ' + currentPrice)
|
||||
} else {
|
||||
currentPrice = this.getItemPrice(parent, currentItem, amount);
|
||||
}
|
||||
|
||||
sum = sum + currentPrice;
|
||||
count++;
|
||||
}
|
||||
//if (name == 'key') {
|
||||
//console.log(prices);
|
||||
//}
|
||||
sum = sum / count;
|
||||
prices.push(sum);
|
||||
sum = 0;
|
||||
}
|
||||
|
||||
|
||||
//console.log(name)
|
||||
//if (name == 'key') {
|
||||
//console.log(prices);
|
||||
//}
|
||||
|
||||
|
||||
this.MysteryContainer.setRarityAverageProfit(name, prices);
|
||||
return prices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the price of a given item in the trader's assort.
|
||||
* Returns 0 if the item is not sold by a trader for roubles.
|
||||
*
|
||||
* @param currentItem - The item for which the price needs to be calculated.
|
||||
* @returns The price of the item in the trader's assortment. If no trader sells the item, returns 0.
|
||||
*/
|
||||
private traderAssortPrice(currentItem: string): any {
|
||||
const databaseServer: DatabaseServer = this.container.resolve<DatabaseServer>("DatabaseServer");
|
||||
const tables = databaseServer.getTables();
|
||||
const traderIDs = ['58330581ace78e27b8b10cee', '54cb50c76803fa8b248b4571', '5c0647fdd443bc2504c2d371', '5a7c2eca46aef81a7ca2145d', '5935c25fb3acc3127c3d8cd9', '5ac3b934156ae10c4430e83c'];
|
||||
let price = 0;
|
||||
|
||||
for (const traderID of traderIDs) {
|
||||
const traderAssort = tables.traders[traderID].assort
|
||||
for (let i = 0; i < traderAssort.items.length; i++) {
|
||||
if (traderAssort.items[i]._tpl == currentItem && traderAssort.items[i].slotId == 'hideout') {
|
||||
const _id = traderAssort.items[i]._id;
|
||||
//console.log('Trader ID = ' + traderID + 'item TPL = ' + traderAssort.items[i]._tpl + ' Item ID = ' + _id)
|
||||
price = traderAssort.barter_scheme[_id][0][0].count;
|
||||
|
||||
if (price < 10) { // price is most likely a barter. This is a bad way of doing this, but fuck it.
|
||||
price = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (traderID == '5935c25fb3acc3127c3d8cd9'){
|
||||
price *= 142; // peacekeeper sells in dollars, must convert to roubles
|
||||
}
|
||||
return price;
|
||||
}
|
||||
}
|
||||
}
|
||||
return price; // No trader sells the item
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the average income for a preset Mystery Container sorted by rarity
|
||||
*
|
||||
* @param name - The name of the container.
|
||||
* @param parent - The parent container.
|
||||
* @param rarities - An array of rarities.
|
||||
* @param items - The items in the container.
|
||||
* @param amount - The amount of items. Default is 1.
|
||||
* @returns An array of preset prices.
|
||||
*/
|
||||
private getContainerPresetPrices(name: string ,parent: string, rarities: Array<string>, items: any, amount: number = 1): Array<number> {
|
||||
const itemHelper: ItemHelper = this.container.resolve<ItemHelper>("ItemHelper");
|
||||
const weapons = new Weapons();
|
||||
let prices: Array<number> = [];
|
||||
let weaponPricesPerTier: Array<number> = [];
|
||||
let tierTotal: number = 0;
|
||||
let sum: number = 0;
|
||||
const helmet_slots = ['helmet_top', 'helmet_back', 'helmet_ears', 'Helmet_top', 'Helmet_back', 'Helmet_ears'];
|
||||
|
||||
for(let i = 0; i < rarities.length; i++){
|
||||
let count = 0;
|
||||
for(let j = 0; j < items.presets[i].length; j++) {
|
||||
for(let k = 0; k < items.presets[i][j].Items.length; k++){
|
||||
|
||||
let currentPrice: number = 0;
|
||||
let currentItem = items.presets[i][j].Items[k]._tpl;
|
||||
|
||||
if (name == 'helmet') {
|
||||
if (helmet_slots.includes(items.presets[i][j].Items[k].slotId)) continue; // skip usless helmet attachments
|
||||
|
||||
//if (i == 3 && j == 0) { // Testing
|
||||
//console.log(items.presets[i][j].Items[k])
|
||||
//console.log('ID = ' + currentItem);
|
||||
//console.log(itemHelper.getDynamicItemPrice(currentItem))
|
||||
//console.log(itemHelper.getItemMaxPrice(currentItem))
|
||||
//console.log(this.traderAssortPrice(currentItem))
|
||||
//}
|
||||
}
|
||||
if (weapons.skip_base_attachments.includes(currentItem)) { // attachment is a base attachment, skip...
|
||||
continue;
|
||||
|
||||
} else {
|
||||
// Order of prices: Override -> Min(trader, flea) -> handbook -> prices.json
|
||||
currentPrice = this.getItemPrice(parent, currentItem, amount);
|
||||
sum = sum + currentPrice;
|
||||
}
|
||||
}
|
||||
count++
|
||||
weaponPricesPerTier.push(Math.floor(sum));
|
||||
sum = 0;
|
||||
}
|
||||
//if ( name == 'helmet') {
|
||||
//console.log('Helmet Rarity = ' + rarities[i]);
|
||||
//console.log(weaponPricesPerTier)
|
||||
//}
|
||||
const tierSum = weaponPricesPerTier.reduce((a, b) => a + b, 0);
|
||||
sum = tierSum / count;
|
||||
prices.push(Math.floor(sum));
|
||||
sum = 0;
|
||||
weaponPricesPerTier = [];
|
||||
}
|
||||
//if ( name == 'helmet') {
|
||||
//console.log(prices)
|
||||
//}
|
||||
this.MysteryContainer.setRarityAverageProfit(name, prices);
|
||||
return prices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the most optimal mystery container price based on the given odds, prices, and desired profitability.
|
||||
*
|
||||
* @param name - name of the mystery container
|
||||
* @param odds - An array of numbers representing the odds.
|
||||
* @param prices - An array of numbers representing the prices.
|
||||
* @param profitability - A number representing the profitability.
|
||||
* @returns The calculated price generation.
|
||||
*/
|
||||
private generatePrices = (name: string, odds: Array<number>, prices: Array<number>, profitability: number) => {
|
||||
let sum: number = 0;
|
||||
let trackOdds = 0;
|
||||
|
||||
for(let i = 0; i < odds.length; i++){
|
||||
const currentOdds = odds[i] - trackOdds;
|
||||
trackOdds = odds[i]
|
||||
sum += prices[i] * (currentOdds / 100);
|
||||
}
|
||||
sum *= profitability;
|
||||
return Math.floor(sum);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Performs a loadout simulation and calculates the average price of the loadout.
|
||||
*
|
||||
* @returns The average price of the loadout.
|
||||
*/
|
||||
public loadoutSimulation = () => {
|
||||
let sum = 0;
|
||||
const weaponContainerPrice = 147000;
|
||||
const extraItems = 5; // extra 2 mags and 3 ammo stacks
|
||||
const simulations = 50000;
|
||||
|
||||
for(let i = 0; i < simulations; i++) {
|
||||
const gamble = new Gamble(this.container, this.config, this.logger, 'loadout');
|
||||
gamble.newGamble();
|
||||
//console.log(gamble.newItemsRequest.itemsWithModsToAdd[1][0].upd.StackObjectsCount)
|
||||
|
||||
for (let j = 0; j < gamble.newItemsRequest.itemsWithModsToAdd.length; j++) {
|
||||
if ( j != 0 && j != 1 + extraItems) { // Weapon, we dont price calculate
|
||||
const indexItem = gamble.newItemsRequest.itemsWithModsToAdd[j][0];
|
||||
const currentItem = indexItem._tpl;
|
||||
const amount = indexItem.upd ? indexItem.upd.StackObjectsCount : 1;
|
||||
const itemPrice = this.getItemPrice('weapon', currentItem, amount);
|
||||
sum += itemPrice;
|
||||
}
|
||||
}
|
||||
|
||||
sum += weaponContainerPrice;
|
||||
}
|
||||
|
||||
return Math.floor(sum / simulations);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
export class ConfigLoader {
|
||||
|
||||
public config = require("../config/config.jsonc");
|
||||
}
|
||||
|
|
@ -1,591 +0,0 @@
|
|||
export class Ammo {
|
||||
|
||||
public parent = "ammo";
|
||||
//public price_generate = true;
|
||||
|
||||
public names = [
|
||||
'7.62x25',
|
||||
'9x18',
|
||||
'9x19',
|
||||
'9x21',
|
||||
'.357',
|
||||
'.45',
|
||||
'4.6x30',
|
||||
'5.7x28',
|
||||
'5.45x39',
|
||||
'5.56x45',
|
||||
'.300',
|
||||
'6.8x51',
|
||||
'7.62x39',
|
||||
'7.62x51',
|
||||
'7.62x54',
|
||||
'.338',
|
||||
'9x39',
|
||||
'.366',
|
||||
'12.7x55',
|
||||
'12/70',
|
||||
'20/70',
|
||||
'23x75',
|
||||
]
|
||||
|
||||
public BSGCalibers = { // this is stupid
|
||||
'Caliber762x25TT': '7.62x25',
|
||||
'Caliber9x18PM': '9x18',
|
||||
'Caliber9x19PARA': '9x19',
|
||||
'Caliber9x21': '9x21',
|
||||
'Caliber9x33R': '.357',
|
||||
'Caliber1143x23ACP': '.45', // ?? why BSG
|
||||
'Caliber46x30': '4.6x30',
|
||||
'Caliber57x28': '5.7x28',
|
||||
'Caliber545x39': '5.45x39',
|
||||
'Caliber556x45NATO': '5.56x45',
|
||||
'Caliber762x35': '.300',
|
||||
'Caliber68x51': '6.8x51',
|
||||
'Caliber762x39': '7.62x39',
|
||||
'Caliber762x51': '7.62x51',
|
||||
'Caliber762x54R': '7.62x54',
|
||||
'Caliber86x70': '.338',
|
||||
'Caliber9x39': '9x39',
|
||||
'Caliber366TKM': '.366',
|
||||
'Caliber127x55': '12.7x55',
|
||||
'Caliber12g': '12/70',
|
||||
'Caliber20g': '20/70',
|
||||
'Caliber23x75': '23x75',
|
||||
}
|
||||
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
]
|
||||
|
||||
public items = {
|
||||
"7.62x25": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"573603562459776430731618", // 7.62x25mm TT Pst gzh
|
||||
],
|
||||
[
|
||||
"5735fdcd2459776445391d61", // 7.62x25mm TT AKBS
|
||||
],
|
||||
[
|
||||
"573602322459776445391df1", // 7.62x25mm TT LRNPC
|
||||
"573601b42459776410737435", // 7.62x25mm TT LRN
|
||||
"5735ff5c245977640e39ba7e", // 7.62x25mm TT FMJ43
|
||||
"5736026a245977644601dc61", // 7.62x25mm TT P gl
|
||||
"573603c924597764442bd9cb", // 7.62x25mm TT PT gzh
|
||||
],
|
||||
]
|
||||
},
|
||||
"9x18": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"57371aab2459775a77142f22", // 9x18mm PMM PstM gzh
|
||||
"573719df2459775a626ccbc2", // 9x18mm PM PBM gzh
|
||||
],
|
||||
[
|
||||
"57372140245977611f70ee91", // 9x18mm PM SP7 gzh
|
||||
"5737218f245977612125ba51", // 9x18mm PM SP8 gzh
|
||||
"573718ba2459775a75491131", // 9x18mm PM BZhT gzh
|
||||
],
|
||||
[
|
||||
"5737207f24597760ff7b25f2", // 9x18mm PM PSV
|
||||
"573719762459775a626ccbc1", // 9x18mm PM P gzh
|
||||
"57371f8d24597761006c6a81", // 9x18mm PM PSO gzh
|
||||
"57371f2b24597761224311f1", // 9x18mm PM PS gs PPO
|
||||
"57371eb62459776125652ac1", // 9x18mm PM PRS gs
|
||||
"57371b192459775a9f58a5e0", // 9x18mm PM PPe gzh
|
||||
"57371e4124597760ff7b25f1", // 9x18mm PM PPT gzh
|
||||
"5737201124597760fc4431f1", // 9x18mm PM Pst gzh
|
||||
"573720e02459776143012541", // 9x18mm PM RG028 gzh
|
||||
],
|
||||
]
|
||||
},
|
||||
"9x19": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5c0d56a986f774449d5de529", // 9x19mm RIP
|
||||
"5c925fa22e221601da359b7b", // 9x19mm AP 6.3
|
||||
"5efb0da7a29a85116f6ea05f", // 9x19mm PBP gzh
|
||||
],
|
||||
[
|
||||
"5efb0e16aeb21837e749c7ff", // 9x19mm QuakeMaker
|
||||
"5a3c16fe86f77452b62de32a", // 9x19mm Luger CCI
|
||||
],
|
||||
[
|
||||
"58864a4f2459770fcc257101", // 9x19mm PSO gzh
|
||||
"5c3df7d588a4501f290594e5", // 9x19mm Green Tracer
|
||||
"64b7bbb74b75259c590fa897", // 9x19mm FMJ M882
|
||||
"56d59d3ad2720bdb418b4577", // 9x19mm Pst gzh
|
||||
],
|
||||
]
|
||||
},
|
||||
"9x21": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5a26ac0ec4a28200741e1e18", // 9x21mm BT gzh
|
||||
"6576f4708ca9c4381d16cd9d", // 9x21mm 7N42 "Zubilo"
|
||||
],
|
||||
[
|
||||
"5a269f97c4a282000b151807", // 9x21mm PS gzh
|
||||
"6576f93989f0062e741ba952", // 9x21mm 7U4
|
||||
],
|
||||
[
|
||||
"5a26ac06c4a282000c5a90a8", // 9x21mm PE gzh
|
||||
"5a26abfac4a28232980eabff", // 9x21mm P gzh
|
||||
],
|
||||
]
|
||||
},
|
||||
".357": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"62330b3ed4dc74626d570b95", // .357 Magnum FMJ
|
||||
],
|
||||
[
|
||||
"62330c18744e5e31df12f516", // .357 Magnum JHP
|
||||
],
|
||||
[
|
||||
"62330c40bdd19b369e1e53d1", // .357 Magnum SP
|
||||
"62330bfadc5883093563729b", // .357 Magnum HP
|
||||
],
|
||||
]
|
||||
},
|
||||
".45": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5ea2a8e200685063ec28c05a", // .45 ACP RIP
|
||||
"5efb0cabfb3e451d70735af5", // .45 ACP AP
|
||||
],
|
||||
[
|
||||
"5efb0fc6aeb21837e749c801", // .45 ACP Hydra-Shok
|
||||
],
|
||||
[
|
||||
"5efb0d4f4bc50b58e81710f3", // .45 ACP Lasermatch FMJ
|
||||
"5e81f423763d9f754677bf2e", // .45 ACP Match FMJ
|
||||
],
|
||||
]
|
||||
},
|
||||
"4.6x30": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5ba26835d4351e0035628ff5", // 4.6x30mm AP SX
|
||||
"5ba2678ad4351e44f824b344", // 4.6x30mm FMJ SX
|
||||
],
|
||||
[
|
||||
"64b6979341772715af0f9c39", // 4.6x30mm JSP SX
|
||||
],
|
||||
[
|
||||
"5ba26844d4351e00334c9475", // 4.6x30mm Subsonic SX
|
||||
"5ba26812d4351e003201fef1", // 4.6x30mm Action SX
|
||||
],
|
||||
]
|
||||
},
|
||||
"5.7x28": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5cc80f53e4a949000e1ea4f8", // 5.7x28mm L191
|
||||
"5cc80f38e4a949001152b560", // 5.7x28mm SS190
|
||||
],
|
||||
[
|
||||
"5cc80f8fe4a949033b0224a2", // 5.7x28mm SS197SR
|
||||
"5cc80f67e4a949035e43bbba", // 5.7x28mm SB193
|
||||
],
|
||||
[
|
||||
"5cc86832d7f00c000d3a6e6c", // 5.7x28mm R37.F
|
||||
"5cc86840d7f00c002412c56c", // 5.7x28mm R37.X
|
||||
"5cc80f79e4a949033c7343b2", // 5.7x28mm SS198LF
|
||||
],
|
||||
]
|
||||
},
|
||||
"5.45x39": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"61962b617c6c7b169525f168", // 5.45x39mm 7N40
|
||||
"56dfef82d2720bbd668b4567", // 5.45x39mm BP gs
|
||||
"56dff026d2720bb8668b4567", // 5.45x39mm BS gs
|
||||
"5c0d5e4486f77478390952fe", // 5.45x39mm PPBS gs "Igolnik"
|
||||
],
|
||||
[
|
||||
"56dff3afd2720bba668b4567", // 5.45x39mm PS gs
|
||||
"56dff2ced2720bb4668b4567", // 5.45x39mm PP gs
|
||||
"56dff061d2720bb5668b4567", // 5.45x39mm BT gs
|
||||
],
|
||||
[
|
||||
"56dff216d2720bbd668b4568", // 5.45x39mm HP
|
||||
"56dff338d2720bbd668b4569", // 5.45x39mm PRS gs
|
||||
"56dff421d2720b5f5a8b4567", // 5.45x39mm SP
|
||||
"56dff4ecd2720b5f5a8b4568", // 5.45x39mm US gs
|
||||
"56dff4a2d2720bbd668b456a", // 5.45x39mm T gs
|
||||
"56dff0bed2720bb0668b4567", // 5.45x39mm FMJ
|
||||
],
|
||||
]
|
||||
},
|
||||
"5.56x45": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"54527ac44bdc2d36668b4567", // 5.56x45mm M855A1
|
||||
"54527ac44bdc2d36668b4567", // 5.56x45mm M855A1
|
||||
"59e690b686f7746c9f75e848", // 5.56x45mm M995
|
||||
"601949593ae8f707c4608daa", // 5.56x45mm SSA AP
|
||||
],
|
||||
[
|
||||
"54527a984bdc2d4e668b4567", // 5.56x45mm M855
|
||||
"60194943740c5d77f6705eea", // 5.56x45mm MK 318 Mod 0 (SOST)
|
||||
"59e6906286f7746c9f75e847", // 5.56x45mm M856A1
|
||||
],
|
||||
[
|
||||
"5c0d5ae286f7741e46554302", // 5.56x45mm Warmageddon
|
||||
"59e6927d86f77411da468256", // 5.56x45mm HP
|
||||
"59e6918f86f7746c9f75e849", // 5.56x45mm MK 255 Mod 0 (RRLP)
|
||||
"59e6920f86f77411d82aa167", // 5.56x45mm FMJ
|
||||
"59e68f6f86f7746c9f75e846", // 5.56x45mm M856
|
||||
],
|
||||
]
|
||||
},
|
||||
".300": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"64b8725c4b75259c590fa899", // .300 Blackout CBJ
|
||||
"5fd20ff893a8961fc660a954", // .300 Blackout AP
|
||||
],
|
||||
[
|
||||
"5fbe3ffdf8b6a877a729ea82", // .300 Blackout BCP FMJ
|
||||
"619636be6db0f2477964e710", // .300 Blackout M62 Tracer
|
||||
],
|
||||
[
|
||||
"6196365d58ef8c428c287da1", // .300 Whisper
|
||||
"6196364158ef8c428c287d9f", // .300 Blackout V-Max
|
||||
],
|
||||
]
|
||||
},
|
||||
"6.8x51": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"6529243824cbe3c74a05e5c1", // 6.8x51mm SIG Hybrid
|
||||
],
|
||||
[
|
||||
"6529302b8c26af6326029fb7", // 6.8x51mm SIG FMJ
|
||||
],
|
||||
[
|
||||
"6529302b8c26af6326029fb7", // 6.8x51mm SIG FMJ
|
||||
],
|
||||
]
|
||||
},
|
||||
"7.62x39": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"59e0d99486f7744a32234762", // 7.62x39mm BP gzh
|
||||
"601aa3d2b2bcb34913271e6d", // 7.62x39mm MAI AP
|
||||
],
|
||||
[
|
||||
"5656d7c34bdc2d9d198b4587", // 7.62x39mm PS gzh
|
||||
"64b7af434b75259c590fa893", // 7.62x39mm PP gzh
|
||||
"64b7af434b75259c590fa893", // 7.62x39mm PP gzh
|
||||
],
|
||||
[
|
||||
"59e4d3d286f774176a36250a", // 7.62x39mm HP
|
||||
"64b7af734b75259c590fa895", // 7.62x39mm SP
|
||||
"64b7af5a8532cf95ee0a0dbd", // 7.62x39mm FMJ
|
||||
"59e4d24686f7741776641ac7", // 7.62x39mm US gzh
|
||||
"59e4cf5286f7741778269d8a", // 7.62x39mm T-45M1 gzh
|
||||
],
|
||||
]
|
||||
},
|
||||
"7.62x51": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5a608bf24f39f98ffc77720e", // 7.62x51mm M62 Tracer
|
||||
"5a6086ea4f39f99cd479502f", // 7.62x51mm M61
|
||||
"6768c25aa7b238f14a08d3f6", // 7.62x51mm M80A1
|
||||
"5efb0c1bd79ff02a1f5e68d9", // 7.62x51mm M993
|
||||
],
|
||||
[
|
||||
"5e023e53d4353e3302577c4c", // 7.62x51mm BCP FMJ
|
||||
"58dd3ad986f77403051cba8f", // 7.62x51mm M80
|
||||
],
|
||||
[
|
||||
"5e023e88277cce2b522ff2b1", // 7.62x51mm Ultra Nosler
|
||||
"5e023e6e34d52a55c3304f71", // 7.62x51mm TCW SP
|
||||
],
|
||||
]
|
||||
},
|
||||
"7.62x54": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5e023d34e8a400319a28ed44", // 7.62x54mm R BT gzh
|
||||
"560d61e84bdc2da74d8b4571", // 7.62x54mm R SNB gzh
|
||||
"5e023d48186a883be655e551", // 7.62x54mm R BS gs
|
||||
],
|
||||
[
|
||||
"5e023cf8186a883be655e54f", // 7.62x54mm R T-46M gzh
|
||||
"5887431f2459777e1612938f", // 7.62x54mm R LPS gzh
|
||||
"59e77a2386f7742ee578960a", // 7.62x54mm R PS gzh
|
||||
],
|
||||
[
|
||||
"64b8f7c241772715af0f9c3d", // 7.62x54mm R HP BT
|
||||
"64b8f7b5389d7ffd620ccba2", // 7.62x54mm R SP BT
|
||||
"64b8f7968532cf95ee0a0dbf", // 7.62x54mm R FMJ
|
||||
],
|
||||
]
|
||||
},
|
||||
".338": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5fc382a9d724d907e2077dab", // .338 Lapua Magnum AP
|
||||
],
|
||||
[
|
||||
"5fc275cf85fd526b824a571a", // .338 Lapua Magnum FMJ
|
||||
],
|
||||
[
|
||||
"5fc382b6d6fa9c00c571bbc3", // .338 Lapua Magnum TAC-X
|
||||
"5fc382c1016cce60e8341b20", // .338 Lapua Magnum UCW
|
||||
],
|
||||
]
|
||||
},
|
||||
"9x39": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5c0d688c86f77413ae3407b2", // 9x39mm BP gs
|
||||
"57a0e5022459774d1673f889", // 9x39mm SP-6 gs
|
||||
],
|
||||
[
|
||||
"57a0dfb82459774d3078b56c", // 9x39mm SP-5 gs
|
||||
"5c0d668f86f7747ccb7f13b2", // 9x39mm SPP gs
|
||||
"5c0d668f86f7747ccb7f13b2", // 9x39mm SPP gs
|
||||
"61962d879bb3d20b0946d385", // 9x39mm PAB-9 gs
|
||||
],
|
||||
[
|
||||
"57a0dfb82459774d3078b56c", // 9x39mm SP-5 gs
|
||||
"6576f96220d53a5b8f3e395e", // 9x39mm FMJ
|
||||
],
|
||||
]
|
||||
},
|
||||
".366": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5f0596629e22f464da6bbdd9", // .366 TKM AP-M
|
||||
],
|
||||
[
|
||||
"59e655cb86f77411dc52a77b", // .366 TKM EKO
|
||||
],
|
||||
[
|
||||
"59e6658b86f77411d949b250", // .366 TKM Geksa
|
||||
"59e6542b86f77411dc52a77a", // .366 TKM FMJ
|
||||
],
|
||||
]
|
||||
},
|
||||
"12.7x55": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5cadf6eeae921500134b2799", // 12.7x55mm PS12B
|
||||
],
|
||||
[
|
||||
"5cadf6ddae9215051e1c23b2", // 12.7x55mm PS12
|
||||
],
|
||||
[
|
||||
"5cadf6e5ae921500113bb973", // 12.7x55mm PS12A
|
||||
],
|
||||
]
|
||||
},
|
||||
"12/70": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5d6e6911a4b9361bd5780d52", // 12/70 flechette
|
||||
"5c0d591486f7744c505b416f", // 12/70 RIP
|
||||
"5d6e68a8a4b9360b6c0d54e2", // 12/70 AP-20 armor-piercing slug
|
||||
],
|
||||
[
|
||||
"5d6e6806a4b936088465b17e", // 12/70 8.5mm Magnum buckshot
|
||||
"64b8ee384b75259c590fa89b", // 12/70 Piranha
|
||||
"5d6e68c4a4b9361b93413f79", // 12/70 makeshift .50 BMG slug
|
||||
],
|
||||
[
|
||||
"5d6e6772a4b936088465b17c", // 12/70 5.25mm buckshot
|
||||
"5d6e67fba4b9361bc73bc779", // 12/70 6.5mm Express buckshot
|
||||
"560d5e524bdc2d25448b4571", // 12/70 7mm buckshot
|
||||
"5d6e68d1a4b93622fe60e845", // 12/70 SuperFormance HP slug
|
||||
"5d6e6869a4b9361c140bcfde", // 12/70 Grizzly 40 slug
|
||||
"5d6e68b3a4b9361bca7e50b5", // 12/70 Copper Sabot Premier HP slug
|
||||
"58820d1224597753c90aeb13", // 12/70 lead slug
|
||||
"5d6e6891a4b9361bd473feea", // 12/70 "Poleva-3" slug
|
||||
"5d6e68dea4b9361bcc29e659", // 12/70 Dual Sabot slug
|
||||
"5d6e68e6a4b9361c140bcfe0", // 12/70 FTX Custom Lite slug
|
||||
"5d6e689ca4b9361bc8618956", // 12/70 "Poleva-6u" slug
|
||||
],
|
||||
]
|
||||
},
|
||||
"20/70": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5d6e6a5fa4b93614ec501745", // 20/70 Devastator slug
|
||||
"5d6e6a05a4b93618084f58d0", // 20/70 Star slug
|
||||
"660137d8481cc6907a0c5cda", // 20/70 TSS Armor Piercing Slug
|
||||
"660137d8481cc6907a0c5cda", // 20/70 TSS Armor Piercing Slug
|
||||
"660137ef76c1b56143052be8", // 20/70 Dangerous Game Slug
|
||||
"660137ef76c1b56143052be8", // 20/70 Dangerous Game Slug
|
||||
"6601380580e77cfd080e3418", // 20/70 flechette
|
||||
"6601380580e77cfd080e3418", // 20/70 flechette
|
||||
],
|
||||
[
|
||||
"5d6e69c7a4b9360b6c0d54e4", // 20/70 7.3mm buckshot
|
||||
"5d6e6a53a4b9361bd473feec", // 20/70 "Poleva-3" slug
|
||||
"5d6e6a42a4b9364f07165f52", // 20/70 "Poleva-6u" slug
|
||||
"6601380580e77cfd080e3418", // 20/70 flechette
|
||||
],
|
||||
[
|
||||
"5d6e695fa4b936359b35d852", // 20/70 5.6mm buckshot
|
||||
"5d6e69b9a4b9361bc8618958", // 20/70 6.2mm buckshot
|
||||
"5a38ebd9c4a282000d722a5b", // 20/70 7.5mm buckshot
|
||||
],
|
||||
]
|
||||
},
|
||||
"23x75": {
|
||||
parent: "ammo",
|
||||
rarities: [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
],
|
||||
rewards: [
|
||||
[
|
||||
"5e85a9f4add9fe03027d9bf1", // 23x75mm Zvezda flashbang round
|
||||
"5e85aa1a988a8701445df1f5", // 23x75mm Barrikada slug
|
||||
"5e85a9a6eacf8c039e4e2ac1", // 23x75mm Shrapnel-10 buckshot
|
||||
],
|
||||
[
|
||||
"5e85a9a6eacf8c039e4e2ac1", // 23x75mm Shrapnel-10 buckshot
|
||||
"5f647f31b6238e5dd066e196", // 23x75mm Shrapnel-25 buckshot
|
||||
],
|
||||
[
|
||||
"5f647f31b6238e5dd066e196", // 23x75mm Shrapnel-25 buckshot
|
||||
],
|
||||
]
|
||||
},
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,17 +0,0 @@
|
|||
export class AverageWeapons {
|
||||
|
||||
public parent = "weapon";
|
||||
public is_preset = true;
|
||||
public price_generate = true;
|
||||
public calculate_preset_prices = false;
|
||||
|
||||
public rarities = [
|
||||
"_decent",
|
||||
"_meta",
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
"decent",
|
||||
"meta",
|
||||
]
|
||||
}
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
export class Backpacks {
|
||||
|
||||
public parent = "backpack";
|
||||
public price_generate = true;
|
||||
|
||||
public rarities = [
|
||||
"_extremely_rare",
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
"656e0436d44a1bb4220303a0", // Mystery Ranch SATL Bridger Assault Pack (Foliage)
|
||||
"628bc7fb408e2b2e9c0801b1", // Mystery Ranch NICE COMM 3 BVS frame system (Coyote)
|
||||
"61b9e1aaef9a1b5d6a79899a", // Santa's bag
|
||||
"5c0e774286f77468413cc5b2", // Mystery Ranch Blackjack 50 backpack (MultiCam)
|
||||
"5c0e774286f77468413cc5b2", // Mystery Ranch Blackjack 50 backpack (MultiCam)
|
||||
],
|
||||
[
|
||||
//"5e4abc6786f77406812bd572", // LBT-2670 Slim Field Med Pack (Black)
|
||||
//"5e997f0b86f7741ac73993e2", // Sanitar's bag
|
||||
"5c0e805e86f774683f3dd637", // 3V Gear Paratus 3-Day Operator's Tactical backpack (Foliage Grey)
|
||||
"5df8a4d786f77412672a1e3b", // 6Sh118 raid backpack (Digital Flora)
|
||||
"5ab8ebf186f7742d8b372e80", // SSO Attack 2 raid backpack (Khaki)
|
||||
"5b44c6ae86f7742d1627baea", // ANA Tactical Beta 2 Battle backpack (Olive Drab)
|
||||
"62a1b7fbc30cfa1d366af586", // Gruppa 99 T30 backpack (MultiCam)
|
||||
"5f5e46b96bdad616ad46d613", // Eberlestock F4 Terminator load bearing backpack (Tiger Stripe)
|
||||
"628e1ffc83ec92260c0f437f", // Gruppa 99 T30 backpack (Black)
|
||||
"6034d2d697633951dc245ea6", // Eberlestock G2 Gunslinger II backpack (Dry Earth)
|
||||
"639346cc1c8f182ad90c8972", // Tasmanian Tiger Trooper 35 backpack (Khaki)
|
||||
"639346cc1c8f182ad90c8972", // Tasmanian Tiger Trooper 35 backpack (Khaki)
|
||||
],
|
||||
[
|
||||
"656ddcf0f02d7bcea90bf395", // Tehinkom RK-PT-25 patrol backpack (Digital Flora)
|
||||
"6034d103ca006d2dca39b3f0", // Hazard 4 Takedown sling backpack (Black)
|
||||
"6038d614d10cbf667352dd44", // Hazard 4 Takedown sling backpack (MultiCam)
|
||||
"619cf0335771dd3c390269ae", // Gruppa 99 T20 backpack (MultiCam)
|
||||
"656f198fb27298d6fd005466", // Direct Action Dragon Egg Mark II backpack (Black)
|
||||
"618cfae774bb2d036a049e7c", // LBT-1476A 3Day Pack (Woodland)
|
||||
"60a272cc93ef783291411d8e", // Hazard 4 Drawbridge backpack (Coyote Tan)
|
||||
"5d5d940f86f7742797262046", // Oakley Mechanism heavy duty backpack (Black)
|
||||
"59e763f286f7742ee57895da", // Pilgrim tourist backpack
|
||||
"5f5e467b0bc58666c37e7821", // Eberlestock F5 Switchblade backpack (Dry Earth)
|
||||
"618bb76513f5097c8d5aa2d5", // Gruppa 99 T20 backpack (Umber Brown)
|
||||
"545cdae64bdc2d39198b4568", // Camelbak Tri-Zip assault backpack (Foliage)
|
||||
"545cdae64bdc2d39198b4568", // Camelbak Tri-Zip assault backpack (Foliage)
|
||||
],
|
||||
[
|
||||
"5ab8f04f86f774585f4237d8", // Tactical sling bag (Khaki)
|
||||
"5ab8ee7786f7742d8f33f0b9", // VKBO army bag
|
||||
"56e33680d2720be2748b4576", // Transformer Bag
|
||||
"56e33634d2720bd8058b456b", // Duffle bag
|
||||
"544a5cde4bdc2d39388b456b", // Flyye MBSS backpack (UCP)
|
||||
"5f5e45cc5021ce62144be7aa", // LolKek 3F Transfer tourist backpack
|
||||
"5e9dcf5986f7746c417435b3", // LBT-8005A Day Pack backpack (MultiCam Black)
|
||||
"60a2828e8689911a226117f9", // Hazard 4 Pillbox backpack (Black)
|
||||
"5ca20d5986f774331e7c9602", // WARTECH Berkut BB-102 backpack (A-TACS FG)
|
||||
"56e335e4d2720b6c058b456d", // Scav backpack
|
||||
"56e335e4d2720b6c058b456d", // Scav backpack
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
export class CoinFlip100k {
|
||||
|
||||
public parent = "100k";
|
||||
public price_generate = true;
|
||||
|
||||
public rarities = [
|
||||
"_success",
|
||||
"_failure",
|
||||
]
|
||||
public stackable = [true, true]
|
||||
public reward_amount = [
|
||||
200000,
|
||||
0
|
||||
]
|
||||
public rewards = [
|
||||
['5449016a4bdc2d6f028b456f'],
|
||||
['NaN'],
|
||||
]
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
export class CoinFlip1Mil {
|
||||
|
||||
public parent = "1mil";
|
||||
public price_generate = true;
|
||||
|
||||
public rarities = [
|
||||
"_success",
|
||||
"_failure",
|
||||
]
|
||||
public stackable = [true, true]
|
||||
public reward_amount = [
|
||||
2000000,
|
||||
0
|
||||
]
|
||||
public rewards = [
|
||||
['5449016a4bdc2d6f028b456f'],
|
||||
['NaN'],
|
||||
]
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
export class CoinFlip500k {
|
||||
|
||||
public parent = "500k";
|
||||
public price_generate = true;
|
||||
|
||||
public rarities = [
|
||||
"_success",
|
||||
"_failure",
|
||||
]
|
||||
public stackable = [true, true]
|
||||
public reward_amount = [
|
||||
1000000,
|
||||
0
|
||||
]
|
||||
public rewards = [
|
||||
['5449016a4bdc2d6f028b456f'],
|
||||
['NaN'],
|
||||
]
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
export class DefaultWeapons {
|
||||
|
||||
public parent = "weapon";
|
||||
public is_preset = true;
|
||||
public price_generate = true;
|
||||
public calculate_preset_prices = false;
|
||||
|
||||
public rarities = [
|
||||
"_base",
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
"base",
|
||||
]
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
export class FlipBitcoin {
|
||||
|
||||
public parent = "money";
|
||||
public rarities = [
|
||||
"_success",
|
||||
]
|
||||
public stackable = [false]
|
||||
public reward_amount = [2]
|
||||
public rewards = [
|
||||
[
|
||||
'59faff1d86f7746c51718c9c', // Bitcoin
|
||||
],
|
||||
|
||||
]
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
export class FlipGPCoin {
|
||||
|
||||
public parent = "money";
|
||||
public rarities = [
|
||||
"_success",
|
||||
]
|
||||
public stackable = [true]
|
||||
public reward_amount = [50]
|
||||
public rewards = [
|
||||
[
|
||||
'5d235b4d86f7742e017bc88a', // GP Coin
|
||||
],
|
||||
|
||||
]
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
export class FlipRouble {
|
||||
|
||||
public parent = "money";
|
||||
public rarities = [
|
||||
"_success",
|
||||
"_failure",
|
||||
]
|
||||
public stackable = [true, false]
|
||||
public reward_amount = [5000000,1]
|
||||
public rewards = [
|
||||
[
|
||||
'5449016a4bdc2d6f028b456f', // 5,000,000 Roubles
|
||||
],
|
||||
[
|
||||
'57347d7224597744596b4e72', // Can of beef stew (Small)
|
||||
],
|
||||
|
||||
]
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
export class Foods {
|
||||
|
||||
public parent = "food";
|
||||
public price_generate = true;
|
||||
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
"5d1b33a686f7742523398398", // Canister with purified water
|
||||
"5d1b376e86f774252519444e", // Bottle of Fierce Hatchling moonshine
|
||||
],
|
||||
[
|
||||
"656df4fec921ad01000481a2", // Pack of instant noodles
|
||||
"5448fee04bdc2dbc018b4567", // Bottle of water (0.6L)
|
||||
"5751496424597720a27126da", // Can of Hot Rod energy drink
|
||||
"57347d8724597744596b4e76", // Can of squash spread
|
||||
"57347d9c245977448b40fa85", // Can of herring
|
||||
"5bc9c29cd4351e003562b8a3", // Can of sprats
|
||||
"57347d7224597744596b4e72", // Can of beef stew (Small)
|
||||
"65815f0e647e3d7246384e14", // Pack of Tarker dried meat
|
||||
"5734773724597737fd047c14", // Can of condensed milk
|
||||
"5751435d24597720a27126d1", // Can of Max Energy energy drink
|
||||
"57347da92459774491567cf5", // Can of beef stew (Large)
|
||||
"5673de654bdc2d180f8b456d", // Can of pacific saury
|
||||
"614451b71e5874611e2c7ae5", // Bottle of Tarkovskaya vodka
|
||||
"57347d5f245977448b40fa81", // Can of humpback salmon
|
||||
"60098b1705871270cd5352a1", // Emergency Water Ration
|
||||
"5e8f3423fd7471236e6e3b64", // Bottle of "Norvinskiy Yadreniy" premium kvass (0.6L)
|
||||
"60b0f93284c20f0feb453da7", // Can of RatCola soda
|
||||
"635a758bfefc88a93f021b8a", // Salty Dog beef sausage
|
||||
"62a09f32621468534a797acb", // Bottle of Pevko Light beer
|
||||
"5d403f9186f7743cac3f229b", // Bottle of Dan Jackiel whiskey
|
||||
"57505f6224597709a92585a9", // Alyonka chocolate bar
|
||||
"590c5f0d86f77413997acfab", // MRE ration pack
|
||||
"575146b724597720a27126d5", // Pack of milk
|
||||
"59e3577886f774176a362503", // Pack of sugar
|
||||
],
|
||||
[
|
||||
|
||||
"575062b524597720a31c09a1", // Can of Ice Green tea
|
||||
"57513f07245977207e26a311", // Pack of apple juice
|
||||
"5448ff904bdc2d6f028b456e", // Army crackers
|
||||
"5751487e245977207e26a315", // Emelya rye croutons
|
||||
"57513f9324597720a7128161", // Pack of Grand juice
|
||||
"544fb62a4bdc2dfb738b4568", // Pack of Russian Army pineapple juice
|
||||
"544fb6cc4bdc2d34748b456e", // Slickers chocolate bar
|
||||
"57514643245977207f2c2d09", // Can of TarCola soda
|
||||
"57513fcc24597720a31c09a6", // Pack of Vita juice
|
||||
"57347d692459774491567cf1", // Can of green peas
|
||||
"57347d90245977448f7b7f65", // Pack of oat flakes
|
||||
"57347d3d245977448f7b7f61", // Rye croutons
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
export class Headsets {
|
||||
|
||||
public parent = "headset";
|
||||
public price_generate = true;
|
||||
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common"
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
"628e4e576d783146b124c64d", // Peltor ComTac 4 Hybrid headset (Coyote Brown)
|
||||
"66b5f6985891c84aab75ca76", // Peltor ComTac VI headset (Coyote Brown)
|
||||
],
|
||||
[
|
||||
"66b5f693acff495a294927e3", // Peltor ComTac V headset (OD Green)
|
||||
"5645bcc04bdc2d363b8b4572", // Peltor ComTac 2 headset (OD Green)
|
||||
"66b5f68de98be930d701c00e", // Safariland Liberator HP 2.0 Hearing Protection Headset (FDE)
|
||||
"5f60cd6cf2bcbb675b00dac6", // Walker's XCEL 500BT Digital headset
|
||||
"5e4d34ca86f774264f758330", // Walker's Razor Digital headset
|
||||
"5c165d832e2216398b5a7e36", // Peltor Tactical Sport headset
|
||||
|
||||
],
|
||||
[
|
||||
"5b432b965acfc47a8774094e", // GSSh-01 active headset
|
||||
"6033fa48ffd42c541047f728", // OPSMEN Earmor M32 headset
|
||||
"5aa2ba71e5b5b000137b758f", // MSA Sordin Supreme PRO-X/L headset
|
||||
|
||||
]
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,33 +0,0 @@
|
|||
export class Keycard {
|
||||
|
||||
public parent = "keycard";
|
||||
public price_generate = true;
|
||||
|
||||
public rarities = [
|
||||
"_red",
|
||||
"_green",
|
||||
"_blue",
|
||||
"_violet",
|
||||
"_black",
|
||||
"_yellow",
|
||||
"_blue_marking",
|
||||
"_21WS",
|
||||
"_11SR",
|
||||
"_access"
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
["5c1d0efb86f7744baf2e7b7b"], // TerraGroup Labs keycard (Red)
|
||||
["5c1d0dc586f7744baf2e7b79"], // TerraGroup Labs keycard (Green)
|
||||
["5c1d0c5f86f7744bb2683cf0"], // TerraGroup Labs keycard (Blue)
|
||||
["5c1e495a86f7743109743dfb"], // TerraGroup Labs keycard (Violet)
|
||||
["5c1d0f4986f7744bb01837fa"], // TerraGroup Labs keycard (Black)
|
||||
["5c1d0d6d86f7744bb2683e1f"], // TerraGroup Labs keycard (Yellow)
|
||||
["5efde6b4f5448336730dbd61"], // Keycard with a blue marking
|
||||
["5e42c83786f7742a021fdf3c"], // Object #21WS keycard
|
||||
["5e42c81886f7742a01529f57"], // Object #11SR keycard
|
||||
["5c94bbff86f7747ee735c08f"] // TerraGroup Labs access keycard
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
export class Loadoutdrink {
|
||||
|
||||
public parent = "loadout_drink";
|
||||
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common",
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
"5e8f3423fd7471236e6e3b64", // Bottle of "Norvinskiy Yadreniy" premium kvass (0.6L)
|
||||
"5448fee04bdc2dbc018b4567", // Bottle of water (0.6L)
|
||||
"60098b1705871270cd5352a1", // Emergency Water Ration
|
||||
],
|
||||
[
|
||||
"575146b724597720a27126d5", // Pack of milk
|
||||
"5751496424597720a27126da", // Can of Hot Rod energy drink
|
||||
"57513fcc24597720a31c09a6", // Pack of Vita juice
|
||||
"5751435d24597720a27126d1", // Can of Max Energy energy drink
|
||||
"60b0f93284c20f0feb453da7", // Can of RatCola soda
|
||||
],
|
||||
[
|
||||
"57513f9324597720a7128161", // Pack of Grand juice
|
||||
"575062b524597720a31c09a1", // Can of Ice Green tea
|
||||
"57513f07245977207e26a311", // Pack of apple juice
|
||||
"544fb62a4bdc2dfb738b4568", // Pack of Russian Army pineapple juice
|
||||
"57514643245977207f2c2d09", // Can of TarCola soda
|
||||
],
|
||||
]
|
||||
}
|
||||
|
|
@ -1,103 +0,0 @@
|
|||
export class LoadoutFacecovers {
|
||||
|
||||
public parent = "loadout_facecovers";
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common",
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
'635267ab3c89e2112001f826', // Spooky skull mask
|
||||
'5e54f76986f7740366043752', // Shroud half-mask
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'6571bde39837cc51b800c212', // Ghost half-mask
|
||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
||||
'62a09dd4621468534a797ac7', // Baddie's red beard
|
||||
'572b7f1624597762ae139822', // Balaclava
|
||||
'5c1a1e3f2e221602b66cc4c2', // Fake white beard
|
||||
'607f201b3c672b3b3a24a800', // Twitch Rivals 2021 balaclava
|
||||
'5e71f6be86f77429f2683c44', // Twitch Rivals 2020 mask
|
||||
'5e71fad086f77422443d4604', // Twitch Rivals 2020 half-mask
|
||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
],
|
||||
[
|
||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
||||
'607f201b3c672b3b3a24a800', // Twitch Rivals 2021 balaclava
|
||||
'5e71f6be86f77429f2683c44', // Twitch Rivals 2020 mask
|
||||
'5e71fad086f77422443d4604', // Twitch Rivals 2020 half-mask
|
||||
'62a09dd4621468534a797ac7', // Baddie's red beard
|
||||
'572b7fa524597762b747ce82', // Lower half-mask
|
||||
'572b7fa524597762b747ce82', // Lower half-mask
|
||||
'572b7f1624597762ae139822', // Balaclava
|
||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
||||
'5e54f76986f7740366043752', // Shroud half-mask
|
||||
'5c1a1e3f2e221602b66cc4c2', // Fake white beard
|
||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'NaN',
|
||||
'NaN',
|
||||
'NaN',
|
||||
],
|
||||
[
|
||||
'6571bde39837cc51b800c212', // Ghost half-mask
|
||||
'62a09dd4621468534a797ac7', // Baddie's red beard
|
||||
'5e71f6be86f77429f2683c44', // Twitch Rivals 2020 mask
|
||||
'5e54f76986f7740366043752', // Shroud half-mask
|
||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
||||
'572b7f1624597762ae139822', // Balaclava
|
||||
'607f201b3c672b3b3a24a800', // Twitch Rivals 2021 balaclava
|
||||
'5e71fad086f77422443d4604', // Twitch Rivals 2020 half-mask
|
||||
'5c1a1e3f2e221602b66cc4c2', // Fake white beard
|
||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
||||
'572b7fa524597762b747ce82', // Lower half-mask
|
||||
'572b7fa524597762b747ce82', // Lower half-mask
|
||||
'572b7fa524597762b747ce82', // Lower half-mask
|
||||
'572b7fa524597762b747ce82', // Lower half-mask
|
||||
'5b4326435acfc433000ed01d', // Neoprene mask
|
||||
'5b4326435acfc433000ed01d', // Neoprene mask
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
||||
'NaN',
|
||||
'NaN',
|
||||
'NaN',
|
||||
'NaN',
|
||||
'NaN',
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
export class LoadoutFood {
|
||||
|
||||
public parent = "loadout_food";
|
||||
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common",
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
"65815f0e647e3d7246384e14", // Pack of Tarker dried meat
|
||||
"57347d5f245977448b40fa81", // Can of humpback salmon
|
||||
"5bc9c29cd4351e003562b8a3", // Can of sprats
|
||||
"57347d7224597744596b4e72", // Can of beef stew (Small)
|
||||
"57347da92459774491567cf5", // Can of beef stew (Large)
|
||||
"635a758bfefc88a93f021b8a", // Salty Dog beef sausage
|
||||
"590c5f0d86f77413997acfab", // MRE ration pack
|
||||
],
|
||||
[
|
||||
"57347d692459774491567cf1", // Can of green peas
|
||||
"57347d9c245977448b40fa85", // Can of herring
|
||||
"57347d8724597744596b4e76", // Can of squash spread
|
||||
"656df4fec921ad01000481a2", // Pack of instant noodles
|
||||
"5673de654bdc2d180f8b456d", // Can of pacific saury
|
||||
|
||||
],
|
||||
[
|
||||
"57347d3d245977448f7b7f61", // Rye croutons
|
||||
"5448ff904bdc2d6f028b456e", // Army crackers
|
||||
"5751487e245977207e26a315", // Emelya rye croutons
|
||||
"544fb6cc4bdc2d34748b456e", // Slickers chocolate bar
|
||||
|
||||
]
|
||||
|
||||
]
|
||||
}
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
export class LoadoutGrenade {
|
||||
|
||||
public parent = "loadout_grenade";
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common",
|
||||
]
|
||||
|
||||
public stackable = [false, false, false]
|
||||
|
||||
//public reward_amount = [ // Amount of rolls for each reward tier, duplicate items
|
||||
//2,
|
||||
//2,
|
||||
//1,
|
||||
//]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'5e340dcdcb6d5863cc5e5efb', // VOG-25 Khattabka improvised hand grenade
|
||||
'5e340dcdcb6d5863cc5e5efb', // VOG-25 Khattabka improvised hand grenade
|
||||
'5e32f56fcb6d5863cc5e5ee4', // VOG-17 Khattabka improvised hand grenade
|
||||
'5e32f56fcb6d5863cc5e5ee4', // VOG-17 Khattabka improvised hand grenade
|
||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
||||
'58d3db5386f77426186285a0', // M67 hand grenade
|
||||
'617fd91e5539a84ec44ce155', // RGN hand grenade
|
||||
'618a431df1eb8e24b8741deb', // RGO hand grenade
|
||||
],
|
||||
[
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'58d3db5386f77426186285a0', // M67 hand grenade
|
||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
||||
],
|
||||
[
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'NaN', // No grenade
|
||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
||||
'5a0c27731526d80618476ac4', // Zarya stun grenade
|
||||
'5a0c27731526d80618476ac4', // Zarya stun grenade
|
||||
'5a0c27731526d80618476ac4', // Zarya stun grenade
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
export class LoadoutHealing {
|
||||
|
||||
public parent = "loadout_light_healing";
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common",
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
||||
'60098ad7c2240c0fe85c570a', // AFAK tactical individual first aid kit
|
||||
'60098ad7c2240c0fe85c570a', // AFAK tactical individual first aid kit
|
||||
'590c657e86f77412b013051d', // Grizzly medical kit
|
||||
],
|
||||
[
|
||||
'590c661e86f7741e566b646a', // Car first aid kit
|
||||
'544fb45d4bdc2dee738b4568', // Salewa first aid kit
|
||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
||||
],
|
||||
[
|
||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
||||
'544fb45d4bdc2dee738b4568', // Salewa first aid kit
|
||||
'5755356824597772cb798962', // AI-2 medkit
|
||||
'5755356824597772cb798962', // AI-2 medkit
|
||||
'590c661e86f7741e566b646a', // Car first aid kit
|
||||
'590c661e86f7741e566b646a', // Car first aid kit
|
||||
]
|
||||
]
|
||||
}
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
export class LoadoutHeavyBleed {
|
||||
|
||||
public parent = "loadout_heavy_bleed";
|
||||
public rarities = [
|
||||
"_rare",
|
||||
"_uncommon",
|
||||
"_common",
|
||||
]
|
||||
|
||||
public rewards = [
|
||||
[
|
||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
||||
],
|
||||
[
|
||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
||||
],
|
||||
[
|
||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
||||
]
|
||||
]
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue