From 1021a945cb31292a2b6f43baeca734af5a2c246b Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 11:46:51 +0000 Subject: [PATCH 01/23] Fix insurance costing 0 roubles --- project/src/controllers/InsuranceController.ts | 9 +++++---- .../models/eft/trade/IProcessBuyTradeRequestData.ts | 3 ++- project/src/services/PaymentService.ts | 13 ++++++++++++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/project/src/controllers/InsuranceController.ts b/project/src/controllers/InsuranceController.ts index a2593187..9ba20416 100644 --- a/project/src/controllers/InsuranceController.ts +++ b/project/src/controllers/InsuranceController.ts @@ -31,6 +31,7 @@ import { TimeUtil } from "@spt-aki/utils/TimeUtil"; export class InsuranceController { protected insuranceConfig: IInsuranceConfig; + protected roubleTpl = "5449016a4bdc2d6f028b456f"; constructor( @inject("WinstonLogger") protected logger: ILogger, @@ -522,17 +523,17 @@ export class InsuranceController const itemsToInsureCount = body.items.length; const itemsToPay = []; const inventoryItemsHash = {}; - + // Create hash of player inventory items (keyed by item id) for (const item of pmcData.Inventory.items) { inventoryItemsHash[item._id] = item; } - // get the price of all items + // Get price of all items being insured for (const key of body.items) { itemsToPay.push({ - id: inventoryItemsHash[key]._id, + id: this.roubleTpl, // TODO: update to handle difference currencies count: Math.round(this.insuranceService.getPremium(pmcData, inventoryItemsHash[key], body.tid)) }); } @@ -541,7 +542,7 @@ export class InsuranceController // eslint-disable-next-line @typescript-eslint/naming-convention scheme_items: itemsToPay, tid: body.tid, - Action: "", + Action: "SptInsure", type: "", // eslint-disable-next-line @typescript-eslint/naming-convention item_id: "", diff --git a/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts b/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts index 5fc93bbb..54b4f8b7 100644 --- a/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts +++ b/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts @@ -3,7 +3,7 @@ import { IProcessBaseTradeRequestData } from "@spt-aki/models/eft/trade/IProcess export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { - Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | "" + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | "" | "SptInsure" type: string tid: string item_id: string @@ -14,6 +14,7 @@ export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestDat export interface SchemeItem { + /** Id of stack to take money from, is money tpl when Action is `SptInsure` */ id: string count: number } diff --git a/project/src/services/PaymentService.ts b/project/src/services/PaymentService.ts index 09e022c6..bcbd826c 100644 --- a/project/src/services/PaymentService.ts +++ b/project/src/services/PaymentService.ts @@ -70,6 +70,16 @@ export class PaymentService } } + // Needs specific handling, add up currency amounts for insured items + if (request.Action === "SptInsure") + { + for (const index in request.scheme_items) + { + const currencyTpl = request.scheme_items[index].id; + currencyAmounts[currencyTpl] = (currencyAmounts[currencyTpl] || 0) + request.scheme_items[index].count; + } + } + // Track the total amount of all currencies. let totalCurrencyAmount = 0; @@ -81,6 +91,7 @@ export class PaymentService if (currencyAmount > 0) { + // Find money stacks in inventory and remove amount needed + update output object to inform client of changes output = this.addPaymentToOutput(pmcData, currencyTpl, currencyAmount, sessionID, output); // If there are warnings, exit early. @@ -240,7 +251,7 @@ export class PaymentService } /** - * Remove currency from player stash/inventory + * Remove currency from player stash/inventory and update client object with changes * @param pmcData Player profile to find and remove currency from * @param currencyTpl Type of currency to pay * @param amountToPay money value to pay From f0358f5241de57bf0dc09e6215e183db7fa00011 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 15:33:34 +0000 Subject: [PATCH 02/23] Added missing locale with key `ragfair-unable_to_find_offer_to_remove` --- project/assets/database/locales/server/en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/project/assets/database/locales/server/en.json b/project/assets/database/locales/server/en.json index 2f10eeb2..93028ac8 100644 --- a/project/assets/database/locales/server/en.json +++ b/project/assets/database/locales/server/en.json @@ -181,6 +181,7 @@ "ragfair-offer_not_found_unable_to_hide": "hideItem() offerId: %s not found, unable to hide offer", "ragfair-tpl_not_a_valid_item": "generateFleaOffersForTrader() tpl: %s not a valid item, skipping", "ragfair-unable_to_find_item_in_inventory": "Unable to find item with id: {{id}} in inventory", + "ragfair-unable_to_find_offer_to_remove": "Unable to find offer with id: %s to remove", "ragfair-unable_to_find_requested_items_in_inventory": "Unable to find any requested items in the inventory", "ragfair-unable_to_pay_commission_fee": "Unable to pay commission fee: %s roubles", "ragfair-offer_no_longer_exists": "Offer no longer exists", From 844cb12cc16b0a6fe91f1684a05bed449d44c572 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 16:09:45 +0000 Subject: [PATCH 03/23] If offer to remove is not found, don't reduce rep loss --- project/src/services/RagfairOfferService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project/src/services/RagfairOfferService.ts b/project/src/services/RagfairOfferService.ts index 07feab5b..4392bab0 100644 --- a/project/src/services/RagfairOfferService.ts +++ b/project/src/services/RagfairOfferService.ts @@ -236,15 +236,15 @@ export class RagfairOfferService const sessionID = profile.sessionId; const offerIndex = profile.RagfairInfo.offers.findIndex(o => o._id === offer._id); - profile.RagfairInfo.rating -= this.ragfairConfig.sell.reputation.loss; - profile.RagfairInfo.isRatingGrowing = false; - if (offerIndex === -1) { this.logger.warning(this.localisationService.getText("ragfair-unable_to_find_offer_to_remove", offer._id)); return this.httpResponse.appendErrorToOutput(this.eventOutputHolder.getOutput(sessionID), this.localisationService.getText("ragfair-offer_not_found_in_profile_short")); } + profile.RagfairInfo.rating -= this.ragfairConfig.sell.reputation.loss; + profile.RagfairInfo.isRatingGrowing = false; + if (offer.items[0].upd.StackObjectsCount > offer.items[0].upd.OriginalStackObjectsCount) { offer.items[0].upd.StackObjectsCount = offer.items[0].upd.OriginalStackObjectsCount; From bb8677bc65e53fc5b55c88ff0a4c4d057a777135 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 17:06:11 +0000 Subject: [PATCH 04/23] Rework `payMoney()` to handle taking money from post-raid therapist healing --- project/src/services/PaymentService.ts | 40 +++++++++++--------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/project/src/services/PaymentService.ts b/project/src/services/PaymentService.ts index bcbd826c..18ff2afa 100644 --- a/project/src/services/PaymentService.ts +++ b/project/src/services/PaymentService.ts @@ -46,35 +46,29 @@ export class PaymentService // Track the amounts of each type of currency involved in the trade. const currencyAmounts: { [key: string]: number } = {}; - // Delete barter items and track currencies if the action is "TradingConfirm". - if (request.Action === "TradingConfirm") + // Delete barter items and track currencies + for (const index in request.scheme_items) { - for (const index in request.scheme_items) + // Find the corresponding item in the player's inventory. + const item = pmcData.Inventory.items.find(i => i._id === request.scheme_items[index].id); + if (item !== undefined) { - // Find the corresponding item in the player's inventory. - const item = pmcData.Inventory.items.find(i => i._id === request.scheme_items[index].id); - if (item !== undefined) + if (!this.paymentHelper.isMoneyTpl(item._tpl)) { - if (!this.paymentHelper.isMoneyTpl(item._tpl)) - { - // If the item is not money, remove it from the inventory. - output = this.inventoryHelper.removeItem(pmcData, item._id, sessionID, output); - request.scheme_items[index].count = 0; - } - else - { - // If the item is money, add its count to the currencyAmounts object. - currencyAmounts[item._tpl] = (currencyAmounts[item._tpl] || 0) + request.scheme_items[index].count; - } + // If the item is not money, remove it from the inventory. + output = this.inventoryHelper.removeItem(pmcData, item._id, sessionID, output); + request.scheme_items[index].count = 0; + } + else + { + // If the item is money, add its count to the currencyAmounts object. + currencyAmounts[item._tpl] = (currencyAmounts[item._tpl] || 0) + request.scheme_items[index].count; } } - } - - // Needs specific handling, add up currency amounts for insured items - if (request.Action === "SptInsure") - { - for (const index in request.scheme_items) + else { + // Used by `SptInsure` + // Handle differently, `id` is the money type tpl const currencyTpl = request.scheme_items[index].id; currencyAmounts[currencyTpl] = (currencyAmounts[currencyTpl] || 0) + request.scheme_items[index].count; } From 909d79f4150b4194c509e47b56b989f444241174 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 17:34:44 +0000 Subject: [PATCH 05/23] Remove unnecessary `removeMapAccessKey()` method, now handled in client --- project/src/helpers/InRaidHelper.ts | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/project/src/helpers/InRaidHelper.ts b/project/src/helpers/InRaidHelper.ts index c2d7a707..5609cca2 100644 --- a/project/src/helpers/InRaidHelper.ts +++ b/project/src/helpers/InRaidHelper.ts @@ -186,9 +186,6 @@ export class InRaidHelper profileData.Info.Experience += profileData.Stats.Eft.TotalSessionExperience; profileData.Stats.Eft.TotalSessionExperience = 0; - // Remove the Lab card - this.removeMapAccessKey(saveProgressRequest, sessionID); - this.setPlayerInRaidLocationStatusToNone(sessionID); if (!saveProgressRequest.isPlayerScav) @@ -312,32 +309,6 @@ export class InRaidHelper } } - /** - * Some maps have one-time-use keys (e.g. Labs - * Remove the relevant key from an inventory based on the post-raid request data passed in - * @param offraidData post-raid data - * @param sessionID Session id - */ - protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void - { - const locationName = this.saveServer.getProfile(sessionID).inraid.location.toLowerCase(); - const mapKey = this.databaseServer.getTables().locations[locationName].base.AccessKeys[0]; - - if (!mapKey) - { - return; - } - - for (const item of offraidData.profile.Inventory.items) - { - if (item._tpl === mapKey && item.slotId.toLowerCase() !== "hideout") - { - this.inventoryHelper.removeItem(offraidData.profile, item._id, sessionID); - break; - } - } - } - /** * Set the SPT inraid location Profile property to 'none' * @param sessionID Session id From 27b7386074422876e79e5dcde79a153bdc21ba2e Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 18:46:22 +0000 Subject: [PATCH 06/23] Add TarkovTalk promo codes --- project/assets/configs/gifts.json | 304 ++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) diff --git a/project/assets/configs/gifts.json b/project/assets/configs/gifts.json index 9fde415d..2c476f94 100644 --- a/project/assets/configs/gifts.json +++ b/project/assets/configs/gifts.json @@ -910,6 +910,310 @@ "slotId": "main" } ] + }, + "GROUNDZERO": { + "items": [{ + "_id": "65539de6fe677db90c0f53cb", + "_tpl": "619cbf7d23893217ec30b689", + "slotId": "main" + } + ], + "sender": "System", + "messageText": "GROUNDZERO", + "collectionTimeHours": 48, + "associatedEvent": "Promo" + }, + "IAMMIGHTY": { + "items": [{ + "_id": "6553a38f2c33e9939d0a2391", + "_tpl": "6176aca650224f204c1da3fb", + "upd": { + "FireMode": { + "FireMode": "single" + } + }, + "parentId": "6553a38f2c33e9939d0a2390", + "slotId": "main" + }, { + "_id": "6553a38f2c33e9939d0a2392", + "_tpl": "6193dcd0f8ee7e52e4210a28", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_pistol_grip" + }, { + "_id": "6553a38f2c33e9939d0a2393", + "_tpl": "617131a4568c120fdd29482d", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_magazine" + }, { + "_id": "6553a38f2c33e9939d0a2394", + "_tpl": "617153016c780c1e710c9a2f", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_stock" + }, { + "_id": "6553a38f2c33e9939d0a2395", + "_tpl": "617154aa1cb55961fa0fdb3b", + "parentId": "6553a38f2c33e9939d0a2394", + "slotId": "mod_stock_000" + }, { + "_id": "6553a38f2c33e9939d0a2396", + "_tpl": "61713a8fd92c473c770214a4", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_reciever" + }, { + "_id": "6553a38f2c33e9939d0a2397", + "_tpl": "6171407e50224f204c1da3c5", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_scope" + }, { + "_id": "6553a38f2c33e9939d0a2398", + "_tpl": "617151c1d92c473c770214ab", + "parentId": "6553a38f2c33e9939d0a2397", + "slotId": "mod_scope_000" + }, { + "_id": "6553a38f2c33e9939d0a2399", + "_tpl": "61702be9faa1272e431522c3", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_barrel" + }, { + "_id": "6553a38f2c33e9939d0a239a", + "_tpl": "61713308d92c473c770214a0", + "parentId": "6553a38f2c33e9939d0a2399", + "slotId": "mod_muzzle" + }, { + "_id": "6553a38f2c33e9939d0a239b", + "_tpl": "61702f1b67085e45ef140b26", + "parentId": "6553a38f2c33e9939d0a2399", + "slotId": "mod_gas_block" + }, { + "_id": "6553a38f2c33e9939d0a239c", + "_tpl": "61712eae6c780c1e710c9a1d", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_handguard" + }, { + "_id": "6553a38f2c33e9939d0a239d", + "_tpl": "5bb20e49d4351e3bac1212de", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_sight_rear" + }, { + "_id": "6553a38f2c33e9939d0a239e", + "_tpl": "61702d8a67085e45ef140b24", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_charge" + }, { + "_id": "6553a38f2c33e9939d0a239f", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "upd": { + "FireMode": { + "FireMode": "single" + } + }, + "parentId": "6553a38f2c33e9939d0a2390", + "slotId": "main" + }, { + "_id": "6553a38f2c33e9939d0a23a0", + "_tpl": "5cc9bcaed7f00c011c04e179", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_pistol_grip" + }, { + "_id": "6553a38f2c33e9939d0a23a1", + "_tpl": "59c1383d86f774290a37e0ca", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_magazine" + }, { + "_id": "6553a38f2c33e9939d0a23a2", + "_tpl": "5d4405aaa4b9361e6a4e6bd3", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_reciever" + }, { + "_id": "6553a38f2c33e9939d0a23a3", + "_tpl": "59f9d81586f7744c7506ee62", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_scope" + }, { + "_id": "6553a38f2c33e9939d0a23a4", + "_tpl": "55d35ee94bdc2d61338b4568", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_barrel" + }, { + "_id": "6553a38f2c33e9939d0a23a5", + "_tpl": "5cff9e5ed7ad1a09407397d4", + "parentId": "6553a38f2c33e9939d0a23a4", + "slotId": "mod_muzzle" + }, { + "_id": "6553a38f2c33e9939d0a23a6", + "_tpl": "5d00ec68d7ad1a04a067e5be", + "parentId": "6553a38f2c33e9939d0a23a4", + "slotId": "mod_gas_block" + }, { + "_id": "6553a38f2c33e9939d0a23a7", + "_tpl": "5c78f2612e221600114c9f0d", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_handguard" + }, { + "_id": "6553a38f2c33e9939d0a23a8", + "_tpl": "5b7be4895acfc400170e2dd5", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_foregrip" + }, { + "_id": "6553a38f2c33e9939d0a23a9", + "_tpl": "588226d124597767ad33f787", + "parentId": "6553a38f2c33e9939d0a23a8", + "slotId": "mod_foregrip" + }, { + "_id": "6553a38f2c33e9939d0a23aa", + "_tpl": "5ba26b01d4351e0085325a51", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_sight_front" + }, { + "_id": "6553a38f2c33e9939d0a23ab", + "_tpl": "5c78f2882e22165df16b832e", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_muzzle" + }, { + "_id": "6553a38f2c33e9939d0a23ac", + "_tpl": "5b07dd285acfc4001754240d", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_tactical_002" + }, { + "_id": "6553a38f2c33e9939d0a23ad", + "_tpl": "5ba26b17d4351e00367f9bdd", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_sight_rear" + }, { + "_id": "6553a38f2c33e9939d0a23ae", + "_tpl": "5d120a10d7ad1a4e1026ba85", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_stock" + }, { + "_id": "6553a38f2c33e9939d0a23af", + "_tpl": "5d120a28d7ad1a1c8962e295", + "parentId": "6553a38f2c33e9939d0a23ae", + "slotId": "mod_stock" + }, { + "_id": "6553a38f2c33e9939d0a23b0", + "_tpl": "5d44334ba4b9362b346d1948", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_charge" + }, { + "_id": "6553a38f2c33e9939d0a23b1", + "_tpl": "5c0e655586f774045612eeb2", + "parentId": "6553a38f2c33e9939d0a2390", + "slotId": "main" + } + ], + "sender": "System", + "messageText": "IAMMIGHTY", + "collectionTimeHours": 48, + "associatedEvent": "Promo" + }, + "ARMORPLATES": { + "items": [{ + "_id": "6553aa39382bf255500f5a73", + "_tpl": "5c0e722886f7740458316a57", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + }, { + "_id": "6553aa39382bf255500f5a74", + "_tpl": "544a5caa4bdc2d1a388b4568", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + }, { + "_id": "6553aa39382bf255500f5a75", + "_tpl": "5b40e2bc5acfc40016388216", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + }, { + "_id": "6553aa39382bf255500f5a76", + "_tpl": "5b40e2bc5acfc40016388216", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + } + ], + "sender": "System", + "messageText": "ARMORPLATES", + "collectionTimeHours": 48, + "associatedEvent": "Promo" + }, + "RICHANDEXPENSIVE": { + "items": [{ + "_id": "6553adb4e56992db30039456", + "_tpl": "5c0e530286f7747fa1419862", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db30039457", + "_tpl": "5c0e530286f7747fa1419862", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db30039458", + "_tpl": "5c0e533786f7747fa23f4d47", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db30039459", + "_tpl": "5c0e533786f7747fa23f4d47", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945a", + "_tpl": "5ed5160a87bb8443d10680b5", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945b", + "_tpl": "5ed5160a87bb8443d10680b5", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945c", + "_tpl": "637b620db7afa97bfc3d7009", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945d", + "_tpl": "637b620db7afa97bfc3d7009", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945e", + "_tpl": "5c0e534186f7747fa1419867", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945f", + "_tpl": "5c0e534186f7747fa1419867", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + } + ], + "sender": "System", + "messageText": "RICHANDEXPENSIVE", + "collectionTimeHours": 48, + "associatedEvent": "Promo" + }, + "LEFTHANDHEADEYES": { + "items": [{ + "_id": "6553aef5e83f97d5d30172d6", + "_tpl": "5d03775b86f774203e7e0c4b", + "parentId": "6553aef5e83f97d5d30172d5", + "slotId": "main" + }, { + "_id": "6553aef5e83f97d5d30172d7", + "_tpl": "5c12613b86f7743bbe2c3f76", + "parentId": "6553aef5e83f97d5d30172d5", + "slotId": "main" + }, { + "_id": "6553aef5e83f97d5d30172d8", + "_tpl": "5d1b36a186f7742523398433", + "parentId": "6553aef5e83f97d5d30172d5", + "slotId": "main" + } + ], + "sender": "System", + "messageText": "LEFTHANDHEADEYES", + "collectionTimeHours": 48, + "associatedEvent": "Promo" } } } From dfe8e08db62e9a0348201ff35dd11e8311ae6cc5 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 18:46:57 +0000 Subject: [PATCH 07/23] lint gift file --- project/assets/configs/gifts.json | 576 +++++++++++++++--------------- 1 file changed, 280 insertions(+), 296 deletions(-) diff --git a/project/assets/configs/gifts.json b/project/assets/configs/gifts.json index 2c476f94..13d5ece8 100644 --- a/project/assets/configs/gifts.json +++ b/project/assets/configs/gifts.json @@ -800,14 +800,12 @@ "_tpl": "5fd4c4fa16cac650092f6771", "parentId": "652a6f5c35258f985804aa0b", "slotId": "main" - }, - { + }, { "_id": "652a6f5c35258f985804aa0d", "_tpl": "64be79c487d1510151095552", "parentId": "652a6f5c35258f985804aa0b", "slotId": "main" - }, - { + }, { "_id": "652a6f5c35258f985804aa0e", "_tpl": "643ea5b23db6f9f57107d9fd", "upd": { @@ -818,62 +816,52 @@ }, "parentId": "652a6f5c35258f985804aa0b", "slotId": "main" - }, - { + }, { "_id": "652a6f5c35258f985804aa0f", "_tpl": "6410745d5dd49d77bd078485", "parentId": "652a6f5c35258f985804aa0e", "slotId": "mod_stock" - }, - { + }, { "_id": "652a6f5c35258f985804aa10", "_tpl": "6410758c857473525b08bb77", "parentId": "652a6f5c35258f985804aa0e", "slotId": "mod_barrel" - }, - { + }, { "_id": "652a6f5c35258f985804aa11", "_tpl": "64119d1f2c6d6f921a0929f8", "parentId": "652a6f5c35258f985804aa10", "slotId": "mod_muzzle" - }, - { + }, { "_id": "652a6f5c35258f985804aa12", "_tpl": "64119d672c6d6f921a0929fb", "parentId": "652a6f5c35258f985804aa11", "slotId": "mod_sight_front" - }, - { + }, { "_id": "652a6f5c35258f985804aa13", "_tpl": "64119d90dcf48d656f0aa275", "parentId": "652a6f5c35258f985804aa10", "slotId": "mod_sight_rear" - }, - { + }, { "_id": "652a6f5c35258f985804aa14", "_tpl": "64119cdbdcf48d656f0aa272", "parentId": "652a6f5c35258f985804aa0e", "slotId": "mod_reciever" - }, - { + }, { "_id": "652a6f5c35258f985804aa15", "_tpl": "6422e1ea3c0f06190302161a", "parentId": "652a6f5c35258f985804aa0e", "slotId": "mod_magazine" - }, - { + }, { "_id": "652a6f5c35258f985804aa16", "_tpl": "641dc35e19604f20c800be18", "parentId": "652a6f5c35258f985804aa0e", "slotId": "mod_scope" - }, - { + }, { "_id": "652a6f5c35258f985804aa17", "_tpl": "5b3f7c1c5acfc40dc5296b1d", "parentId": "652a6f5c35258f985804aa16", "slotId": "mod_scope" - }, - { + }, { "_id": "652a6f5c35258f985804aa18", "_tpl": "64748cb8de82c85eaf0a273a", "upd": { @@ -884,26 +872,22 @@ }, "parentId": "652a6f5c35258f985804aa0b", "slotId": "main" - }, - { + }, { "_id": "652a6f5c35258f985804aa19", "_tpl": "64748d02d1c009260702b526", "parentId": "652a6f5c35258f985804aa18", "slotId": "mod_barrel" - }, - { + }, { "_id": "652a6f5c35258f985804aa1a", "_tpl": "5f60cd6cf2bcbb675b00dac6", "parentId": "652a6f5c35258f985804aa0b", "slotId": "main" - }, - { + }, { "_id": "652a6f5c35258f985804aa1b", "_tpl": "5d5e7d28a4b936645d161203", "parentId": "652a6f5c35258f985804aa0b", "slotId": "main" - }, - { + }, { "_id": "652a6f5c35258f985804aa1c", "_tpl": "5d1b376e86f774252519444e", "parentId": "652a6f5c35258f985804aa0b", @@ -911,7 +895,7 @@ } ] }, - "GROUNDZERO": { + "GROUNDZERO": { "items": [{ "_id": "65539de6fe677db90c0f53cb", "_tpl": "619cbf7d23893217ec30b689", @@ -923,292 +907,292 @@ "collectionTimeHours": 48, "associatedEvent": "Promo" }, - "IAMMIGHTY": { + "IAMMIGHTY": { "items": [{ - "_id": "6553a38f2c33e9939d0a2391", - "_tpl": "6176aca650224f204c1da3fb", - "upd": { - "FireMode": { - "FireMode": "single" - } - }, - "parentId": "6553a38f2c33e9939d0a2390", - "slotId": "main" - }, { - "_id": "6553a38f2c33e9939d0a2392", - "_tpl": "6193dcd0f8ee7e52e4210a28", - "parentId": "6553a38f2c33e9939d0a2391", - "slotId": "mod_pistol_grip" - }, { - "_id": "6553a38f2c33e9939d0a2393", - "_tpl": "617131a4568c120fdd29482d", - "parentId": "6553a38f2c33e9939d0a2391", - "slotId": "mod_magazine" - }, { - "_id": "6553a38f2c33e9939d0a2394", - "_tpl": "617153016c780c1e710c9a2f", - "parentId": "6553a38f2c33e9939d0a2391", - "slotId": "mod_stock" - }, { - "_id": "6553a38f2c33e9939d0a2395", - "_tpl": "617154aa1cb55961fa0fdb3b", - "parentId": "6553a38f2c33e9939d0a2394", - "slotId": "mod_stock_000" - }, { - "_id": "6553a38f2c33e9939d0a2396", - "_tpl": "61713a8fd92c473c770214a4", - "parentId": "6553a38f2c33e9939d0a2391", - "slotId": "mod_reciever" - }, { - "_id": "6553a38f2c33e9939d0a2397", - "_tpl": "6171407e50224f204c1da3c5", - "parentId": "6553a38f2c33e9939d0a2396", - "slotId": "mod_scope" - }, { - "_id": "6553a38f2c33e9939d0a2398", - "_tpl": "617151c1d92c473c770214ab", - "parentId": "6553a38f2c33e9939d0a2397", - "slotId": "mod_scope_000" - }, { - "_id": "6553a38f2c33e9939d0a2399", - "_tpl": "61702be9faa1272e431522c3", - "parentId": "6553a38f2c33e9939d0a2396", - "slotId": "mod_barrel" - }, { - "_id": "6553a38f2c33e9939d0a239a", - "_tpl": "61713308d92c473c770214a0", - "parentId": "6553a38f2c33e9939d0a2399", - "slotId": "mod_muzzle" - }, { - "_id": "6553a38f2c33e9939d0a239b", - "_tpl": "61702f1b67085e45ef140b26", - "parentId": "6553a38f2c33e9939d0a2399", - "slotId": "mod_gas_block" - }, { - "_id": "6553a38f2c33e9939d0a239c", - "_tpl": "61712eae6c780c1e710c9a1d", - "parentId": "6553a38f2c33e9939d0a2396", - "slotId": "mod_handguard" - }, { - "_id": "6553a38f2c33e9939d0a239d", - "_tpl": "5bb20e49d4351e3bac1212de", - "parentId": "6553a38f2c33e9939d0a2396", - "slotId": "mod_sight_rear" - }, { - "_id": "6553a38f2c33e9939d0a239e", - "_tpl": "61702d8a67085e45ef140b24", - "parentId": "6553a38f2c33e9939d0a2391", - "slotId": "mod_charge" - }, { - "_id": "6553a38f2c33e9939d0a239f", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "upd": { - "FireMode": { - "FireMode": "single" - } - }, - "parentId": "6553a38f2c33e9939d0a2390", - "slotId": "main" - }, { - "_id": "6553a38f2c33e9939d0a23a0", - "_tpl": "5cc9bcaed7f00c011c04e179", - "parentId": "6553a38f2c33e9939d0a239f", - "slotId": "mod_pistol_grip" - }, { - "_id": "6553a38f2c33e9939d0a23a1", - "_tpl": "59c1383d86f774290a37e0ca", - "parentId": "6553a38f2c33e9939d0a239f", - "slotId": "mod_magazine" - }, { - "_id": "6553a38f2c33e9939d0a23a2", - "_tpl": "5d4405aaa4b9361e6a4e6bd3", - "parentId": "6553a38f2c33e9939d0a239f", - "slotId": "mod_reciever" - }, { - "_id": "6553a38f2c33e9939d0a23a3", - "_tpl": "59f9d81586f7744c7506ee62", - "parentId": "6553a38f2c33e9939d0a23a2", - "slotId": "mod_scope" - }, { - "_id": "6553a38f2c33e9939d0a23a4", - "_tpl": "55d35ee94bdc2d61338b4568", - "parentId": "6553a38f2c33e9939d0a23a2", - "slotId": "mod_barrel" - }, { - "_id": "6553a38f2c33e9939d0a23a5", - "_tpl": "5cff9e5ed7ad1a09407397d4", - "parentId": "6553a38f2c33e9939d0a23a4", - "slotId": "mod_muzzle" - }, { - "_id": "6553a38f2c33e9939d0a23a6", - "_tpl": "5d00ec68d7ad1a04a067e5be", - "parentId": "6553a38f2c33e9939d0a23a4", - "slotId": "mod_gas_block" - }, { - "_id": "6553a38f2c33e9939d0a23a7", - "_tpl": "5c78f2612e221600114c9f0d", - "parentId": "6553a38f2c33e9939d0a23a2", - "slotId": "mod_handguard" - }, { - "_id": "6553a38f2c33e9939d0a23a8", - "_tpl": "5b7be4895acfc400170e2dd5", - "parentId": "6553a38f2c33e9939d0a23a7", - "slotId": "mod_foregrip" - }, { - "_id": "6553a38f2c33e9939d0a23a9", - "_tpl": "588226d124597767ad33f787", - "parentId": "6553a38f2c33e9939d0a23a8", - "slotId": "mod_foregrip" - }, { - "_id": "6553a38f2c33e9939d0a23aa", - "_tpl": "5ba26b01d4351e0085325a51", - "parentId": "6553a38f2c33e9939d0a23a7", - "slotId": "mod_sight_front" - }, { - "_id": "6553a38f2c33e9939d0a23ab", - "_tpl": "5c78f2882e22165df16b832e", - "parentId": "6553a38f2c33e9939d0a23a7", - "slotId": "mod_muzzle" - }, { - "_id": "6553a38f2c33e9939d0a23ac", - "_tpl": "5b07dd285acfc4001754240d", - "parentId": "6553a38f2c33e9939d0a23a7", - "slotId": "mod_tactical_002" - }, { - "_id": "6553a38f2c33e9939d0a23ad", - "_tpl": "5ba26b17d4351e00367f9bdd", - "parentId": "6553a38f2c33e9939d0a23a2", - "slotId": "mod_sight_rear" - }, { - "_id": "6553a38f2c33e9939d0a23ae", - "_tpl": "5d120a10d7ad1a4e1026ba85", - "parentId": "6553a38f2c33e9939d0a239f", - "slotId": "mod_stock" - }, { - "_id": "6553a38f2c33e9939d0a23af", - "_tpl": "5d120a28d7ad1a1c8962e295", - "parentId": "6553a38f2c33e9939d0a23ae", - "slotId": "mod_stock" - }, { - "_id": "6553a38f2c33e9939d0a23b0", - "_tpl": "5d44334ba4b9362b346d1948", - "parentId": "6553a38f2c33e9939d0a239f", - "slotId": "mod_charge" - }, { - "_id": "6553a38f2c33e9939d0a23b1", - "_tpl": "5c0e655586f774045612eeb2", - "parentId": "6553a38f2c33e9939d0a2390", - "slotId": "main" + "_id": "6553a38f2c33e9939d0a2391", + "_tpl": "6176aca650224f204c1da3fb", + "upd": { + "FireMode": { + "FireMode": "single" } + }, + "parentId": "6553a38f2c33e9939d0a2390", + "slotId": "main" + }, { + "_id": "6553a38f2c33e9939d0a2392", + "_tpl": "6193dcd0f8ee7e52e4210a28", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_pistol_grip" + }, { + "_id": "6553a38f2c33e9939d0a2393", + "_tpl": "617131a4568c120fdd29482d", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_magazine" + }, { + "_id": "6553a38f2c33e9939d0a2394", + "_tpl": "617153016c780c1e710c9a2f", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_stock" + }, { + "_id": "6553a38f2c33e9939d0a2395", + "_tpl": "617154aa1cb55961fa0fdb3b", + "parentId": "6553a38f2c33e9939d0a2394", + "slotId": "mod_stock_000" + }, { + "_id": "6553a38f2c33e9939d0a2396", + "_tpl": "61713a8fd92c473c770214a4", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_reciever" + }, { + "_id": "6553a38f2c33e9939d0a2397", + "_tpl": "6171407e50224f204c1da3c5", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_scope" + }, { + "_id": "6553a38f2c33e9939d0a2398", + "_tpl": "617151c1d92c473c770214ab", + "parentId": "6553a38f2c33e9939d0a2397", + "slotId": "mod_scope_000" + }, { + "_id": "6553a38f2c33e9939d0a2399", + "_tpl": "61702be9faa1272e431522c3", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_barrel" + }, { + "_id": "6553a38f2c33e9939d0a239a", + "_tpl": "61713308d92c473c770214a0", + "parentId": "6553a38f2c33e9939d0a2399", + "slotId": "mod_muzzle" + }, { + "_id": "6553a38f2c33e9939d0a239b", + "_tpl": "61702f1b67085e45ef140b26", + "parentId": "6553a38f2c33e9939d0a2399", + "slotId": "mod_gas_block" + }, { + "_id": "6553a38f2c33e9939d0a239c", + "_tpl": "61712eae6c780c1e710c9a1d", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_handguard" + }, { + "_id": "6553a38f2c33e9939d0a239d", + "_tpl": "5bb20e49d4351e3bac1212de", + "parentId": "6553a38f2c33e9939d0a2396", + "slotId": "mod_sight_rear" + }, { + "_id": "6553a38f2c33e9939d0a239e", + "_tpl": "61702d8a67085e45ef140b24", + "parentId": "6553a38f2c33e9939d0a2391", + "slotId": "mod_charge" + }, { + "_id": "6553a38f2c33e9939d0a239f", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "upd": { + "FireMode": { + "FireMode": "single" + } + }, + "parentId": "6553a38f2c33e9939d0a2390", + "slotId": "main" + }, { + "_id": "6553a38f2c33e9939d0a23a0", + "_tpl": "5cc9bcaed7f00c011c04e179", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_pistol_grip" + }, { + "_id": "6553a38f2c33e9939d0a23a1", + "_tpl": "59c1383d86f774290a37e0ca", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_magazine" + }, { + "_id": "6553a38f2c33e9939d0a23a2", + "_tpl": "5d4405aaa4b9361e6a4e6bd3", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_reciever" + }, { + "_id": "6553a38f2c33e9939d0a23a3", + "_tpl": "59f9d81586f7744c7506ee62", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_scope" + }, { + "_id": "6553a38f2c33e9939d0a23a4", + "_tpl": "55d35ee94bdc2d61338b4568", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_barrel" + }, { + "_id": "6553a38f2c33e9939d0a23a5", + "_tpl": "5cff9e5ed7ad1a09407397d4", + "parentId": "6553a38f2c33e9939d0a23a4", + "slotId": "mod_muzzle" + }, { + "_id": "6553a38f2c33e9939d0a23a6", + "_tpl": "5d00ec68d7ad1a04a067e5be", + "parentId": "6553a38f2c33e9939d0a23a4", + "slotId": "mod_gas_block" + }, { + "_id": "6553a38f2c33e9939d0a23a7", + "_tpl": "5c78f2612e221600114c9f0d", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_handguard" + }, { + "_id": "6553a38f2c33e9939d0a23a8", + "_tpl": "5b7be4895acfc400170e2dd5", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_foregrip" + }, { + "_id": "6553a38f2c33e9939d0a23a9", + "_tpl": "588226d124597767ad33f787", + "parentId": "6553a38f2c33e9939d0a23a8", + "slotId": "mod_foregrip" + }, { + "_id": "6553a38f2c33e9939d0a23aa", + "_tpl": "5ba26b01d4351e0085325a51", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_sight_front" + }, { + "_id": "6553a38f2c33e9939d0a23ab", + "_tpl": "5c78f2882e22165df16b832e", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_muzzle" + }, { + "_id": "6553a38f2c33e9939d0a23ac", + "_tpl": "5b07dd285acfc4001754240d", + "parentId": "6553a38f2c33e9939d0a23a7", + "slotId": "mod_tactical_002" + }, { + "_id": "6553a38f2c33e9939d0a23ad", + "_tpl": "5ba26b17d4351e00367f9bdd", + "parentId": "6553a38f2c33e9939d0a23a2", + "slotId": "mod_sight_rear" + }, { + "_id": "6553a38f2c33e9939d0a23ae", + "_tpl": "5d120a10d7ad1a4e1026ba85", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_stock" + }, { + "_id": "6553a38f2c33e9939d0a23af", + "_tpl": "5d120a28d7ad1a1c8962e295", + "parentId": "6553a38f2c33e9939d0a23ae", + "slotId": "mod_stock" + }, { + "_id": "6553a38f2c33e9939d0a23b0", + "_tpl": "5d44334ba4b9362b346d1948", + "parentId": "6553a38f2c33e9939d0a239f", + "slotId": "mod_charge" + }, { + "_id": "6553a38f2c33e9939d0a23b1", + "_tpl": "5c0e655586f774045612eeb2", + "parentId": "6553a38f2c33e9939d0a2390", + "slotId": "main" + } ], "sender": "System", "messageText": "IAMMIGHTY", "collectionTimeHours": 48, "associatedEvent": "Promo" }, - "ARMORPLATES": { + "ARMORPLATES": { "items": [{ - "_id": "6553aa39382bf255500f5a73", - "_tpl": "5c0e722886f7740458316a57", - "parentId": "6553aa39382bf255500f5a72", - "slotId": "main" - }, { - "_id": "6553aa39382bf255500f5a74", - "_tpl": "544a5caa4bdc2d1a388b4568", - "parentId": "6553aa39382bf255500f5a72", - "slotId": "main" - }, { - "_id": "6553aa39382bf255500f5a75", - "_tpl": "5b40e2bc5acfc40016388216", - "parentId": "6553aa39382bf255500f5a72", - "slotId": "main" - }, { - "_id": "6553aa39382bf255500f5a76", - "_tpl": "5b40e2bc5acfc40016388216", - "parentId": "6553aa39382bf255500f5a72", - "slotId": "main" - } + "_id": "6553aa39382bf255500f5a73", + "_tpl": "5c0e722886f7740458316a57", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + }, { + "_id": "6553aa39382bf255500f5a74", + "_tpl": "544a5caa4bdc2d1a388b4568", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + }, { + "_id": "6553aa39382bf255500f5a75", + "_tpl": "5b40e2bc5acfc40016388216", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + }, { + "_id": "6553aa39382bf255500f5a76", + "_tpl": "5b40e2bc5acfc40016388216", + "parentId": "6553aa39382bf255500f5a72", + "slotId": "main" + } ], "sender": "System", "messageText": "ARMORPLATES", "collectionTimeHours": 48, "associatedEvent": "Promo" }, - "RICHANDEXPENSIVE": { + "RICHANDEXPENSIVE": { "items": [{ - "_id": "6553adb4e56992db30039456", - "_tpl": "5c0e530286f7747fa1419862", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db30039457", - "_tpl": "5c0e530286f7747fa1419862", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db30039458", - "_tpl": "5c0e533786f7747fa23f4d47", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db30039459", - "_tpl": "5c0e533786f7747fa23f4d47", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db3003945a", - "_tpl": "5ed5160a87bb8443d10680b5", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db3003945b", - "_tpl": "5ed5160a87bb8443d10680b5", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db3003945c", - "_tpl": "637b620db7afa97bfc3d7009", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db3003945d", - "_tpl": "637b620db7afa97bfc3d7009", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db3003945e", - "_tpl": "5c0e534186f7747fa1419867", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - }, { - "_id": "6553adb4e56992db3003945f", - "_tpl": "5c0e534186f7747fa1419867", - "parentId": "6553adb4e56992db30039455", - "slotId": "main" - } + "_id": "6553adb4e56992db30039456", + "_tpl": "5c0e530286f7747fa1419862", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db30039457", + "_tpl": "5c0e530286f7747fa1419862", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db30039458", + "_tpl": "5c0e533786f7747fa23f4d47", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db30039459", + "_tpl": "5c0e533786f7747fa23f4d47", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945a", + "_tpl": "5ed5160a87bb8443d10680b5", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945b", + "_tpl": "5ed5160a87bb8443d10680b5", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945c", + "_tpl": "637b620db7afa97bfc3d7009", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945d", + "_tpl": "637b620db7afa97bfc3d7009", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945e", + "_tpl": "5c0e534186f7747fa1419867", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + }, { + "_id": "6553adb4e56992db3003945f", + "_tpl": "5c0e534186f7747fa1419867", + "parentId": "6553adb4e56992db30039455", + "slotId": "main" + } ], "sender": "System", "messageText": "RICHANDEXPENSIVE", "collectionTimeHours": 48, "associatedEvent": "Promo" }, - "LEFTHANDHEADEYES": { + "LEFTHANDHEADEYES": { "items": [{ - "_id": "6553aef5e83f97d5d30172d6", - "_tpl": "5d03775b86f774203e7e0c4b", - "parentId": "6553aef5e83f97d5d30172d5", - "slotId": "main" - }, { - "_id": "6553aef5e83f97d5d30172d7", - "_tpl": "5c12613b86f7743bbe2c3f76", - "parentId": "6553aef5e83f97d5d30172d5", - "slotId": "main" - }, { - "_id": "6553aef5e83f97d5d30172d8", - "_tpl": "5d1b36a186f7742523398433", - "parentId": "6553aef5e83f97d5d30172d5", - "slotId": "main" - } + "_id": "6553aef5e83f97d5d30172d6", + "_tpl": "5d03775b86f774203e7e0c4b", + "parentId": "6553aef5e83f97d5d30172d5", + "slotId": "main" + }, { + "_id": "6553aef5e83f97d5d30172d7", + "_tpl": "5c12613b86f7743bbe2c3f76", + "parentId": "6553aef5e83f97d5d30172d5", + "slotId": "main" + }, { + "_id": "6553aef5e83f97d5d30172d8", + "_tpl": "5d1b36a186f7742523398433", + "parentId": "6553aef5e83f97d5d30172d5", + "slotId": "main" + } ], "sender": "System", "messageText": "LEFTHANDHEADEYES", From 70637679a0462541f95423c1f655bed4f3fcd5fb Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 19:25:02 +0000 Subject: [PATCH 08/23] Update boss spawn locations for killa, Reshala and gluhar --- project/assets/database/locations/bigmap/base.json | 2 +- project/assets/database/locations/interchange/base.json | 2 +- project/assets/database/locations/rezervbase/base.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/project/assets/database/locations/bigmap/base.json b/project/assets/database/locations/bigmap/base.json index d7737d4a..2117da63 100644 --- a/project/assets/database/locations/bigmap/base.json +++ b/project/assets/database/locations/bigmap/base.json @@ -126,7 +126,7 @@ "BossEscortType": "followerBully", "BossName": "bossBully", "BossPlayer": false, - "BossZone": "ZoneDormitory", + "BossZone": "ZoneDormitory,ZoneGasStation,ZoneScavBase", "RandomTimeSpawn": false, "Supports": null, "Time": -1 diff --git a/project/assets/database/locations/interchange/base.json b/project/assets/database/locations/interchange/base.json index fd2efef2..eac20459 100644 --- a/project/assets/database/locations/interchange/base.json +++ b/project/assets/database/locations/interchange/base.json @@ -49,7 +49,7 @@ "BossEscortType": "followerTagilla", "BossName": "bossKilla", "BossPlayer": false, - "BossZone": "ZoneCenter", + "BossZone": "ZoneCenterBot,ZoneCenter,ZoneOLI,ZoneIDEA,ZoneGoshan", "RandomTimeSpawn": false, "Supports": null, "Time": -1 diff --git a/project/assets/database/locations/rezervbase/base.json b/project/assets/database/locations/rezervbase/base.json index 75a1785f..421b86b7 100644 --- a/project/assets/database/locations/rezervbase/base.json +++ b/project/assets/database/locations/rezervbase/base.json @@ -49,7 +49,7 @@ "BossEscortType": "followerGluharAssault", "BossName": "bossGluhar", "BossPlayer": false, - "BossZone": "ZoneRailStrorage", + "BossZone": "ZoneRailStrorage,ZoneRailStrorage,ZoneRailStrorage,ZonePTOR1,ZonePTOR2,ZoneBarrack,ZoneBarrack,ZoneBarrack,ZoneSubStorage", "RandomTimeSpawn": false, "Supports": [ { From cd36e3993dc93949d785b27c6f4ce85f54743af2 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 21:43:37 +0000 Subject: [PATCH 09/23] When rewarding a weapon for a repeatable quest, choose a random default preset if the chosen weapon has no defaults --- project/src/generators/RepeatableQuestGenerator.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/project/src/generators/RepeatableQuestGenerator.ts b/project/src/generators/RepeatableQuestGenerator.ts index f85fe623..07439862 100644 --- a/project/src/generators/RepeatableQuestGenerator.ts +++ b/project/src/generators/RepeatableQuestGenerator.ts @@ -836,16 +836,20 @@ export class RepeatableQuestGenerator continue; } - // If we provide ammo we don't want to provide just one bullet + // Randomise the cartridge count returned value = this.randomUtil.randInt(repeatableConfig.rewardAmmoStackMinSize, itemSelected._props.StackMaxSize); } else if (this.itemHelper.isOfBaseclass(itemSelected._id, BaseClasses.WEAPON)) { - const defaultPreset = this.presetHelper.getDefaultPreset(itemSelected._id); - if (defaultPreset) + let defaultPreset = this.presetHelper.getDefaultPreset(itemSelected._id); + if (!defaultPreset) { - children = this.ragfairServerHelper.reparentPresets(defaultPreset._items[0], defaultPreset._items); + // No default for chosen weapon found, get any random default weapon preset + const defaultPresets = Object.values(this.presetHelper.getDefaultPresets()); + defaultPreset = this.randomUtil.getArrayValue(defaultPresets); } + + children = this.ragfairServerHelper.reparentPresets(defaultPreset._items[0], defaultPreset._items); } rewards.Success.push(this.generateRewardItem(itemSelected._id, value, index, children)); From c9dc0d2192154f7a7eff144913e6376909687042 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 23:05:34 +0000 Subject: [PATCH 10/23] Make each trader reward different types of items Prevent trader from rewarding more than 1 weapon Fixed trader failing to find default weapon to send as reward --- project/assets/configs/quest.json | 188 ++++++++++++++++-- .../src/controllers/InsuranceController.ts | 2 +- .../generators/RepeatableQuestGenerator.ts | 92 +++++---- project/src/models/spt/config/IQuestConfig.ts | 1 + 4 files changed, 230 insertions(+), 53 deletions(-) diff --git a/project/assets/configs/quest.json b/project/assets/configs/quest.json index c4083a01..d98fd72a 100644 --- a/project/assets/configs/quest.json +++ b/project/assets/configs/quest.json @@ -166,25 +166,98 @@ }, "traderWhitelist": [{ "traderId": "54cb50c76803fa8b248b4571", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "prapor", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "543be6564bdc2df4348b4568", + "5485a8684bdc2da71d8b4567", + "590c745b86f7743cc433c5f2", + "5422acb9af1c889c16000029" + ] }, { "traderId": "54cb57776803fa99248b456e", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "therapist", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "57864a66245977548f04a81f", + "5448f39d4bdc2d0a728b4568", + "5448f3ac4bdc2dce718b4569", + "5448f3a64bdc2d60728b456a", + "57864c322459775490116fbf", + "57864c8c245977548867e7f1", + "5448e8d04bdc2ddf718b4569", + "57864e4c24597754843f8723", + "57864ee62459775490116fc1" + ] }, { "traderId": "58330581ace78e27b8b10cee", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "skier", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5a341c4086f77401f2541505", + "5448e8d64bdc2dce718b4568", + "5448e8d04bdc2ddf718b4569", + "5422acb9af1c889c16000029", + "55818ad54bdc2ddc698b4569", + "57864a3d24597754843f8721", + "5a341c4686f77469e155819e", + "55818b224bdc2dde698b456f", + "5c99f98d86f7745c314214b3", + "55818aeb4bdc2ddc698b456a", + "55818acf4bdc2dde698b456b", + "57864bb7245977548b3b66c2", + "590c745b86f7743cc433c5f2" + ] }, { "traderId": "5935c25fb3acc3127c3d8cd9", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "peacekeeper", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5422acb9af1c889c16000029", + "543be6564bdc2df4348b4568", + "5448e5284bdc2dcb718b4567", + "5485a8684bdc2da71d8b4567", + "57864a3d24597754843f8721", + "55818af64bdc2d5b648b4570" + ] }, { "traderId": "5a7c2eca46aef81a7ca2145d", - "questTypes": ["Completion", "Exploration"] + "name": "mechanic", + "questTypes": ["Completion", "Exploration"], + "rewardBaseWhitelist": [ + "55818af64bdc2d5b648b4570", + "5448bc234bdc2d3c308b4569", + "55818b164bdc2ddc698b456c", + "55818a684bdc2ddd698b456d", + "550aa4cd4bdc2dd8348b456c", + "5422acb9af1c889c16000029", + "5485a8684bdc2da71d8b4567", + "55818b224bdc2dde698b456f" + ] }, { "traderId": "5ac3b934156ae10c4430e83c", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "ragman", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5a341c4086f77401f2541505", + "5448e5724bdc2ddf718b4568", + "5448e54d4bdc2dcc718b4568", + "590c745b86f7743cc433c5f2", + "57bef4c42459772e8d35a53b", + "5448e53e4bdc2d60728b4567", + "5448e5284bdc2dcb718b4567", + "57864a66245977548f04a81f" + ] }, { "traderId": "5c0647fdd443bc2504c2d371", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "jaeger", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5448f3ac4bdc2dce718b4569", + "5c99f98d86f7745c314214b3", + "590c745b86f7743cc433c5f2", + "57864bb7245977548b3b66c2" + ] } ], "questConfig": { @@ -692,7 +765,7 @@ } ] }, - "rewardBaseTypeBlacklist": ["543be5e94bdc2df1348b4568", "5b3f15d486f77432d0509248"], + "rewardBaseTypeBlacklist": ["543be5e94bdc2df1348b4568", "5b3f15d486f77432d0509248", "59f32c3b86f77472a31742f0", "59f32bb586f774757e1e8442"], "rewardBlacklist": ["627bce33f21bc425b06ab967"], "rewardAmmoStackMinSize": 20 }, { @@ -731,25 +804,98 @@ }, "traderWhitelist": [{ "traderId": "54cb50c76803fa8b248b4571", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "prapor", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "543be6564bdc2df4348b4568", + "5485a8684bdc2da71d8b4567", + "590c745b86f7743cc433c5f2", + "5422acb9af1c889c16000029" + ] }, { "traderId": "54cb57776803fa99248b456e", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "therapist", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "57864a66245977548f04a81f", + "5448f39d4bdc2d0a728b4568", + "5448f3ac4bdc2dce718b4569", + "5448f3a64bdc2d60728b456a", + "57864c322459775490116fbf", + "57864c8c245977548867e7f1", + "5448e8d04bdc2ddf718b4569", + "57864e4c24597754843f8723", + "57864ee62459775490116fc1" + ] }, { "traderId": "58330581ace78e27b8b10cee", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "skier", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5a341c4086f77401f2541505", + "5448e8d64bdc2dce718b4568", + "5448e8d04bdc2ddf718b4569", + "5422acb9af1c889c16000029", + "55818ad54bdc2ddc698b4569", + "57864a3d24597754843f8721", + "5a341c4686f77469e155819e", + "55818b224bdc2dde698b456f", + "5c99f98d86f7745c314214b3", + "55818aeb4bdc2ddc698b456a", + "55818acf4bdc2dde698b456b", + "57864bb7245977548b3b66c2", + "590c745b86f7743cc433c5f2" + ] }, { "traderId": "5935c25fb3acc3127c3d8cd9", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "peacekeeper", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5422acb9af1c889c16000029", + "543be6564bdc2df4348b4568", + "5448e5284bdc2dcb718b4567", + "5485a8684bdc2da71d8b4567", + "57864a3d24597754843f8721", + "55818af64bdc2d5b648b4570" + ] }, { "traderId": "5a7c2eca46aef81a7ca2145d", - "questTypes": ["Completion", "Exploration"] + "name": "mechanic", + "questTypes": ["Completion", "Exploration"], + "rewardBaseWhitelist": [ + "55818af64bdc2d5b648b4570", + "5448bc234bdc2d3c308b4569", + "55818b164bdc2ddc698b456c", + "55818a684bdc2ddd698b456d", + "550aa4cd4bdc2dd8348b456c", + "5422acb9af1c889c16000029", + "5485a8684bdc2da71d8b4567", + "55818b224bdc2dde698b456f" + ] }, { "traderId": "5ac3b934156ae10c4430e83c", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "ragman", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5a341c4086f77401f2541505", + "5448e5724bdc2ddf718b4568", + "5448e54d4bdc2dcc718b4568", + "590c745b86f7743cc433c5f2", + "57bef4c42459772e8d35a53b", + "5448e53e4bdc2d60728b4567", + "5448e5284bdc2dcb718b4567", + "57864a66245977548f04a81f" + ] }, { "traderId": "5c0647fdd443bc2504c2d371", - "questTypes": ["Completion", "Exploration", "Elimination"] + "name": "jaeger", + "questTypes": ["Completion", "Exploration", "Elimination"], + "rewardBaseWhitelist": [ + "5448f3ac4bdc2dce718b4569", + "5c99f98d86f7745c314214b3", + "590c745b86f7743cc433c5f2", + "57864bb7245977548b3b66c2" + ] } ], "questConfig": { @@ -1323,7 +1469,7 @@ } ] }, - "rewardBaseTypeBlacklist": ["543be5e94bdc2df1348b4568", "5b3f15d486f77432d0509248"], + "rewardBaseTypeBlacklist": ["543be5e94bdc2df1348b4568", "5b3f15d486f77432d0509248", "59f32c3b86f77472a31742f0", "59f32bb586f774757e1e8442"], "rewardBlacklist": ["627bce33f21bc425b06ab967"], "rewardAmmoStackMinSize": 15 }, { @@ -1362,7 +1508,15 @@ }, "traderWhitelist": [{ "traderId": "579dc571d53a0658a154fbec", - "questTypes": ["Completion", "Exploration", "Elimination", "Pickup"] + "questTypes": ["Completion", "Exploration", "Elimination", "Pickup"], + "rewardBaseWhitelist": [ + "55818a684bdc2ddd698b456d", + "55818a594bdc2db9688b456a", + "57864c8c245977548867e7f1", + "5448ecbe4bdc2d60728b4568", + "5422acb9af1c889c16000029", + "57864bb7245977548b3b66c2" + ] } ], "questConfig": { diff --git a/project/src/controllers/InsuranceController.ts b/project/src/controllers/InsuranceController.ts index 9ba20416..d6ab3634 100644 --- a/project/src/controllers/InsuranceController.ts +++ b/project/src/controllers/InsuranceController.ts @@ -533,7 +533,7 @@ export class InsuranceController for (const key of body.items) { itemsToPay.push({ - id: this.roubleTpl, // TODO: update to handle difference currencies + id: this.roubleTpl, // TODO: update to handle different currencies count: Math.round(this.insuranceService.getPremium(pmcData, inventoryItemsHash[key], body.tid)) }); } diff --git a/project/src/generators/RepeatableQuestGenerator.ts b/project/src/generators/RepeatableQuestGenerator.ts index 07439862..e26c6208 100644 --- a/project/src/generators/RepeatableQuestGenerator.ts +++ b/project/src/generators/RepeatableQuestGenerator.ts @@ -8,6 +8,7 @@ import { RagfairServerHelper } from "@spt-aki/helpers/RagfairServerHelper"; import { RepeatableQuestHelper } from "@spt-aki/helpers/RepeatableQuestHelper"; import { Exit, ILocationBase } from "@spt-aki/models/eft/common/ILocationBase"; import { TraderInfo } from "@spt-aki/models/eft/common/tables/IBotBase"; +import { Item } from "@spt-aki/models/eft/common/tables/IItem"; import { ICompletion, ICompletionAvailableFor, @@ -449,7 +450,7 @@ export class RepeatableQuestGenerator const levelsConfig = repeatableConfig.rewardScaling.levels; const roublesConfig = repeatableConfig.rewardScaling.roubles; - // in the available dumps only 2 distinct items were ever requested + // In the available dumps only 2 distinct items were ever requested let numberDistinctItems = 1; if (Math.random() > 0.75) { @@ -458,13 +459,13 @@ export class RepeatableQuestGenerator const quest = this.generateRepeatableTemplate("Completion", traderId,repeatableConfig.side) as ICompletion; - // Filter the items.json items to items the player must retrieve to complete queist: shouldn't be a quest item or "non-existant" - let itemSelection = this.getRewardableItems(repeatableConfig); + // Filter the items.json items to items the player must retrieve to complete quest: shouldn't be a quest item or "non-existant" + const possibleItemsToRetrievePool = this.getRewardableItems(repeatableConfig, traderId); // Be fair, don't let the items be more expensive than the reward let roublesBudget = Math.floor(this.mathUtil.interp1(pmcLevel, levelsConfig, roublesConfig) * this.randomUtil.getFloat(0.5, 1)); roublesBudget = Math.max(roublesBudget, 5000); - itemSelection = itemSelection.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget); + let itemSelection = possibleItemsToRetrievePool.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget); // We also have the option to use whitelist and/or blacklist which is defined in repeatableQuests.json as // [{"minPlayerLevel": 1, "itemIds": ["id1",...]}, {"minPlayerLevel": 15, "itemIds": ["id3",...]}] @@ -796,8 +797,9 @@ export class RepeatableQuestGenerator // Possible improvement -> draw trader-specific items e.g. with this.itemHelper.isOfBaseclass(val._id, ItemHelper.BASECLASS.FoodDrink) let roublesBudget = rewardRoubles; - let chosenRewardItems = this.chooseRewardItemsWithinBudget(repeatableConfig, roublesBudget); + let rewardItemPool = this.chooseRewardItemsWithinBudget(repeatableConfig, roublesBudget, traderId); + // Add xp reward const rewards: IRewards = { Started: [], Success: [ @@ -810,6 +812,7 @@ export class RepeatableQuestGenerator Fail: [] }; + // Add money reward if (traderId === Traders.PEACEKEEPER) { // convert to equivalent dollars @@ -821,13 +824,14 @@ export class RepeatableQuestGenerator } let index = 2; - if (chosenRewardItems.length > 0) + if (rewardItemPool.length > 0) { + let weaponRewardCount = 0; for (let i = 0; i < rewardNumItems; i++) { - let value = 1; - let children = null; - const itemSelected = chosenRewardItems[this.randomUtil.randInt(chosenRewardItems.length)]; + let itemCount = 1; + let children: Item[] = null; + const itemSelected = rewardItemPool[this.randomUtil.randInt(rewardItemPool.length)]; if (this.itemHelper.isOfBaseclass(itemSelected._id, BaseClasses.AMMO)) { // Dont reward ammo that stacks to less than what's defined in config @@ -837,10 +841,16 @@ export class RepeatableQuestGenerator } // Randomise the cartridge count returned - value = this.randomUtil.randInt(repeatableConfig.rewardAmmoStackMinSize, itemSelected._props.StackMaxSize); + itemCount = this.randomUtil.randInt(repeatableConfig.rewardAmmoStackMinSize, itemSelected._props.StackMaxSize); } else if (this.itemHelper.isOfBaseclass(itemSelected._id, BaseClasses.WEAPON)) { + if (weaponRewardCount >= 1) + { + // Limit weapon rewards to 1 per daily + rewardItemPool = rewardItemPool.filter(x => !this.itemHelper.isOfBaseclass(x._id, BaseClasses.WEAPON)); + continue; + } let defaultPreset = this.presetHelper.getDefaultPreset(itemSelected._id); if (!defaultPreset) { @@ -850,21 +860,21 @@ export class RepeatableQuestGenerator } children = this.ragfairServerHelper.reparentPresets(defaultPreset._items[0], defaultPreset._items); - } - rewards.Success.push(this.generateRewardItem(itemSelected._id, value, index, children)); + weaponRewardCount ++; - // TODO: maybe also non-default use ragfair to calculate the price + // TODO: maybe also non-default use ragfair to calculate the price // this.ragfairServer.getWeaponPresetPrice(item, items, existingPrice) - - roublesBudget -= value * this.itemHelper.getStaticItemPrice(itemSelected._id); + } + rewards.Success.push(this.generateRewardItem(itemSelected._id, itemCount, index, children)); + roublesBudget -= itemCount * this.itemHelper.getStaticItemPrice(itemSelected._id); index += 1; // if we still have budget narrow down the items if (roublesBudget > 0) { // Filter possible reward items to only items with a price below the remaining budget - chosenRewardItems = chosenRewardItems.filter(x => this.itemHelper.getStaticItemPrice(x._id) < roublesBudget); - if (chosenRewardItems.length === 0) + rewardItemPool = rewardItemPool.filter(x => this.itemHelper.getStaticItemPrice(x._id) < roublesBudget); + if (rewardItemPool.length === 0) { break; // No reward items left, exit } @@ -909,20 +919,21 @@ export class RepeatableQuestGenerator * @param roublesBudget Total value of items to return * @returns Array of reward items that fit budget */ - protected chooseRewardItemsWithinBudget(repeatableConfig: IRepeatableQuestConfig, roublesBudget: number): ITemplateItem[] + protected chooseRewardItemsWithinBudget(repeatableConfig: IRepeatableQuestConfig, roublesBudget: number, traderId: string): ITemplateItem[] { // First filter for type and baseclass to avoid lookup in handbook for non-available items - const rewardableItems = this.getRewardableItems(repeatableConfig); + const rewardableItemPool = this.getRewardableItems(repeatableConfig, traderId); const minPrice = Math.min(25000, 0.5 * roublesBudget); - let itemSelection = rewardableItems.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget && this.itemHelper.getItemPrice(x[0]) > minPrice).map(x => x[1]); - if (itemSelection.length === 0) + + let rewardableItemPoolWithinBudget = rewardableItemPool.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget && this.itemHelper.getItemPrice(x[0]) > minPrice).map(x => x[1]); + if (rewardableItemPoolWithinBudget.length === 0) { this.logger.warning(this.localisationService.getText("repeatable-no_reward_item_found_in_price_range", {minPrice: minPrice, roublesBudget: roublesBudget})); // In case we don't find any items in the price range - itemSelection = rewardableItems.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget).map(x => x[1]); + rewardableItemPoolWithinBudget = rewardableItemPool.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget).map(x => x[1]); } - return itemSelection; + return rewardableItemPoolWithinBudget; } /** @@ -968,7 +979,7 @@ export class RepeatableQuestGenerator * @param repeatableQuestConfig Config file * @returns List of rewardable items [[_tpl, itemTemplate],...] */ - protected getRewardableItems(repeatableQuestConfig: IRepeatableQuestConfig): [string, ITemplateItem][] + protected getRewardableItems(repeatableQuestConfig: IRepeatableQuestConfig, traderId: string): [string, ITemplateItem][] { // check for specific baseclasses which don't make sense as reward item // also check if the price is greater than 0; there are some items whose price can not be found @@ -983,7 +994,8 @@ export class RepeatableQuestGenerator return false; } - return this.isValidRewardItem(tpl, repeatableQuestConfig); + const traderWhitelist = repeatableQuestConfig.traderWhitelist.find(x => x.traderId === traderId); + return this.isValidRewardItem(tpl, repeatableQuestConfig, traderWhitelist?.rewardBaseWhitelist); } ); } @@ -994,12 +1006,17 @@ export class RepeatableQuestGenerator * @param {string} tpl template id of item to check * @returns True if item is valid reward */ - protected isValidRewardItem(tpl: string, repeatableQuestConfig: IRepeatableQuestConfig): boolean + protected isValidRewardItem(tpl: string, repeatableQuestConfig: IRepeatableQuestConfig, itemBaseWhitelist: string[]): boolean { - let valid = this.itemHelper.isValidItem(tpl); - if (!valid) + if (!this.itemHelper.isValidItem(tpl)) { - return valid; + return false; + } + + // Check global blacklist + if (this.itemFilterService.isItemBlacklisted(tpl)) + { + return false; } // Item is on repeatable or global blacklist @@ -1015,17 +1032,22 @@ export class RepeatableQuestGenerator return false; } - if (this.itemHelper.isOfBaseclasses(tpl, [BaseClasses.DOG_TAG_USEC, BaseClasses.DOG_TAG_BEAR, BaseClasses.MOUNT, BaseClasses.KEY, BaseClasses.ARMBAND])) + // Skip boss items + if (this.itemFilterService.isBossItem(tpl)) { return false; } - // Skip globally blacklisted items + boss items - // rome-ignore lint/complexity/useSimplifiedLogicExpression: - valid = !this.itemFilterService.isItemBlacklisted(tpl) - && !this.itemFilterService.isBossItem(tpl); + // Trader has specific item base types they can give as rewards to player + if (itemBaseWhitelist !== undefined) + { + if (!this.itemHelper.isOfBaseclasses(tpl, [...itemBaseWhitelist])) + { + return false; + } + } - return valid; + return true; } /** diff --git a/project/src/models/spt/config/IQuestConfig.ts b/project/src/models/spt/config/IQuestConfig.ts index 34753847..1c157684 100644 --- a/project/src/models/spt/config/IQuestConfig.ts +++ b/project/src/models/spt/config/IQuestConfig.ts @@ -76,6 +76,7 @@ export interface ITraderWhitelist { traderId: string questTypes: string[] + rewardBaseWhitelist: string[] } export interface IRepeatableQuestTypesConfig From 8cda48cac7ad00d699a259f79d8fd2d35258dad2 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 14 Nov 2023 23:12:50 +0000 Subject: [PATCH 11/23] Get a more accurate price for weapon preset rewards --- project/src/generators/RepeatableQuestGenerator.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/project/src/generators/RepeatableQuestGenerator.ts b/project/src/generators/RepeatableQuestGenerator.ts index e26c6208..a834d0c5 100644 --- a/project/src/generators/RepeatableQuestGenerator.ts +++ b/project/src/generators/RepeatableQuestGenerator.ts @@ -861,12 +861,12 @@ export class RepeatableQuestGenerator children = this.ragfairServerHelper.reparentPresets(defaultPreset._items[0], defaultPreset._items); weaponRewardCount ++; - - // TODO: maybe also non-default use ragfair to calculate the price - // this.ragfairServer.getWeaponPresetPrice(item, items, existingPrice) } rewards.Success.push(this.generateRewardItem(itemSelected._id, itemCount, index, children)); - roublesBudget -= itemCount * this.itemHelper.getStaticItemPrice(itemSelected._id); + const itemCost = (this.itemHelper.isOfBaseclass(itemSelected._id, BaseClasses.WEAPON)) + ? this.itemHelper.getItemMaxPrice(children[0]._tpl) // use if preset is not default : this.itemHelper.getWeaponPresetPrice(children[0], children, this.itemHelper.getStaticItemPrice(itemSelected._id)) + : this.itemHelper.getStaticItemPrice(itemSelected._id); + roublesBudget -= itemCount * itemCost; index += 1; // if we still have budget narrow down the items From fcb1e2c2f326726fd7fe99102a6ec533e0dc2d44 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 15 Nov 2023 09:25:03 +0000 Subject: [PATCH 12/23] Adjust sanitar+sanitarFollower to have more live-accurate generation values --- project/assets/database/bots/types/bosssanitar.json | 12 ++++++------ .../assets/database/bots/types/followersanitar.json | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/project/assets/database/bots/types/bosssanitar.json b/project/assets/database/bots/types/bosssanitar.json index a9056929..87669e84 100644 --- a/project/assets/database/bots/types/bosssanitar.json +++ b/project/assets/database/bots/types/bosssanitar.json @@ -2117,7 +2117,7 @@ "weights": { "0": 1, "1": 2, - "2": 0 + "2": 2 }, "whitelist": [] }, @@ -2136,7 +2136,7 @@ "weights": { "0": 1, "1": 2, - "2": 1 + "2": 3 }, "whitelist": [] }, @@ -2162,16 +2162,16 @@ }, "specialItems": { "weights": { - "0": 1, - "1": 0 + "0": 0, + "1": 1 }, "whitelist": [] }, "stims": { "weights": { - "0": 2, + "0": 1, "1": 1, - "2": 0 + "2": 2 }, "whitelist": [] }, diff --git a/project/assets/database/bots/types/followersanitar.json b/project/assets/database/bots/types/followersanitar.json index 073d1e52..8c5ec439 100644 --- a/project/assets/database/bots/types/followersanitar.json +++ b/project/assets/database/bots/types/followersanitar.json @@ -2134,7 +2134,7 @@ "weights": { "0": 1, "1": 2, - "2": 0 + "2": 2 }, "whitelist": [] }, @@ -2153,7 +2153,7 @@ "weights": { "0": 1, "1": 2, - "2": 1 + "2": 2 }, "whitelist": [] }, @@ -2186,9 +2186,9 @@ }, "stims": { "weights": { - "0": 2, - "1": 1, - "2": 0 + "0": 1, + "1": 2, + "2": 1 }, "whitelist": [] }, From 3b053b741bf9084a6a8c14fd7e7352fa3482e13b Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 15 Nov 2023 11:16:56 +0000 Subject: [PATCH 13/23] Allow custom profiles to use localied descriptions Fixed an inconsistently named locale key Added logger to LauncherController --- .../assets/database/locales/server/en.json | 5 +- .../assets/database/locales/server/es.json | 2 +- .../assets/database/locales/server/fr.json | 2 +- .../assets/database/locales/server/it.json | 2 +- .../assets/database/locales/server/ko.json | 2 +- .../assets/database/locales/server/nl.json | 2 +- .../assets/database/locales/server/pl.json | 2 +- .../assets/database/locales/server/ru.json | 2 +- .../assets/database/locales/server/zh.json | 2 +- .../assets/database/templates/profiles.json | 85996 ++++++++-------- project/src/controllers/LauncherController.ts | 36 +- .../eft/common/tables/IProfileTemplate.ts | 9 +- 12 files changed, 41453 insertions(+), 44609 deletions(-) diff --git a/project/assets/database/locales/server/en.json b/project/assets/database/locales/server/en.json index 93028ac8..bc976917 100644 --- a/project/assets/database/locales/server/en.json +++ b/project/assets/database/locales/server/en.json @@ -593,8 +593,9 @@ "launcher-profile_standard": "Same as live, basic stash size (10x28), 500,000 roubles", "launcher-profile_leftbehind": "Same as Standard plus; larger stash size (10x38), extra equipment/items, 500 dollars", "launcher-profile_preparetoescape": "Same as Left Behind plus; larger stash size (10x48), extra equipment/items, higher starting reputation with traders, 250 euros", - "launcher-edgeofdarkness": "Same as Prepare To Escape plus; larger stash size (10x68), extra equipment/items, higher starting reputation with traders, 1000 dollars, 500 euros", + "launcher-profile-edgeofdarkness": "Same as Prepare To Escape plus; larger stash size (10x68), extra equipment/items, higher starting reputation with traders, 1000 dollars, 500 euros", "launcher-profile_spteasystart": "Lots of Roubles/Dollars/Euros, Some QoL skills are level 20, trader rep maxed, starting level is 69, no quests completed", "launcher-profile_sptzerotohero": "Start with almost nothing, no Roubles/Dollars/Euros, no trader rep, 1 knife, no quests completed", - "launcher-profile_sptdeveloper": "Testing profile, starting level is 69, lots of Roubles/Dollars/Euros, USEC start with all quests ready to start, BEAR start with all quests ready to hand in, invincibility balaclava" + "launcher-profile_sptdeveloper": "Testing profile, starting level is 69, lots of Roubles/Dollars/Euros, USEC start with all quests ready to start, BEAR start with all quests ready to hand in, invincibility balaclava", + "launcher-missing_property": "Profile: %s is missing a descriptionLocaleKey property" } \ No newline at end of file diff --git a/project/assets/database/locales/server/es.json b/project/assets/database/locales/server/es.json index bf165d5c..5d9a3bb2 100644 --- a/project/assets/database/locales/server/es.json +++ b/project/assets/database/locales/server/es.json @@ -402,7 +402,7 @@ "launcher-profile_standard": "Igual que en multijugador, el tamaño básico del escondite (10x28), 500.000 rublos", "launcher-profile_leftbehind": "Igual que Standard plus; mayor tamaño de inventario(10x38), equipamiento extra, 500 dólares", "launcher-profile_preparetoescape": "Igual que Left Behind plus; mayor tamaño de inventario (10x48), equipamiento adicional/artículos, mayor reputación inicial con los comerciantes, 250 euros", - "launcher-edgeofdarkness": "Igual que Prepare to Escape plus; mayor tamaño de escondite (10x68), equipo adicional/artículos, mayor reputación inicial con los comerciantes, 1000 dólares, 500 euros", + "launcher-profile-edgeofdarkness": "Igual que Prepare to Escape plus; mayor tamaño de escondite (10x68), equipo adicional/artículos, mayor reputación inicial con los comerciantes, 1000 dólares, 500 euros", "launcher-profile_spteasystart": "Muchos rublos/dólares/euros, algunas habilidades de QoL son de nivel 20, la reputación de los comerciantes al máximo, el nivel inicial es 69, no hay misiones completadas", "launcher-profile_sptzerotohero": "Comienza con casi nada, sin rublos/dólares/euros, sin reputación de comerciantes, 1 cuchillo y sin misiones completadas", "launcher-profile_sptdeveloper": "Prefil de prueba, el nivel inicial es 69, muchos rublos/dólares/euros, USEC comienza con todas las misiones listas para empezar, BEAR comienza con todas las misiones listas para entregar, pasamontañas de invencibilidad" diff --git a/project/assets/database/locales/server/fr.json b/project/assets/database/locales/server/fr.json index 92b77c47..c0ae2190 100644 --- a/project/assets/database/locales/server/fr.json +++ b/project/assets/database/locales/server/fr.json @@ -553,7 +553,7 @@ "launcher-profile_standard": "Edition Standard, stash basique (10x28), 500 000 roubles", "launcher-profile_leftbehind": "Edition Left Behind, stash moyenne (10x38), équipement en plus, 500 dollars", "launcher-profile_preparetoescape": "Edition Prepare for Escape, stash grande (10x48), plus d'équipement, meilleure rép de démarrage vendeurs, 250 euros", - "launcher-edgeofdarkness": "Edition EoD, stash de taille maximale (10x68), un max d'équipement, gros boost avec la rép des traders, 1000 dollars, 500 euros", + "launcher-profile-edgeofdarkness": "Edition EoD, stash de taille maximale (10x68), un max d'équipement, gros boost avec la rép des traders, 1000 dollars, 500 euros", "launcher-profile_spteasystart": "SPT mode touriste. Beaucoup de Roubles/Dollars/Euros, certains skills confort sont à 20, réputation traders maximale, level de départ à 69. Aucune quête validée", "launcher-profile_sptzerotohero": "SPT zero to hero ! Tu démarres avec rien, juste ta bite et ton couteau ! Aucune quête validée", "launcher-profile_sptdeveloper": "SPT dév/testing/debug, lvl 69, max Roubles/Dollars/Euros, USEC ==> toutes les quêtes prêtes à être débutées, BEAR ==> toutes les quêtes terminées prêtes à être validées, item balaclava d'invincibilité" diff --git a/project/assets/database/locales/server/it.json b/project/assets/database/locales/server/it.json index 81f93855..e0306b39 100644 --- a/project/assets/database/locales/server/it.json +++ b/project/assets/database/locales/server/it.json @@ -208,7 +208,7 @@ "launcher-profile_standard": "Uguale al profilo standard di live EFT, dimensioni standard del nascondiglio (10x28), 500,000 rubli", "launcher-profile_leftbehind": "Uguale al profilo standard di live EFT ed in più; dimensioni del nascondiglio aumentato (10x38), oggetti/equipaggiamento extra, 500 dollari", "launcher-profile_preparetoescape": "Uguale al profilo Left Behind di live EFT ed in più; dimensioni del nascondiglio aumentato (10x48), oggetti/equipaggiamento extra, reputazione con i mercanti più alta, 250 euro", - "launcher-edgeofdarkness": "Uguale al profilo Prepare to Escape di live EFT ed in più; dimensioni del nascondiglio massime (10x68), oggetti/equipaggiamento extra, reputazione con i mercanti più alta, 1000 dollari, 500 euro", + "launcher-profile-edgeofdarkness": "Uguale al profilo Prepare to Escape di live EFT ed in più; dimensioni del nascondiglio massime (10x68), oggetti/equipaggiamento extra, reputazione con i mercanti più alta, 1000 dollari, 500 euro", "launcher-profile_spteasystart": "Gran numero di Rubli/Dollari/Euro, alcune abilità utili sono già livello 20, reputazione con i mercanti al massimo, i PMC iniziano al livello 69, nessuna missione completata", "launcher-profile_sptzerotohero": "Inizi con quasi nulla, niente Rubli/Dollari/Euro, reputazione mercanti a zero, un coltello, nessuna missione completata", "launcher-profile_sptdeveloper": "Profile per testare, i PMC iniziano al livello 69, molti Rubli/Dollari/Euro, USEC cominciano con tutte le quest pronte a cominciare, BEAR comincia con tutte le quest pronte ad essere consegnate, balaclava dell'invicibilità incluso", diff --git a/project/assets/database/locales/server/ko.json b/project/assets/database/locales/server/ko.json index 244faa51..0e0b4b40 100644 --- a/project/assets/database/locales/server/ko.json +++ b/project/assets/database/locales/server/ko.json @@ -479,7 +479,7 @@ "launcher-profile_standard": "라이브와 동일, 기본 보관함 크기(10x28), 500,000루블", "launcher-profile_leftbehind": "스탠다드 + 더 큰 보관함 크기(10x38), 추가 장비/아이템, 500달러", "launcher-profile_preparetoescape": "레프트 비하인드와 동일 더 큰 보관함 크기(10x48), 추가 장비/아이템, 상인과의 시작 평판 상승, 250유로", - "launcher-edgeofdarkness": "프리페어 투 이스케이프와 동일 더 큰 은신처 크기(10x68), 추가 장비/아이템, 상인과의 높은 시작 평판, 1000달러, 500유로", + "launcher-profile-edgeofdarkness": "프리페어 투 이스케이프와 동일 더 큰 은신처 크기(10x68), 추가 장비/아이템, 상인과의 높은 시작 평판, 1000달러, 500유로", "launcher-profile_spteasystart": "많은 루블/달러/유로, 일부 품질 관리 기술 레벨 20, 상인 담당자 최대 레벨, 시작 레벨 69, 완료된 퀘스트 없음", "launcher-profile_sptzerotohero": "루블/달러/유로, 상인 대표, 칼 1개, 퀘스트 완료 등 거의 아무것도 없이 시작하세요.", "launcher-profile_sptdeveloper": "테스트 프로필, 시작 레벨은 69, 많은 루블/달러/유로, USEC는 모든 퀘스트를 시작할 준비가 된 상태로 시작, BEAR는 모든 퀘스트를 제출할 준비가 된 상태로 시작, 무적 발라 클라바" diff --git a/project/assets/database/locales/server/nl.json b/project/assets/database/locales/server/nl.json index dc6dbbc3..6cdc49cc 100644 --- a/project/assets/database/locales/server/nl.json +++ b/project/assets/database/locales/server/nl.json @@ -553,7 +553,7 @@ "launcher-profile_standard": "Zelfde als live, basis stash grootte (10x28), 500,000 roubles", "launcher-profile_leftbehind": "Zelfde als Standard plus; grotere stash (10x38), extra uitrusting/items, 500 dollars", "launcher-profile_preparetoescape": "Zelfde als Left Behind plus; grotere stash (10x48), extra uitrusting/items, hogere start reputatie met traders, 250 euros", - "launcher-edgeofdarkness": "Zelfde als Prepare To Escape plus; grotere stash (10x68), extra uitrusting/items, hogere start reputatie met traders, 1000 dollars, 500 euros", + "launcher-profile-edgeofdarkness": "Zelfde als Prepare To Escape plus; grotere stash (10x68), extra uitrusting/items, hogere start reputatie met traders, 1000 dollars, 500 euros", "launcher-profile_spteasystart": "Heel veel Roubles/Dollars/Euros, Een aantal QoL skills zijn level 20, trader rep maximaal, start level is 69, geen voltooide missies", "launcher-profile_sptzerotohero": "Start met bijna niks, geen Roubles/Dollars/Euros, geen trader rep, 1 mes, geen voltooide missies", "launcher-profile_sptdeveloper": "Test profiel, start level is 69, heel veel Roubles/Dollars/Euros, USEC start met alle missied klaar om te starten, BEAR start met alle missies klaar om ingeleverd te vorden, invincibility balaclava" diff --git a/project/assets/database/locales/server/pl.json b/project/assets/database/locales/server/pl.json index ef04a880..0ab32df4 100644 --- a/project/assets/database/locales/server/pl.json +++ b/project/assets/database/locales/server/pl.json @@ -553,7 +553,7 @@ "launcher-profile_standard": "Tak samo jak na oficjalnym, podstawowy rozmiar schowka (10x28), 500 000 rubli", "launcher-profile_leftbehind": "Tak samo jak Standard plus; większy rozmiar schowka (10x38), dodatkowy sprzęt/przedmioty, 500 dolarów", "launcher-profile_preparetoescape": "Tak samo jak Left Behind plus; większy rozmiar schowka (10x48), dodatkowy sprzęt/przedmioty, wyższa startowa reputacja u handlarzy, 250 euro", - "launcher-edgeofdarkness": "Tak samo jak Prepare To Escape plus; większy rozmiar schowka (10x68), dodatkowy sprzęt/przedmioty, wyższa startowa reputacja u handlarzy, 1000 dolarów, 500 euro", + "launcher-profile-edgeofdarkness": "Tak samo jak Prepare To Escape plus; większy rozmiar schowka (10x68), dodatkowy sprzęt/przedmioty, wyższa startowa reputacja u handlarzy, 1000 dolarów, 500 euro", "launcher-profile_spteasystart": "Dużo rubli/dolarów/euro, niektóre pomocne umiejętności na poziomie 20, maksymalna reputacja u handlarzy, początkowy poziom to 69, żadne zadania nie zostały ukończone", "launcher-profile_sptzerotohero": "Zaczynaj praktycznie od zera, bez rubli/dolarów/euro, bez reputacji u handlarzy, 1 nóż, żadne zadania nie zostały ukończone", "launcher-profile_sptdeveloper": "Profil testowy, początkowy poziom to 69, dużo rubli/dolarów/euro, USEC zaczyna z wszystkimi zadaniami gotowymi do rozpoczęcia, BEAR zaczyna z wszystkimi zadaniami gotowymi do oddania, kominiarka nieśmiertelności" diff --git a/project/assets/database/locales/server/ru.json b/project/assets/database/locales/server/ru.json index ae9b08d4..18f76e8a 100644 --- a/project/assets/database/locales/server/ru.json +++ b/project/assets/database/locales/server/ru.json @@ -548,7 +548,7 @@ "launcher-profile_standard": "Вариант Standard, базовый размер схрона (10x28), 500,000 рублей", "launcher-profile_leftbehind": "Вариант Left Behind; увеличенный размер схрона (10x38), дополнительное снаряжение/предметы, 500 долларов", "launcher-profile_preparetoescape": "Вариант Prepare for Escape; увеличенный размер схрона (10x48), дополнительное снаряжение/предметы, изначально повышенная репутация со всеми торговцами в игре, 250 евро", - "launcher-edgeofdarkness": "Вариант Edge of Darkness; увеличенный размер схрона (10x68), дополнительное снаряжение/предметы, изначально повышенная репутация со всеми торговцами в игре, 1000 долларов, 500 евро", + "launcher-profile-edgeofdarkness": "Вариант Edge of Darkness; увеличенный размер схрона (10x68), дополнительное снаряжение/предметы, изначально повышенная репутация со всеми торговцами в игре, 1000 долларов, 500 евро", "launcher-profile_spteasystart": "Много рублей/долларов/евро, некоторые QoL навыки 20 уровня, максимальная репа у троговцев, начальный уровень 69, задания не выполнены", "launcher-profile_sptzerotohero": "Старт практические без всего, нет рублей/долларов/евро, нет репутации у торговцев, 1 нож, задания не выполнены", "launcher-profile_sptdeveloper": "Профиль для тестирования, начальный уровень 69, много рублей/долларов/евро, USEC начинают со всеми заданиями, готовыми к принятию, BEAR начинают со всеми заданиями, готовыми к сдаче, балаклава неуязвимости" diff --git a/project/assets/database/locales/server/zh.json b/project/assets/database/locales/server/zh.json index 1422a0b9..5889e479 100644 --- a/project/assets/database/locales/server/zh.json +++ b/project/assets/database/locales/server/zh.json @@ -553,7 +553,7 @@ "launcher-profile_standard": "与在线相同,基本储物空间(10×28),500,000卢布", "launcher-profile_leftbehind": "包含标准版内容以及;更大的储物空间;(10×38),额外的装备和物品,500美元", "launcher-profile_preparetoescape": "包含落后版内容以及;更大的储物空间(10×48),额外的装备和物品,更高的商人初始声望,250欧元", - "launcher-edgeofdarkness": "包含准备逃离版内容以及;更大的储物空间(10×68),额外的装备和物品,更高的商人初始声望,1000美元,500欧元", + "launcher-profile-edgeofdarkness": "包含准备逃离版内容以及;更大的储物空间(10×68),额外的装备和物品,更高的商人初始声望,1000美元,500欧元", "launcher-profile_spteasystart": "大量卢布、美元和欧元,一些基础技能等级20,商人声望满,初始等级69,没有已完成任务", "launcher-profile_sptzerotohero": "开局几乎没有物资,没有卢布、美元或欧元,没有商人声望,就一把刀,没有已完成任务", "launcher-profile_sptdeveloper": "测试用存档,初始等级69,大量卢布、美元和欧元,USEC开局所有的任务已准备开始,BEAR开局所有任务已准备接取,无敌面罩" diff --git a/project/assets/database/templates/profiles.json b/project/assets/database/templates/profiles.json index d610aeda..3934a2f7 100644 --- a/project/assets/database/templates/profiles.json +++ b/project/assets/database/templates/profiles.json @@ -1,44666 +1,41500 @@ { - "Edge Of Darkness": { - "bear": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c6", - "templateId": "5811ce772459770e9e5f9532", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] + "Edge Of Darkness": { + "descriptionLocaleKey": "launcher-profile-edgeofdarkness1", + "bear": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c6", + "templateId": "5811ce772459770e9e5f9532", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cc0858d14c02e000c6bea66", + "Feet": "5cc085bb14c02e000e67a5c5", + "Hands": "5cc0876314c02e000c6bea6b", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "544a11ac4bdc2d470e8b456a": false, + "544a5caa4bdc2d1a388b4568": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "54527a984bdc2d4e668b4567": false, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "55801eed4bdc2d89578b4588": true, + "55802d5f4bdc2dac148b458e": false, + "559ba5b34bdc2d1f1a8b4582": true, + "55d480c04bdc2d1d4e8b456a": false, + "55d4887d4bdc2d962f8b4570": false, + "55d7217a4bdc2d86028b456d": false, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "564ca99c4bdc2d16268b4589": false, + "567143bf4bdc2d1a0f8b4567": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59d3ad2720bdb418b4577": false, + "56dfef82d2720bbd668b4567": true, + "56dff3afd2720bba668b4567": false, + "56e294cdd2720b603a8b4575": false, + "56ea8222d2720b69698b4567": true, + "570fd6c2d2720bc6458b457f": false, + "5710c24ad2720bc3458b45a3": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "57cd379a24597778e7682ecf": false, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce772459770e9e5f9532": false, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "5894a05586f774094708ef75": false, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "590c5d4b86f774784e1b9c45": false, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": false, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": false, + "592c2d1a86f7746dbe2af32a": true, + "595cf16b86f77427440c32e2": true, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "59e770b986f7742cbd762754": false, + "5a0c27731526d80618476ac4": false, + "5aa2b87de5b5b00016327c25": false, + "5aa7cfc0e5b5b00015693143": false, + "5aafbde786f774389d0cbc0f": false, + "5ab8f39486f7745cd93a1cca": false, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac72e475acfc400180ae6fe": false, + "5ac7655e5acfc40016339a19": false, + "5af0454c86f7746bf20992e8": false, + "5b40e5e25acfc4001a599bea": false, + "5b432b965acfc47a8774094e": false, + "5b432d215acfc4771e1c6624": false, + "5bed625c0db834001c062946": false, + "5beec1bd0db834001e6006f3": false, + "5beec3420db834001b095429": false, + "5beec3e30db8340019619424": false, + "5beec8b20db834001961942a": false, + "5beec8c20db834001d2c465c": false, + "5beec8ea0db834001a6f9dbf": false, + "5beec91a0db834001961942d": false, + "5beec9450db83400970084fd": false, + "5beecbb80db834001d2c465e": false, + "5beed0f50db834001c062b12": false, + "5bf3f59f0db834001a6fa060": false, + "5bffdc370db834001d23eca8": false, + "5c0505e00db834001b735073": false, + "5c0e530286f7747fa1419862": false, + "5c0e53c886f7747fa54205c7": false, + "5c0e722886f7740458316a57": false, + "5c488a752e221602b412af63": false, + "5c48a14f2e2216152006edd7": false, + "5c48a2852e221602b21d5923": false, + "5c48a2a42e221602b66d1e07": false, + "5c48a2c22e221602b313fb6c": false, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": false, + "5d02778e86f774203e7dedbe": false, + "5d02797c86f774203f38e30a": false, + "5d0a29fed7ad1a002769ad08": false, + "5d0a3e8cd7ad1a6f6a3d35bd": false, + "5d1b36a186f7742523398433": false, + "5d1b371186f774253763a656": false, + "5d40407c86f774318526545a": false, + "5d5d85c586f774279a21cbdb": false, + "5d5d940f86f7742797262046": false, + "5d5e9c74a4b9364855191c40": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": false, + "5e870397991fd70db46995c8": false, + "5e87071478f43e51ca2de5e1": false, + "5e87076ce2db31558c75a11d": false, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": false, + "5e87114fe2db31558c75a120": false, + "5e87116b81c4ed43e83cefdd": false, + "5f4f9eb969cdc30ff33f09db": false, + "61faa91878830f069b6b7967": false, + "627a4e6b255f7527fb05a0f6": false + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608815684 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 4, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 24 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 25 + } + ], + "Improvement": {}, + "Production": {}, + "Seed": 222222222 + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "edge_of_darkness", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 2, + "NeedWipeOptions": [], + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "AggressorBonus": 0, + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault", + "StandingForKill": 0 + }, + "Side": "Bear", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49444ae6628187a2e77b8", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49444ae6628187a2e77b8", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "a797e819df958aad39cdbd3c", + "_tpl": "5ac4cd105acfc40016339859", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "43e3a7bd752424eaa0c800e0", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "a797e819df958aad39cdbd3c", + "slotId": "mod_gas_block" + }, { + "_id": "1cdd4c79345d24be45ae4e5f", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "43e3a7bd752424eaa0c800e0", + "slotId": "mod_handguard" + }, { + "_id": "a20279119c4931eceb8a097e", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "a797e819df958aad39cdbd3c", + "slotId": "mod_muzzle" + }, { + "_id": "b2430220da94fb22c0d65693", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "a797e819df958aad39cdbd3c", + "slotId": "mod_pistol_grip" + }, { + "_id": "94751193011013ee7734b4fe", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "a797e819df958aad39cdbd3c", + "slotId": "mod_reciever" + }, { + "_id": "276460f843affd97cad97da7", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "a797e819df958aad39cdbd3c", + "slotId": "mod_sight_rear" + }, { + "_id": "8cf886617f5211d237aa5a1f", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "a797e819df958aad39cdbd3c", + "slotId": "mod_stock" + }, { + "_id": "a9cb81802a05229cb65b11ef", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "a797e819df958aad39cdbd3c", + "slotId": "mod_magazine" + }, { + "_id": "909e88f6ba6571e5ab4a3476", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "a9cb81802a05229cb65b11ef", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "0250844ab4d1320f304fdfcb", + "_tpl": "5bffdc370db834001d23eca8", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 80, + "MaxDurability": 80 + } + } + }, { + "_id": "03470cbbef724cc5017f6538", + "_tpl": "5b40e5e25acfc4001a599bea", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "490e6180d045eeaf5cef9073", + "_tpl": "5ca20abf86f77418567a43f2", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "TacticalVest" + }, { + "_id": "9c22fdef66c45863afa4a8de", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "490e6180d045eeaf5cef9073", + "slotId": "1" + }, { + "_id": "11eadc612502a26aeb1611df", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "9c22fdef66c45863afa4a8de", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "01ea8735feb7d3b5ab772dde", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "490e6180d045eeaf5cef9073", + "slotId": "2" + }, { + "_id": "28605b3f275070610f47af1b", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "01ea8735feb7d3b5ab772dde", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "98f1e5b11f4f85e12db463cf", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "490e6180d045eeaf5cef9073", + "slotId": "3" + }, { + "_id": "62c13892d6d745050dad38b0", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "98f1e5b11f4f85e12db463cf", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "dbda40032725eb2924b01fbe", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "490e6180d045eeaf5cef9073", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "f5e6bdac05e699d687993249", + "_tpl": "5857a8bc2459772bad15db29", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "SecuredContainer" + }, { + "_id": "13117a5a113a6246a2db5fff", + "_tpl": "5ca20d5986f774331e7c9602", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Backpack" + }, { + "_id": "8b6f0bac70f8f2d91c2a0c74", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "13117a5a113a6246a2db5fff", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "c063ca857d900564f913197f", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 1 + }, + "parentId": "13117a5a113a6246a2db5fff", + "slotId": "main", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "b4bef7715cfbfde49f9deb57", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "13117a5a113a6246a2db5fff", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "4ea0df06a22b64ea321dafec", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "13117a5a113a6246a2db5fff", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "af4d8b34228a85208fb85895", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "01e9d751f10e4e9aebdd94d5", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Pockets" + }, { + "_id": "4ca0cf14b0ae5bd2753a0a87", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "01e9d751f10e4e9aebdd94d5", + "slotId": "pocket1" + }, { + "_id": "749309e76ce2fdcf316f29fe", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "01e9d751f10e4e9aebdd94d5", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "729ecfc38cce5672b1dc1ad1", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "01e9d751f10e4e9aebdd94d5", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "ad076f81dc918f5e4c7fbd18", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Earpiece" + }, { + "_id": "5fe49444ae6628187a2e78b8", + "_tpl": "5811ce772459770e9e5f9532" + }, { + "_id": "702bdc5dfd91ed316b175b3c", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "fb08ac9e01a36533563a4389", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "686cfcc458f923cb2e76b8d7", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "1936371534d82e70c76a7645", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 9 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "12be6d1147d04252aacaa083", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "6342de84cd397d00cb31e87f", + "_tpl": "557ff21e4bdc2d89578b4586", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 22 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "81a756ebe7ce1ea490962f9e", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "a9bccb7b590bf286c6e0a0c3", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "cfd59c8e3cd5cce89c53b10f", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "b2fe6975cd7ba911fbf6bf42", + "_tpl": "5d40407c86f774318526545a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "f587cf58fc9d1c6cf7899bf1", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "26578d87ce5797ff5e87fd3c", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "feb9c6ec3ad0f62f2cac447c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "26578d87ce5797ff5e87fd3c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "7a3a6fdbd690c6e3767a096d", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "a498d5c84a16a8700486b51e", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "90ceaf3a032fbddb4d8ba181", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "106af131dbdc7fd37bd14dfb", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 11 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "78a938654650e34abbc5b8ba", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "d74a1797a4c614b767fc3bae", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "90770873e582d91803aab334", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "d74a1797a4c614b767fc3bae", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "d9cbc2cd84237f98ff2755c3", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "8f79a44ad63d889117296f4c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "d9cbc2cd84237f98ff2755c3", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "2812b9183017676294379dca", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d8f30bca23ad344542332c2b", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "2812b9183017676294379dca", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "793165a59cd9851376721225", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "a8063d54da55fb4f5f65e5db", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "793165a59cd9851376721225", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5c38985edc19d2dcabbae35c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "e1ea22ee08f9df9510ba0d78", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "cfefb0ba82b5146fc31a6950", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "b6672157bc48c99a22bddfc0", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "eb9fdb0d060da5428fda443c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "79d2d8c7e5beea7eacdd182b", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "627d2a20092c113b5becf64d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "ca80652ee36de43007d8efcc", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "008684957ef010140bcaab5d", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "ca80652ee36de43007d8efcc", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "a3c7c8cc79286d6977471596", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "0ec7e3bf2f3c7c3ba38239eb", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "a3c7c8cc79286d6977471596", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "feb6dfb5498cd78530ef127c", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "e8bb934c6185c10053db2644", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "feb6dfb5498cd78530ef127c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "98f8acadeebdbfc5dc71e3d1", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "5d1d600c9966b2a55a7b2753", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "98f8acadeebdbfc5dc71e3d1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "865d1f2ad642b3b4f1215069", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "b66581c029631a7b55a32047", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "865d1f2ad642b3b4f1215069", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "84e1c2763a73328da1f12d47", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 11 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "a41d51a5df91ab76147f4f67", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 11 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "da12ff8da976f0b65169a4c6", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 17 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "cff77612829a2bca05bb12fe", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 1, + "x": 8, + "y": 32 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "bf4e22ad1b7491a3b64952f0", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "0d433004c6fbce3e87cab553", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 1, + "x": 8, + "y": 30 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "45f4260eb5b8f95b76169117", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5b5939c98d57a378a0028aab", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 21 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "6090c8f36c2c7ea96450338f", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 15 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "ab849c066c608b391089b7ec", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 15 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "778249f3797805c34e11eb12", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 16 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "62357ba0ab9508b9dd3122e6", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "778249f3797805c34e11eb12", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "e7758bee1260861bf7002b97", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 16 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "44919bf9dd35679ad2f2f05a", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "e7758bee1260861bf7002b97", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "fa48d505a5d4b745d87738db", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 16 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "6f052efd98ed56034614d0c8", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "fa48d505a5d4b745d87738db", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "791c40db74e01311fe25e1f6", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 16 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "ae94aebd712a154aa5507d95", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 16 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "ff0ff90e0cf7c5e3e7010ea4", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "ae94aebd712a154aa5507d95", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "08dfb883d785b8f6c2cb3c55", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 30 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "d669a3bb766f4b5372d397c8", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 30 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "151c9e54ab15b0671f73dbc8", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 30 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "ab975022dba4a048a89bab1f", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 32 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "6e7c46c087fbb3c5c75d8289", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 32 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "2c2328ec1d21a33e4672ff5d", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 32 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "7f0dce2c6b47b1eeac74f3fd", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 29 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "f34845e66c2fb4d3a724610e", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 29 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "14d7acac0cfb3b83a75f338e", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "e9a6f02b0bdcb5396e649244", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "370172a19dfd4e467aef1dbe", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d4dce1062cb9cc8a826ea03b", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d3ce4df1bc5894e2f78882f3", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "ae8149b8dc0ae253f174b6f4", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "4daad698cf5b72487346e0d5", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "f880ae41ce81ab084a2f4eab", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "64277b11e912b968a9c41b3b", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 37 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "239a4b43740b84e90db4fb17", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 37 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "c4332600c7ea3d4dc9a3eeeb", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "87961dd2d7e7ee05db9e45c9", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "9dd9d821cffb585482fd1389", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "87961dd2d7e7ee05db9e45c9", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "9417e493bc4c277a6adee960", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "9492c6ec9a2a58c03fb3ae07", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "9417e493bc4c277a6adee960", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "50e24912547aecad4244f96c", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 18 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "bf299763ba7c6d6130aeb67c", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "169fca7757fa58518380f4ed", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 14 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "94614a61c5f560ec575b96f5", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 28 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "a9f69caa9c291288d3af3f70", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "86c426e5603f11f3973a7c2e", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "423c59d7d0be625133067ff9", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d987a0a70512510f633e21d5", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 37 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d51b419b7f442422bcf2fab6", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 37 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "03cd7851e89f43020e24bafb", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "57daa3f963e75470cebe4fef", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "e63b5a4e5a3c84dde743edd1", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500 + } + }, { + "_id": "4c138d4262cfdd01efc8145a", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500 + } + }, { + "_id": "f0f9c3ff0b3b1dbdeffee6ea", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 18 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "a8b2466d0350461c4b04fd2c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "fe4dbfce77eb6008a8f4d09d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 10 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "11ae2930e3accdc5f124876b", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "c8a0ba51f519cfde0fe997e8", + "_tpl": "5c0e53c886f7747fa54205c7", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 19 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 47, + "MaxDurability": 47 + } + } + }, { + "_id": "cd688bf5123e7f7b524bf826", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 18 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "44ebc2c1ad7f620ebe405367", + "_tpl": "5d1b36a186f7742523398433", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 38 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 100 + } + } + }, { + "_id": "c71ab08b792188701a79e839", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 38 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "719317c75d4325f6a48a14a6", + "_tpl": "5d0a3e8cd7ad1a6f6a3d35bd", + "parentId": "f5de5b058e07bcacee8c97d0", + "slotId": "mod_scope", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "f5de5b058e07bcacee8c97d0", + "_tpl": "5d0a29fed7ad1a002769ad08", + "parentId": "60c86df7ed1a4e3ce394a0f6", + "slotId": "mod_scope" + }, { + "_id": "612d78111fdcbf34bd2d7b28", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 21 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "100de389aa4e70a171270a83", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 21 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "e58c0f483fce36e55aec165e", + "_tpl": "559ba5b34bdc2d1f1a8b4582", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 8, + "y": 18 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "e20ddc9d3b8849fbdc251ea0", + "_tpl": "5887431f2459777e1612938f", + "parentId": "e58c0f483fce36e55aec165e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "dd6cb088cfc11365f794ec4b", + "_tpl": "559ba5b34bdc2d1f1a8b4582", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 20 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "da6373f4e09dd3d4eea68bf0", + "_tpl": "5887431f2459777e1612938f", + "parentId": "dd6cb088cfc11365f794ec4b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "9cad0271722c938b71f12f95", + "_tpl": "559ba5b34bdc2d1f1a8b4582", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 19 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d9d62e8db1303bbf4a88c7e9", + "_tpl": "5887431f2459777e1612938f", + "parentId": "9cad0271722c938b71f12f95", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "25a617ea956575203cdf0a09", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "deed2ec92f8ebf37cf3e639a", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "e4c6958acc50164d2387b53a", + "_tpl": "5aa7cfc0e5b5b00015693143", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 23 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 25, + "MaxDurability": 25 + } + } + }, { + "_id": "599a234277a564d9dd5bdd1c", + "_tpl": "5ab8f39486f7745cd93a1cca", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 22 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "8683fa7212c9bdd366063dd0", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 32 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "4abf4d970ec5b19afe8e126d", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500 + } + }, { + "_id": "7ca437210f63ee92275b37fe", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "7ad655c1e45bc6a9f49b4b99", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 36 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "f602250b1405f266cfe696f7", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "8b672ab1e2278d787bed7cf9", + "_tpl": "5d5d940f86f7742797262046", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 29 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "da478b8f22969edb7af064a8", + "_tpl": "57cd379a24597778e7682ecf", + "location": { + "isSearched": true, + "r": 1, + "x": 4, + "y": 23 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "49fbfbdeed8888564938c8cb", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 21 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "8da531704ee0e9cabfc6dce2", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 22 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "3cd0e5ffd24f9e4c1f206741", + "_tpl": "5ab8f39486f7745cd93a1cca", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 21 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "24f71b418e8670d740e6024b", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 40 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "17f350695fd709de9e868610", + "_tpl": "5d5d85c586f774279a21cbdb", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 25 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "380b954613fc6559dee3e19e", + "_tpl": "5c0e722886f7740458316a57", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 25 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 65, + "MaxDurability": 65 + } + } + }, { + "_id": "b410bdab51c195ffe3c83d1b", + "_tpl": "5b432d215acfc4771e1c6624", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 23 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 30, + "MaxDurability": 30 + } + } + }, { + "_id": "172f0b166eec3c78e6c3ea84", + "_tpl": "5e8488fa988a8701445df1e4", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 37 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 3 + } + } + }, { + "_id": "ccac1906f229352147a9934b", + "_tpl": "5e8488fa988a8701445df1e4", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 37 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 3 + } + } + }, { + "_id": "c728563377b6a440482d77b9", + "_tpl": "590c678286f77426c9660122", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 38 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 300 + } + } + }, { + "_id": "b43973e59452e707816a5857", + "_tpl": "590c678286f77426c9660122", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 39 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 300 + } + } + }, { + "_id": "dd039504d446bd7af0992a1b", + "_tpl": "590c678286f77426c9660122", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 38 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 300 + } + } + }, { + "_id": "dc189c626993ff517fc61236", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 28 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "7d644abc323d82b9ba729740", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "dc189c626993ff517fc61236", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "661a3936e62f490e219582dc", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 28 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "449d62388f2f639a64045d71", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 28 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "52399e2f1a3044a514b2030b", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 23 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "467a6cdeeb6cd75a7c538872", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "52399e2f1a3044a514b2030b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "e0419baa0c2d4f3619acb5cc", + "_tpl": "5c0e530286f7747fa1419862", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "1e4a2fd745c006867fb88f79", + "_tpl": "5c0e530286f7747fa1419862", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "5784837a07c8f380cb2950cd", + "_tpl": "559ba5b34bdc2d1f1a8b4582", + "parentId": "60c86df7ed1a4e3ce394a0f6", + "slotId": "mod_magazine" + }, { + "_id": "de67e78c4fb859322f766194", + "_tpl": "5887431f2459777e1612938f", + "parentId": "5784837a07c8f380cb2950cd", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "1eb47c86694ab2fce9904af6", + "_tpl": "5c0505e00db834001b735073", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 24 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "1772d219adce434a029346c1", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 25 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "b04747fbdbeb0707a3f7340d", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "1772d219adce434a029346c1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "12572b486734c09b8839733d", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 1, + "x": 5, + "y": 24 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "8f08e02573f940e71f37feb2", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "12572b486734c09b8839733d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "4da90923d1e3133f938bdeec", + "_tpl": "590c657e86f77412b013051d", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 38 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 1800 + } + } + }, { + "_id": "c6d58ede5aa9d24744187054", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "0bc3a80d48bac27550c6a15a", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 21 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "5f13a6fbf32fbcd1c5796899", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 27 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "f0c60e3787fa3aca66dcc74a", + "_tpl": "5887431f2459777e1612938f", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 22 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 40 + } + }, { + "_id": "44e01b1a96be81711f7dc93e", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 34 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "7dd0fe67076e301ba04210dc", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 33 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5253b6b2ca3428ab303af52b", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 38 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "99eaa80a461346eda014048d", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 39 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "9812a8a58953878fa4242cd3", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 40 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "1f7bfa7312cdaa64f4133089", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "04e14fd3d1294042f7cb618d", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 35 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "93ca8f31b67632bc7f8caf74", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d96c035dd972bb5b42a7951a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "93ca8f31b67632bc7f8caf74", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "217bde33f66867ae88e11af1", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "d7ab0baf36814edcd1c33e20", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "217bde33f66867ae88e11af1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "32c8f2ea6a975dafe2f4daba", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "97861a122e2e3e84c07e34b3", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "32c8f2ea6a975dafe2f4daba", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "6c232b354c34836ee2627544", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "e4d6da7d7327f32138181741", + "_tpl": "5645bcc04bdc2d363b8b4572", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 23 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "8698b23a78a8dc22f4c69609", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 9 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "3497bff150a35f338ca823f6", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "9942ed330f84122f06ba4db4", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "bc683f19adbaab56ff115d51", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "1064afb08ab86ccac101d94f", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 30 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "c844cb2dba7d609cbcba4770", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 31 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5ed1e6bac123c3b2c9eeaf35", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 37 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "033a831eee25432724e8b1e9", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "4040d36d8534fae91fb683d9", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "033a831eee25432724e8b1e9", + "slotId": "mod_magazine" + }, { + "_id": "b1c5d10c0b6bb788d1a1d032", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "4040d36d8534fae91fb683d9", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "cbd1aa819fe0cf71f0d23ccd", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "033a831eee25432724e8b1e9", + "slotId": "mod_pistol_grip" + }, { + "_id": "aee2db2a5b61e09942c5b7d7", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "e73fe8ced9426d992f6bb3c0", + "_tpl": "5998517986f7746017232f7e", + "parentId": "aee2db2a5b61e09942c5b7d7", + "slotId": "mod_pistol_grip" + }, { + "_id": "88641f60682745d0bf04747e", + "_tpl": "599851db86f77467372f0a18", + "parentId": "aee2db2a5b61e09942c5b7d7", + "slotId": "mod_stock" + }, { + "_id": "6393b7d3728b809b054baa31", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "aee2db2a5b61e09942c5b7d7", + "slotId": "mod_magazine" + }, { + "_id": "77489a635cff7fb941b58382", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "6393b7d3728b809b054baa31", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "54d27d8d60eb93aa6598377a", + "_tpl": "5998597786f77414ea6da093", + "parentId": "aee2db2a5b61e09942c5b7d7", + "slotId": "mod_muzzle" + }, { + "_id": "249ccd46eb7413434545be77", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "aee2db2a5b61e09942c5b7d7", + "slotId": "mod_reciever" + }, { + "_id": "673088d03e5d01e4138ef4ab", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "aee2db2a5b61e09942c5b7d7", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "e629647af1a768658f2576a9", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "aee2db2a5b61e09942c5b7d7", + "slotId": "mod_gas_block" + }, { + "_id": "6ae2eff0b14c553cdaf9c4be", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "e629647af1a768658f2576a9", + "slotId": "mod_handguard" + }, { + "_id": "48116a27afe5a51c917c10dd", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "492f1602f7df59c0ff58bb91", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "48116a27afe5a51c917c10dd", + "slotId": "mod_magazine" + }, { + "_id": "2d1261c888e045fc764e4a11", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "492f1602f7df59c0ff58bb91", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "c68ed794aa5be082ab90220e", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "48116a27afe5a51c917c10dd", + "slotId": "mod_pistol_grip" + }, { + "_id": "04f8a1021e1cef21b5347758", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "1ae4bba45f10fc2012f3a5b1", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "04f8a1021e1cef21b5347758", + "slotId": "mod_magazine" + }, { + "_id": "5dbe4c5e5b4795f82ed6144a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "1ae4bba45f10fc2012f3a5b1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "ca2a633299f9f33af985b298", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "04f8a1021e1cef21b5347758", + "slotId": "mod_pistol_grip" + }, { + "_id": "b81104333cd5e913c1abd001", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "caae6d1eec454357902beeba", + "_tpl": "5998517986f7746017232f7e", + "parentId": "b81104333cd5e913c1abd001", + "slotId": "mod_pistol_grip" + }, { + "_id": "d1904664ab60713b9fd815be", + "_tpl": "599851db86f77467372f0a18", + "parentId": "b81104333cd5e913c1abd001", + "slotId": "mod_stock" + }, { + "_id": "9dad59f2a5e9ff7e955c5a56", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "b81104333cd5e913c1abd001", + "slotId": "mod_magazine" + }, { + "_id": "0a21f9564f0c58050b5dd2d2", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "9dad59f2a5e9ff7e955c5a56", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "ae896c83b9422ef05d676b06", + "_tpl": "5998597786f77414ea6da093", + "parentId": "b81104333cd5e913c1abd001", + "slotId": "mod_muzzle" + }, { + "_id": "fc407b8aa1339bba319c2ef6", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "b81104333cd5e913c1abd001", + "slotId": "mod_reciever" + }, { + "_id": "6a7502a02962e7c027c15a63", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "b81104333cd5e913c1abd001", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "67fe260376be3f6cb6ded9cf", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "b81104333cd5e913c1abd001", + "slotId": "mod_gas_block" + }, { + "_id": "f19cdda8faee5021d4a08f81", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "67fe260376be3f6cb6ded9cf", + "slotId": "mod_handguard" + }, { + "_id": "88d67c13e89abba40c550ef1", + "_tpl": "5ac4cd105acfc40016339859", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 16 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "ec876c03e80b8c3c46e59399", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "88d67c13e89abba40c550ef1", + "slotId": "mod_gas_block" + }, { + "_id": "da186a0d6c299a65a317ed61", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "ec876c03e80b8c3c46e59399", + "slotId": "mod_handguard" + }, { + "_id": "cfacc8f134240e1223fcb615", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "88d67c13e89abba40c550ef1", + "slotId": "mod_muzzle" + }, { + "_id": "cc181f04ada4abe087e17234", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "88d67c13e89abba40c550ef1", + "slotId": "mod_pistol_grip" + }, { + "_id": "d8c5662e3f953c5e4c9f4613", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "88d67c13e89abba40c550ef1", + "slotId": "mod_reciever" + }, { + "_id": "ad816afec6245fb529b58600", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "88d67c13e89abba40c550ef1", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "fec1cfe279af3d3258bd0c90", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "88d67c13e89abba40c550ef1", + "slotId": "mod_stock" + }, { + "_id": "a4e24ac95eb0f569a1866bf3", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "88d67c13e89abba40c550ef1", + "slotId": "mod_magazine" + }, { + "_id": "2d1395cba72107e1c9162cf3", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "a4e24ac95eb0f569a1866bf3", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "1c25a131cbb81b7961ef203b", + "_tpl": "5e870397991fd70db46995c8", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 18 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5df1457876ccab711e118c24", + "_tpl": "5e87071478f43e51ca2de5e1", + "parentId": "1c25a131cbb81b7961ef203b", + "slotId": "mod_barrel" + }, { + "_id": "c0ca8f4dea05e26d4e806a4c", + "_tpl": "5e8708d4ae379e67d22e0102", + "parentId": "5df1457876ccab711e118c24", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "6919532db9870495a2a7a7c8", + "_tpl": "5e87076ce2db31558c75a11d", + "parentId": "1c25a131cbb81b7961ef203b", + "slotId": "mod_handguard" + }, { + "_id": "90e4e6856f705bedd86f56c2", + "_tpl": "5e87080c81c4ed43e83cefda", + "parentId": "1c25a131cbb81b7961ef203b", + "slotId": "mod_magazine" + }, { + "_id": "d8f540e6cfb57e776d01e3ce", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "90e4e6856f705bedd86f56c2", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 8 + } + }, { + "_id": "ce990869892535be8644a87d", + "_tpl": "5e87116b81c4ed43e83cefdd", + "parentId": "1c25a131cbb81b7961ef203b", + "slotId": "mod_stock" + }, { + "_id": "65c7752f89afb6e9fc368d54", + "_tpl": "5e87114fe2db31558c75a120", + "parentId": "1c25a131cbb81b7961ef203b", + "slotId": "mod_mount", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "2fee9ee8b89eb2bc60279765", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "1c25a131cbb81b7961ef203b", + "slotId": "patron_in_weapon" + }, { + "_id": "0263e3bc89cb651c5139987e", + "_tpl": "559ba5b34bdc2d1f1a8b4582", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 18 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout" + }, { + "_id": "769a6f15a9b3c58ce40e75ac", + "_tpl": "5887431f2459777e1612938f", + "parentId": "0263e3bc89cb651c5139987e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "b2edecbf14e5350dfd6e6e5e", + "_tpl": "5beed0f50db834001c062b12", + "location": { + "isSearched": true, + "r": 1, + "x": 7, + "y": 25 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "64ffc5ccbc2251b698f0fea2", + "_tpl": "5beec8ea0db834001a6f9dbf", + "parentId": "b2edecbf14e5350dfd6e6e5e", + "slotId": "mod_pistol_grip" + }, { + "_id": "59a37d06c461cf976c402b80", + "_tpl": "5beec91a0db834001961942d", + "parentId": "b2edecbf14e5350dfd6e6e5e", + "slotId": "mod_reciever" + }, { + "_id": "cedefb638120dc6d42fb662b", + "_tpl": "5beec9450db83400970084fd", + "parentId": "59a37d06c461cf976c402b80", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "15fc85f890517a4ef55164ea", + "_tpl": "5bf3f59f0db834001a6fa060", + "parentId": "cedefb638120dc6d42fb662b", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "169361f6c47d5b6a2a5b119a", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "b2edecbf14e5350dfd6e6e5e", + "slotId": "mod_magazine" + }, { + "_id": "4062e1a8d731f8aae2570107", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "169361f6c47d5b6a2a5b119a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "d068c0da32fec4264ddefef9", + "_tpl": "5beec8b20db834001961942a", + "parentId": "b2edecbf14e5350dfd6e6e5e", + "slotId": "mod_stock_001" + }, { + "_id": "48d82e5be78ae8d5937339a2", + "_tpl": "5beec8c20db834001d2c465c", + "parentId": "d068c0da32fec4264ddefef9", + "slotId": "mod_stock" + }, { + "_id": "c441884a6e358fd88e34aa25", + "_tpl": "5beec3e30db8340019619424", + "parentId": "b2edecbf14e5350dfd6e6e5e", + "slotId": "mod_handguard" + }, { + "_id": "185af9bc73a14483a29c9535", + "_tpl": "5beecbb80db834001d2c465e", + "parentId": "c441884a6e358fd88e34aa25", + "slotId": "mod_mount_000" + }, { + "_id": "61e9f910940ae4f314cf7866", + "_tpl": "5beecbb80db834001d2c465e", + "parentId": "c441884a6e358fd88e34aa25", + "slotId": "mod_mount_001" + }, { + "_id": "e871768761a4bfc081a9841e", + "_tpl": "5beec1bd0db834001e6006f3", + "parentId": "b2edecbf14e5350dfd6e6e5e", + "slotId": "mod_barrel" + }, { + "_id": "e4bde4372417487034344d72", + "_tpl": "5beec3420db834001b095429", + "parentId": "e871768761a4bfc081a9841e", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49444ae6628187a2e78ba", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49444ae6628187a2e78b9", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + }, { + "_id": "60c86df7ed1a4e3ce394a0f6", + "_tpl": "55801eed4bdc2d89578b4588", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 19 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + }, + "StackObjectsCount": 1 + } + }, { + "_id": "645a3bf083b382035fcd50c3", + "_tpl": "56083eab4bdc2d26448b456a", + "parentId": "60c86df7ed1a4e3ce394a0f6", + "slotId": "mod_tactical", + "upd": { + "StackObjectsCount": 1 + } + }, { + "_id": "f230be53d0fb90f23ac0005e", + "_tpl": "560e620e4bdc2d724b8b456b", + "parentId": "60c86df7ed1a4e3ce394a0f6", + "slotId": "mod_muzzle", + "upd": { + "StackObjectsCount": 1 + } + }, { + "_id": "3da4a360d74f2f9628bc5dd2", + "_tpl": "61faa91878830f069b6b7967", + "parentId": "60c86df7ed1a4e3ce394a0f6", + "slotId": "mod_stock", + "upd": { + "StackObjectsCount": 1 + } + }, { + "_id": "969ff4763565268bc52e4d2e", + "_tpl": "56ea8222d2720b69698b4567", + "parentId": "3da4a360d74f2f9628bc5dd2", + "slotId": "mod_bipod", + "upd": { + "StackObjectsCount": 1 + } + } + ], + "questRaidItems": "5fe49444ae6628187a2e78b9", + "questStashItems": "5fe49444ae6628187a2e78ba", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49444ae6628187a2e78b8" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": { + "Items": [] + }, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cd946231388ce000d572fe3", + "5cd945d71388ce000a659dfb" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0.2, + "jaegerUnlocked": false + }, + "weaponbuilds": {} }, - "Customization": { - "Body": "5cc0858d14c02e000c6bea66", - "Feet": "5cc085bb14c02e000e67a5c5", - "Hands": "5cc0876314c02e000c6bea6b", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "544a11ac4bdc2d470e8b456a": false, - "544a5caa4bdc2d1a388b4568": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "54527a984bdc2d4e668b4567": false, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "55801eed4bdc2d89578b4588": true, - "55802d5f4bdc2dac148b458e": false, - "559ba5b34bdc2d1f1a8b4582": true, - "55d480c04bdc2d1d4e8b456a": false, - "55d4887d4bdc2d962f8b4570": false, - "55d7217a4bdc2d86028b456d": false, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "564ca99c4bdc2d16268b4589": false, - "567143bf4bdc2d1a0f8b4567": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59d3ad2720bdb418b4577": false, - "56dfef82d2720bbd668b4567": true, - "56dff3afd2720bba668b4567": false, - "56e294cdd2720b603a8b4575": false, - "56ea8222d2720b69698b4567": true, - "570fd6c2d2720bc6458b457f": false, - "5710c24ad2720bc3458b45a3": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "57cd379a24597778e7682ecf": false, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce772459770e9e5f9532": false, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "5894a05586f774094708ef75": false, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "590c5d4b86f774784e1b9c45": false, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": false, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": false, - "592c2d1a86f7746dbe2af32a": true, - "595cf16b86f77427440c32e2": true, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "59e770b986f7742cbd762754": false, - "5a0c27731526d80618476ac4": false, - "5aa2b87de5b5b00016327c25": false, - "5aa7cfc0e5b5b00015693143": false, - "5aafbde786f774389d0cbc0f": false, - "5ab8f39486f7745cd93a1cca": false, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac72e475acfc400180ae6fe": false, - "5ac7655e5acfc40016339a19": false, - "5af0454c86f7746bf20992e8": false, - "5b40e5e25acfc4001a599bea": false, - "5b432b965acfc47a8774094e": false, - "5b432d215acfc4771e1c6624": false, - "5bed625c0db834001c062946": false, - "5beec1bd0db834001e6006f3": false, - "5beec3420db834001b095429": false, - "5beec3e30db8340019619424": false, - "5beec8b20db834001961942a": false, - "5beec8c20db834001d2c465c": false, - "5beec8ea0db834001a6f9dbf": false, - "5beec91a0db834001961942d": false, - "5beec9450db83400970084fd": false, - "5beecbb80db834001d2c465e": false, - "5beed0f50db834001c062b12": false, - "5bf3f59f0db834001a6fa060": false, - "5bffdc370db834001d23eca8": false, - "5c0505e00db834001b735073": false, - "5c0e530286f7747fa1419862": false, - "5c0e53c886f7747fa54205c7": false, - "5c0e722886f7740458316a57": false, - "5c488a752e221602b412af63": false, - "5c48a14f2e2216152006edd7": false, - "5c48a2852e221602b21d5923": false, - "5c48a2a42e221602b66d1e07": false, - "5c48a2c22e221602b313fb6c": false, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": false, - "5d02778e86f774203e7dedbe": false, - "5d02797c86f774203f38e30a": false, - "5d0a29fed7ad1a002769ad08": false, - "5d0a3e8cd7ad1a6f6a3d35bd": false, - "5d1b36a186f7742523398433": false, - "5d1b371186f774253763a656": false, - "5d40407c86f774318526545a": false, - "5d5d85c586f774279a21cbdb": false, - "5d5d940f86f7742797262046": false, - "5d5e9c74a4b9364855191c40": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": false, - "5e870397991fd70db46995c8": false, - "5e87071478f43e51ca2de5e1": false, - "5e87076ce2db31558c75a11d": false, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": false, - "5e87114fe2db31558c75a120": false, - "5e87116b81c4ed43e83cefdd": false, - "5f4f9eb969cdc30ff33f09db": false, - "61faa91878830f069b6b7967": false, - "627a4e6b255f7527fb05a0f6": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608815684 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 4, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 24 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 25 - } - ], - "Improvement": {}, - "Production": {}, - "Seed": 222222222 - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "edge_of_darkness", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 2, - "NeedWipeOptions": [], - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "AggressorBonus": 0, - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault", - "StandingForKill": 0 - }, - "Side": "Bear", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49444ae6628187a2e77b8", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49444ae6628187a2e77b8", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "a797e819df958aad39cdbd3c", - "_tpl": "5ac4cd105acfc40016339859", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" + "usec": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c6", + "templateId": "5811ce772459770e9e5f9532", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] }, - "Foldable": { - "Folded": false + "Customization": { + "Body": "5cde95d97d6c8b647a3769b0", + "Feet": "5cde95ef7d6c8b04713c4f2d", + "Hands": "5cde95fa7d6c8b04737c2d13", + "Head": "__REPLACEME__" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "43e3a7bd752424eaa0c800e0", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "a797e819df958aad39cdbd3c", - "slotId": "mod_gas_block" - }, - { - "_id": "1cdd4c79345d24be45ae4e5f", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "43e3a7bd752424eaa0c800e0", - "slotId": "mod_handguard" - }, - { - "_id": "a20279119c4931eceb8a097e", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "a797e819df958aad39cdbd3c", - "slotId": "mod_muzzle" - }, - { - "_id": "b2430220da94fb22c0d65693", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "a797e819df958aad39cdbd3c", - "slotId": "mod_pistol_grip" - }, - { - "_id": "94751193011013ee7734b4fe", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "a797e819df958aad39cdbd3c", - "slotId": "mod_reciever" - }, - { - "_id": "276460f843affd97cad97da7", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "a797e819df958aad39cdbd3c", - "slotId": "mod_sight_rear" - }, - { - "_id": "8cf886617f5211d237aa5a1f", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "a797e819df958aad39cdbd3c", - "slotId": "mod_stock" - }, - { - "_id": "a9cb81802a05229cb65b11ef", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "a797e819df958aad39cdbd3c", - "slotId": "mod_magazine" - }, - { - "_id": "909e88f6ba6571e5ab4a3476", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "a9cb81802a05229cb65b11ef", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "0250844ab4d1320f304fdfcb", - "_tpl": "5bffdc370db834001d23eca8", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 80, - "MaxDurability": 80 - } - } - }, - { - "_id": "03470cbbef724cc5017f6538", - "_tpl": "5b40e5e25acfc4001a599bea", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "490e6180d045eeaf5cef9073", - "_tpl": "5ca20abf86f77418567a43f2", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "TacticalVest" - }, - { - "_id": "9c22fdef66c45863afa4a8de", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "490e6180d045eeaf5cef9073", - "slotId": "1" - }, - { - "_id": "11eadc612502a26aeb1611df", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "9c22fdef66c45863afa4a8de", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "01ea8735feb7d3b5ab772dde", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "490e6180d045eeaf5cef9073", - "slotId": "2" - }, - { - "_id": "28605b3f275070610f47af1b", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "01ea8735feb7d3b5ab772dde", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "98f1e5b11f4f85e12db463cf", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "490e6180d045eeaf5cef9073", - "slotId": "3" - }, - { - "_id": "62c13892d6d745050dad38b0", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "98f1e5b11f4f85e12db463cf", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "dbda40032725eb2924b01fbe", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "490e6180d045eeaf5cef9073", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "f5e6bdac05e699d687993249", - "_tpl": "5857a8bc2459772bad15db29", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "SecuredContainer" - }, - { - "_id": "13117a5a113a6246a2db5fff", - "_tpl": "5ca20d5986f774331e7c9602", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Backpack" - }, - { - "_id": "8b6f0bac70f8f2d91c2a0c74", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "13117a5a113a6246a2db5fff", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "c063ca857d900564f913197f", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 1 - }, - "parentId": "13117a5a113a6246a2db5fff", - "slotId": "main", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "b4bef7715cfbfde49f9deb57", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "13117a5a113a6246a2db5fff", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "4ea0df06a22b64ea321dafec", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "13117a5a113a6246a2db5fff", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "af4d8b34228a85208fb85895", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "01e9d751f10e4e9aebdd94d5", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Pockets" - }, - { - "_id": "4ca0cf14b0ae5bd2753a0a87", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "01e9d751f10e4e9aebdd94d5", - "slotId": "pocket1" - }, - { - "_id": "749309e76ce2fdcf316f29fe", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "01e9d751f10e4e9aebdd94d5", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "729ecfc38cce5672b1dc1ad1", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "01e9d751f10e4e9aebdd94d5", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "ad076f81dc918f5e4c7fbd18", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Earpiece" - }, - { - "_id": "5fe49444ae6628187a2e78b8", - "_tpl": "5811ce772459770e9e5f9532" - }, - { - "_id": "702bdc5dfd91ed316b175b3c", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "fb08ac9e01a36533563a4389", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "686cfcc458f923cb2e76b8d7", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "1936371534d82e70c76a7645", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 9 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "12be6d1147d04252aacaa083", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "6342de84cd397d00cb31e87f", - "_tpl": "557ff21e4bdc2d89578b4586", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 22 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "81a756ebe7ce1ea490962f9e", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "a9bccb7b590bf286c6e0a0c3", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "cfd59c8e3cd5cce89c53b10f", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "b2fe6975cd7ba911fbf6bf42", - "_tpl": "5d40407c86f774318526545a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "f587cf58fc9d1c6cf7899bf1", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "26578d87ce5797ff5e87fd3c", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "feb9c6ec3ad0f62f2cac447c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "26578d87ce5797ff5e87fd3c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "7a3a6fdbd690c6e3767a096d", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "a498d5c84a16a8700486b51e", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "90ceaf3a032fbddb4d8ba181", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "106af131dbdc7fd37bd14dfb", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 11 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "78a938654650e34abbc5b8ba", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "d74a1797a4c614b767fc3bae", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "90770873e582d91803aab334", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "d74a1797a4c614b767fc3bae", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "d9cbc2cd84237f98ff2755c3", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "8f79a44ad63d889117296f4c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "d9cbc2cd84237f98ff2755c3", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "2812b9183017676294379dca", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d8f30bca23ad344542332c2b", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "2812b9183017676294379dca", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "793165a59cd9851376721225", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "a8063d54da55fb4f5f65e5db", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "793165a59cd9851376721225", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5c38985edc19d2dcabbae35c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "e1ea22ee08f9df9510ba0d78", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "cfefb0ba82b5146fc31a6950", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "b6672157bc48c99a22bddfc0", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "eb9fdb0d060da5428fda443c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "79d2d8c7e5beea7eacdd182b", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "627d2a20092c113b5becf64d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "ca80652ee36de43007d8efcc", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "008684957ef010140bcaab5d", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "ca80652ee36de43007d8efcc", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "a3c7c8cc79286d6977471596", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "0ec7e3bf2f3c7c3ba38239eb", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "a3c7c8cc79286d6977471596", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "feb6dfb5498cd78530ef127c", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "e8bb934c6185c10053db2644", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "feb6dfb5498cd78530ef127c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "98f8acadeebdbfc5dc71e3d1", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "5d1d600c9966b2a55a7b2753", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "98f8acadeebdbfc5dc71e3d1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "865d1f2ad642b3b4f1215069", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "b66581c029631a7b55a32047", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "865d1f2ad642b3b4f1215069", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "84e1c2763a73328da1f12d47", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 11 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "a41d51a5df91ab76147f4f67", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 11 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "da12ff8da976f0b65169a4c6", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 17 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "cff77612829a2bca05bb12fe", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 1, - "x": 8, - "y": 32 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "bf4e22ad1b7491a3b64952f0", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "0d433004c6fbce3e87cab553", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 1, - "x": 8, - "y": 30 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "45f4260eb5b8f95b76169117", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5b5939c98d57a378a0028aab", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 21 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "6090c8f36c2c7ea96450338f", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 15 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "ab849c066c608b391089b7ec", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 15 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "778249f3797805c34e11eb12", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 16 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "62357ba0ab9508b9dd3122e6", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "778249f3797805c34e11eb12", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "e7758bee1260861bf7002b97", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 16 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "44919bf9dd35679ad2f2f05a", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "e7758bee1260861bf7002b97", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "fa48d505a5d4b745d87738db", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 16 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "6f052efd98ed56034614d0c8", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "fa48d505a5d4b745d87738db", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "791c40db74e01311fe25e1f6", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 16 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "ae94aebd712a154aa5507d95", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 16 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "ff0ff90e0cf7c5e3e7010ea4", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "ae94aebd712a154aa5507d95", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "08dfb883d785b8f6c2cb3c55", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 30 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "d669a3bb766f4b5372d397c8", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 30 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "151c9e54ab15b0671f73dbc8", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 30 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "ab975022dba4a048a89bab1f", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 32 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "6e7c46c087fbb3c5c75d8289", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 32 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "2c2328ec1d21a33e4672ff5d", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 32 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "7f0dce2c6b47b1eeac74f3fd", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 29 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "f34845e66c2fb4d3a724610e", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 29 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "14d7acac0cfb3b83a75f338e", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "e9a6f02b0bdcb5396e649244", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "370172a19dfd4e467aef1dbe", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d4dce1062cb9cc8a826ea03b", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d3ce4df1bc5894e2f78882f3", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "ae8149b8dc0ae253f174b6f4", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "4daad698cf5b72487346e0d5", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "f880ae41ce81ab084a2f4eab", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "64277b11e912b968a9c41b3b", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 37 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "239a4b43740b84e90db4fb17", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 37 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "c4332600c7ea3d4dc9a3eeeb", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "87961dd2d7e7ee05db9e45c9", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "9dd9d821cffb585482fd1389", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "87961dd2d7e7ee05db9e45c9", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "9417e493bc4c277a6adee960", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "9492c6ec9a2a58c03fb3ae07", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "9417e493bc4c277a6adee960", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "50e24912547aecad4244f96c", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 18 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "bf299763ba7c6d6130aeb67c", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "169fca7757fa58518380f4ed", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 14 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "94614a61c5f560ec575b96f5", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 28 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "a9f69caa9c291288d3af3f70", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "86c426e5603f11f3973a7c2e", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "423c59d7d0be625133067ff9", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d987a0a70512510f633e21d5", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 37 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d51b419b7f442422bcf2fab6", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 37 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "03cd7851e89f43020e24bafb", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "57daa3f963e75470cebe4fef", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "e63b5a4e5a3c84dde743edd1", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500 - } - }, - { - "_id": "4c138d4262cfdd01efc8145a", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500 - } - }, - { - "_id": "f0f9c3ff0b3b1dbdeffee6ea", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 18 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "a8b2466d0350461c4b04fd2c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "fe4dbfce77eb6008a8f4d09d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 10 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "11ae2930e3accdc5f124876b", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "c8a0ba51f519cfde0fe997e8", - "_tpl": "5c0e53c886f7747fa54205c7", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 19 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 47, - "MaxDurability": 47 - } - } - }, - { - "_id": "cd688bf5123e7f7b524bf826", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 18 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "44ebc2c1ad7f620ebe405367", - "_tpl": "5d1b36a186f7742523398433", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 38 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 100 - } - } - }, - { - "_id": "c71ab08b792188701a79e839", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 38 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "719317c75d4325f6a48a14a6", - "_tpl": "5d0a3e8cd7ad1a6f6a3d35bd", - "parentId": "f5de5b058e07bcacee8c97d0", - "slotId": "mod_scope", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "f5de5b058e07bcacee8c97d0", - "_tpl": "5d0a29fed7ad1a002769ad08", - "parentId": "60c86df7ed1a4e3ce394a0f6", - "slotId": "mod_scope" - }, - { - "_id": "612d78111fdcbf34bd2d7b28", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 21 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "100de389aa4e70a171270a83", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 21 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "e58c0f483fce36e55aec165e", - "_tpl": "559ba5b34bdc2d1f1a8b4582", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 8, - "y": 18 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "e20ddc9d3b8849fbdc251ea0", - "_tpl": "5887431f2459777e1612938f", - "parentId": "e58c0f483fce36e55aec165e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "dd6cb088cfc11365f794ec4b", - "_tpl": "559ba5b34bdc2d1f1a8b4582", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 20 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "da6373f4e09dd3d4eea68bf0", - "_tpl": "5887431f2459777e1612938f", - "parentId": "dd6cb088cfc11365f794ec4b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "9cad0271722c938b71f12f95", - "_tpl": "559ba5b34bdc2d1f1a8b4582", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 19 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d9d62e8db1303bbf4a88c7e9", - "_tpl": "5887431f2459777e1612938f", - "parentId": "9cad0271722c938b71f12f95", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "25a617ea956575203cdf0a09", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "deed2ec92f8ebf37cf3e639a", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "e4c6958acc50164d2387b53a", - "_tpl": "5aa7cfc0e5b5b00015693143", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 23 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 25, - "MaxDurability": 25 - } - } - }, - { - "_id": "599a234277a564d9dd5bdd1c", - "_tpl": "5ab8f39486f7745cd93a1cca", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 22 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "8683fa7212c9bdd366063dd0", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 32 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "4abf4d970ec5b19afe8e126d", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500 - } - }, - { - "_id": "7ca437210f63ee92275b37fe", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "7ad655c1e45bc6a9f49b4b99", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 36 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "f602250b1405f266cfe696f7", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "8b672ab1e2278d787bed7cf9", - "_tpl": "5d5d940f86f7742797262046", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 29 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "da478b8f22969edb7af064a8", - "_tpl": "57cd379a24597778e7682ecf", - "location": { - "isSearched": true, - "r": 1, - "x": 4, - "y": 23 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "49fbfbdeed8888564938c8cb", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 21 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "8da531704ee0e9cabfc6dce2", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 22 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "3cd0e5ffd24f9e4c1f206741", - "_tpl": "5ab8f39486f7745cd93a1cca", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 21 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "24f71b418e8670d740e6024b", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 40 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "17f350695fd709de9e868610", - "_tpl": "5d5d85c586f774279a21cbdb", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 25 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "380b954613fc6559dee3e19e", - "_tpl": "5c0e722886f7740458316a57", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 25 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 65, - "MaxDurability": 65 - } - } - }, - { - "_id": "b410bdab51c195ffe3c83d1b", - "_tpl": "5b432d215acfc4771e1c6624", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 23 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 30, - "MaxDurability": 30 - } - } - }, - { - "_id": "172f0b166eec3c78e6c3ea84", - "_tpl": "5e8488fa988a8701445df1e4", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 37 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 3 - } - } - }, - { - "_id": "ccac1906f229352147a9934b", - "_tpl": "5e8488fa988a8701445df1e4", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 37 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 3 - } - } - }, - { - "_id": "c728563377b6a440482d77b9", - "_tpl": "590c678286f77426c9660122", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 38 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 300 - } - } - }, - { - "_id": "b43973e59452e707816a5857", - "_tpl": "590c678286f77426c9660122", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 39 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 300 - } - } - }, - { - "_id": "dd039504d446bd7af0992a1b", - "_tpl": "590c678286f77426c9660122", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 38 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 300 - } - } - }, - { - "_id": "dc189c626993ff517fc61236", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 28 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "7d644abc323d82b9ba729740", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "dc189c626993ff517fc61236", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "661a3936e62f490e219582dc", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 28 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "449d62388f2f639a64045d71", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 28 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "52399e2f1a3044a514b2030b", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 23 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "467a6cdeeb6cd75a7c538872", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "52399e2f1a3044a514b2030b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "e0419baa0c2d4f3619acb5cc", - "_tpl": "5c0e530286f7747fa1419862", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "1e4a2fd745c006867fb88f79", - "_tpl": "5c0e530286f7747fa1419862", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "5784837a07c8f380cb2950cd", - "_tpl": "559ba5b34bdc2d1f1a8b4582", - "parentId": "60c86df7ed1a4e3ce394a0f6", - "slotId": "mod_magazine" - }, - { - "_id": "de67e78c4fb859322f766194", - "_tpl": "5887431f2459777e1612938f", - "parentId": "5784837a07c8f380cb2950cd", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "1eb47c86694ab2fce9904af6", - "_tpl": "5c0505e00db834001b735073", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 24 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "1772d219adce434a029346c1", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 25 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "b04747fbdbeb0707a3f7340d", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "1772d219adce434a029346c1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "12572b486734c09b8839733d", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 1, - "x": 5, - "y": 24 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "8f08e02573f940e71f37feb2", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "12572b486734c09b8839733d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "4da90923d1e3133f938bdeec", - "_tpl": "590c657e86f77412b013051d", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 38 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 1800 - } - } - }, - { - "_id": "c6d58ede5aa9d24744187054", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "0bc3a80d48bac27550c6a15a", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 21 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "5f13a6fbf32fbcd1c5796899", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 27 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "f0c60e3787fa3aca66dcc74a", - "_tpl": "5887431f2459777e1612938f", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 22 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 40 - } - }, - { - "_id": "44e01b1a96be81711f7dc93e", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 34 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "7dd0fe67076e301ba04210dc", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 33 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5253b6b2ca3428ab303af52b", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 38 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "99eaa80a461346eda014048d", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 39 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "9812a8a58953878fa4242cd3", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 40 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "1f7bfa7312cdaa64f4133089", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "04e14fd3d1294042f7cb618d", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 35 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "93ca8f31b67632bc7f8caf74", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d96c035dd972bb5b42a7951a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "93ca8f31b67632bc7f8caf74", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "217bde33f66867ae88e11af1", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "d7ab0baf36814edcd1c33e20", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "217bde33f66867ae88e11af1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "32c8f2ea6a975dafe2f4daba", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "97861a122e2e3e84c07e34b3", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "32c8f2ea6a975dafe2f4daba", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "6c232b354c34836ee2627544", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "e4d6da7d7327f32138181741", - "_tpl": "5645bcc04bdc2d363b8b4572", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 23 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "8698b23a78a8dc22f4c69609", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 9 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "3497bff150a35f338ca823f6", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "9942ed330f84122f06ba4db4", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "bc683f19adbaab56ff115d51", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "1064afb08ab86ccac101d94f", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 30 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "c844cb2dba7d609cbcba4770", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 31 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5ed1e6bac123c3b2c9eeaf35", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 37 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "033a831eee25432724e8b1e9", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Encyclopedia": { + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "544a11ac4bdc2d470e8b456a": false, + "544a5caa4bdc2d1a388b4568": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "54527a984bdc2d4e668b4567": false, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "55801eed4bdc2d89578b4588": true, + "55802d5f4bdc2dac148b458e": false, + "559ba5b34bdc2d1f1a8b4582": true, + "55d480c04bdc2d1d4e8b456a": false, + "55d4887d4bdc2d962f8b4570": false, + "55d7217a4bdc2d86028b456d": false, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "564ca99c4bdc2d16268b4589": false, + "567143bf4bdc2d1a0f8b4567": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59d3ad2720bdb418b4577": false, + "56dfef82d2720bbd668b4567": true, + "56dff3afd2720bba668b4567": false, + "56e294cdd2720b603a8b4575": false, + "56ea8222d2720b69698b4567": true, + "570fd6c2d2720bc6458b457f": false, + "5710c24ad2720bc3458b45a3": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "57cd379a24597778e7682ecf": false, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce772459770e9e5f9532": false, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "5894a05586f774094708ef75": false, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "590c5d4b86f774784e1b9c45": false, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": false, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": false, + "592c2d1a86f7746dbe2af32a": true, + "595cf16b86f77427440c32e2": true, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "59e770b986f7742cbd762754": false, + "5a0c27731526d80618476ac4": false, + "5aa2b87de5b5b00016327c25": false, + "5aa7cfc0e5b5b00015693143": false, + "5aafbde786f774389d0cbc0f": false, + "5ab8f39486f7745cd93a1cca": false, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac72e475acfc400180ae6fe": false, + "5ac7655e5acfc40016339a19": false, + "5af0454c86f7746bf20992e8": false, + "5b40e5e25acfc4001a599bea": false, + "5b432b965acfc47a8774094e": false, + "5b432d215acfc4771e1c6624": false, + "5bed625c0db834001c062946": false, + "5beec1bd0db834001e6006f3": false, + "5beec3420db834001b095429": false, + "5beec3e30db8340019619424": false, + "5beec8b20db834001961942a": false, + "5beec8c20db834001d2c465c": false, + "5beec8ea0db834001a6f9dbf": false, + "5beec91a0db834001961942d": false, + "5beec9450db83400970084fd": false, + "5beecbb80db834001d2c465e": false, + "5beed0f50db834001c062b12": false, + "5bf3f59f0db834001a6fa060": false, + "5bffdc370db834001d23eca8": false, + "5c0505e00db834001b735073": false, + "5c0e530286f7747fa1419862": false, + "5c0e53c886f7747fa54205c7": false, + "5c0e722886f7740458316a57": false, + "5c488a752e221602b412af63": false, + "5c48a14f2e2216152006edd7": false, + "5c48a2852e221602b21d5923": false, + "5c48a2a42e221602b66d1e07": false, + "5c48a2c22e221602b313fb6c": false, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": false, + "5d02778e86f774203e7dedbe": false, + "5d02797c86f774203f38e30a": false, + "5d0a29fed7ad1a002769ad08": false, + "5d0a3e8cd7ad1a6f6a3d35bd": false, + "5d1b36a186f7742523398433": false, + "5d1b371186f774253763a656": false, + "5d40407c86f774318526545a": false, + "5d5d85c586f774279a21cbdb": false, + "5d5d940f86f7742797262046": false, + "5d5e9c74a4b9364855191c40": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": false, + "5e870397991fd70db46995c8": false, + "5e87071478f43e51ca2de5e1": false, + "5e87076ce2db31558c75a11d": false, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": false, + "5e87114fe2db31558c75a120": false, + "5e87116b81c4ed43e83cefdd": false, + "5f4f9eb969cdc30ff33f09db": false, + "61faa91878830f069b6b7967": false, + "627a4e6b255f7527fb05a0f6": false }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "4040d36d8534fae91fb683d9", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "033a831eee25432724e8b1e9", - "slotId": "mod_magazine" - }, - { - "_id": "b1c5d10c0b6bb788d1a1d032", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "4040d36d8534fae91fb683d9", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "cbd1aa819fe0cf71f0d23ccd", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "033a831eee25432724e8b1e9", - "slotId": "mod_pistol_grip" - }, - { - "_id": "aee2db2a5b61e09942c5b7d7", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608817166 }, - "Foldable": { - "Folded": false + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 4, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 24 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 25 + } + ], + "Improvement": {}, + "Production": {}, + "Seed": 111111111 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "e73fe8ced9426d992f6bb3c0", - "_tpl": "5998517986f7746017232f7e", - "parentId": "aee2db2a5b61e09942c5b7d7", - "slotId": "mod_pistol_grip" - }, - { - "_id": "88641f60682745d0bf04747e", - "_tpl": "599851db86f77467372f0a18", - "parentId": "aee2db2a5b61e09942c5b7d7", - "slotId": "mod_stock" - }, - { - "_id": "6393b7d3728b809b054baa31", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "aee2db2a5b61e09942c5b7d7", - "slotId": "mod_magazine" - }, - { - "_id": "77489a635cff7fb941b58382", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "6393b7d3728b809b054baa31", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "54d27d8d60eb93aa6598377a", - "_tpl": "5998597786f77414ea6da093", - "parentId": "aee2db2a5b61e09942c5b7d7", - "slotId": "mod_muzzle" - }, - { - "_id": "249ccd46eb7413434545be77", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "aee2db2a5b61e09942c5b7d7", - "slotId": "mod_reciever" - }, - { - "_id": "673088d03e5d01e4138ef4ab", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "aee2db2a5b61e09942c5b7d7", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "e629647af1a768658f2576a9", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "aee2db2a5b61e09942c5b7d7", - "slotId": "mod_gas_block" - }, - { - "_id": "6ae2eff0b14c553cdaf9c4be", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "e629647af1a768658f2576a9", - "slotId": "mod_handguard" - }, - { - "_id": "48116a27afe5a51c917c10dd", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "edge_of_darkness", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 2, + "NeedWipeOptions": [], + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Usec", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "492f1602f7df59c0ff58bb91", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "48116a27afe5a51c917c10dd", - "slotId": "mod_magazine" - }, - { - "_id": "2d1261c888e045fc764e4a11", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "492f1602f7df59c0ff58bb91", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "c68ed794aa5be082ab90220e", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "48116a27afe5a51c917c10dd", - "slotId": "mod_pistol_grip" - }, - { - "_id": "04f8a1021e1cef21b5347758", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49a0e2694b0755a50476c", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49a0e2694b0755a50476c", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "5fe49a0e2694b0755a504755", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504749", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe49a0e2694b0755a504755", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49a0e2694b0755a50474b", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe49a0e2694b0755a504755", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a50474a", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a50474b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a504751", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe49a0e2694b0755a504755", + "slotId": "mod_reciever" + }, { + "_id": "5fe49a0e2694b0755a50474e", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe49a0e2694b0755a504751", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a50474c", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe49a0e2694b0755a50474e", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a50474d", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe49a0e2694b0755a50474e", + "slotId": "mod_gas_block" + }, { + "_id": "5fe49a0e2694b0755a50474f", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe49a0e2694b0755a504751", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe49a0e2694b0755a50474f", + "slotId": "mod_handguard" + }, { + "_id": "5fe49a0e2694b0755a504750", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe49a0e2694b0755a504751", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504753", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe49a0e2694b0755a504755", + "slotId": "mod_stock" + }, { + "_id": "5fe49a0e2694b0755a504752", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe49a0e2694b0755a504753", + "slotId": "mod_stock_000" + }, { + "_id": "5fe49a0e2694b0755a504754", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe49a0e2694b0755a504755", + "slotId": "mod_charge" + }, { + "_id": "5fe49a0e2694b0755a504756", + "_tpl": "54491bb74bdc2d09088b4567", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 70, + "MaxDurability": 70 + } + } + }, { + "_id": "5fe49a0e2694b0755a504757", + "_tpl": "572b7fa524597762b747ce82", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "FaceCover", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504758", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe49a0e2694b0755a504760", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "TacticalVest" + }, { + "_id": "5fe49a0e2694b0755a50475a", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504760", + "slotId": "1" + }, { + "_id": "5fe49a0e2694b0755a504759", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a50475a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a50475c", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504760", + "slotId": "2" + }, { + "_id": "5fe49a0e2694b0755a50475b", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a50475c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a50475e", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504760", + "slotId": "3" + }, { + "_id": "5fe49a0e2694b0755a50475d", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a50475e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a50475f", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504760", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504761", + "_tpl": "5857a8bc2459772bad15db29", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "SecuredContainer" + }, { + "_id": "5fe49a0e2694b0755a504765", + "_tpl": "5e9dcf5986f7746c417435b3", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "Backpack" + }, { + "_id": "5fe49a0e2694b0755a504762", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504765", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49a0e2694b0755a504763", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504765", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a504764", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504765", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe49a0e2694b0755a504766", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe49a0e2694b0755a50476a", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "Pockets" + }, { + "_id": "5fe49a0e2694b0755a504767", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a50476a", + "slotId": "pocket1" + }, { + "_id": "5fe49a0e2694b0755a504768", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a50476a", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe49a0e2694b0755a504769", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a50476a", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe49a0e2694b0755a50476b", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe49a0e2694b0755a50476c", + "slotId": "Earpiece" + }, { + "_id": "5fe49a0e2694b0755a504876", + "_tpl": "5811ce772459770e9e5f9532" + }, { + "_id": "5fe49a0e2694b0755a50476d", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 32 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a50476e", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 9 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50476f", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504771", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504770", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a504771", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a504773", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 14 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504772", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a504773", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a504774", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 17 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe49a0e2694b0755a504775", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 1, + "x": 9, + "y": 31 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe49a0e2694b0755a504776", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 31 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504777", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504779", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 15 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504778", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a504779", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a50477a", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a50477b", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 32 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a50477d", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 14 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50477c", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a50477d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a50477e", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50477f", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 17 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe49a0e2694b0755a504780", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 32 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe49a0e2694b0755a504781", + "_tpl": "5ab8f39486f7745cd93a1cca", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 25 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504782", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 14 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504783", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504785", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 20 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504784", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe49a0e2694b0755a504785", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe49a0e2694b0755a504786", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 11 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504787", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe49a0e2694b0755a504788", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504789", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 32 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a50478a", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe49a0e2694b0755a50478b", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe49a0e2694b0755a50478c", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 33 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50478d", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 31 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a50478f", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50478e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a50478f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a504790", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 9 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504791", + "_tpl": "5d403f9186f7743cac3f229b", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a504792", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504793", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe49a0e2694b0755a504794", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 33 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504795", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504796", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504797", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504798", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 33 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504799", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe49a0e2694b0755a50479b", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50479a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a50479b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a50479c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a50479d", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50479e", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 36 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50479f", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047a0", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 36 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047a1", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047a3", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047a2", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047a3", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047a5", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047a4", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047a5", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a5047a7", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047a6", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047a7", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047a9", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047a8", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047a9", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047ab", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047aa", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047ab", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047ac", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 36 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047ae", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 1, + "x": 3, + "y": 25 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047ad", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a5047ae", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a5047af", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047b0", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047b1", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047b2", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047b3", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500 + } + }, { + "_id": "5fe49a0e2694b0755a5047b4", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047b6", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047b5", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047b6", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a5047b8", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047b7", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047b8", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047b9", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047ba", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047bb", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49a0e2694b0755a5047bc", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 31 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047bd", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 33 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047be", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe49a0e2694b0755a5047bf", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe49a0e2694b0755a5047c1", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 14 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047c0", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a5047c1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a5047c2", + "_tpl": "5e8488fa988a8701445df1e4", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 36 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 3 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047c3", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 2 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500 + } + }, { + "_id": "5fe49a0e2694b0755a5047c5", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047c4", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047c5", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a5047c7", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047c6", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047c7", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047c9", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047c8", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047c9", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a5047cb", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047ca", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a5047cb", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a5047cc", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 16 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047cd", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 15 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047ce", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 26 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047cf", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 28 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047d0", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 26 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047d1", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 27 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047d2", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 17 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047d3", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 17 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047d4", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 17 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a5047d5", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047d6", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 31 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047d7", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047d8", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 32 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047d9", + "_tpl": "5c0e655586f774045612eeb2", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 17 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 85, + "MaxDurability": 85 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047da", + "_tpl": "5c165d832e2216398b5a7e36", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 21 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047db", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 33 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047dc", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 33 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047dd", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 33 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047de", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047df", + "_tpl": "5ab8f39486f7745cd93a1cca", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 25 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047e0", + "_tpl": "557ff21e4bdc2d89578b4586", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 22 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047e1", + "_tpl": "5bfebc5e0db834001a6694e5", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 19 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047e2", + "_tpl": "57c5ac0824597754771e88a9", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 16 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047e3", + "_tpl": "5aa7d03ae5b5b00016327db5", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 20 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 25, + "MaxDurability": 25 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047e4", + "_tpl": "5aa7d03ae5b5b00016327db5", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 20 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 25, + "MaxDurability": 25 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047e5", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047e6", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047e7", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 19 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047e8", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 19 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047e9", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 20 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047eb", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 24 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047ea", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a5047eb", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a5047ec", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 37 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047ed", + "_tpl": "5d1b36a186f7742523398433", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 37 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047ee", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047ef", + "_tpl": "557ff21e4bdc2d89578b4586", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 23 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047f0", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 29 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047f1", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 32 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047f2", + "_tpl": "5d5d940f86f7742797262046", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 27 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047f3", + "_tpl": "57cd379a24597778e7682ecf", + "location": { + "isSearched": true, + "r": 1, + "x": 0, + "y": 26 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047f4", + "_tpl": "544a5caa4bdc2d1a388b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 22 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 70, + "MaxDurability": 70 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047f5", + "_tpl": "5d5d85c586f774279a21cbdb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 22 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047f6", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 36 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047f7", + "_tpl": "570fd6c2d2720bc6458b457f", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 26 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047f8", + "_tpl": "5448be9a4bdc2dfd2f8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 20 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047f9", + "_tpl": "5448be9a4bdc2dfd2f8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 21 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047fa", + "_tpl": "590c657e86f77412b013051d", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 37 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 1800 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047fb", + "_tpl": "5d5e9c74a4b9364855191c40", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 17 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 27, + "MaxDurability": 27 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047fd", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 1, + "x": 3, + "y": 26 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a5047fc", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a5047fd", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a5047fe", + "_tpl": "590c678286f77426c9660122", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 300 + } + } + }, { + "_id": "5fe49a0e2694b0755a5047ff", + "_tpl": "590c678286f77426c9660122", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 300 + } + } + }, { + "_id": "5fe49a0e2694b0755a504800", + "_tpl": "590c678286f77426c9660122", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 300 + } + } + }, { + "_id": "5fe49a0e2694b0755a504802", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 24 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504801", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a504802", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a504803", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 29 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49a0e2694b0755a504804", + "_tpl": "5e8488fa988a8701445df1e4", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 36 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 3 + } + } + }, { + "_id": "5fe49a0e2694b0755a504805", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 26 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe49a0e2694b0755a504806", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 26 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a504807", + "_tpl": "5c0e530286f7747fa1419862", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504808", + "_tpl": "5c0e530286f7747fa1419862", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504809", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 25 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a50480a", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500 + } + }, { + "_id": "5fe49a0e2694b0755a50480c", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 19 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50480b", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe49a0e2694b0755a50480c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe49a0e2694b0755a50480e", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 19 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50480d", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe49a0e2694b0755a50480e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe49a0e2694b0755a504810", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 20 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50480f", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe49a0e2694b0755a504810", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe49a0e2694b0755a504811", + "_tpl": "58dd3ad986f77403051cba8f", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 19 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a504812", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 29 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49a0e2694b0755a504813", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 34 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504815", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504814", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a504815", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a504817", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504816", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a504817", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a504819", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504818", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a504819", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a50481a", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 30 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50481b", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 30 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50481c", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 38 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a50481d", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 37 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a50481e", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 39 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a50481f", + "_tpl": "58dd3ad986f77403051cba8f", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 16 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a504820", + "_tpl": "5448be9a4bdc2dfd2f8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 21 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504821", + "_tpl": "5645bcc04bdc2d363b8b4572", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 23 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a504822", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 29 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a504823", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 29 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49a0e2694b0755a504824", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 35 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout" + }, { + "_id": "5fe49a0e2694b0755a50482d", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504826", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe49a0e2694b0755a50482d", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a504825", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe49a0e2694b0755a504826", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a504827", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe49a0e2694b0755a50482d", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49a0e2694b0755a50482a", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe49a0e2694b0755a50482d", + "slotId": "mod_reciever" + }, { + "_id": "5fe49a0e2694b0755a504828", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe49a0e2694b0755a50482a", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504829", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe49a0e2694b0755a50482a", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a50482c", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe49a0e2694b0755a50482d", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a50482b", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a50482c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a504836", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a50482f", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe49a0e2694b0755a504836", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a50482e", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe49a0e2694b0755a50482f", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a504830", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe49a0e2694b0755a504836", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49a0e2694b0755a504833", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe49a0e2694b0755a504836", + "slotId": "mod_reciever" + }, { + "_id": "5fe49a0e2694b0755a504831", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe49a0e2694b0755a504833", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504832", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe49a0e2694b0755a504833", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504835", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe49a0e2694b0755a504836", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a504834", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a504835", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a504843", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 14 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504837", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe49a0e2694b0755a504843", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49a0e2694b0755a504839", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe49a0e2694b0755a504843", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a504838", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a504839", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a50483f", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe49a0e2694b0755a504843", + "slotId": "mod_reciever" + }, { + "_id": "5fe49a0e2694b0755a50483c", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe49a0e2694b0755a50483f", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a50483a", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe49a0e2694b0755a50483c", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a50483b", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe49a0e2694b0755a50483c", + "slotId": "mod_gas_block" + }, { + "_id": "5fe49a0e2694b0755a50483d", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe49a0e2694b0755a50483f", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe49a0e2694b0755a50483d", + "slotId": "mod_handguard" + }, { + "_id": "5fe49a0e2694b0755a50483e", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe49a0e2694b0755a50483f", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504841", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe49a0e2694b0755a504843", + "slotId": "mod_stock" + }, { + "_id": "5fe49a0e2694b0755a504840", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe49a0e2694b0755a504841", + "slotId": "mod_stock_000" + }, { + "_id": "5fe49a0e2694b0755a504842", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe49a0e2694b0755a504843", + "slotId": "mod_charge" + }, { + "_id": "5fe49a0e2694b0755a50484c", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504845", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe49a0e2694b0755a50484c", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a504844", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a504845", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a50484a", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe49a0e2694b0755a50484c", + "slotId": "mod_reciever" + }, { + "_id": "5fe49a0e2694b0755a504846", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe49a0e2694b0755a50484a", + "slotId": "mod_handguard" + }, { + "_id": "5fe49a0e2694b0755a504847", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe49a0e2694b0755a50484a", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504848", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe49a0e2694b0755a50484a", + "slotId": "mod_stock" + }, { + "_id": "5fe49a0e2694b0755a504849", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe49a0e2694b0755a50484a", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a50484b", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe49a0e2694b0755a50484c", + "slotId": "mod_charge" + }, { + "_id": "5fe49a0e2694b0755a504855", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a50484e", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe49a0e2694b0755a504855", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a50484d", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a50484e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49a0e2694b0755a504853", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe49a0e2694b0755a504855", + "slotId": "mod_reciever" + }, { + "_id": "5fe49a0e2694b0755a50484f", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe49a0e2694b0755a504853", + "slotId": "mod_handguard" + }, { + "_id": "5fe49a0e2694b0755a504850", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe49a0e2694b0755a504853", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504851", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe49a0e2694b0755a504853", + "slotId": "mod_stock" + }, { + "_id": "5fe49a0e2694b0755a504852", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe49a0e2694b0755a504853", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a504854", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe49a0e2694b0755a504855", + "slotId": "mod_charge" + }, { + "_id": "5fe49a0e2694b0755a50485e", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504857", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe49a0e2694b0755a50485e", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a504856", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe49a0e2694b0755a504857", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a504858", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe49a0e2694b0755a50485e", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49a0e2694b0755a50485b", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe49a0e2694b0755a50485e", + "slotId": "mod_reciever" + }, { + "_id": "5fe49a0e2694b0755a504859", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe49a0e2694b0755a50485b", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a50485a", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe49a0e2694b0755a50485b", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a50485d", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe49a0e2694b0755a50485e", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a50485c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49a0e2694b0755a50485d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49a0e2694b0755a504867", + "_tpl": "5e870397991fd70db46995c8", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 16 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504860", + "_tpl": "5e87071478f43e51ca2de5e1", + "parentId": "5fe49a0e2694b0755a504867", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a50485f", + "_tpl": "5e8708d4ae379e67d22e0102", + "parentId": "5fe49a0e2694b0755a504860", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504861", + "_tpl": "5e87076ce2db31558c75a11d", + "parentId": "5fe49a0e2694b0755a504867", + "slotId": "mod_handguard" + }, { + "_id": "5fe49a0e2694b0755a504863", + "_tpl": "5e87080c81c4ed43e83cefda", + "parentId": "5fe49a0e2694b0755a504867", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a504862", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe49a0e2694b0755a504863", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 8 + } + }, { + "_id": "5fe49a0e2694b0755a504864", + "_tpl": "5e87116b81c4ed43e83cefdd", + "parentId": "5fe49a0e2694b0755a504867", + "slotId": "mod_stock" + }, { + "_id": "5fe49a0e2694b0755a504865", + "_tpl": "5e87114fe2db31558c75a120", + "parentId": "5fe49a0e2694b0755a504867", + "slotId": "mod_mount", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504866", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe49a0e2694b0755a504867", + "slotId": "patron_in_weapon" + }, { + "_id": "5fe49a0e2694b0755a50486c", + "_tpl": "5bfea6e90db834001b7347f3", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 18 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a504869", + "_tpl": "5bfeaa0f0db834001b734927", + "parentId": "5fe49a0e2694b0755a50486c", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a504868", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe49a0e2694b0755a504869", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe49a0e2694b0755a50486a", + "_tpl": "5bfeb32b0db834001a6694d9", + "parentId": "5fe49a0e2694b0755a50486c", + "slotId": "mod_stock" + }, { + "_id": "5fe49a0e2694b0755a50486b", + "_tpl": "5bfebc320db8340019668d79", + "parentId": "5fe49a0e2694b0755a50486c", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a504875", + "_tpl": "5c488a752e221602b412af63", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 27 + }, + "parentId": "5fe49a0e2694b0755a504876", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49a0e2694b0755a50486d", + "_tpl": "5c48a2c22e221602b313fb6c", + "parentId": "5fe49a0e2694b0755a504875", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49a0e2694b0755a50486f", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe49a0e2694b0755a504875", + "slotId": "mod_magazine" + }, { + "_id": "5fe49a0e2694b0755a50486e", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49a0e2694b0755a50486f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49a0e2694b0755a504871", + "_tpl": "5c48a14f2e2216152006edd7", + "parentId": "5fe49a0e2694b0755a504875", + "slotId": "mod_handguard" + }, { + "_id": "5fe49a0e2694b0755a504870", + "_tpl": "5c18b90d2e2216152142466b", + "parentId": "5fe49a0e2694b0755a504871", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504873", + "_tpl": "5c48a2852e221602b21d5923", + "parentId": "5fe49a0e2694b0755a504875", + "slotId": "mod_barrel" + }, { + "_id": "5fe49a0e2694b0755a504872", + "_tpl": "5c48a2a42e221602b66d1e07", + "parentId": "5fe49a0e2694b0755a504873", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49a0e2694b0755a504874", + "_tpl": "5c18b9192e2216398b5a8104", + "parentId": "5fe49a0e2694b0755a504875", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49a0e2694b0755a504878", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49a0e2694b0755a504877", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + } + ], + "questRaidItems": "5fe49a0e2694b0755a504877", + "questStashItems": "5fe49a0e2694b0755a504878", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49a0e2694b0755a504876" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "1ae4bba45f10fc2012f3a5b1", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "04f8a1021e1cef21b5347758", - "slotId": "mod_magazine" - }, - { - "_id": "5dbe4c5e5b4795f82ed6144a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "1ae4bba45f10fc2012f3a5b1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "ca2a633299f9f33af985b298", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "04f8a1021e1cef21b5347758", - "slotId": "mod_pistol_grip" - }, - { - "_id": "b81104333cd5e913c1abd001", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Notes": { + "Notes": [] }, - "Foldable": { - "Folded": false + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "caae6d1eec454357902beeba", - "_tpl": "5998517986f7746017232f7e", - "parentId": "b81104333cd5e913c1abd001", - "slotId": "mod_pistol_grip" - }, - { - "_id": "d1904664ab60713b9fd815be", - "_tpl": "599851db86f77467372f0a18", - "parentId": "b81104333cd5e913c1abd001", - "slotId": "mod_stock" - }, - { - "_id": "9dad59f2a5e9ff7e955c5a56", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "b81104333cd5e913c1abd001", - "slotId": "mod_magazine" - }, - { - "_id": "0a21f9564f0c58050b5dd2d2", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "9dad59f2a5e9ff7e955c5a56", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "ae896c83b9422ef05d676b06", - "_tpl": "5998597786f77414ea6da093", - "parentId": "b81104333cd5e913c1abd001", - "slotId": "mod_muzzle" - }, - { - "_id": "fc407b8aa1339bba319c2ef6", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "b81104333cd5e913c1abd001", - "slotId": "mod_reciever" - }, - { - "_id": "6a7502a02962e7c027c15a63", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "b81104333cd5e913c1abd001", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "67fe260376be3f6cb6ded9cf", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "b81104333cd5e913c1abd001", - "slotId": "mod_gas_block" - }, - { - "_id": "f19cdda8faee5021d4a08f81", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "67fe260376be3f6cb6ded9cf", - "slotId": "mod_handguard" - }, - { - "_id": "88d67c13e89abba40c550ef1", - "_tpl": "5ac4cd105acfc40016339859", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 16 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 }, - "Foldable": { - "Folded": false + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": { + "Items": [] + }, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "ec876c03e80b8c3c46e59399", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "88d67c13e89abba40c550ef1", - "slotId": "mod_gas_block" - }, - { - "_id": "da186a0d6c299a65a317ed61", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "ec876c03e80b8c3c46e59399", - "slotId": "mod_handguard" - }, - { - "_id": "cfacc8f134240e1223fcb615", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "88d67c13e89abba40c550ef1", - "slotId": "mod_muzzle" - }, - { - "_id": "cc181f04ada4abe087e17234", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "88d67c13e89abba40c550ef1", - "slotId": "mod_pistol_grip" - }, - { - "_id": "d8c5662e3f953c5e4c9f4613", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "88d67c13e89abba40c550ef1", - "slotId": "mod_reciever" - }, - { - "_id": "ad816afec6245fb529b58600", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "88d67c13e89abba40c550ef1", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "fec1cfe279af3d3258bd0c90", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "88d67c13e89abba40c550ef1", - "slotId": "mod_stock" - }, - { - "_id": "a4e24ac95eb0f569a1866bf3", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "88d67c13e89abba40c550ef1", - "slotId": "mod_magazine" - }, - { - "_id": "2d1395cba72107e1c9162cf3", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "a4e24ac95eb0f569a1866bf3", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "1c25a131cbb81b7961ef203b", - "_tpl": "5e870397991fd70db46995c8", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 18 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5df1457876ccab711e118c24", - "_tpl": "5e87071478f43e51ca2de5e1", - "parentId": "1c25a131cbb81b7961ef203b", - "slotId": "mod_barrel" - }, - { - "_id": "c0ca8f4dea05e26d4e806a4c", - "_tpl": "5e8708d4ae379e67d22e0102", - "parentId": "5df1457876ccab711e118c24", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "6919532db9870495a2a7a7c8", - "_tpl": "5e87076ce2db31558c75a11d", - "parentId": "1c25a131cbb81b7961ef203b", - "slotId": "mod_handguard" - }, - { - "_id": "90e4e6856f705bedd86f56c2", - "_tpl": "5e87080c81c4ed43e83cefda", - "parentId": "1c25a131cbb81b7961ef203b", - "slotId": "mod_magazine" - }, - { - "_id": "d8f540e6cfb57e776d01e3ce", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "90e4e6856f705bedd86f56c2", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 8 - } - }, - { - "_id": "ce990869892535be8644a87d", - "_tpl": "5e87116b81c4ed43e83cefdd", - "parentId": "1c25a131cbb81b7961ef203b", - "slotId": "mod_stock" - }, - { - "_id": "65c7752f89afb6e9fc368d54", - "_tpl": "5e87114fe2db31558c75a120", - "parentId": "1c25a131cbb81b7961ef203b", - "slotId": "mod_mount", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "2fee9ee8b89eb2bc60279765", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "1c25a131cbb81b7961ef203b", - "slotId": "patron_in_weapon" - }, - { - "_id": "0263e3bc89cb651c5139987e", - "_tpl": "559ba5b34bdc2d1f1a8b4582", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 18 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout" - }, - { - "_id": "769a6f15a9b3c58ce40e75ac", - "_tpl": "5887431f2459777e1612938f", - "parentId": "0263e3bc89cb651c5139987e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "b2edecbf14e5350dfd6e6e5e", - "_tpl": "5beed0f50db834001c062b12", - "location": { - "isSearched": true, - "r": 1, - "x": 7, - "y": 25 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Foldable": { - "Folded": false - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "64ffc5ccbc2251b698f0fea2", - "_tpl": "5beec8ea0db834001a6f9dbf", - "parentId": "b2edecbf14e5350dfd6e6e5e", - "slotId": "mod_pistol_grip" - }, - { - "_id": "59a37d06c461cf976c402b80", - "_tpl": "5beec91a0db834001961942d", - "parentId": "b2edecbf14e5350dfd6e6e5e", - "slotId": "mod_reciever" - }, - { - "_id": "cedefb638120dc6d42fb662b", - "_tpl": "5beec9450db83400970084fd", - "parentId": "59a37d06c461cf976c402b80", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "15fc85f890517a4ef55164ea", - "_tpl": "5bf3f59f0db834001a6fa060", - "parentId": "cedefb638120dc6d42fb662b", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "169361f6c47d5b6a2a5b119a", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "b2edecbf14e5350dfd6e6e5e", - "slotId": "mod_magazine" - }, - { - "_id": "4062e1a8d731f8aae2570107", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "169361f6c47d5b6a2a5b119a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "d068c0da32fec4264ddefef9", - "_tpl": "5beec8b20db834001961942a", - "parentId": "b2edecbf14e5350dfd6e6e5e", - "slotId": "mod_stock_001" - }, - { - "_id": "48d82e5be78ae8d5937339a2", - "_tpl": "5beec8c20db834001d2c465c", - "parentId": "d068c0da32fec4264ddefef9", - "slotId": "mod_stock" - }, - { - "_id": "c441884a6e358fd88e34aa25", - "_tpl": "5beec3e30db8340019619424", - "parentId": "b2edecbf14e5350dfd6e6e5e", - "slotId": "mod_handguard" - }, - { - "_id": "185af9bc73a14483a29c9535", - "_tpl": "5beecbb80db834001d2c465e", - "parentId": "c441884a6e358fd88e34aa25", - "slotId": "mod_mount_000" - }, - { - "_id": "61e9f910940ae4f314cf7866", - "_tpl": "5beecbb80db834001d2c465e", - "parentId": "c441884a6e358fd88e34aa25", - "slotId": "mod_mount_001" - }, - { - "_id": "e871768761a4bfc081a9841e", - "_tpl": "5beec1bd0db834001e6006f3", - "parentId": "b2edecbf14e5350dfd6e6e5e", - "slotId": "mod_barrel" - }, - { - "_id": "e4bde4372417487034344d72", - "_tpl": "5beec3420db834001b095429", - "parentId": "e871768761a4bfc081a9841e", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49444ae6628187a2e78ba", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49444ae6628187a2e78b9", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - }, - { - "_id": "60c86df7ed1a4e3ce394a0f6", - "_tpl": "55801eed4bdc2d89578b4588", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 19 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - }, - "StackObjectsCount": 1 - } - }, - { - "_id": "645a3bf083b382035fcd50c3", - "_tpl": "56083eab4bdc2d26448b456a", - "parentId": "60c86df7ed1a4e3ce394a0f6", - "slotId": "mod_tactical", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "f230be53d0fb90f23ac0005e", - "_tpl": "560e620e4bdc2d724b8b456b", - "parentId": "60c86df7ed1a4e3ce394a0f6", - "slotId": "mod_muzzle", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "3da4a360d74f2f9628bc5dd2", - "_tpl": "61faa91878830f069b6b7967", - "parentId": "60c86df7ed1a4e3ce394a0f6", - "slotId": "mod_stock", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "969ff4763565268bc52e4d2e", - "_tpl": "56ea8222d2720b69698b4567", - "parentId": "3da4a360d74f2f9628bc5dd2", - "slotId": "mod_bipod", - "upd": { - "StackObjectsCount": 1 - } - } - ], - "questRaidItems": "5fe49444ae6628187a2e78b9", - "questStashItems": "5fe49444ae6628187a2e78ba", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49444ae6628187a2e78b8" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": { - "Items": [] - }, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cd946231388ce000d572fe3", - "5cd945d71388ce000a659dfb" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0.2, - "jaegerUnlocked": false - }, - "weaponbuilds": {} + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cde9ec17d6c8b04723cf479", + "5cde9e957d6c8b0474535da7" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0.2, + "jaegerUnlocked": false + }, + "weaponbuilds": {} + } }, - "usec": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c6", - "templateId": "5811ce772459770e9e5f9532", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cde95d97d6c8b647a3769b0", - "Feet": "5cde95ef7d6c8b04713c4f2d", - "Hands": "5cde95fa7d6c8b04737c2d13", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "544a11ac4bdc2d470e8b456a": false, - "544a5caa4bdc2d1a388b4568": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "54527a984bdc2d4e668b4567": false, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "55801eed4bdc2d89578b4588": true, - "55802d5f4bdc2dac148b458e": false, - "559ba5b34bdc2d1f1a8b4582": true, - "55d480c04bdc2d1d4e8b456a": false, - "55d4887d4bdc2d962f8b4570": false, - "55d7217a4bdc2d86028b456d": false, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "564ca99c4bdc2d16268b4589": false, - "567143bf4bdc2d1a0f8b4567": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59d3ad2720bdb418b4577": false, - "56dfef82d2720bbd668b4567": true, - "56dff3afd2720bba668b4567": false, - "56e294cdd2720b603a8b4575": false, - "56ea8222d2720b69698b4567": true, - "570fd6c2d2720bc6458b457f": false, - "5710c24ad2720bc3458b45a3": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "57cd379a24597778e7682ecf": false, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce772459770e9e5f9532": false, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "5894a05586f774094708ef75": false, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "590c5d4b86f774784e1b9c45": false, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": false, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": false, - "592c2d1a86f7746dbe2af32a": true, - "595cf16b86f77427440c32e2": true, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "59e770b986f7742cbd762754": false, - "5a0c27731526d80618476ac4": false, - "5aa2b87de5b5b00016327c25": false, - "5aa7cfc0e5b5b00015693143": false, - "5aafbde786f774389d0cbc0f": false, - "5ab8f39486f7745cd93a1cca": false, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac72e475acfc400180ae6fe": false, - "5ac7655e5acfc40016339a19": false, - "5af0454c86f7746bf20992e8": false, - "5b40e5e25acfc4001a599bea": false, - "5b432b965acfc47a8774094e": false, - "5b432d215acfc4771e1c6624": false, - "5bed625c0db834001c062946": false, - "5beec1bd0db834001e6006f3": false, - "5beec3420db834001b095429": false, - "5beec3e30db8340019619424": false, - "5beec8b20db834001961942a": false, - "5beec8c20db834001d2c465c": false, - "5beec8ea0db834001a6f9dbf": false, - "5beec91a0db834001961942d": false, - "5beec9450db83400970084fd": false, - "5beecbb80db834001d2c465e": false, - "5beed0f50db834001c062b12": false, - "5bf3f59f0db834001a6fa060": false, - "5bffdc370db834001d23eca8": false, - "5c0505e00db834001b735073": false, - "5c0e530286f7747fa1419862": false, - "5c0e53c886f7747fa54205c7": false, - "5c0e722886f7740458316a57": false, - "5c488a752e221602b412af63": false, - "5c48a14f2e2216152006edd7": false, - "5c48a2852e221602b21d5923": false, - "5c48a2a42e221602b66d1e07": false, - "5c48a2c22e221602b313fb6c": false, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": false, - "5d02778e86f774203e7dedbe": false, - "5d02797c86f774203f38e30a": false, - "5d0a29fed7ad1a002769ad08": false, - "5d0a3e8cd7ad1a6f6a3d35bd": false, - "5d1b36a186f7742523398433": false, - "5d1b371186f774253763a656": false, - "5d40407c86f774318526545a": false, - "5d5d85c586f774279a21cbdb": false, - "5d5d940f86f7742797262046": false, - "5d5e9c74a4b9364855191c40": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": false, - "5e870397991fd70db46995c8": false, - "5e87071478f43e51ca2de5e1": false, - "5e87076ce2db31558c75a11d": false, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": false, - "5e87114fe2db31558c75a120": false, - "5e87116b81c4ed43e83cefdd": false, - "5f4f9eb969cdc30ff33f09db": false, - "61faa91878830f069b6b7967": false, - "627a4e6b255f7527fb05a0f6": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608817166 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 4, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 24 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 25 - } - ], - "Improvement": {}, - "Production": {}, - "Seed": 111111111 - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "edge_of_darkness", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 2, - "NeedWipeOptions": [], - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Usec", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49a0e2694b0755a50476c", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49a0e2694b0755a50476c", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "5fe49a0e2694b0755a504755", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" + "Left Behind": { + "descriptionLocaleKey": "launcher-profile_leftbehind", + "bear": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504749", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe49a0e2694b0755a504755", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49a0e2694b0755a50474b", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe49a0e2694b0755a504755", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a50474a", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a50474b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a504751", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe49a0e2694b0755a504755", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49a0e2694b0755a50474e", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe49a0e2694b0755a504751", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a50474c", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe49a0e2694b0755a50474e", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a50474d", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe49a0e2694b0755a50474e", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe49a0e2694b0755a50474f", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe49a0e2694b0755a504751", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe49a0e2694b0755a50474f", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49a0e2694b0755a504750", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe49a0e2694b0755a504751", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504753", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe49a0e2694b0755a504755", - "slotId": "mod_stock" - }, - { - "_id": "5fe49a0e2694b0755a504752", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe49a0e2694b0755a504753", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe49a0e2694b0755a504754", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe49a0e2694b0755a504755", - "slotId": "mod_charge" - }, - { - "_id": "5fe49a0e2694b0755a504756", - "_tpl": "54491bb74bdc2d09088b4567", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 70, - "MaxDurability": 70 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504757", - "_tpl": "572b7fa524597762b747ce82", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "FaceCover", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504758", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504760", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "TacticalVest" - }, - { - "_id": "5fe49a0e2694b0755a50475a", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504760", - "slotId": "1" - }, - { - "_id": "5fe49a0e2694b0755a504759", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a50475a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a50475c", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504760", - "slotId": "2" - }, - { - "_id": "5fe49a0e2694b0755a50475b", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a50475c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a50475e", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504760", - "slotId": "3" - }, - { - "_id": "5fe49a0e2694b0755a50475d", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a50475e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a50475f", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504760", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504761", - "_tpl": "5857a8bc2459772bad15db29", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "SecuredContainer" - }, - { - "_id": "5fe49a0e2694b0755a504765", - "_tpl": "5e9dcf5986f7746c417435b3", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "Backpack" - }, - { - "_id": "5fe49a0e2694b0755a504762", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504765", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504763", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504765", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504764", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504765", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe49a0e2694b0755a504766", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50476a", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "Pockets" - }, - { - "_id": "5fe49a0e2694b0755a504767", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a50476a", - "slotId": "pocket1" - }, - { - "_id": "5fe49a0e2694b0755a504768", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a50476a", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504769", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a50476a", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50476b", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe49a0e2694b0755a50476c", - "slotId": "Earpiece" - }, - { - "_id": "5fe49a0e2694b0755a504876", - "_tpl": "5811ce772459770e9e5f9532" - }, - { - "_id": "5fe49a0e2694b0755a50476d", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 32 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50476e", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 9 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50476f", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504771", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504770", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a504771", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a504773", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 14 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504772", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a504773", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a504774", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 17 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe49a0e2694b0755a504775", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 1, - "x": 9, - "y": 31 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504776", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 31 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504777", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504779", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 15 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504778", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a504779", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a50477a", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a50477b", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 32 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50477d", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 14 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50477c", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a50477d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a50477e", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50477f", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 17 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe49a0e2694b0755a504780", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 32 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504781", - "_tpl": "5ab8f39486f7745cd93a1cca", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 25 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504782", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 14 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504783", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504785", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 20 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504784", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe49a0e2694b0755a504785", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe49a0e2694b0755a504786", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 11 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504787", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504788", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504789", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 32 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50478a", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50478b", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50478c", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 33 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50478d", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 31 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50478f", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50478e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a50478f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a504790", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 9 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504791", - "_tpl": "5d403f9186f7743cac3f229b", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504792", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504793", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504794", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 33 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504795", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504796", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504797", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504798", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 33 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504799", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50479b", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50479a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a50479b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a50479c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a50479d", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50479e", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 36 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50479f", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047a0", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 36 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047a1", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047a3", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047a2", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047a3", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047a5", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047a4", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047a5", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a5047a7", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047a6", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047a7", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047a9", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047a8", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047a9", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047ab", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047aa", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047ab", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047ac", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 36 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047ae", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 1, - "x": 3, - "y": 25 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047ad", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a5047ae", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a5047af", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b0", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b1", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b2", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b3", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b4", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b6", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047b5", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047b6", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b8", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047b7", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047b8", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047b9", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047ba", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047bb", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49a0e2694b0755a5047bc", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 31 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047bd", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 33 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047be", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe49a0e2694b0755a5047bf", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe49a0e2694b0755a5047c1", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 14 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047c0", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a5047c1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a5047c2", - "_tpl": "5e8488fa988a8701445df1e4", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 36 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 3 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047c3", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 2 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500 - } - }, - { - "_id": "5fe49a0e2694b0755a5047c5", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047c4", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047c5", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a5047c7", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047c6", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047c7", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047c9", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047c8", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047c9", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a5047cb", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047ca", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a5047cb", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a5047cc", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 16 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047cd", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 15 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047ce", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 26 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047cf", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 28 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047d0", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 26 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047d1", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 27 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047d2", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 17 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047d3", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 17 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047d4", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 17 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a5047d5", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047d6", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 31 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047d7", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047d8", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 32 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047d9", - "_tpl": "5c0e655586f774045612eeb2", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 17 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 85, - "MaxDurability": 85 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047da", - "_tpl": "5c165d832e2216398b5a7e36", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 21 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047db", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 33 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047dc", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 33 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047dd", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 33 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047de", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047df", - "_tpl": "5ab8f39486f7745cd93a1cca", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 25 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047e0", - "_tpl": "557ff21e4bdc2d89578b4586", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 22 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047e1", - "_tpl": "5bfebc5e0db834001a6694e5", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 19 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047e2", - "_tpl": "57c5ac0824597754771e88a9", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 16 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047e3", - "_tpl": "5aa7d03ae5b5b00016327db5", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 20 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 25, - "MaxDurability": 25 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047e4", - "_tpl": "5aa7d03ae5b5b00016327db5", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 20 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 25, - "MaxDurability": 25 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047e5", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047e6", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047e7", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 19 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047e8", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 19 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047e9", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 20 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047eb", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 24 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047ea", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a5047eb", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a5047ec", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 37 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047ed", - "_tpl": "5d1b36a186f7742523398433", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 37 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047ee", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047ef", - "_tpl": "557ff21e4bdc2d89578b4586", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 23 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047f0", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 29 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047f1", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 32 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047f2", - "_tpl": "5d5d940f86f7742797262046", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 27 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047f3", - "_tpl": "57cd379a24597778e7682ecf", - "location": { - "isSearched": true, - "r": 1, - "x": 0, - "y": 26 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047f4", - "_tpl": "544a5caa4bdc2d1a388b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 22 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 70, - "MaxDurability": 70 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047f5", - "_tpl": "5d5d85c586f774279a21cbdb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 22 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047f6", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 36 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047f7", - "_tpl": "570fd6c2d2720bc6458b457f", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 26 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047f8", - "_tpl": "5448be9a4bdc2dfd2f8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 20 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047f9", - "_tpl": "5448be9a4bdc2dfd2f8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 21 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047fa", - "_tpl": "590c657e86f77412b013051d", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 37 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 1800 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047fb", - "_tpl": "5d5e9c74a4b9364855191c40", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 17 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 27, - "MaxDurability": 27 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047fd", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 1, - "x": 3, - "y": 26 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a5047fc", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a5047fd", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a5047fe", - "_tpl": "590c678286f77426c9660122", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 300 - } - } - }, - { - "_id": "5fe49a0e2694b0755a5047ff", - "_tpl": "590c678286f77426c9660122", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 300 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504800", - "_tpl": "590c678286f77426c9660122", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 300 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504802", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 24 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504801", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a504802", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a504803", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 29 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504804", - "_tpl": "5e8488fa988a8701445df1e4", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 36 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 3 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504805", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 26 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe49a0e2694b0755a504806", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 26 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a504807", - "_tpl": "5c0e530286f7747fa1419862", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504808", - "_tpl": "5c0e530286f7747fa1419862", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504809", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 25 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a50480a", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500 - } - }, - { - "_id": "5fe49a0e2694b0755a50480c", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 19 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50480b", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe49a0e2694b0755a50480c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe49a0e2694b0755a50480e", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 19 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50480d", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe49a0e2694b0755a50480e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe49a0e2694b0755a504810", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 20 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50480f", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe49a0e2694b0755a504810", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe49a0e2694b0755a504811", - "_tpl": "58dd3ad986f77403051cba8f", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 19 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a504812", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 29 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504813", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 34 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504815", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504814", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a504815", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a504817", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504816", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a504817", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a504819", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504818", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a504819", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a50481a", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 30 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50481b", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 30 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50481c", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 38 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50481d", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 37 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50481e", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 39 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50481f", - "_tpl": "58dd3ad986f77403051cba8f", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 16 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a504820", - "_tpl": "5448be9a4bdc2dfd2f8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 21 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504821", - "_tpl": "5645bcc04bdc2d363b8b4572", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 23 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a504822", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 29 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504823", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 29 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504824", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 35 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout" - }, - { - "_id": "5fe49a0e2694b0755a50482d", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Customization": { + "Body": "5cc0858d14c02e000c6bea66", + "Feet": "5cc085bb14c02e000e67a5c5", + "Hands": "5cc0876314c02e000c6bea6b", + "Head": "__REPLACEME__" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504826", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe49a0e2694b0755a50482d", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a504825", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe49a0e2694b0755a504826", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a504827", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe49a0e2694b0755a50482d", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49a0e2694b0755a50482a", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe49a0e2694b0755a50482d", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49a0e2694b0755a504828", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe49a0e2694b0755a50482a", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504829", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe49a0e2694b0755a50482a", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50482c", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe49a0e2694b0755a50482d", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a50482b", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a50482c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a504836", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Encyclopedia": { + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "54491bb74bdc2d09088b4567": false, + "544a11ac4bdc2d470e8b456a": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": false, + "544fb45d4bdc2dee738b4568": true, + "557ffd194bdc2d28148b457f": false, + "55d480c04bdc2d1d4e8b456a": false, + "55d482194bdc2d1d4e8b456b": true, + "55d7217a4bdc2d86028b456d": false, + "560d5e524bdc2d25448b4571": false, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "564ca99c4bdc2d16268b4589": false, + "5696686a4bdc2da3298b456a": false, + "56d59d3ad2720bdb418b4577": false, + "56dfef82d2720bbd668b4567": true, + "56dff3afd2720bba668b4567": false, + "5710c24ad2720bc3458b45a3": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce572459770cba1a34ea": false, + "58864a4f2459770fcc257101": true, + "590c5d4b86f774784e1b9c45": false, + "590c661e86f7741e566b646a": false, + "590c695186f7741e566b64a2": false, + "59984ab886f7743e98271174": false, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a8086f77414ec448d1a": false, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": false, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": false, + "59d36a0086f7747e673f3946": true, + "5a0c27731526d80618476ac4": false, + "5aa2b87de5b5b00016327c25": false, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac72e475acfc400180ae6fe": false, + "5ac7655e5acfc40016339a19": false, + "5b40e5e25acfc4001a599bea": false, + "5b432b965acfc47a8774094e": false, + "5bffdc370db834001d23eca8": false, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": false, + "5d02778e86f774203e7dedbe": false, + "5d1b371186f774253763a656": false, + "5d40407c86f774318526545a": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e870397991fd70db46995c8": false, + "5e87071478f43e51ca2de5e1": false, + "5e87076ce2db31558c75a11d": false, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": false, + "5e87114fe2db31558c75a120": false, + "5e87116b81c4ed43e83cefdd": false }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50482f", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe49a0e2694b0755a504836", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a50482e", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe49a0e2694b0755a50482f", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a504830", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe49a0e2694b0755a504836", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49a0e2694b0755a504833", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe49a0e2694b0755a504836", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49a0e2694b0755a504831", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe49a0e2694b0755a504833", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504832", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe49a0e2694b0755a504833", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504835", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe49a0e2694b0755a504836", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a504834", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a504835", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a504843", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 14 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608821034 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504837", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe49a0e2694b0755a504843", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49a0e2694b0755a504839", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe49a0e2694b0755a504843", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a504838", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a504839", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a50483f", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe49a0e2694b0755a504843", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49a0e2694b0755a50483c", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe49a0e2694b0755a50483f", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a50483a", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe49a0e2694b0755a50483c", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a50483b", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe49a0e2694b0755a50483c", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe49a0e2694b0755a50483d", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe49a0e2694b0755a50483f", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe49a0e2694b0755a50483d", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49a0e2694b0755a50483e", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe49a0e2694b0755a50483f", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504841", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe49a0e2694b0755a504843", - "slotId": "mod_stock" - }, - { - "_id": "5fe49a0e2694b0755a504840", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe49a0e2694b0755a504841", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe49a0e2694b0755a504842", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe49a0e2694b0755a504843", - "slotId": "mod_charge" - }, - { - "_id": "5fe49a0e2694b0755a50484c", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 2, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504845", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe49a0e2694b0755a50484c", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a504844", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a504845", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a50484a", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe49a0e2694b0755a50484c", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49a0e2694b0755a504846", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe49a0e2694b0755a50484a", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49a0e2694b0755a504847", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe49a0e2694b0755a50484a", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504848", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe49a0e2694b0755a50484a", - "slotId": "mod_stock" - }, - { - "_id": "5fe49a0e2694b0755a504849", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe49a0e2694b0755a50484a", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a50484b", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe49a0e2694b0755a50484c", - "slotId": "mod_charge" - }, - { - "_id": "5fe49a0e2694b0755a504855", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "left_behind", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Bear", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50484e", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe49a0e2694b0755a504855", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a50484d", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a50484e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49a0e2694b0755a504853", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe49a0e2694b0755a504855", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49a0e2694b0755a50484f", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe49a0e2694b0755a504853", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49a0e2694b0755a504850", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe49a0e2694b0755a504853", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504851", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe49a0e2694b0755a504853", - "slotId": "mod_stock" - }, - { - "_id": "5fe49a0e2694b0755a504852", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe49a0e2694b0755a504853", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a504854", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe49a0e2694b0755a504855", - "slotId": "mod_charge" - }, - { - "_id": "5fe49a0e2694b0755a50485e", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "InsuredItems": [], + "Inventory": { + "equipment": "5fe4a9285a72d07b66302933", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe4a9285a72d07b66302933", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "5fe4a9285a72d07b6630291c", + "_tpl": "5ac4cd105acfc40016339859", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b66302914", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "5fe4a9285a72d07b6630291c", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a9285a72d07b66302913", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a9285a72d07b66302914", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9285a72d07b66302915", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "5fe4a9285a72d07b6630291c", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9285a72d07b66302916", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "5fe4a9285a72d07b6630291c", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9285a72d07b66302917", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "5fe4a9285a72d07b6630291c", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9285a72d07b66302918", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "5fe4a9285a72d07b6630291c", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b66302919", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "5fe4a9285a72d07b6630291c", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9285a72d07b6630291b", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "5fe4a9285a72d07b6630291c", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b6630291a", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "5fe4a9285a72d07b6630291b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b6630291d", + "_tpl": "5bffdc370db834001d23eca8", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 80, + "MaxDurability": 80 + } + } + }, { + "_id": "5fe4a9285a72d07b6630291e", + "_tpl": "5b40e5e25acfc4001a599bea", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a9285a72d07b66302926", + "_tpl": "5ca20abf86f77418567a43f2", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "TacticalVest" + }, { + "_id": "5fe4a9285a72d07b66302920", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b66302926", + "slotId": "1" + }, { + "_id": "5fe4a9285a72d07b6630291f", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a9285a72d07b66302920", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302922", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b66302926", + "slotId": "2" + }, { + "_id": "5fe4a9285a72d07b66302921", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a9285a72d07b66302922", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302924", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b66302926", + "slotId": "3" + }, { + "_id": "5fe4a9285a72d07b66302923", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a9285a72d07b66302924", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302925", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b66302926", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b66302927", + "_tpl": "544a11ac4bdc2d470e8b456a", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "SecuredContainer" + }, { + "_id": "5fe4a9285a72d07b6630292c", + "_tpl": "5ca20d5986f774331e7c9602", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "Backpack" + }, { + "_id": "5fe4a9285a72d07b66302928", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b6630292c", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4a9285a72d07b66302929", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 1 + }, + "parentId": "5fe4a9285a72d07b6630292c", + "slotId": "main", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b6630292a", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b6630292c", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9285a72d07b6630292b", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b6630292c", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b6630292d", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a9285a72d07b66302931", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "Pockets" + }, { + "_id": "5fe4a9285a72d07b6630292e", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b66302931", + "slotId": "pocket1" + }, { + "_id": "5fe4a9285a72d07b6630292f", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b66302931", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9285a72d07b66302930", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b66302931", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a9285a72d07b66302932", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe4a9285a72d07b66302933", + "slotId": "Earpiece" + }, { + "_id": "5fe4a9285a72d07b663029e2", + "_tpl": "5811ce572459770cba1a34ea" + }, { + "_id": "5fe4a9285a72d07b66302934", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b66302935", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a9285a72d07b66302936", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302937", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 9 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302938", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302939", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 150 + } + }, { + "_id": "5fe4a9285a72d07b6630293a", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630293b", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630293c", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b6630293d", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b6630293e", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9285a72d07b6630293f", + "_tpl": "5d40407c86f774318526545a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b66302940", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4a9285a72d07b66302942", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302941", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b66302942", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302943", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a9285a72d07b66302944", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a9285a72d07b66302945", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a9285a72d07b66302946", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 11 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302947", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9285a72d07b66302949", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302948", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b66302949", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b6630294b", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630294a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630294b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b6630294d", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630294c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630294d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b6630294f", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630294e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630294f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b66302950", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b66302951", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b66302952", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9285a72d07b66302953", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9285a72d07b66302954", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b66302955", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b66302956", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b66302958", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302957", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b66302958", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b6630295a", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302959", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630295a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b6630295c", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630295b", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630295c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b6630295e", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630295d", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630295e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302960", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630295f", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b66302960", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302961", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 11 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302962", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 11 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302963", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 17 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302964", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4a9285a72d07b66302965", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4a9285a72d07b66302966", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 20 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4a9285a72d07b66302967", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 23 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5fe4a9285a72d07b66302968", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 18 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302969", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630296a", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 15 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630296b", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 15 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630296c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b6630296d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b6630296f", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 16 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630296e", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a9285a72d07b6630296f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302971", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 16 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302970", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a9285a72d07b66302971", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302973", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 16 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302972", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a9285a72d07b66302973", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302974", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 18 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302975", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 16 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302977", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 16 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302976", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a9285a72d07b66302977", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b66302978", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b66302979", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b6630297a", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9285a72d07b6630297b", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9285a72d07b6630297c", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9285a72d07b6630297d", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 20 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b6630297e", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b6630297f", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 20 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b66302980", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9285a72d07b66302981", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302982", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302983", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302984", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302985", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b66302986", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302987", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 23 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "5fe4a9285a72d07b66302988", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302989", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630298a", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b6630298c", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630298b", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630298c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b6630298e", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b6630298d", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b6630298e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b6630298f", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 18 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9285a72d07b66302990", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302991", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 14 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302992", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 19 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9285a72d07b66302993", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4a9285a72d07b66302994", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 1, + "x": 2, + "y": 23 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe4a9285a72d07b66302995", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 21 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302996", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 23 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302997", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 23 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b66302998", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9285a72d07b66302999", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a9285a72d07b6630299a", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 22 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a9285a72d07b6630299b", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 2 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 200 + } + }, { + "_id": "5fe4a9285a72d07b6630299c", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 150 + } + }, { + "_id": "5fe4a9285a72d07b6630299d", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 18 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9285a72d07b6630299e", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 18 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9285a72d07b6630299f", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9285a72d07b663029a0", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 10 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b663029a2", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b663029a1", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029a2", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b663029a3", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 24 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029a4", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 24 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029a5", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 25 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029a6", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 25 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029a8", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b663029a7", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029a8", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b663029aa", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout" + }, { + "_id": "5fe4a9285a72d07b663029a9", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029aa", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b663029ab", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b663029ac", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 9 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b663029ad", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b663029ae", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a9285a72d07b663029b2", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b663029b0", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4a9285a72d07b663029b2", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b663029af", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029b0", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b663029b1", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4a9285a72d07b663029b2", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9285a72d07b663029bc", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b663029b3", + "_tpl": "5998517986f7746017232f7e", + "parentId": "5fe4a9285a72d07b663029bc", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9285a72d07b663029b4", + "_tpl": "599851db86f77467372f0a18", + "parentId": "5fe4a9285a72d07b663029bc", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9285a72d07b663029b6", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "5fe4a9285a72d07b663029bc", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b663029b5", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029b6", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b663029b7", + "_tpl": "5998597786f77414ea6da093", + "parentId": "5fe4a9285a72d07b663029bc", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9285a72d07b663029b8", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "5fe4a9285a72d07b663029bc", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9285a72d07b663029b9", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "5fe4a9285a72d07b663029bc", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029bb", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "5fe4a9285a72d07b663029bc", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a9285a72d07b663029ba", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a9285a72d07b663029bb", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9285a72d07b663029c0", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b663029be", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4a9285a72d07b663029c0", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b663029bd", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029be", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b663029bf", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4a9285a72d07b663029c0", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9285a72d07b663029c4", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b663029c2", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4a9285a72d07b663029c4", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b663029c1", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029c2", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a9285a72d07b663029c3", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4a9285a72d07b663029c4", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9285a72d07b663029ce", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b663029c5", + "_tpl": "5998517986f7746017232f7e", + "parentId": "5fe4a9285a72d07b663029ce", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9285a72d07b663029c6", + "_tpl": "599851db86f77467372f0a18", + "parentId": "5fe4a9285a72d07b663029ce", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9285a72d07b663029c8", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "5fe4a9285a72d07b663029ce", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b663029c7", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9285a72d07b663029c8", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b663029c9", + "_tpl": "5998597786f77414ea6da093", + "parentId": "5fe4a9285a72d07b663029ce", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9285a72d07b663029ca", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "5fe4a9285a72d07b663029ce", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9285a72d07b663029cb", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "5fe4a9285a72d07b663029ce", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029cd", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "5fe4a9285a72d07b663029ce", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a9285a72d07b663029cc", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a9285a72d07b663029cd", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9285a72d07b663029d8", + "_tpl": "5ac4cd105acfc40016339859", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 16 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b663029d0", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "5fe4a9285a72d07b663029d8", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a9285a72d07b663029cf", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a9285a72d07b663029d0", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9285a72d07b663029d1", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "5fe4a9285a72d07b663029d8", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9285a72d07b663029d2", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "5fe4a9285a72d07b663029d8", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9285a72d07b663029d3", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "5fe4a9285a72d07b663029d8", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9285a72d07b663029d4", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "5fe4a9285a72d07b663029d8", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029d5", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "5fe4a9285a72d07b663029d8", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9285a72d07b663029d7", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "5fe4a9285a72d07b663029d8", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b663029d6", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "5fe4a9285a72d07b663029d7", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9285a72d07b663029e1", + "_tpl": "5e870397991fd70db46995c8", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 18 + }, + "parentId": "5fe4a9285a72d07b663029e2", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9285a72d07b663029da", + "_tpl": "5e87071478f43e51ca2de5e1", + "parentId": "5fe4a9285a72d07b663029e1", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a9285a72d07b663029d9", + "_tpl": "5e8708d4ae379e67d22e0102", + "parentId": "5fe4a9285a72d07b663029da", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029db", + "_tpl": "5e87076ce2db31558c75a11d", + "parentId": "5fe4a9285a72d07b663029e1", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9285a72d07b663029dd", + "_tpl": "5e87080c81c4ed43e83cefda", + "parentId": "5fe4a9285a72d07b663029e1", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9285a72d07b663029dc", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4a9285a72d07b663029dd", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 8 + } + }, { + "_id": "5fe4a9285a72d07b663029de", + "_tpl": "5e87116b81c4ed43e83cefdd", + "parentId": "5fe4a9285a72d07b663029e1", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9285a72d07b663029df", + "_tpl": "5e87114fe2db31558c75a120", + "parentId": "5fe4a9285a72d07b663029e1", + "slotId": "mod_mount", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9285a72d07b663029e0", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4a9285a72d07b663029e1", + "slotId": "patron_in_weapon" + }, { + "_id": "5fe4a9285a72d07b663029e4", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe4a9285a72d07b663029e3", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + } + ], + "questRaidItems": "5fe4a9285a72d07b663029e3", + "questStashItems": "5fe4a9285a72d07b663029e4", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe4a9285a72d07b663029e2" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504857", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe49a0e2694b0755a50485e", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a504856", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe49a0e2694b0755a504857", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a504858", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe49a0e2694b0755a50485e", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49a0e2694b0755a50485b", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe49a0e2694b0755a50485e", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49a0e2694b0755a504859", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe49a0e2694b0755a50485b", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50485a", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe49a0e2694b0755a50485b", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a50485d", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe49a0e2694b0755a50485e", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a50485c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49a0e2694b0755a50485d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49a0e2694b0755a504867", - "_tpl": "5e870397991fd70db46995c8", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 16 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Notes": { + "Notes": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504860", - "_tpl": "5e87071478f43e51ca2de5e1", - "parentId": "5fe49a0e2694b0755a504867", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a50485f", - "_tpl": "5e8708d4ae379e67d22e0102", - "parentId": "5fe49a0e2694b0755a504860", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504861", - "_tpl": "5e87076ce2db31558c75a11d", - "parentId": "5fe49a0e2694b0755a504867", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49a0e2694b0755a504863", - "_tpl": "5e87080c81c4ed43e83cefda", - "parentId": "5fe49a0e2694b0755a504867", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a504862", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe49a0e2694b0755a504863", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 8 - } - }, - { - "_id": "5fe49a0e2694b0755a504864", - "_tpl": "5e87116b81c4ed43e83cefdd", - "parentId": "5fe49a0e2694b0755a504867", - "slotId": "mod_stock" - }, - { - "_id": "5fe49a0e2694b0755a504865", - "_tpl": "5e87114fe2db31558c75a120", - "parentId": "5fe49a0e2694b0755a504867", - "slotId": "mod_mount", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504866", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe49a0e2694b0755a504867", - "slotId": "patron_in_weapon" - }, - { - "_id": "5fe49a0e2694b0755a50486c", - "_tpl": "5bfea6e90db834001b7347f3", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 18 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504869", - "_tpl": "5bfeaa0f0db834001b734927", - "parentId": "5fe49a0e2694b0755a50486c", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a504868", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe49a0e2694b0755a504869", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe49a0e2694b0755a50486a", - "_tpl": "5bfeb32b0db834001a6694d9", - "parentId": "5fe49a0e2694b0755a50486c", - "slotId": "mod_stock" - }, - { - "_id": "5fe49a0e2694b0755a50486b", - "_tpl": "5bfebc320db8340019668d79", - "parentId": "5fe49a0e2694b0755a50486c", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a504875", - "_tpl": "5c488a752e221602b412af63", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 27 - }, - "parentId": "5fe49a0e2694b0755a504876", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" }, - { - "_id": "5fe49a0e2694b0755a50486d", - "_tpl": "5c48a2c22e221602b313fb6c", - "parentId": "5fe49a0e2694b0755a504875", - "slotId": "mod_pistol_grip" + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cd946231388ce000d572fe3", + "5cd945d71388ce000a659dfb" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0, + "jaegerUnlocked": false }, - { - "_id": "5fe49a0e2694b0755a50486f", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe49a0e2694b0755a504875", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49a0e2694b0755a50486e", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49a0e2694b0755a50486f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49a0e2694b0755a504871", - "_tpl": "5c48a14f2e2216152006edd7", - "parentId": "5fe49a0e2694b0755a504875", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49a0e2694b0755a504870", - "_tpl": "5c18b90d2e2216152142466b", - "parentId": "5fe49a0e2694b0755a504871", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504873", - "_tpl": "5c48a2852e221602b21d5923", - "parentId": "5fe49a0e2694b0755a504875", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49a0e2694b0755a504872", - "_tpl": "5c48a2a42e221602b66d1e07", - "parentId": "5fe49a0e2694b0755a504873", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49a0e2694b0755a504874", - "_tpl": "5c18b9192e2216398b5a8104", - "parentId": "5fe49a0e2694b0755a504875", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49a0e2694b0755a504878", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49a0e2694b0755a504877", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - } - ], - "questRaidItems": "5fe49a0e2694b0755a504877", - "questStashItems": "5fe49a0e2694b0755a504878", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49a0e2694b0755a504876" + "weaponbuilds": {} }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": { - "Items": [] - }, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cde9ec17d6c8b04723cf479", - "5cde9e957d6c8b0474535da7" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0.2, - "jaegerUnlocked": false - }, - "weaponbuilds": {} - } - }, - "Left Behind": { - "bear": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cc0858d14c02e000c6bea66", - "Feet": "5cc085bb14c02e000e67a5c5", - "Hands": "5cc0876314c02e000c6bea6b", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "54491bb74bdc2d09088b4567": false, - "544a11ac4bdc2d470e8b456a": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": false, - "544fb45d4bdc2dee738b4568": true, - "557ffd194bdc2d28148b457f": false, - "55d480c04bdc2d1d4e8b456a": false, - "55d482194bdc2d1d4e8b456b": true, - "55d7217a4bdc2d86028b456d": false, - "560d5e524bdc2d25448b4571": false, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "564ca99c4bdc2d16268b4589": false, - "5696686a4bdc2da3298b456a": false, - "56d59d3ad2720bdb418b4577": false, - "56dfef82d2720bbd668b4567": true, - "56dff3afd2720bba668b4567": false, - "5710c24ad2720bc3458b45a3": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce572459770cba1a34ea": false, - "58864a4f2459770fcc257101": true, - "590c5d4b86f774784e1b9c45": false, - "590c661e86f7741e566b646a": false, - "590c695186f7741e566b64a2": false, - "59984ab886f7743e98271174": false, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a8086f77414ec448d1a": false, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": false, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": false, - "59d36a0086f7747e673f3946": true, - "5a0c27731526d80618476ac4": false, - "5aa2b87de5b5b00016327c25": false, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac72e475acfc400180ae6fe": false, - "5ac7655e5acfc40016339a19": false, - "5b40e5e25acfc4001a599bea": false, - "5b432b965acfc47a8774094e": false, - "5bffdc370db834001d23eca8": false, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": false, - "5d02778e86f774203e7dedbe": false, - "5d1b371186f774253763a656": false, - "5d40407c86f774318526545a": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e870397991fd70db46995c8": false, - "5e87071478f43e51ca2de5e1": false, - "5e87076ce2db31558c75a11d": false, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": false, - "5e87114fe2db31558c75a120": false, - "5e87116b81c4ed43e83cefdd": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608821034 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 2, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "left_behind", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Bear", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe4a9285a72d07b66302933", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe4a9285a72d07b66302933", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "5fe4a9285a72d07b6630291c", - "_tpl": "5ac4cd105acfc40016339859", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" + "usec": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] }, - "Foldable": { - "Folded": false + "Customization": { + "Body": "5cde95d97d6c8b647a3769b0", + "Feet": "5cde95ef7d6c8b04713c4f2d", + "Hands": "5cde95fa7d6c8b04737c2d13", + "Head": "__REPLACEME__" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302914", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "5fe4a9285a72d07b6630291c", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a9285a72d07b66302913", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a9285a72d07b66302914", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9285a72d07b66302915", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "5fe4a9285a72d07b6630291c", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9285a72d07b66302916", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "5fe4a9285a72d07b6630291c", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9285a72d07b66302917", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "5fe4a9285a72d07b6630291c", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9285a72d07b66302918", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "5fe4a9285a72d07b6630291c", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302919", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "5fe4a9285a72d07b6630291c", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9285a72d07b6630291b", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "5fe4a9285a72d07b6630291c", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b6630291a", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "5fe4a9285a72d07b6630291b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b6630291d", - "_tpl": "5bffdc370db834001d23eca8", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 80, - "MaxDurability": 80 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630291e", - "_tpl": "5b40e5e25acfc4001a599bea", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302926", - "_tpl": "5ca20abf86f77418567a43f2", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "TacticalVest" - }, - { - "_id": "5fe4a9285a72d07b66302920", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b66302926", - "slotId": "1" - }, - { - "_id": "5fe4a9285a72d07b6630291f", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a9285a72d07b66302920", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302922", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b66302926", - "slotId": "2" - }, - { - "_id": "5fe4a9285a72d07b66302921", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a9285a72d07b66302922", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302924", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b66302926", - "slotId": "3" - }, - { - "_id": "5fe4a9285a72d07b66302923", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a9285a72d07b66302924", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302925", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b66302926", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302927", - "_tpl": "544a11ac4bdc2d470e8b456a", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "SecuredContainer" - }, - { - "_id": "5fe4a9285a72d07b6630292c", - "_tpl": "5ca20d5986f774331e7c9602", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "Backpack" - }, - { - "_id": "5fe4a9285a72d07b66302928", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b6630292c", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4a9285a72d07b66302929", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 1 - }, - "parentId": "5fe4a9285a72d07b6630292c", - "slotId": "main", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b6630292a", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b6630292c", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630292b", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b6630292c", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630292d", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302931", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "Pockets" - }, - { - "_id": "5fe4a9285a72d07b6630292e", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b66302931", - "slotId": "pocket1" - }, - { - "_id": "5fe4a9285a72d07b6630292f", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b66302931", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302930", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b66302931", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302932", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe4a9285a72d07b66302933", - "slotId": "Earpiece" - }, - { - "_id": "5fe4a9285a72d07b663029e2", - "_tpl": "5811ce572459770cba1a34ea" - }, - { - "_id": "5fe4a9285a72d07b66302934", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302935", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302936", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302937", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 9 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302938", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302939", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 150 - } - }, - { - "_id": "5fe4a9285a72d07b6630293a", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630293b", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630293c", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630293d", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630293e", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630293f", - "_tpl": "5d40407c86f774318526545a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302940", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4a9285a72d07b66302942", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302941", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b66302942", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302943", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302944", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302945", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302946", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 11 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302947", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9285a72d07b66302949", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302948", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b66302949", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b6630294b", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630294a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630294b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b6630294d", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630294c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630294d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b6630294f", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630294e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630294f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b66302950", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b66302951", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b66302952", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9285a72d07b66302953", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9285a72d07b66302954", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b66302955", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b66302956", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b66302958", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302957", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b66302958", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b6630295a", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302959", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630295a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b6630295c", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630295b", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630295c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b6630295e", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630295d", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630295e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302960", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630295f", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b66302960", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302961", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 11 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302962", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 11 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302963", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 17 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302964", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302965", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4a9285a72d07b66302966", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 20 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302967", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 23 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302968", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 18 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302969", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630296a", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 15 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630296b", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 15 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630296c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b6630296d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b6630296f", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 16 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630296e", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a9285a72d07b6630296f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302971", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 16 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302970", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a9285a72d07b66302971", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302973", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 16 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302972", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a9285a72d07b66302973", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302974", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 18 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302975", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 16 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302977", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 16 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302976", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a9285a72d07b66302977", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b66302978", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302979", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630297a", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630297b", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630297c", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630297d", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 20 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630297e", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630297f", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 20 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302980", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302981", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302982", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302983", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302984", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302985", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302986", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302987", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 23 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302988", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302989", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630298a", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630298c", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630298b", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630298c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b6630298e", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b6630298d", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b6630298e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b6630298f", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 18 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9285a72d07b66302990", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302991", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 14 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302992", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 19 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302993", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302994", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 1, - "x": 2, - "y": 23 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302995", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 21 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302996", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 23 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302997", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 23 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b66302998", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9285a72d07b66302999", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630299a", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 22 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a9285a72d07b6630299b", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 2 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 200 - } - }, - { - "_id": "5fe4a9285a72d07b6630299c", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 150 - } - }, - { - "_id": "5fe4a9285a72d07b6630299d", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 18 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9285a72d07b6630299e", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 18 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9285a72d07b6630299f", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9285a72d07b663029a0", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 10 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b663029a2", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b663029a1", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029a2", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b663029a3", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 24 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029a4", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 24 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029a5", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 25 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029a6", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 25 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029a8", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b663029a7", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029a8", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b663029aa", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout" - }, - { - "_id": "5fe4a9285a72d07b663029a9", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029aa", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b663029ab", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b663029ac", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 9 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b663029ad", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b663029ae", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a9285a72d07b663029b2", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Encyclopedia": { + "5447a9cd4bdc2dbd208b4567": false, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "54491bb74bdc2d09088b4567": false, + "544a11ac4bdc2d470e8b456a": false, + "544a38634bdc2d58388b4568": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "544fb45d4bdc2dee738b4568": true, + "54527a984bdc2d4e668b4567": false, + "557ffd194bdc2d28148b457f": false, + "55d355e64bdc2d962f8b4569": false, + "55d3632e4bdc2d972f8b4569": false, + "55d44fd14bdc2d962f8b456e": false, + "55d459824bdc2d892f8b4573": false, + "55d482194bdc2d1d4e8b456b": true, + "55d4887d4bdc2d962f8b4570": false, + "55d4ae6c4bdc2d8b2f8b456e": false, + "55d4af3a4bdc2d972f8b456f": false, + "55d4b9964bdc2d1d4e8b456e": false, + "55d5f46a4bdc2d1b198b4567": false, + "55d7217a4bdc2d86028b456d": false, + "560d5e524bdc2d25448b4571": false, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "5649be884bdc2d79388b4577": false, + "564ca99c4bdc2d16268b4589": false, + "5696686a4bdc2da3298b456a": false, + "56d59856d2720bd8418b456a": false, + "56d59948d2720bb7418b4582": false, + "56d59d3ad2720bdb418b4577": false, + "56d5a1f7d2720bb3418b456a": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56d5a661d2720bd8418b456b": false, + "56d5a77ed2720b90418b4568": false, + "56dfef82d2720bbd668b4567": true, + "56ea8d2fd2720b7c698b4570": false, + "572b7fa524597762b747ce82": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce572459770cba1a34ea": false, + "58864a4f2459770fcc257101": true, + "58d3db5386f77426186285a0": false, + "590c5f0d86f77413997acfab": false, + "590c661e86f7741e566b646a": false, + "590c695186f7741e566b64a2": false, + "5926bb2186f7744b1c6c6e60": false, + "5926c0df86f77462f647f764": false, + "5926c32286f774616e42de99": false, + "5926c36d86f77467a92a8629": false, + "5926c3b286f774640d189b6b": false, + "5926d2be86f774134d668e4e": false, + "5926d3c686f77410de68ebc8": false, + "5926e16e86f7742f5a0f7ecb": false, + "59c6633186f7740cf0493bb9": true, + "59d36a0086f7747e673f3946": true, + "5a0c27731526d80618476ac4": false, + "5aa2a7e8e5b5b00016327c16": false, + "5ab8f39486f7745cd93a1cca": false, + "5ae30bad5acfc400185c2dc4": false, + "5ae30db85acfc408fb139a05": false, + "5ae30e795acfc408fb139a0b": false, + "5b44c8ea86f7742d1627baf1": false, + "5c0e9f2c86f77432297fe0a3": false, + "5cadc190ae921500103bb3b6": false, + "5cadc1c6ae9215000f2775a4": false, + "5cadc2e0ae9215051e1c21e7": false, + "5cadc390ae921500126a77f1": false, + "5cadc431ae921500113bb8d5": false, + "5cadc55cae921500103bb3be": false, + "5cadd919ae921500126a77f3": false, + "5cadd940ae9215051e1c2316": false, + "5d02778e86f774203e7dedbe": false, + "5d1b371186f774253763a656": false, + "5d2f213448f0355009199284": false, + "5d403f9186f7743cac3f229b": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e4d34ca86f774264f758330": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e870397991fd70db46995c8": false, + "5e87071478f43e51ca2de5e1": false, + "5e87076ce2db31558c75a11d": false, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": false, + "5e87114fe2db31558c75a120": false, + "5e87116b81c4ed43e83cefdd": false, + "5e9dcf5986f7746c417435b3": false }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029b0", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4a9285a72d07b663029b2", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b663029af", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029b0", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b663029b1", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4a9285a72d07b663029b2", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9285a72d07b663029bc", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608821244 }, - "Foldable": { - "Folded": false + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 2, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029b3", - "_tpl": "5998517986f7746017232f7e", - "parentId": "5fe4a9285a72d07b663029bc", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9285a72d07b663029b4", - "_tpl": "599851db86f77467372f0a18", - "parentId": "5fe4a9285a72d07b663029bc", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9285a72d07b663029b6", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "5fe4a9285a72d07b663029bc", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b663029b5", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029b6", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b663029b7", - "_tpl": "5998597786f77414ea6da093", - "parentId": "5fe4a9285a72d07b663029bc", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9285a72d07b663029b8", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "5fe4a9285a72d07b663029bc", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9285a72d07b663029b9", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "5fe4a9285a72d07b663029bc", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029bb", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "5fe4a9285a72d07b663029bc", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a9285a72d07b663029ba", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a9285a72d07b663029bb", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9285a72d07b663029c0", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "left_behind", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Usec", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029be", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4a9285a72d07b663029c0", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b663029bd", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029be", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b663029bf", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4a9285a72d07b663029c0", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9285a72d07b663029c4", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "InsuredItems": [], + "Inventory": { + "equipment": "5fe4a9fcf5aec236ec38363c", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe4a9fcf5aec236ec38363c", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "5fe4a9fcf5aec236ec383625", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383619", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe4a9fcf5aec236ec383625", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9fcf5aec236ec38361b", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe4a9fcf5aec236ec383625", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec38361a", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec38361b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec383621", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe4a9fcf5aec236ec383625", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9fcf5aec236ec38361e", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe4a9fcf5aec236ec383621", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a9fcf5aec236ec38361c", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe4a9fcf5aec236ec38361e", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9fcf5aec236ec38361d", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe4a9fcf5aec236ec38361e", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a9fcf5aec236ec38361f", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe4a9fcf5aec236ec383621", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe4a9fcf5aec236ec38361f", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9fcf5aec236ec383620", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe4a9fcf5aec236ec383621", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383623", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe4a9fcf5aec236ec383625", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9fcf5aec236ec383622", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe4a9fcf5aec236ec383623", + "slotId": "mod_stock_000" + }, { + "_id": "5fe4a9fcf5aec236ec383624", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe4a9fcf5aec236ec383625", + "slotId": "mod_charge" + }, { + "_id": "5fe4a9fcf5aec236ec383626", + "_tpl": "54491bb74bdc2d09088b4567", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 70, + "MaxDurability": 70 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383627", + "_tpl": "572b7fa524597762b747ce82", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "FaceCover", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383628", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383630", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "TacticalVest" + }, { + "_id": "5fe4a9fcf5aec236ec38362a", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec383630", + "slotId": "1" + }, { + "_id": "5fe4a9fcf5aec236ec383629", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec38362a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec38362c", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec383630", + "slotId": "2" + }, { + "_id": "5fe4a9fcf5aec236ec38362b", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec38362c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec38362e", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec383630", + "slotId": "3" + }, { + "_id": "5fe4a9fcf5aec236ec38362d", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec38362e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec38362f", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec383630", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383631", + "_tpl": "544a11ac4bdc2d470e8b456a", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "SecuredContainer" + }, { + "_id": "5fe4a9fcf5aec236ec383635", + "_tpl": "5e9dcf5986f7746c417435b3", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "Backpack" + }, { + "_id": "5fe4a9fcf5aec236ec383632", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec383635", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383633", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec383635", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383634", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec383635", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4a9fcf5aec236ec383636", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38363a", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "Pockets" + }, { + "_id": "5fe4a9fcf5aec236ec383637", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec38363a", + "slotId": "pocket1" + }, { + "_id": "5fe4a9fcf5aec236ec383638", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec38363a", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383639", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec38363a", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38363b", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe4a9fcf5aec236ec38363c", + "slotId": "Earpiece" + }, { + "_id": "5fe4a9fcf5aec236ec3836f7", + "_tpl": "5811ce572459770cba1a34ea" + }, { + "_id": "5fe4a9fcf5aec236ec38363d", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38363e", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 9 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38363f", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383641", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383640", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec383641", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec383643", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 14 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383642", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec383643", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec383644", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 16 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4a9fcf5aec236ec383645", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383646", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383647", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383648", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38364a", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 15 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383649", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec38364a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec38364b", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec38364c", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38364e", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 14 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38364d", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec38364e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec38364f", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383650", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 16 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4a9fcf5aec236ec383651", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 18 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383652", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383653", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 14 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383654", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383655", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383656", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 11 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383657", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383658", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383659", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38365a", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38365b", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38365c", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38365d", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 21 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38365e", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 18 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38365f", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383660", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383661", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec383662", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 9 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383663", + "_tpl": "5d403f9186f7743cac3f229b", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383664", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383665", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383666", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383667", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383668", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383669", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38366a", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38366b", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38366c", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38366d", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38366f", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38366e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec38366f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec383670", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec383671", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383672", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383673", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 21 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383674", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 21 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383675", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 21 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383676", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 21 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383678", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383677", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec383678", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec383679", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec38367b", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38367a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec38367b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec38367d", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38367c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec38367d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec38367f", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38367e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec38367f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec383680", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 21 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec383681", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec383682", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec383683", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec383684", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 2 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 100 + } + }, { + "_id": "5fe4a9fcf5aec236ec383686", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383685", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec383686", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec383688", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383687", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec383688", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec38368a", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383689", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec38368a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec38368b", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec38368c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec38368d", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4a9fcf5aec236ec38368e", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4a9fcf5aec236ec383690", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 14 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38368f", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec383690", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec383691", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 200 + } + }, { + "_id": "5fe4a9fcf5aec236ec383692", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 200 + } + }, { + "_id": "5fe4a9fcf5aec236ec383694", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383693", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec383694", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec383696", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383695", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec383696", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec383698", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383697", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec383698", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec38369a", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec383699", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec38369a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec38369b", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 16 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38369c", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 15 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec38369d", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 18 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38369e", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec38369f", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 19 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a0", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a1", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 17 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a2", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 16 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a3", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a4", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 21 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a5", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 20 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a6", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 18 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a7", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 23 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a8", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 23 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836a9", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 22 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836aa", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 22 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836ab", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836ad", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec3836ac", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836ad", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836af", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec3836ae", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836af", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836b1", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec3836b0", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836b1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836b3", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout" + }, { + "_id": "5fe4a9fcf5aec236ec3836b2", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836b3", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836bc", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836b5", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe4a9fcf5aec236ec3836bc", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a9fcf5aec236ec3836b4", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe4a9fcf5aec236ec3836b5", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9fcf5aec236ec3836b6", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe4a9fcf5aec236ec3836bc", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9fcf5aec236ec3836b9", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe4a9fcf5aec236ec3836bc", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9fcf5aec236ec3836b7", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe4a9fcf5aec236ec3836b9", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836b8", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe4a9fcf5aec236ec3836b9", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836bb", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe4a9fcf5aec236ec3836bc", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec3836ba", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836bb", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836c5", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836be", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe4a9fcf5aec236ec3836c5", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a9fcf5aec236ec3836bd", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe4a9fcf5aec236ec3836be", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9fcf5aec236ec3836bf", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe4a9fcf5aec236ec3836c5", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9fcf5aec236ec3836c2", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe4a9fcf5aec236ec3836c5", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9fcf5aec236ec3836c0", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe4a9fcf5aec236ec3836c2", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836c1", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe4a9fcf5aec236ec3836c2", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836c4", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe4a9fcf5aec236ec3836c5", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec3836c3", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836c4", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836d2", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 14 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836c6", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe4a9fcf5aec236ec3836d2", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9fcf5aec236ec3836c8", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe4a9fcf5aec236ec3836d2", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec3836c7", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4a9fcf5aec236ec3836c8", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836ce", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe4a9fcf5aec236ec3836d2", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9fcf5aec236ec3836cb", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe4a9fcf5aec236ec3836ce", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a9fcf5aec236ec3836c9", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe4a9fcf5aec236ec3836cb", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9fcf5aec236ec3836ca", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe4a9fcf5aec236ec3836cb", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a9fcf5aec236ec3836cc", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe4a9fcf5aec236ec3836ce", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe4a9fcf5aec236ec3836cc", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9fcf5aec236ec3836cd", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe4a9fcf5aec236ec3836ce", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836d0", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe4a9fcf5aec236ec3836d2", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9fcf5aec236ec3836cf", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe4a9fcf5aec236ec3836d0", + "slotId": "mod_stock_000" + }, { + "_id": "5fe4a9fcf5aec236ec3836d1", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe4a9fcf5aec236ec3836d2", + "slotId": "mod_charge" + }, { + "_id": "5fe4a9fcf5aec236ec3836db", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836d4", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe4a9fcf5aec236ec3836db", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec3836d3", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836d4", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836d9", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe4a9fcf5aec236ec3836db", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9fcf5aec236ec3836d5", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe4a9fcf5aec236ec3836d9", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9fcf5aec236ec3836d6", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe4a9fcf5aec236ec3836d9", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836d7", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe4a9fcf5aec236ec3836d9", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9fcf5aec236ec3836d8", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe4a9fcf5aec236ec3836d9", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9fcf5aec236ec3836da", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe4a9fcf5aec236ec3836db", + "slotId": "mod_charge" + }, { + "_id": "5fe4a9fcf5aec236ec3836e4", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836dd", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe4a9fcf5aec236ec3836e4", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec3836dc", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836dd", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836e2", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe4a9fcf5aec236ec3836e4", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9fcf5aec236ec3836de", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe4a9fcf5aec236ec3836e2", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9fcf5aec236ec3836df", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe4a9fcf5aec236ec3836e2", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836e0", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe4a9fcf5aec236ec3836e2", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9fcf5aec236ec3836e1", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe4a9fcf5aec236ec3836e2", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9fcf5aec236ec3836e3", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe4a9fcf5aec236ec3836e4", + "slotId": "mod_charge" + }, { + "_id": "5fe4a9fcf5aec236ec3836ed", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836e6", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe4a9fcf5aec236ec3836ed", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a9fcf5aec236ec3836e5", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe4a9fcf5aec236ec3836e6", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a9fcf5aec236ec3836e7", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe4a9fcf5aec236ec3836ed", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a9fcf5aec236ec3836ea", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe4a9fcf5aec236ec3836ed", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a9fcf5aec236ec3836e8", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe4a9fcf5aec236ec3836ea", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836e9", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe4a9fcf5aec236ec3836ea", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836ec", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe4a9fcf5aec236ec3836ed", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec3836eb", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a9fcf5aec236ec3836ec", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836f6", + "_tpl": "5e870397991fd70db46995c8", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 16 + }, + "parentId": "5fe4a9fcf5aec236ec3836f7", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836ef", + "_tpl": "5e87071478f43e51ca2de5e1", + "parentId": "5fe4a9fcf5aec236ec3836f6", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a9fcf5aec236ec3836ee", + "_tpl": "5e8708d4ae379e67d22e0102", + "parentId": "5fe4a9fcf5aec236ec3836ef", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836f0", + "_tpl": "5e87076ce2db31558c75a11d", + "parentId": "5fe4a9fcf5aec236ec3836f6", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a9fcf5aec236ec3836f2", + "_tpl": "5e87080c81c4ed43e83cefda", + "parentId": "5fe4a9fcf5aec236ec3836f6", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a9fcf5aec236ec3836f1", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4a9fcf5aec236ec3836f2", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 8 + } + }, { + "_id": "5fe4a9fcf5aec236ec3836f3", + "_tpl": "5e87116b81c4ed43e83cefdd", + "parentId": "5fe4a9fcf5aec236ec3836f6", + "slotId": "mod_stock" + }, { + "_id": "5fe4a9fcf5aec236ec3836f4", + "_tpl": "5e87114fe2db31558c75a120", + "parentId": "5fe4a9fcf5aec236ec3836f6", + "slotId": "mod_mount", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a9fcf5aec236ec3836f5", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4a9fcf5aec236ec3836f6", + "slotId": "patron_in_weapon" + }, { + "_id": "5fe4a9fcf5aec236ec3836f9", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe4a9fcf5aec236ec3836f8", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + } + ], + "questRaidItems": "5fe4a9fcf5aec236ec3836f8", + "questStashItems": "5fe4a9fcf5aec236ec3836f9", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe4a9fcf5aec236ec3836f7" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029c2", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4a9285a72d07b663029c4", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b663029c1", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029c2", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a9285a72d07b663029c3", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4a9285a72d07b663029c4", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9285a72d07b663029ce", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Notes": { + "Notes": [] }, - "Foldable": { - "Folded": false + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029c5", - "_tpl": "5998517986f7746017232f7e", - "parentId": "5fe4a9285a72d07b663029ce", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9285a72d07b663029c6", - "_tpl": "599851db86f77467372f0a18", - "parentId": "5fe4a9285a72d07b663029ce", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9285a72d07b663029c8", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "5fe4a9285a72d07b663029ce", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b663029c7", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9285a72d07b663029c8", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b663029c9", - "_tpl": "5998597786f77414ea6da093", - "parentId": "5fe4a9285a72d07b663029ce", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9285a72d07b663029ca", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "5fe4a9285a72d07b663029ce", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9285a72d07b663029cb", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "5fe4a9285a72d07b663029ce", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029cd", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "5fe4a9285a72d07b663029ce", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a9285a72d07b663029cc", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a9285a72d07b663029cd", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9285a72d07b663029d8", - "_tpl": "5ac4cd105acfc40016339859", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 16 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 }, - "Foldable": { - "Folded": false + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029d0", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "5fe4a9285a72d07b663029d8", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a9285a72d07b663029cf", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a9285a72d07b663029d0", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9285a72d07b663029d1", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "5fe4a9285a72d07b663029d8", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9285a72d07b663029d2", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "5fe4a9285a72d07b663029d8", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9285a72d07b663029d3", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "5fe4a9285a72d07b663029d8", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9285a72d07b663029d4", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "5fe4a9285a72d07b663029d8", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029d5", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "5fe4a9285a72d07b663029d8", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9285a72d07b663029d7", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "5fe4a9285a72d07b663029d8", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b663029d6", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "5fe4a9285a72d07b663029d7", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9285a72d07b663029e1", - "_tpl": "5e870397991fd70db46995c8", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 18 - }, - "parentId": "5fe4a9285a72d07b663029e2", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029da", - "_tpl": "5e87071478f43e51ca2de5e1", - "parentId": "5fe4a9285a72d07b663029e1", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4a9285a72d07b663029d9", - "_tpl": "5e8708d4ae379e67d22e0102", - "parentId": "5fe4a9285a72d07b663029da", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029db", - "_tpl": "5e87076ce2db31558c75a11d", - "parentId": "5fe4a9285a72d07b663029e1", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9285a72d07b663029dd", - "_tpl": "5e87080c81c4ed43e83cefda", - "parentId": "5fe4a9285a72d07b663029e1", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9285a72d07b663029dc", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4a9285a72d07b663029dd", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 8 - } - }, - { - "_id": "5fe4a9285a72d07b663029de", - "_tpl": "5e87116b81c4ed43e83cefdd", - "parentId": "5fe4a9285a72d07b663029e1", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9285a72d07b663029df", - "_tpl": "5e87114fe2db31558c75a120", - "parentId": "5fe4a9285a72d07b663029e1", - "slotId": "mod_mount", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9285a72d07b663029e0", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4a9285a72d07b663029e1", - "slotId": "patron_in_weapon" - }, - { - "_id": "5fe4a9285a72d07b663029e4", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe4a9285a72d07b663029e3", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - } - ], - "questRaidItems": "5fe4a9285a72d07b663029e3", - "questStashItems": "5fe4a9285a72d07b663029e4", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe4a9285a72d07b663029e2" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cd946231388ce000d572fe3", - "5cd945d71388ce000a659dfb" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0, - "jaegerUnlocked": false - }, - "weaponbuilds": {} + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cde9ec17d6c8b04723cf479", + "5cde9e957d6c8b0474535da7" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0, + "jaegerUnlocked": false + }, + "weaponbuilds": {} + } }, - "usec": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cde95d97d6c8b647a3769b0", - "Feet": "5cde95ef7d6c8b04713c4f2d", - "Hands": "5cde95fa7d6c8b04737c2d13", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447a9cd4bdc2dbd208b4567": false, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "54491bb74bdc2d09088b4567": false, - "544a11ac4bdc2d470e8b456a": false, - "544a38634bdc2d58388b4568": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "544fb45d4bdc2dee738b4568": true, - "54527a984bdc2d4e668b4567": false, - "557ffd194bdc2d28148b457f": false, - "55d355e64bdc2d962f8b4569": false, - "55d3632e4bdc2d972f8b4569": false, - "55d44fd14bdc2d962f8b456e": false, - "55d459824bdc2d892f8b4573": false, - "55d482194bdc2d1d4e8b456b": true, - "55d4887d4bdc2d962f8b4570": false, - "55d4ae6c4bdc2d8b2f8b456e": false, - "55d4af3a4bdc2d972f8b456f": false, - "55d4b9964bdc2d1d4e8b456e": false, - "55d5f46a4bdc2d1b198b4567": false, - "55d7217a4bdc2d86028b456d": false, - "560d5e524bdc2d25448b4571": false, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "5649be884bdc2d79388b4577": false, - "564ca99c4bdc2d16268b4589": false, - "5696686a4bdc2da3298b456a": false, - "56d59856d2720bd8418b456a": false, - "56d59948d2720bb7418b4582": false, - "56d59d3ad2720bdb418b4577": false, - "56d5a1f7d2720bb3418b456a": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56d5a661d2720bd8418b456b": false, - "56d5a77ed2720b90418b4568": false, - "56dfef82d2720bbd668b4567": true, - "56ea8d2fd2720b7c698b4570": false, - "572b7fa524597762b747ce82": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce572459770cba1a34ea": false, - "58864a4f2459770fcc257101": true, - "58d3db5386f77426186285a0": false, - "590c5f0d86f77413997acfab": false, - "590c661e86f7741e566b646a": false, - "590c695186f7741e566b64a2": false, - "5926bb2186f7744b1c6c6e60": false, - "5926c0df86f77462f647f764": false, - "5926c32286f774616e42de99": false, - "5926c36d86f77467a92a8629": false, - "5926c3b286f774640d189b6b": false, - "5926d2be86f774134d668e4e": false, - "5926d3c686f77410de68ebc8": false, - "5926e16e86f7742f5a0f7ecb": false, - "59c6633186f7740cf0493bb9": true, - "59d36a0086f7747e673f3946": true, - "5a0c27731526d80618476ac4": false, - "5aa2a7e8e5b5b00016327c16": false, - "5ab8f39486f7745cd93a1cca": false, - "5ae30bad5acfc400185c2dc4": false, - "5ae30db85acfc408fb139a05": false, - "5ae30e795acfc408fb139a0b": false, - "5b44c8ea86f7742d1627baf1": false, - "5c0e9f2c86f77432297fe0a3": false, - "5cadc190ae921500103bb3b6": false, - "5cadc1c6ae9215000f2775a4": false, - "5cadc2e0ae9215051e1c21e7": false, - "5cadc390ae921500126a77f1": false, - "5cadc431ae921500113bb8d5": false, - "5cadc55cae921500103bb3be": false, - "5cadd919ae921500126a77f3": false, - "5cadd940ae9215051e1c2316": false, - "5d02778e86f774203e7dedbe": false, - "5d1b371186f774253763a656": false, - "5d2f213448f0355009199284": false, - "5d403f9186f7743cac3f229b": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e4d34ca86f774264f758330": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e870397991fd70db46995c8": false, - "5e87071478f43e51ca2de5e1": false, - "5e87076ce2db31558c75a11d": false, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": false, - "5e87114fe2db31558c75a120": false, - "5e87116b81c4ed43e83cefdd": false, - "5e9dcf5986f7746c417435b3": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608821244 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 2, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "left_behind", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Usec", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe4a9fcf5aec236ec38363c", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe4a9fcf5aec236ec38363c", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "5fe4a9fcf5aec236ec383625", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" + "Prepare To Escape": { + "descriptionLocaleKey": "launcher-profile_preparetoescape", + "bear": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383619", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe4a9fcf5aec236ec383625", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9fcf5aec236ec38361b", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe4a9fcf5aec236ec383625", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec38361a", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec38361b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383621", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe4a9fcf5aec236ec383625", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9fcf5aec236ec38361e", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe4a9fcf5aec236ec383621", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4a9fcf5aec236ec38361c", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe4a9fcf5aec236ec38361e", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9fcf5aec236ec38361d", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe4a9fcf5aec236ec38361e", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a9fcf5aec236ec38361f", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe4a9fcf5aec236ec383621", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe4a9fcf5aec236ec38361f", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9fcf5aec236ec383620", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe4a9fcf5aec236ec383621", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383623", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe4a9fcf5aec236ec383625", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9fcf5aec236ec383622", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe4a9fcf5aec236ec383623", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe4a9fcf5aec236ec383624", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe4a9fcf5aec236ec383625", - "slotId": "mod_charge" - }, - { - "_id": "5fe4a9fcf5aec236ec383626", - "_tpl": "54491bb74bdc2d09088b4567", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 70, - "MaxDurability": 70 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383627", - "_tpl": "572b7fa524597762b747ce82", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "FaceCover", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383628", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383630", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "TacticalVest" - }, - { - "_id": "5fe4a9fcf5aec236ec38362a", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec383630", - "slotId": "1" - }, - { - "_id": "5fe4a9fcf5aec236ec383629", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec38362a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38362c", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec383630", - "slotId": "2" - }, - { - "_id": "5fe4a9fcf5aec236ec38362b", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec38362c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38362e", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec383630", - "slotId": "3" - }, - { - "_id": "5fe4a9fcf5aec236ec38362d", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec38362e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38362f", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec383630", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383631", - "_tpl": "544a11ac4bdc2d470e8b456a", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "SecuredContainer" - }, - { - "_id": "5fe4a9fcf5aec236ec383635", - "_tpl": "5e9dcf5986f7746c417435b3", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "Backpack" - }, - { - "_id": "5fe4a9fcf5aec236ec383632", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec383635", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383633", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec383635", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383634", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec383635", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383636", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38363a", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "Pockets" - }, - { - "_id": "5fe4a9fcf5aec236ec383637", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec38363a", - "slotId": "pocket1" - }, - { - "_id": "5fe4a9fcf5aec236ec383638", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec38363a", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383639", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec38363a", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38363b", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe4a9fcf5aec236ec38363c", - "slotId": "Earpiece" - }, - { - "_id": "5fe4a9fcf5aec236ec3836f7", - "_tpl": "5811ce572459770cba1a34ea" - }, - { - "_id": "5fe4a9fcf5aec236ec38363d", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38363e", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 9 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38363f", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383641", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383640", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec383641", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383643", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 14 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383642", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec383643", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383644", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 16 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383645", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383646", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383647", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383648", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38364a", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 15 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383649", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec38364a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38364b", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38364c", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38364e", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 14 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38364d", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec38364e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38364f", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383650", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 16 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383651", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 18 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383652", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383653", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 14 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383654", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383655", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383656", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 11 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383657", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383658", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383659", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38365a", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38365b", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38365c", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38365d", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 21 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38365e", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 18 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38365f", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383660", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383661", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383662", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 9 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383663", - "_tpl": "5d403f9186f7743cac3f229b", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383664", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383665", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383666", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383667", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383668", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383669", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38366a", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38366b", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38366c", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38366d", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38366f", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38366e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec38366f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383670", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383671", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383672", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383673", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 21 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383674", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 21 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383675", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 21 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383676", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 21 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383678", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383677", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec383678", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383679", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38367b", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38367a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec38367b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38367d", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38367c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec38367d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38367f", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38367e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec38367f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383680", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 21 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec383681", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383682", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383683", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383684", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 2 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 100 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383686", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383685", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec383686", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383688", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383687", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec383688", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38368a", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383689", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec38368a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38368b", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38368c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38368d", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38368e", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383690", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 14 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38368f", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec383690", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383691", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 200 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383692", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 200 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383694", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383693", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec383694", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383696", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383695", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec383696", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec383698", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383697", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec383698", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38369a", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec383699", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec38369a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec38369b", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 16 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38369c", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 15 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec38369d", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 18 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38369e", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec38369f", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 19 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a0", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a1", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 17 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a2", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 16 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a3", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a4", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 21 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a5", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 20 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a6", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 18 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a7", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 23 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a8", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 23 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836a9", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 22 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836aa", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 22 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836ab", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836ad", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec3836ac", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836ad", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836af", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec3836ae", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836af", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836b1", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec3836b0", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836b1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836b3", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout" - }, - { - "_id": "5fe4a9fcf5aec236ec3836b2", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836b3", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836bc", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Customization": { + "Body": "5cc0858d14c02e000c6bea66", + "Feet": "5cc085bb14c02e000e67a5c5", + "Hands": "5cc0876314c02e000c6bea6b", + "Head": "__REPLACEME__" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836b5", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe4a9fcf5aec236ec3836bc", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4a9fcf5aec236ec3836b4", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe4a9fcf5aec236ec3836b5", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9fcf5aec236ec3836b6", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe4a9fcf5aec236ec3836bc", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9fcf5aec236ec3836b9", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe4a9fcf5aec236ec3836bc", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9fcf5aec236ec3836b7", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe4a9fcf5aec236ec3836b9", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836b8", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe4a9fcf5aec236ec3836b9", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836bb", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe4a9fcf5aec236ec3836bc", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec3836ba", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836bb", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836c5", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Encyclopedia": { + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "54491bb74bdc2d09088b4567": false, + "544a11ac4bdc2d470e8b456a": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": false, + "544fb45d4bdc2dee738b4568": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "55801eed4bdc2d89578b4588": false, + "559ba5b34bdc2d1f1a8b4582": false, + "55d480c04bdc2d1d4e8b456a": false, + "55d482194bdc2d1d4e8b456b": true, + "55d7217a4bdc2d86028b456d": false, + "56083e1b4bdc2dc8488b4572": false, + "56083eab4bdc2d26448b456a": false, + "560d5e524bdc2d25448b4571": false, + "560e620e4bdc2d724b8b456b": false, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "564ca99c4bdc2d16268b4589": false, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59d3ad2720bdb418b4577": false, + "56dfef82d2720bbd668b4567": true, + "56dff3afd2720bba668b4567": false, + "56ea8222d2720b69698b4567": false, + "5710c24ad2720bc3458b45a3": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce662459770f6f490f32": false, + "584984812459776a704a82a6": true, + "5857a8b324597729ab0a0e7d": false, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": false, + "590c5d4b86f774784e1b9c45": false, + "590c661e86f7741e566b646a": false, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": false, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "5a0c27731526d80618476ac4": false, + "5aa2b87de5b5b00016327c25": false, + "5aa7cfc0e5b5b00015693143": false, + "5ab8f39486f7745cd93a1cca": false, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac72e475acfc400180ae6fe": false, + "5ac7655e5acfc40016339a19": false, + "5af0454c86f7746bf20992e8": false, + "5b40e5e25acfc4001a599bea": false, + "5b432b965acfc47a8774094e": false, + "5bffdc370db834001d23eca8": false, + "5c0e53c886f7747fa54205c7": false, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": false, + "5d02778e86f774203e7dedbe": false, + "5d0a29fed7ad1a002769ad08": false, + "5d0a3e8cd7ad1a6f6a3d35bd": false, + "5d1b36a186f7742523398433": false, + "5d1b371186f774253763a656": false, + "5d40407c86f774318526545a": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e870397991fd70db46995c8": false, + "5e87071478f43e51ca2de5e1": false, + "5e87076ce2db31558c75a11d": false, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": false, + "5e87114fe2db31558c75a120": false, + "5e87116b81c4ed43e83cefdd": false }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836be", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe4a9fcf5aec236ec3836c5", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4a9fcf5aec236ec3836bd", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe4a9fcf5aec236ec3836be", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9fcf5aec236ec3836bf", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe4a9fcf5aec236ec3836c5", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9fcf5aec236ec3836c2", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe4a9fcf5aec236ec3836c5", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9fcf5aec236ec3836c0", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe4a9fcf5aec236ec3836c2", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836c1", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe4a9fcf5aec236ec3836c2", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836c4", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe4a9fcf5aec236ec3836c5", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec3836c3", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836c4", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836d2", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 14 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608820335 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836c6", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe4a9fcf5aec236ec3836d2", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9fcf5aec236ec3836c8", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe4a9fcf5aec236ec3836d2", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec3836c7", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4a9fcf5aec236ec3836c8", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836ce", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe4a9fcf5aec236ec3836d2", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9fcf5aec236ec3836cb", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe4a9fcf5aec236ec3836ce", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4a9fcf5aec236ec3836c9", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe4a9fcf5aec236ec3836cb", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9fcf5aec236ec3836ca", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe4a9fcf5aec236ec3836cb", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a9fcf5aec236ec3836cc", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe4a9fcf5aec236ec3836ce", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe4a9fcf5aec236ec3836cc", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9fcf5aec236ec3836cd", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe4a9fcf5aec236ec3836ce", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836d0", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe4a9fcf5aec236ec3836d2", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9fcf5aec236ec3836cf", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe4a9fcf5aec236ec3836d0", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe4a9fcf5aec236ec3836d1", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe4a9fcf5aec236ec3836d2", - "slotId": "mod_charge" - }, - { - "_id": "5fe4a9fcf5aec236ec3836db", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836d4", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe4a9fcf5aec236ec3836db", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec3836d3", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836d4", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836d9", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe4a9fcf5aec236ec3836db", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9fcf5aec236ec3836d5", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe4a9fcf5aec236ec3836d9", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9fcf5aec236ec3836d6", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe4a9fcf5aec236ec3836d9", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836d7", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe4a9fcf5aec236ec3836d9", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9fcf5aec236ec3836d8", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe4a9fcf5aec236ec3836d9", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9fcf5aec236ec3836da", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe4a9fcf5aec236ec3836db", - "slotId": "mod_charge" - }, - { - "_id": "5fe4a9fcf5aec236ec3836e4", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "prepare_for_escape", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Bear", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836dd", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe4a9fcf5aec236ec3836e4", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec3836dc", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836dd", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836e2", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe4a9fcf5aec236ec3836e4", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9fcf5aec236ec3836de", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe4a9fcf5aec236ec3836e2", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9fcf5aec236ec3836df", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe4a9fcf5aec236ec3836e2", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836e0", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe4a9fcf5aec236ec3836e2", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9fcf5aec236ec3836e1", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe4a9fcf5aec236ec3836e2", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9fcf5aec236ec3836e3", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe4a9fcf5aec236ec3836e4", - "slotId": "mod_charge" - }, - { - "_id": "5fe4a9fcf5aec236ec3836ed", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "InsuredItems": [], + "Inventory": { + "equipment": "5fe4a66e40ca750fd72b5886", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe4a66e40ca750fd72b5886", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "5fe4a66e40ca750fd72b586f", + "_tpl": "5ac4cd105acfc40016339859", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5867", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "5fe4a66e40ca750fd72b586f", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a66e40ca750fd72b5866", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a66e40ca750fd72b5867", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a66e40ca750fd72b5868", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "5fe4a66e40ca750fd72b586f", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a66e40ca750fd72b5869", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "5fe4a66e40ca750fd72b586f", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a66e40ca750fd72b586a", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "5fe4a66e40ca750fd72b586f", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a66e40ca750fd72b586b", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "5fe4a66e40ca750fd72b586f", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b586c", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "5fe4a66e40ca750fd72b586f", + "slotId": "mod_stock" + }, { + "_id": "5fe4a66e40ca750fd72b586e", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "5fe4a66e40ca750fd72b586f", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b586d", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "5fe4a66e40ca750fd72b586e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b5870", + "_tpl": "5bffdc370db834001d23eca8", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 80, + "MaxDurability": 80 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5871", + "_tpl": "5b40e5e25acfc4001a599bea", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5879", + "_tpl": "5ca20abf86f77418567a43f2", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "TacticalVest" + }, { + "_id": "5fe4a66e40ca750fd72b5873", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b5879", + "slotId": "1" + }, { + "_id": "5fe4a66e40ca750fd72b5872", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a66e40ca750fd72b5873", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b5875", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b5879", + "slotId": "2" + }, { + "_id": "5fe4a66e40ca750fd72b5874", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a66e40ca750fd72b5875", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b5877", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b5879", + "slotId": "3" + }, { + "_id": "5fe4a66e40ca750fd72b5876", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a66e40ca750fd72b5877", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b5878", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b5879", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b587a", + "_tpl": "5857a8b324597729ab0a0e7d", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "SecuredContainer" + }, { + "_id": "5fe4a66e40ca750fd72b587f", + "_tpl": "5ca20d5986f774331e7c9602", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "Backpack" + }, { + "_id": "5fe4a66e40ca750fd72b587b", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b587f", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4a66e40ca750fd72b587c", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 1 + }, + "parentId": "5fe4a66e40ca750fd72b587f", + "slotId": "main", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b587d", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b587f", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b587e", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b587f", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5880", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5884", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "Pockets" + }, { + "_id": "5fe4a66e40ca750fd72b5881", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b5884", + "slotId": "pocket1" + }, { + "_id": "5fe4a66e40ca750fd72b5882", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b5884", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5883", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b5884", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5885", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe4a66e40ca750fd72b5886", + "slotId": "Earpiece" + }, { + "_id": "5fe4a66e40ca750fd72b595a", + "_tpl": "5811ce662459770f6f490f32" + }, { + "_id": "5fe4a66e40ca750fd72b5887", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5888", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5889", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b588a", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 9 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b588b", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b588c", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250 + } + }, { + "_id": "5fe4a66e40ca750fd72b588d", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b588e", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b588f", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5890", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5891", + "_tpl": "5d40407c86f774318526545a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5892", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4a66e40ca750fd72b5894", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5893", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b5894", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b5895", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5896", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5897", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5898", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 11 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5899", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a66e40ca750fd72b589b", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b589a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b589b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b589d", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b589c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b589d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b589f", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b589e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b589f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a1", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58a0", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58a1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a2", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a3", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a4", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a5", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a6", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a7", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58a8", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58aa", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58a9", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58aa", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58ac", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58ab", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58ac", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58ae", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58ad", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58ae", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58b0", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58af", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58b0", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58b2", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58b1", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58b2", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58b3", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 11 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58b4", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 11 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58b5", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 17 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58b6", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58b7", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4a66e40ca750fd72b58b8", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58b9", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58ba", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 18 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58bb", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58bc", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 15 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58bd", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 15 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58be", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58bf", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 9 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58c1", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 16 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58c0", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a66e40ca750fd72b58c1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58c3", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 16 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58c2", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a66e40ca750fd72b58c3", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58c5", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 16 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58c4", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a66e40ca750fd72b58c5", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58c6", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 18 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58c7", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 16 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58c9", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 16 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58c8", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4a66e40ca750fd72b58c9", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b58ca", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58cb", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58cc", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58cd", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58ce", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58cf", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58d0", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58d1", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 24 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58d2", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58d3", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58d4", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58d5", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58d6", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58d7", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58d8", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58d9", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58da", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58db", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58dd", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58dc", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58dd", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b58df", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58de", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b58df", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b58e0", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 18 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a66e40ca750fd72b58e1", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58e2", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 14 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58e3", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58e4", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58e5", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58e6", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58e7", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58e8", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58e9", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58ea", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58eb", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58ec", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58ed", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250 + } + }, { + "_id": "5fe4a66e40ca750fd72b58ee", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 21 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58ef", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 18 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a66e40ca750fd72b58f0", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 18 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4a66e40ca750fd72b58f1", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4a66e40ca750fd72b58f2", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 10 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58f3", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b58f4", + "_tpl": "5c0e53c886f7747fa54205c7", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 19 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 47, + "MaxDurability": 47 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58f5", + "_tpl": "5d1b36a186f7742523398433", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 29 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58f6", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 29 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b58fb", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 21 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58fc", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 22 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b58fd", + "_tpl": "5aa7cfc0e5b5b00015693143", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 23 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 25, + "MaxDurability": 25 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5901", + "_tpl": "559ba5b34bdc2d1f1a8b4582", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 20 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5900", + "_tpl": "5887431f2459777e1612938f", + "parentId": "5fe4a66e40ca750fd72b5901", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe4a66e40ca750fd72b5903", + "_tpl": "559ba5b34bdc2d1f1a8b4582", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 19 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5902", + "_tpl": "5887431f2459777e1612938f", + "parentId": "5fe4a66e40ca750fd72b5903", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe4a66e40ca750fd72b5904", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5905", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5906", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 2 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250 + } + }, { + "_id": "5fe4a66e40ca750fd72b5907", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5908", + "_tpl": "5ab8f39486f7745cd93a1cca", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 21 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5909", + "_tpl": "557ff21e4bdc2d89578b4586", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 22 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b590a", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 24 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b590b", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 26 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b590c", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b590d", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 27 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b590e", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 25 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b590f", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5910", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 28 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5911", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 29 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5912", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 29 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5913", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 30 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5914", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 30 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5916", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5915", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b5916", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b5918", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5917", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b5918", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b591a", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b5919", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b591a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b591b", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b591c", + "_tpl": "5645bcc04bdc2d363b8b4572", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 21 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout" + }, { + "_id": "5fe4a66e40ca750fd72b591d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b591e", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4a66e40ca750fd72b591f", + "_tpl": "5887431f2459777e1612938f", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 21 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 40 + } + }, { + "_id": "5fe4a66e40ca750fd72b5923", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5921", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4a66e40ca750fd72b5923", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b5920", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b5921", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b5922", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4a66e40ca750fd72b5923", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a66e40ca750fd72b592d", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5924", + "_tpl": "5998517986f7746017232f7e", + "parentId": "5fe4a66e40ca750fd72b592d", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a66e40ca750fd72b5925", + "_tpl": "599851db86f77467372f0a18", + "parentId": "5fe4a66e40ca750fd72b592d", + "slotId": "mod_stock" + }, { + "_id": "5fe4a66e40ca750fd72b5927", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "5fe4a66e40ca750fd72b592d", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b5926", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b5927", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b5928", + "_tpl": "5998597786f77414ea6da093", + "parentId": "5fe4a66e40ca750fd72b592d", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a66e40ca750fd72b5929", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "5fe4a66e40ca750fd72b592d", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a66e40ca750fd72b592a", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "5fe4a66e40ca750fd72b592d", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b592c", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "5fe4a66e40ca750fd72b592d", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a66e40ca750fd72b592b", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a66e40ca750fd72b592c", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a66e40ca750fd72b5931", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b592f", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4a66e40ca750fd72b5931", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b592e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b592f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b5930", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4a66e40ca750fd72b5931", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a66e40ca750fd72b5935", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5933", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4a66e40ca750fd72b5935", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b5932", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b5933", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4a66e40ca750fd72b5934", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4a66e40ca750fd72b5935", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a66e40ca750fd72b593f", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5936", + "_tpl": "5998517986f7746017232f7e", + "parentId": "5fe4a66e40ca750fd72b593f", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a66e40ca750fd72b5937", + "_tpl": "599851db86f77467372f0a18", + "parentId": "5fe4a66e40ca750fd72b593f", + "slotId": "mod_stock" + }, { + "_id": "5fe4a66e40ca750fd72b5939", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "5fe4a66e40ca750fd72b593f", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b5938", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4a66e40ca750fd72b5939", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b593a", + "_tpl": "5998597786f77414ea6da093", + "parentId": "5fe4a66e40ca750fd72b593f", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a66e40ca750fd72b593b", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "5fe4a66e40ca750fd72b593f", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a66e40ca750fd72b593c", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "5fe4a66e40ca750fd72b593f", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b593e", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "5fe4a66e40ca750fd72b593f", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a66e40ca750fd72b593d", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a66e40ca750fd72b593e", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a66e40ca750fd72b5949", + "_tpl": "5ac4cd105acfc40016339859", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 16 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5941", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "5fe4a66e40ca750fd72b5949", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4a66e40ca750fd72b5940", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4a66e40ca750fd72b5941", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a66e40ca750fd72b5942", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "5fe4a66e40ca750fd72b5949", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a66e40ca750fd72b5943", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "5fe4a66e40ca750fd72b5949", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4a66e40ca750fd72b5944", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "5fe4a66e40ca750fd72b5949", + "slotId": "mod_reciever" + }, { + "_id": "5fe4a66e40ca750fd72b5945", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "5fe4a66e40ca750fd72b5949", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5946", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "5fe4a66e40ca750fd72b5949", + "slotId": "mod_stock" + }, { + "_id": "5fe4a66e40ca750fd72b5948", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "5fe4a66e40ca750fd72b5949", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b5947", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "5fe4a66e40ca750fd72b5948", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4a66e40ca750fd72b5952", + "_tpl": "5e870397991fd70db46995c8", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 18 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b594b", + "_tpl": "5e87071478f43e51ca2de5e1", + "parentId": "5fe4a66e40ca750fd72b5952", + "slotId": "mod_barrel" + }, { + "_id": "5fe4a66e40ca750fd72b594a", + "_tpl": "5e8708d4ae379e67d22e0102", + "parentId": "5fe4a66e40ca750fd72b594b", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b594c", + "_tpl": "5e87076ce2db31558c75a11d", + "parentId": "5fe4a66e40ca750fd72b5952", + "slotId": "mod_handguard" + }, { + "_id": "5fe4a66e40ca750fd72b594e", + "_tpl": "5e87080c81c4ed43e83cefda", + "parentId": "5fe4a66e40ca750fd72b5952", + "slotId": "mod_magazine" + }, { + "_id": "5fe4a66e40ca750fd72b594d", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4a66e40ca750fd72b594e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 8 + } + }, { + "_id": "5fe4a66e40ca750fd72b594f", + "_tpl": "5e87116b81c4ed43e83cefdd", + "parentId": "5fe4a66e40ca750fd72b5952", + "slotId": "mod_stock" + }, { + "_id": "5fe4a66e40ca750fd72b5950", + "_tpl": "5e87114fe2db31558c75a120", + "parentId": "5fe4a66e40ca750fd72b5952", + "slotId": "mod_mount", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5951", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4a66e40ca750fd72b5952", + "slotId": "patron_in_weapon" + }, { + "_id": "5fe4a66e40ca750fd72b5959", + "_tpl": "55801eed4bdc2d89578b4588", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 19 + }, + "parentId": "5fe4a66e40ca750fd72b595a", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b5956", + "_tpl": "56083eab4bdc2d26448b456a", + "parentId": "5fe4a66e40ca750fd72b5959", + "slotId": "mod_tactical" + }, { + "_id": "5fe4a66e40ca750fd72b5957", + "_tpl": "560e620e4bdc2d724b8b456b", + "parentId": "5fe4a66e40ca750fd72b5959", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4a66e40ca750fd72b5958", + "_tpl": "61faa91878830f069b6b7967", + "parentId": "5fe4a66e40ca750fd72b5959", + "slotId": "mod_stock" + }, { + "_id": "969ff4763565268bc52e4d2e", + "_tpl": "56ea8222d2720b69698b4567", + "parentId": "5fe4a66e40ca750fd72b5958", + "slotId": "mod_bipod", + "upd": { + "StackObjectsCount": 1 + } + }, { + "_id": "f5de5b058e07bcacee8c97d0", + "_tpl": "5d0a29fed7ad1a002769ad08", + "parentId": "5fe4a66e40ca750fd72b5959", + "slotId": "mod_scope" + }, { + "_id": "719317c75d4325f6a48a14a6", + "_tpl": "5d0a3e8cd7ad1a6f6a3d35bd", + "parentId": "f5de5b058e07bcacee8c97d0", + "slotId": "mod_scope", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4a66e40ca750fd72b595c", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe4a66e40ca750fd72b595b", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + } + ], + "questRaidItems": "5fe4a66e40ca750fd72b595b", + "questStashItems": "5fe4a66e40ca750fd72b595c", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe4a66e40ca750fd72b595a" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836e6", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe4a9fcf5aec236ec3836ed", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4a9fcf5aec236ec3836e5", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe4a9fcf5aec236ec3836e6", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a9fcf5aec236ec3836e7", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe4a9fcf5aec236ec3836ed", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a9fcf5aec236ec3836ea", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe4a9fcf5aec236ec3836ed", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a9fcf5aec236ec3836e8", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe4a9fcf5aec236ec3836ea", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836e9", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe4a9fcf5aec236ec3836ea", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836ec", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe4a9fcf5aec236ec3836ed", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec3836eb", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a9fcf5aec236ec3836ec", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836f6", - "_tpl": "5e870397991fd70db46995c8", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 16 - }, - "parentId": "5fe4a9fcf5aec236ec3836f7", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Notes": { + "Notes": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" }, - { - "_id": "5fe4a9fcf5aec236ec3836ef", - "_tpl": "5e87071478f43e51ca2de5e1", - "parentId": "5fe4a9fcf5aec236ec3836f6", - "slotId": "mod_barrel" + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cd946231388ce000d572fe3", + "5cd945d71388ce000a659dfb" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0.2, + "jaegerUnlocked": false }, - { - "_id": "5fe4a9fcf5aec236ec3836ee", - "_tpl": "5e8708d4ae379e67d22e0102", - "parentId": "5fe4a9fcf5aec236ec3836ef", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836f0", - "_tpl": "5e87076ce2db31558c75a11d", - "parentId": "5fe4a9fcf5aec236ec3836f6", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a9fcf5aec236ec3836f2", - "_tpl": "5e87080c81c4ed43e83cefda", - "parentId": "5fe4a9fcf5aec236ec3836f6", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a9fcf5aec236ec3836f1", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4a9fcf5aec236ec3836f2", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 8 - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836f3", - "_tpl": "5e87116b81c4ed43e83cefdd", - "parentId": "5fe4a9fcf5aec236ec3836f6", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a9fcf5aec236ec3836f4", - "_tpl": "5e87114fe2db31558c75a120", - "parentId": "5fe4a9fcf5aec236ec3836f6", - "slotId": "mod_mount", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a9fcf5aec236ec3836f5", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4a9fcf5aec236ec3836f6", - "slotId": "patron_in_weapon" - }, - { - "_id": "5fe4a9fcf5aec236ec3836f9", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe4a9fcf5aec236ec3836f8", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - } - ], - "questRaidItems": "5fe4a9fcf5aec236ec3836f8", - "questStashItems": "5fe4a9fcf5aec236ec3836f9", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe4a9fcf5aec236ec3836f7" + "weaponbuilds": {} }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cde9ec17d6c8b04723cf479", - "5cde9e957d6c8b0474535da7" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0, - "jaegerUnlocked": false - }, - "weaponbuilds": {} - } - }, - "Prepare To Escape": { - "bear": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cc0858d14c02e000c6bea66", - "Feet": "5cc085bb14c02e000e67a5c5", - "Hands": "5cc0876314c02e000c6bea6b", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "54491bb74bdc2d09088b4567": false, - "544a11ac4bdc2d470e8b456a": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": false, - "544fb45d4bdc2dee738b4568": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "55801eed4bdc2d89578b4588": false, - "559ba5b34bdc2d1f1a8b4582": false, - "55d480c04bdc2d1d4e8b456a": false, - "55d482194bdc2d1d4e8b456b": true, - "55d7217a4bdc2d86028b456d": false, - "56083e1b4bdc2dc8488b4572": false, - "56083eab4bdc2d26448b456a": false, - "560d5e524bdc2d25448b4571": false, - "560e620e4bdc2d724b8b456b": false, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "564ca99c4bdc2d16268b4589": false, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59d3ad2720bdb418b4577": false, - "56dfef82d2720bbd668b4567": true, - "56dff3afd2720bba668b4567": false, - "56ea8222d2720b69698b4567": false, - "5710c24ad2720bc3458b45a3": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce662459770f6f490f32": false, - "584984812459776a704a82a6": true, - "5857a8b324597729ab0a0e7d": false, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": false, - "590c5d4b86f774784e1b9c45": false, - "590c661e86f7741e566b646a": false, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": false, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "5a0c27731526d80618476ac4": false, - "5aa2b87de5b5b00016327c25": false, - "5aa7cfc0e5b5b00015693143": false, - "5ab8f39486f7745cd93a1cca": false, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac72e475acfc400180ae6fe": false, - "5ac7655e5acfc40016339a19": false, - "5af0454c86f7746bf20992e8": false, - "5b40e5e25acfc4001a599bea": false, - "5b432b965acfc47a8774094e": false, - "5bffdc370db834001d23eca8": false, - "5c0e53c886f7747fa54205c7": false, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": false, - "5d02778e86f774203e7dedbe": false, - "5d0a29fed7ad1a002769ad08": false, - "5d0a3e8cd7ad1a6f6a3d35bd": false, - "5d1b36a186f7742523398433": false, - "5d1b371186f774253763a656": false, - "5d40407c86f774318526545a": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e870397991fd70db46995c8": false, - "5e87071478f43e51ca2de5e1": false, - "5e87076ce2db31558c75a11d": false, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": false, - "5e87114fe2db31558c75a120": false, - "5e87116b81c4ed43e83cefdd": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608820335 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "prepare_for_escape", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Bear", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe4a66e40ca750fd72b5886", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe4a66e40ca750fd72b5886", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "5fe4a66e40ca750fd72b586f", - "_tpl": "5ac4cd105acfc40016339859", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" + "usec": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] }, - "Foldable": { - "Folded": false + "Customization": { + "Body": "5cde95d97d6c8b647a3769b0", + "Feet": "5cde95ef7d6c8b04713c4f2d", + "Hands": "5cde95fa7d6c8b04737c2d13", + "Head": "__REPLACEME__" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5867", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "5fe4a66e40ca750fd72b586f", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a66e40ca750fd72b5866", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a66e40ca750fd72b5867", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a66e40ca750fd72b5868", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "5fe4a66e40ca750fd72b586f", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a66e40ca750fd72b5869", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "5fe4a66e40ca750fd72b586f", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a66e40ca750fd72b586a", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "5fe4a66e40ca750fd72b586f", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a66e40ca750fd72b586b", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "5fe4a66e40ca750fd72b586f", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b586c", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "5fe4a66e40ca750fd72b586f", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a66e40ca750fd72b586e", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "5fe4a66e40ca750fd72b586f", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b586d", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "5fe4a66e40ca750fd72b586e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5870", - "_tpl": "5bffdc370db834001d23eca8", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 80, - "MaxDurability": 80 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5871", - "_tpl": "5b40e5e25acfc4001a599bea", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5879", - "_tpl": "5ca20abf86f77418567a43f2", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "TacticalVest" - }, - { - "_id": "5fe4a66e40ca750fd72b5873", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b5879", - "slotId": "1" - }, - { - "_id": "5fe4a66e40ca750fd72b5872", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a66e40ca750fd72b5873", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5875", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b5879", - "slotId": "2" - }, - { - "_id": "5fe4a66e40ca750fd72b5874", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a66e40ca750fd72b5875", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5877", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b5879", - "slotId": "3" - }, - { - "_id": "5fe4a66e40ca750fd72b5876", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a66e40ca750fd72b5877", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5878", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b5879", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b587a", - "_tpl": "5857a8b324597729ab0a0e7d", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "SecuredContainer" - }, - { - "_id": "5fe4a66e40ca750fd72b587f", - "_tpl": "5ca20d5986f774331e7c9602", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "Backpack" - }, - { - "_id": "5fe4a66e40ca750fd72b587b", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b587f", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4a66e40ca750fd72b587c", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 1 - }, - "parentId": "5fe4a66e40ca750fd72b587f", - "slotId": "main", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b587d", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b587f", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b587e", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b587f", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5880", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5884", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "Pockets" - }, - { - "_id": "5fe4a66e40ca750fd72b5881", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b5884", - "slotId": "pocket1" - }, - { - "_id": "5fe4a66e40ca750fd72b5882", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b5884", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5883", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b5884", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5885", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe4a66e40ca750fd72b5886", - "slotId": "Earpiece" - }, - { - "_id": "5fe4a66e40ca750fd72b595a", - "_tpl": "5811ce662459770f6f490f32" - }, - { - "_id": "5fe4a66e40ca750fd72b5887", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5888", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5889", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b588a", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 9 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b588b", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b588c", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250 - } - }, - { - "_id": "5fe4a66e40ca750fd72b588d", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b588e", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b588f", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5890", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5891", - "_tpl": "5d40407c86f774318526545a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5892", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5894", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5893", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b5894", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5895", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5896", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5897", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5898", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 11 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5899", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a66e40ca750fd72b589b", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b589a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b589b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b589d", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b589c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b589d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b589f", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b589e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b589f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a1", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58a0", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58a1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a2", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a3", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a4", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a5", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a6", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a7", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58a8", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58aa", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58a9", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58aa", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ac", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58ab", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58ac", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ae", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58ad", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58ae", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58b0", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58af", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58b0", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58b2", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58b1", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58b2", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58b3", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 11 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58b4", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 11 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58b5", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 17 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58b6", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58b7", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58b8", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58b9", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ba", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 18 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58bb", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58bc", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 15 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58bd", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 15 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58be", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58bf", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 9 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58c1", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 16 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58c0", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a66e40ca750fd72b58c1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58c3", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 16 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58c2", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a66e40ca750fd72b58c3", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58c5", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 16 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58c4", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a66e40ca750fd72b58c5", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58c6", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 18 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58c7", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 16 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58c9", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 16 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58c8", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4a66e40ca750fd72b58c9", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ca", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58cb", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58cc", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58cd", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ce", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58cf", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58d0", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58d1", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 24 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58d2", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58d3", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58d4", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58d5", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58d6", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58d7", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58d8", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58d9", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58da", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58db", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58dd", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58dc", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58dd", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58df", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58de", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b58df", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58e0", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 18 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58e1", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58e2", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 14 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58e3", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58e4", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58e5", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58e6", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58e7", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58e8", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58e9", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58ea", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58eb", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ec", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ed", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58ee", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 21 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58ef", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 18 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58f0", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 18 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58f1", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58f2", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 10 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58f3", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b58f4", - "_tpl": "5c0e53c886f7747fa54205c7", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 19 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 47, - "MaxDurability": 47 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58f5", - "_tpl": "5d1b36a186f7742523398433", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 29 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58f6", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 29 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b58fb", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 21 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58fc", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 22 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b58fd", - "_tpl": "5aa7cfc0e5b5b00015693143", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 23 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 25, - "MaxDurability": 25 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5901", - "_tpl": "559ba5b34bdc2d1f1a8b4582", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 20 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5900", - "_tpl": "5887431f2459777e1612938f", - "parentId": "5fe4a66e40ca750fd72b5901", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5903", - "_tpl": "559ba5b34bdc2d1f1a8b4582", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 19 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5902", - "_tpl": "5887431f2459777e1612938f", - "parentId": "5fe4a66e40ca750fd72b5903", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5904", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5905", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5906", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 2 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5907", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5908", - "_tpl": "5ab8f39486f7745cd93a1cca", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 21 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5909", - "_tpl": "557ff21e4bdc2d89578b4586", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 22 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b590a", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 24 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b590b", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 26 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b590c", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b590d", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 27 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b590e", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 25 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b590f", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5910", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 28 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5911", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 29 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5912", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 29 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5913", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 30 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5914", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 30 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5916", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5915", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b5916", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5918", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5917", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b5918", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b591a", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b5919", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b591a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b591b", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b591c", - "_tpl": "5645bcc04bdc2d363b8b4572", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 21 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout" - }, - { - "_id": "5fe4a66e40ca750fd72b591d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b591e", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4a66e40ca750fd72b591f", - "_tpl": "5887431f2459777e1612938f", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 21 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 40 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5923", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Encyclopedia": { + "5447a9cd4bdc2dbd208b4567": false, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "54491bb74bdc2d09088b4567": false, + "544a11ac4bdc2d470e8b456a": false, + "544a38634bdc2d58388b4568": true, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": true, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "54527a984bdc2d4e668b4567": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "55801eed4bdc2d89578b4588": true, + "559ba5b34bdc2d1f1a8b4582": true, + "55d355e64bdc2d962f8b4569": true, + "55d3632e4bdc2d972f8b4569": true, + "55d44fd14bdc2d962f8b456e": true, + "55d459824bdc2d892f8b4573": true, + "55d4887d4bdc2d962f8b4570": true, + "55d4ae6c4bdc2d8b2f8b456e": true, + "55d4af3a4bdc2d972f8b456f": true, + "55d4b9964bdc2d1d4e8b456e": true, + "55d5f46a4bdc2d1b198b4567": true, + "55d7217a4bdc2d86028b456d": false, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "5649be884bdc2d79388b4577": true, + "564ca99c4bdc2d16268b4589": false, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59856d2720bd8418b456a": true, + "56d59948d2720bb7418b4582": false, + "56d59d3ad2720bdb418b4577": false, + "56d5a1f7d2720bb3418b456a": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56d5a661d2720bd8418b456b": false, + "56d5a77ed2720b90418b4568": false, + "56dfef82d2720bbd668b4567": true, + "56e294cdd2720b603a8b4575": true, + "56ea8222d2720b69698b4567": true, + "56ea8d2fd2720b7c698b4570": true, + "5710c24ad2720bc3458b45a3": false, + "572b7fa524597762b747ce82": true, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": true, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": true, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": true, + "57c5ac0824597754771e88a9": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce662459770f6f490f32": false, + "584984812459776a704a82a6": true, + "5857a8b324597729ab0a0e7d": false, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "58d3db5386f77426186285a0": false, + "58dd3ad986f77403051cba8f": true, + "590c5f0d86f77413997acfab": false, + "590c661e86f7741e566b646a": true, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": true, + "5926bb2186f7744b1c6c6e60": true, + "5926c0df86f77462f647f764": true, + "5926c32286f774616e42de99": true, + "5926c36d86f77467a92a8629": true, + "5926c3b286f774640d189b6b": true, + "5926d2be86f774134d668e4e": true, + "5926d3c686f77410de68ebc8": true, + "5926e16e86f7742f5a0f7ecb": true, + "59c6633186f7740cf0493bb9": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "5a0c27731526d80618476ac4": true, + "5aa2a7e8e5b5b00016327c16": false, + "5aa7cfc0e5b5b00015693143": false, + "5aa7d03ae5b5b00016327db5": false, + "5ab8f39486f7745cd93a1cca": true, + "5ae30bad5acfc400185c2dc4": true, + "5ae30db85acfc408fb139a05": true, + "5ae30e795acfc408fb139a0b": true, + "5af0454c86f7746bf20992e8": true, + "5b44c8ea86f7742d1627baf1": true, + "5bfea6e90db834001b7347f3": true, + "5bfea7ad0db834001c38f1ee": true, + "5bfeaa0f0db834001b734927": true, + "5bfeb32b0db834001a6694d9": true, + "5bfebc320db8340019668d79": true, + "5bfebc5e0db834001a6694e5": true, + "5c0e53c886f7747fa54205c7": true, + "5c0e655586f774045612eeb2": true, + "5c0e9f2c86f77432297fe0a3": false, + "5c165d832e2216398b5a7e36": true, + "5cadc190ae921500103bb3b6": false, + "5cadc1c6ae9215000f2775a4": true, + "5cadc2e0ae9215051e1c21e7": true, + "5cadc390ae921500126a77f1": true, + "5cadc431ae921500113bb8d5": true, + "5cadc55cae921500103bb3be": true, + "5cadd919ae921500126a77f3": true, + "5cadd940ae9215051e1c2316": true, + "5d02778e86f774203e7dedbe": true, + "5d0a29fed7ad1a002769ad08": true, + "5d0a3e8cd7ad1a6f6a3d35bd": true, + "5d1b36a186f7742523398433": true, + "5d1b371186f774253763a656": true, + "5d2f213448f0355009199284": true, + "5d403f9186f7743cac3f229b": true, + "5e2af47786f7746d404f3aaa": true, + "5e2af4a786f7746d3f3c3400": true, + "5e4d34ca86f774264f758330": true, + "5e831507ea0a7c419c2f9bd9": false, + "5e870397991fd70db46995c8": true, + "5e87071478f43e51ca2de5e1": true, + "5e87076ce2db31558c75a11d": true, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": true, + "5e87114fe2db31558c75a120": true, + "5e87116b81c4ed43e83cefdd": true, + "5e9dcf5986f7746c417435b3": false }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5921", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4a66e40ca750fd72b5923", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b5920", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b5921", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5922", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4a66e40ca750fd72b5923", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a66e40ca750fd72b592d", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608821755 }, - "Foldable": { - "Folded": false + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5924", - "_tpl": "5998517986f7746017232f7e", - "parentId": "5fe4a66e40ca750fd72b592d", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a66e40ca750fd72b5925", - "_tpl": "599851db86f77467372f0a18", - "parentId": "5fe4a66e40ca750fd72b592d", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a66e40ca750fd72b5927", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "5fe4a66e40ca750fd72b592d", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b5926", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b5927", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5928", - "_tpl": "5998597786f77414ea6da093", - "parentId": "5fe4a66e40ca750fd72b592d", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a66e40ca750fd72b5929", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "5fe4a66e40ca750fd72b592d", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a66e40ca750fd72b592a", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "5fe4a66e40ca750fd72b592d", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b592c", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "5fe4a66e40ca750fd72b592d", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a66e40ca750fd72b592b", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a66e40ca750fd72b592c", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a66e40ca750fd72b5931", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "prepare_for_escape", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Usec", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b592f", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4a66e40ca750fd72b5931", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b592e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b592f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5930", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4a66e40ca750fd72b5931", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a66e40ca750fd72b5935", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "InsuredItems": [], + "Inventory": { + "equipment": "5fe4ab2240ca750fd72bbd3a", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe4ab2240ca750fd72bbd3a", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "5fe4ab2240ca750fd72bbd23", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd17", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe4ab2240ca750fd72bbd23", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4ab2240ca750fd72bbd19", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe4ab2240ca750fd72bbd23", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbd18", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd19", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd1f", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe4ab2240ca750fd72bbd23", + "slotId": "mod_reciever" + }, { + "_id": "5fe4ab2240ca750fd72bbd1c", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe4ab2240ca750fd72bbd1f", + "slotId": "mod_barrel" + }, { + "_id": "5fe4ab2240ca750fd72bbd1a", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe4ab2240ca750fd72bbd1c", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4ab2240ca750fd72bbd1b", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe4ab2240ca750fd72bbd1c", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4ab2240ca750fd72bbd1d", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe4ab2240ca750fd72bbd1f", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe4ab2240ca750fd72bbd1d", + "slotId": "mod_handguard" + }, { + "_id": "5fe4ab2240ca750fd72bbd1e", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe4ab2240ca750fd72bbd1f", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd21", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe4ab2240ca750fd72bbd23", + "slotId": "mod_stock" + }, { + "_id": "5fe4ab2240ca750fd72bbd20", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe4ab2240ca750fd72bbd21", + "slotId": "mod_stock_000" + }, { + "_id": "5fe4ab2240ca750fd72bbd22", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe4ab2240ca750fd72bbd23", + "slotId": "mod_charge" + }, { + "_id": "5fe4ab2240ca750fd72bbd24", + "_tpl": "54491bb74bdc2d09088b4567", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 70, + "MaxDurability": 70 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd25", + "_tpl": "572b7fa524597762b747ce82", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "FaceCover", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd26", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd2e", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "TacticalVest" + }, { + "_id": "5fe4ab2240ca750fd72bbd28", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd2e", + "slotId": "1" + }, { + "_id": "5fe4ab2240ca750fd72bbd27", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd28", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd2a", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd2e", + "slotId": "2" + }, { + "_id": "5fe4ab2240ca750fd72bbd29", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd2a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd2c", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd2e", + "slotId": "3" + }, { + "_id": "5fe4ab2240ca750fd72bbd2b", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd2c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd2d", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd2e", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd2f", + "_tpl": "5857a8b324597729ab0a0e7d", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "SecuredContainer" + }, { + "_id": "5fe4ab2240ca750fd72bbd33", + "_tpl": "5e9dcf5986f7746c417435b3", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "Backpack" + }, { + "_id": "5fe4ab2240ca750fd72bbd30", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd33", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd31", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd33", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd32", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd33", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd34", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd38", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "Pockets" + }, { + "_id": "5fe4ab2240ca750fd72bbd35", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd38", + "slotId": "pocket1" + }, { + "_id": "5fe4ab2240ca750fd72bbd36", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd38", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd37", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbd38", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd39", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe4ab2240ca750fd72bbd3a", + "slotId": "Earpiece" + }, { + "_id": "5fe4ab2240ca750fd72bbe1c", + "_tpl": "5811ce662459770f6f490f32" + }, { + "_id": "5fe4ab2240ca750fd72bbd3b", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 22 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd3c", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 9 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd3d", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd3f", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd3e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd3f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd41", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 14 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd40", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd41", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd42", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd43", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 26 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd44", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd45", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 27 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd46", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd48", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 15 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd47", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd48", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd49", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd4a", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 22 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd4c", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 14 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd4b", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd4c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd4d", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd4e", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd4f", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 26 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd50", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 22 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd51", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 14 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd52", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd53", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 11 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd54", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd55", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd56", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 22 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd57", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd58", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd59", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 27 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd5a", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 27 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd5b", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 22 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd5c", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd5d", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd5f", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd5e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd5f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd60", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 9 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd61", + "_tpl": "5d403f9186f7743cac3f229b", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd62", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd63", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd64", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 28 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd65", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd66", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd67", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 27 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd68", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 27 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd69", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 28 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd6a", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd6c", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd6b", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd6c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd6d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd6e", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd6f", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd70", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd71", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd72", + "_tpl": "590c695186f7741e566b64a2", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 23 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd73", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd75", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd74", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd75", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd77", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd76", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd77", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd79", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd78", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd79", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd7b", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd7a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd7b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd7c", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 29 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd7d", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 22 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbd7e", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd7f", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd80", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd81", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd83", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 19 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd82", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe4ab2240ca750fd72bbd83", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd84", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd86", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd85", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd86", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd88", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd87", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd88", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd8a", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd89", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd8a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd8b", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd8c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd8d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd8e", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 27 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd8f", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd90", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd92", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 14 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd91", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbd92", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd93", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd94", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd96", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd95", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd96", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd98", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd97", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd98", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd9a", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd99", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd9a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd9c", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd9b", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbd9c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbd9d", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 16 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd9e", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 15 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbd9f", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 23 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbda0", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 23 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbda1", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbda2", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbda3", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 23 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbda4", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbda5", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbda6", + "_tpl": "560d5e524bdc2d25448b4571", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbda7", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbda8", + "_tpl": "5d02778e86f774203e7dedbe", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 26 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbda9", + "_tpl": "5c0e655586f774045612eeb2", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 85, + "MaxDurability": 85 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdaa", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 24 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdab", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 28 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdac", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 29 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdad", + "_tpl": "557ff21e4bdc2d89578b4586", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 21 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdae", + "_tpl": "5ab8f39486f7745cd93a1cca", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 19 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb1", + "_tpl": "5c165d832e2216398b5a7e36", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 21 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdb2", + "_tpl": "5aa7d03ae5b5b00016327db5", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 20 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 25, + "MaxDurability": 25 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb3", + "_tpl": "5aa7d03ae5b5b00016327db5", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 20 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 25, + "MaxDurability": 25 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb4", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb5", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb6", + "_tpl": "5af0454c86f7746bf20992e8", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 28 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 5 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb7", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 26 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb8", + "_tpl": "5d1b36a186f7742523398433", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 27 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdb9", + "_tpl": "544fb45d4bdc2dee738b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 400 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdba", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 2 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdbb", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 20 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdbc", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 19 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdbd", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 20 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdbe", + "_tpl": "557ff21e4bdc2d89578b4586", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 20 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdbf", + "_tpl": "58dd3ad986f77403051cba8f", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 19 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdc1", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdc0", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe4ab2240ca750fd72bbdc1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdc3", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 17 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdc2", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe4ab2240ca750fd72bbdc3", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdc5", + "_tpl": "5bfeaa0f0db834001b734927", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 19 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdc4", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe4ab2240ca750fd72bbdc5", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdc6", + "_tpl": "58dd3ad986f77403051cba8f", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 16 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdc8", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 7 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdc7", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbdc8", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdc9", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdca", + "_tpl": "544fb3f34bdc2d03748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 25 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdcc", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdcb", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbdcc", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdce", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbdcd", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbdce", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdcf", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 28 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdd0", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 29 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdd1", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 29 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdd2", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 28 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdd3", + "_tpl": "5645bcc04bdc2d363b8b4572", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 21 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout" + }, { + "_id": "5fe4ab2240ca750fd72bbddc", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdd5", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe4ab2240ca750fd72bbddc", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbdd4", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbdd5", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdda", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe4ab2240ca750fd72bbddc", + "slotId": "mod_reciever" + }, { + "_id": "5fe4ab2240ca750fd72bbdd6", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe4ab2240ca750fd72bbdda", + "slotId": "mod_handguard" + }, { + "_id": "5fe4ab2240ca750fd72bbdd7", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe4ab2240ca750fd72bbdda", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdd8", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe4ab2240ca750fd72bbdda", + "slotId": "mod_stock" + }, { + "_id": "5fe4ab2240ca750fd72bbdd9", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe4ab2240ca750fd72bbdda", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4ab2240ca750fd72bbddb", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe4ab2240ca750fd72bbddc", + "slotId": "mod_charge" + }, { + "_id": "5fe4ab2240ca750fd72bbde5", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdde", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe4ab2240ca750fd72bbde5", + "slotId": "mod_barrel" + }, { + "_id": "5fe4ab2240ca750fd72bbddd", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe4ab2240ca750fd72bbdde", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4ab2240ca750fd72bbddf", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe4ab2240ca750fd72bbde5", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4ab2240ca750fd72bbde2", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe4ab2240ca750fd72bbde5", + "slotId": "mod_reciever" + }, { + "_id": "5fe4ab2240ca750fd72bbde0", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe4ab2240ca750fd72bbde2", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbde1", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe4ab2240ca750fd72bbde2", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbde4", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe4ab2240ca750fd72bbde5", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbde3", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbde4", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdee", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbde7", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe4ab2240ca750fd72bbdee", + "slotId": "mod_barrel" + }, { + "_id": "5fe4ab2240ca750fd72bbde6", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe4ab2240ca750fd72bbde7", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4ab2240ca750fd72bbde8", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe4ab2240ca750fd72bbdee", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4ab2240ca750fd72bbdeb", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe4ab2240ca750fd72bbdee", + "slotId": "mod_reciever" + }, { + "_id": "5fe4ab2240ca750fd72bbde9", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe4ab2240ca750fd72bbdeb", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdea", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe4ab2240ca750fd72bbdeb", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbded", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe4ab2240ca750fd72bbdee", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbdec", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbded", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdfb", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 14 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdef", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe4ab2240ca750fd72bbdfb", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4ab2240ca750fd72bbdf1", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe4ab2240ca750fd72bbdfb", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbdf0", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe4ab2240ca750fd72bbdf1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4ab2240ca750fd72bbdf7", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe4ab2240ca750fd72bbdfb", + "slotId": "mod_reciever" + }, { + "_id": "5fe4ab2240ca750fd72bbdf4", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe4ab2240ca750fd72bbdf7", + "slotId": "mod_barrel" + }, { + "_id": "5fe4ab2240ca750fd72bbdf2", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe4ab2240ca750fd72bbdf4", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4ab2240ca750fd72bbdf3", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe4ab2240ca750fd72bbdf4", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4ab2240ca750fd72bbdf5", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe4ab2240ca750fd72bbdf7", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe4ab2240ca750fd72bbdf5", + "slotId": "mod_handguard" + }, { + "_id": "5fe4ab2240ca750fd72bbdf6", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe4ab2240ca750fd72bbdf7", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdf9", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe4ab2240ca750fd72bbdfb", + "slotId": "mod_stock" + }, { + "_id": "5fe4ab2240ca750fd72bbdf8", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe4ab2240ca750fd72bbdf9", + "slotId": "mod_stock_000" + }, { + "_id": "5fe4ab2240ca750fd72bbdfa", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe4ab2240ca750fd72bbdfb", + "slotId": "mod_charge" + }, { + "_id": "5fe4ab2240ca750fd72bbe04", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdfd", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe4ab2240ca750fd72bbe04", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbdfc", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbdfd", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe4ab2240ca750fd72bbe02", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe4ab2240ca750fd72bbe04", + "slotId": "mod_reciever" + }, { + "_id": "5fe4ab2240ca750fd72bbdfe", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe4ab2240ca750fd72bbe02", + "slotId": "mod_handguard" + }, { + "_id": "5fe4ab2240ca750fd72bbdff", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe4ab2240ca750fd72bbe02", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe00", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe4ab2240ca750fd72bbe02", + "slotId": "mod_stock" + }, { + "_id": "5fe4ab2240ca750fd72bbe01", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe4ab2240ca750fd72bbe02", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4ab2240ca750fd72bbe03", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe4ab2240ca750fd72bbe04", + "slotId": "mod_charge" + }, { + "_id": "5fe4ab2240ca750fd72bbe0d", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe06", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe4ab2240ca750fd72bbe0d", + "slotId": "mod_barrel" + }, { + "_id": "5fe4ab2240ca750fd72bbe05", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe4ab2240ca750fd72bbe06", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4ab2240ca750fd72bbe07", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe4ab2240ca750fd72bbe0d", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4ab2240ca750fd72bbe0a", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe4ab2240ca750fd72bbe0d", + "slotId": "mod_reciever" + }, { + "_id": "5fe4ab2240ca750fd72bbe08", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe4ab2240ca750fd72bbe0a", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe09", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe4ab2240ca750fd72bbe0a", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe0c", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe4ab2240ca750fd72bbe0d", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbe0b", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4ab2240ca750fd72bbe0c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe4ab2240ca750fd72bbe16", + "_tpl": "5e870397991fd70db46995c8", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 16 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe0f", + "_tpl": "5e87071478f43e51ca2de5e1", + "parentId": "5fe4ab2240ca750fd72bbe16", + "slotId": "mod_barrel" + }, { + "_id": "5fe4ab2240ca750fd72bbe0e", + "_tpl": "5e8708d4ae379e67d22e0102", + "parentId": "5fe4ab2240ca750fd72bbe0f", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe10", + "_tpl": "5e87076ce2db31558c75a11d", + "parentId": "5fe4ab2240ca750fd72bbe16", + "slotId": "mod_handguard" + }, { + "_id": "5fe4ab2240ca750fd72bbe12", + "_tpl": "5e87080c81c4ed43e83cefda", + "parentId": "5fe4ab2240ca750fd72bbe16", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbe11", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4ab2240ca750fd72bbe12", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 8 + } + }, { + "_id": "5fe4ab2240ca750fd72bbe13", + "_tpl": "5e87116b81c4ed43e83cefdd", + "parentId": "5fe4ab2240ca750fd72bbe16", + "slotId": "mod_stock" + }, { + "_id": "5fe4ab2240ca750fd72bbe14", + "_tpl": "5e87114fe2db31558c75a120", + "parentId": "5fe4ab2240ca750fd72bbe16", + "slotId": "mod_mount", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe15", + "_tpl": "560d5e524bdc2d25448b4571", + "parentId": "5fe4ab2240ca750fd72bbe16", + "slotId": "patron_in_weapon" + }, { + "_id": "5fe4ab2240ca750fd72bbe1b", + "_tpl": "5bfea6e90db834001b7347f3", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 18 + }, + "parentId": "5fe4ab2240ca750fd72bbe1c", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbdaf", + "_tpl": "5bfebc5e0db834001a6694e5", + "parentId": "5fe4ab2240ca750fd72bbe1b", + "slotId": "mod_mount" + }, { + "_id": "5fe4ab2240ca750fd72bbdb0", + "_tpl": "57c5ac0824597754771e88a9", + "parentId": "5fe4ab2240ca750fd72bbdaf", + "slotId": "mod_scope", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4ab2240ca750fd72bbe18", + "_tpl": "5bfeaa0f0db834001b734927", + "parentId": "5fe4ab2240ca750fd72bbe1b", + "slotId": "mod_magazine" + }, { + "_id": "5fe4ab2240ca750fd72bbe17", + "_tpl": "58dd3ad986f77403051cba8f", + "parentId": "5fe4ab2240ca750fd72bbe18", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 10 + } + }, { + "_id": "5fe4ab2240ca750fd72bbe19", + "_tpl": "5bfeb32b0db834001a6694d9", + "parentId": "5fe4ab2240ca750fd72bbe1b", + "slotId": "mod_stock" + }, { + "_id": "5fe4ab2240ca750fd72bbe1a", + "_tpl": "5bfebc320db8340019668d79", + "parentId": "5fe4ab2240ca750fd72bbe1b", + "slotId": "mod_barrel" + }, { + "_id": "5fe4ab2240ca750fd72bbe1e", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe4ab2240ca750fd72bbe1d", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + } + ], + "questRaidItems": "5fe4ab2240ca750fd72bbe1d", + "questStashItems": "5fe4ab2240ca750fd72bbe1e", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe4ab2240ca750fd72bbe1c" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5933", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4a66e40ca750fd72b5935", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b5932", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b5933", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5934", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4a66e40ca750fd72b5935", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a66e40ca750fd72b593f", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Notes": { + "Notes": [] }, - "Foldable": { - "Folded": false + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5936", - "_tpl": "5998517986f7746017232f7e", - "parentId": "5fe4a66e40ca750fd72b593f", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a66e40ca750fd72b5937", - "_tpl": "599851db86f77467372f0a18", - "parentId": "5fe4a66e40ca750fd72b593f", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a66e40ca750fd72b5939", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "5fe4a66e40ca750fd72b593f", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b5938", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4a66e40ca750fd72b5939", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b593a", - "_tpl": "5998597786f77414ea6da093", - "parentId": "5fe4a66e40ca750fd72b593f", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a66e40ca750fd72b593b", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "5fe4a66e40ca750fd72b593f", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a66e40ca750fd72b593c", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "5fe4a66e40ca750fd72b593f", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b593e", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "5fe4a66e40ca750fd72b593f", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a66e40ca750fd72b593d", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a66e40ca750fd72b593e", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a66e40ca750fd72b5949", - "_tpl": "5ac4cd105acfc40016339859", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 16 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 }, - "Foldable": { - "Folded": false + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5941", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "5fe4a66e40ca750fd72b5949", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4a66e40ca750fd72b5940", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4a66e40ca750fd72b5941", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a66e40ca750fd72b5942", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "5fe4a66e40ca750fd72b5949", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a66e40ca750fd72b5943", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "5fe4a66e40ca750fd72b5949", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4a66e40ca750fd72b5944", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "5fe4a66e40ca750fd72b5949", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4a66e40ca750fd72b5945", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "5fe4a66e40ca750fd72b5949", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5946", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "5fe4a66e40ca750fd72b5949", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a66e40ca750fd72b5948", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "5fe4a66e40ca750fd72b5949", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b5947", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "5fe4a66e40ca750fd72b5948", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4a66e40ca750fd72b5952", - "_tpl": "5e870397991fd70db46995c8", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 18 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b594b", - "_tpl": "5e87071478f43e51ca2de5e1", - "parentId": "5fe4a66e40ca750fd72b5952", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4a66e40ca750fd72b594a", - "_tpl": "5e8708d4ae379e67d22e0102", - "parentId": "5fe4a66e40ca750fd72b594b", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b594c", - "_tpl": "5e87076ce2db31558c75a11d", - "parentId": "5fe4a66e40ca750fd72b5952", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4a66e40ca750fd72b594e", - "_tpl": "5e87080c81c4ed43e83cefda", - "parentId": "5fe4a66e40ca750fd72b5952", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4a66e40ca750fd72b594d", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4a66e40ca750fd72b594e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 8 - } - }, - { - "_id": "5fe4a66e40ca750fd72b594f", - "_tpl": "5e87116b81c4ed43e83cefdd", - "parentId": "5fe4a66e40ca750fd72b5952", - "slotId": "mod_stock" - }, - { - "_id": "5fe4a66e40ca750fd72b5950", - "_tpl": "5e87114fe2db31558c75a120", - "parentId": "5fe4a66e40ca750fd72b5952", - "slotId": "mod_mount", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5951", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4a66e40ca750fd72b5952", - "slotId": "patron_in_weapon" - }, - { - "_id": "5fe4a66e40ca750fd72b5959", - "_tpl": "55801eed4bdc2d89578b4588", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 19 - }, - "parentId": "5fe4a66e40ca750fd72b595a", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b5956", - "_tpl": "56083eab4bdc2d26448b456a", - "parentId": "5fe4a66e40ca750fd72b5959", - "slotId": "mod_tactical" - }, - { - "_id": "5fe4a66e40ca750fd72b5957", - "_tpl": "560e620e4bdc2d724b8b456b", - "parentId": "5fe4a66e40ca750fd72b5959", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4a66e40ca750fd72b5958", - "_tpl": "61faa91878830f069b6b7967", - "parentId": "5fe4a66e40ca750fd72b5959", - "slotId": "mod_stock" - }, - { - "_id": "969ff4763565268bc52e4d2e", - "_tpl": "56ea8222d2720b69698b4567", - "parentId": "5fe4a66e40ca750fd72b5958", - "slotId": "mod_bipod", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "f5de5b058e07bcacee8c97d0", - "_tpl": "5d0a29fed7ad1a002769ad08", - "parentId": "5fe4a66e40ca750fd72b5959", - "slotId": "mod_scope" - }, - { - "_id": "719317c75d4325f6a48a14a6", - "_tpl": "5d0a3e8cd7ad1a6f6a3d35bd", - "parentId": "f5de5b058e07bcacee8c97d0", - "slotId": "mod_scope", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4a66e40ca750fd72b595c", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe4a66e40ca750fd72b595b", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - } - ], - "questRaidItems": "5fe4a66e40ca750fd72b595b", - "questStashItems": "5fe4a66e40ca750fd72b595c", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe4a66e40ca750fd72b595a" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cd946231388ce000d572fe3", - "5cd945d71388ce000a659dfb" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0.2, - "jaegerUnlocked": false - }, - "weaponbuilds": {} + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cde9ec17d6c8b04723cf479", + "5cde9e957d6c8b0474535da7" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0.2, + "jaegerUnlocked": false + }, + "weaponbuilds": {} + } }, - "usec": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cde95d97d6c8b647a3769b0", - "Feet": "5cde95ef7d6c8b04713c4f2d", - "Hands": "5cde95fa7d6c8b04737c2d13", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447a9cd4bdc2dbd208b4567": false, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "54491bb74bdc2d09088b4567": false, - "544a11ac4bdc2d470e8b456a": false, - "544a38634bdc2d58388b4568": true, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": true, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "54527a984bdc2d4e668b4567": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "55801eed4bdc2d89578b4588": true, - "559ba5b34bdc2d1f1a8b4582": true, - "55d355e64bdc2d962f8b4569": true, - "55d3632e4bdc2d972f8b4569": true, - "55d44fd14bdc2d962f8b456e": true, - "55d459824bdc2d892f8b4573": true, - "55d4887d4bdc2d962f8b4570": true, - "55d4ae6c4bdc2d8b2f8b456e": true, - "55d4af3a4bdc2d972f8b456f": true, - "55d4b9964bdc2d1d4e8b456e": true, - "55d5f46a4bdc2d1b198b4567": true, - "55d7217a4bdc2d86028b456d": false, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "5649be884bdc2d79388b4577": true, - "564ca99c4bdc2d16268b4589": false, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59856d2720bd8418b456a": true, - "56d59948d2720bb7418b4582": false, - "56d59d3ad2720bdb418b4577": false, - "56d5a1f7d2720bb3418b456a": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56d5a661d2720bd8418b456b": false, - "56d5a77ed2720b90418b4568": false, - "56dfef82d2720bbd668b4567": true, - "56e294cdd2720b603a8b4575": true, - "56ea8222d2720b69698b4567": true, - "56ea8d2fd2720b7c698b4570": true, - "5710c24ad2720bc3458b45a3": false, - "572b7fa524597762b747ce82": true, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": true, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": true, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": true, - "57c5ac0824597754771e88a9": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce662459770f6f490f32": false, - "584984812459776a704a82a6": true, - "5857a8b324597729ab0a0e7d": false, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "58d3db5386f77426186285a0": false, - "58dd3ad986f77403051cba8f": true, - "590c5f0d86f77413997acfab": false, - "590c661e86f7741e566b646a": true, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": true, - "5926bb2186f7744b1c6c6e60": true, - "5926c0df86f77462f647f764": true, - "5926c32286f774616e42de99": true, - "5926c36d86f77467a92a8629": true, - "5926c3b286f774640d189b6b": true, - "5926d2be86f774134d668e4e": true, - "5926d3c686f77410de68ebc8": true, - "5926e16e86f7742f5a0f7ecb": true, - "59c6633186f7740cf0493bb9": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "5a0c27731526d80618476ac4": true, - "5aa2a7e8e5b5b00016327c16": false, - "5aa7cfc0e5b5b00015693143": false, - "5aa7d03ae5b5b00016327db5": false, - "5ab8f39486f7745cd93a1cca": true, - "5ae30bad5acfc400185c2dc4": true, - "5ae30db85acfc408fb139a05": true, - "5ae30e795acfc408fb139a0b": true, - "5af0454c86f7746bf20992e8": true, - "5b44c8ea86f7742d1627baf1": true, - "5bfea6e90db834001b7347f3": true, - "5bfea7ad0db834001c38f1ee": true, - "5bfeaa0f0db834001b734927": true, - "5bfeb32b0db834001a6694d9": true, - "5bfebc320db8340019668d79": true, - "5bfebc5e0db834001a6694e5": true, - "5c0e53c886f7747fa54205c7": true, - "5c0e655586f774045612eeb2": true, - "5c0e9f2c86f77432297fe0a3": false, - "5c165d832e2216398b5a7e36": true, - "5cadc190ae921500103bb3b6": false, - "5cadc1c6ae9215000f2775a4": true, - "5cadc2e0ae9215051e1c21e7": true, - "5cadc390ae921500126a77f1": true, - "5cadc431ae921500113bb8d5": true, - "5cadc55cae921500103bb3be": true, - "5cadd919ae921500126a77f3": true, - "5cadd940ae9215051e1c2316": true, - "5d02778e86f774203e7dedbe": true, - "5d0a29fed7ad1a002769ad08": true, - "5d0a3e8cd7ad1a6f6a3d35bd": true, - "5d1b36a186f7742523398433": true, - "5d1b371186f774253763a656": true, - "5d2f213448f0355009199284": true, - "5d403f9186f7743cac3f229b": true, - "5e2af47786f7746d404f3aaa": true, - "5e2af4a786f7746d3f3c3400": true, - "5e4d34ca86f774264f758330": true, - "5e831507ea0a7c419c2f9bd9": false, - "5e870397991fd70db46995c8": true, - "5e87071478f43e51ca2de5e1": true, - "5e87076ce2db31558c75a11d": true, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": true, - "5e87114fe2db31558c75a120": true, - "5e87116b81c4ed43e83cefdd": true, - "5e9dcf5986f7746c417435b3": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608821755 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "prepare_for_escape", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Usec", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe4ab2240ca750fd72bbd3a", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe4ab2240ca750fd72bbd3a", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "5fe4ab2240ca750fd72bbd23", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" + "SPT Developer": { + "descriptionLocaleKey": "launcher-profile_sptdeveloper", + "bear": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c6", + "templateId": "5811ce772459770e9e5f9532", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd17", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe4ab2240ca750fd72bbd23", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4ab2240ca750fd72bbd19", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe4ab2240ca750fd72bbd23", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbd18", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd19", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd1f", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe4ab2240ca750fd72bbd23", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4ab2240ca750fd72bbd1c", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe4ab2240ca750fd72bbd1f", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4ab2240ca750fd72bbd1a", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe4ab2240ca750fd72bbd1c", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4ab2240ca750fd72bbd1b", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe4ab2240ca750fd72bbd1c", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4ab2240ca750fd72bbd1d", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe4ab2240ca750fd72bbd1f", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe4ab2240ca750fd72bbd1d", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4ab2240ca750fd72bbd1e", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe4ab2240ca750fd72bbd1f", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd21", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe4ab2240ca750fd72bbd23", - "slotId": "mod_stock" - }, - { - "_id": "5fe4ab2240ca750fd72bbd20", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe4ab2240ca750fd72bbd21", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe4ab2240ca750fd72bbd22", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe4ab2240ca750fd72bbd23", - "slotId": "mod_charge" - }, - { - "_id": "5fe4ab2240ca750fd72bbd24", - "_tpl": "54491bb74bdc2d09088b4567", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 70, - "MaxDurability": 70 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd25", - "_tpl": "572b7fa524597762b747ce82", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "FaceCover", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd26", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd2e", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "TacticalVest" - }, - { - "_id": "5fe4ab2240ca750fd72bbd28", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd2e", - "slotId": "1" - }, - { - "_id": "5fe4ab2240ca750fd72bbd27", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd28", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd2a", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd2e", - "slotId": "2" - }, - { - "_id": "5fe4ab2240ca750fd72bbd29", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd2a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd2c", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd2e", - "slotId": "3" - }, - { - "_id": "5fe4ab2240ca750fd72bbd2b", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd2c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd2d", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd2e", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd2f", - "_tpl": "5857a8b324597729ab0a0e7d", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "SecuredContainer" - }, - { - "_id": "5fe4ab2240ca750fd72bbd33", - "_tpl": "5e9dcf5986f7746c417435b3", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "Backpack" - }, - { - "_id": "5fe4ab2240ca750fd72bbd30", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd33", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd31", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd33", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd32", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd33", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd34", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd38", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "Pockets" - }, - { - "_id": "5fe4ab2240ca750fd72bbd35", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd38", - "slotId": "pocket1" - }, - { - "_id": "5fe4ab2240ca750fd72bbd36", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd38", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd37", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbd38", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd39", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe4ab2240ca750fd72bbd3a", - "slotId": "Earpiece" - }, - { - "_id": "5fe4ab2240ca750fd72bbe1c", - "_tpl": "5811ce662459770f6f490f32" - }, - { - "_id": "5fe4ab2240ca750fd72bbd3b", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 22 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd3c", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 9 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd3d", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd3f", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd3e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd3f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd41", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 14 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd40", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd41", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd42", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd43", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 26 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd44", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd45", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 27 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd46", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd48", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 15 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd47", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd48", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd49", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd4a", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 22 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd4c", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 14 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd4b", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd4c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd4d", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd4e", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd4f", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 26 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd50", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 22 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd51", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 14 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd52", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd53", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 11 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd54", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd55", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd56", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 22 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd57", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd58", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd59", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 27 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd5a", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 27 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd5b", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 22 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd5c", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd5d", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd5f", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd5e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd5f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd60", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 9 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd61", - "_tpl": "5d403f9186f7743cac3f229b", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd62", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd63", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd64", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 28 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd65", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd66", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd67", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 27 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd68", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 27 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd69", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 28 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd6a", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd6c", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd6b", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd6c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd6d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd6e", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd6f", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd70", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd71", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd72", - "_tpl": "590c695186f7741e566b64a2", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 23 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd73", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd75", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd74", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd75", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd77", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd76", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd77", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd79", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd78", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd79", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd7b", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd7a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd7b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd7c", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 29 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd7d", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 22 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd7e", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd7f", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd80", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd81", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd83", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 19 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd82", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe4ab2240ca750fd72bbd83", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd84", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd86", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd85", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd86", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd88", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd87", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd88", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd8a", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd89", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd8a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd8b", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd8c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd8d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd8e", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 27 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd8f", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd90", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd92", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 14 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd91", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbd92", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd93", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd94", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd96", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd95", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd96", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd98", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd97", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd98", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd9a", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd99", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd9a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd9c", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd9b", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbd9c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbd9d", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 16 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd9e", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 15 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbd9f", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 23 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda0", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 23 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda1", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda2", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda3", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 23 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda4", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda5", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda6", - "_tpl": "560d5e524bdc2d25448b4571", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda7", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda8", - "_tpl": "5d02778e86f774203e7dedbe", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 26 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbda9", - "_tpl": "5c0e655586f774045612eeb2", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 85, - "MaxDurability": 85 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdaa", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 24 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdab", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 28 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdac", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 29 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdad", - "_tpl": "557ff21e4bdc2d89578b4586", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 21 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdae", - "_tpl": "5ab8f39486f7745cd93a1cca", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 19 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb1", - "_tpl": "5c165d832e2216398b5a7e36", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 21 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdb2", - "_tpl": "5aa7d03ae5b5b00016327db5", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 20 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 25, - "MaxDurability": 25 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb3", - "_tpl": "5aa7d03ae5b5b00016327db5", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 20 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 25, - "MaxDurability": 25 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb4", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb5", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb6", - "_tpl": "5af0454c86f7746bf20992e8", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 28 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 5 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb7", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 26 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb8", - "_tpl": "5d1b36a186f7742523398433", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 27 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdb9", - "_tpl": "544fb45d4bdc2dee738b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 400 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdba", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 2 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdbb", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 20 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdbc", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 19 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdbd", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 20 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdbe", - "_tpl": "557ff21e4bdc2d89578b4586", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 20 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdbf", - "_tpl": "58dd3ad986f77403051cba8f", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 19 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdc1", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdc0", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe4ab2240ca750fd72bbdc1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdc3", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 17 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdc2", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe4ab2240ca750fd72bbdc3", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdc5", - "_tpl": "5bfeaa0f0db834001b734927", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 19 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdc4", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe4ab2240ca750fd72bbdc5", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdc6", - "_tpl": "58dd3ad986f77403051cba8f", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 16 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdc8", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 7 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdc7", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbdc8", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdc9", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdca", - "_tpl": "544fb3f34bdc2d03748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 25 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdcc", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdcb", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbdcc", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdce", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbdcd", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbdce", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdcf", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 28 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdd0", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 29 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdd1", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 29 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdd2", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 28 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdd3", - "_tpl": "5645bcc04bdc2d363b8b4572", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 21 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout" - }, - { - "_id": "5fe4ab2240ca750fd72bbddc", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Customization": { + "Body": "5cc0858d14c02e000c6bea66", + "Feet": "5cc085bb14c02e000e67a5c5", + "Hands": "5cc0876314c02e000c6bea6b", + "Head": "__REPLACEME__" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdd5", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe4ab2240ca750fd72bbddc", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbdd4", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbdd5", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdda", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe4ab2240ca750fd72bbddc", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4ab2240ca750fd72bbdd6", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe4ab2240ca750fd72bbdda", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4ab2240ca750fd72bbdd7", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe4ab2240ca750fd72bbdda", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdd8", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe4ab2240ca750fd72bbdda", - "slotId": "mod_stock" - }, - { - "_id": "5fe4ab2240ca750fd72bbdd9", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe4ab2240ca750fd72bbdda", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4ab2240ca750fd72bbddb", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe4ab2240ca750fd72bbddc", - "slotId": "mod_charge" - }, - { - "_id": "5fe4ab2240ca750fd72bbde5", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Encyclopedia": { + "5447ac644bdc2d6c208b4567": true, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448c1d04bdc2dff2f8b4569": true, + "5448fee04bdc2dbc018b4567": false, + "5448ff904bdc2d6f028b456e": true, + "5449016a4bdc2d6f028b456f": false, + "544909bb4bdc2d6f028b4577": true, + "544a11ac4bdc2d470e8b456a": false, + "544a378f4bdc2d30388b4567": true, + "544a37c44bdc2d25388b4567": true, + "544a38634bdc2d58388b4568": true, + "544a3a774bdc2d3a388b4567": true, + "544a5caa4bdc2d1a388b4568": true, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": true, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "544fb62a4bdc2dfb738b4568": true, + "544fb6cc4bdc2d34748b456e": true, + "54527a984bdc2d4e668b4567": true, + "54527ac44bdc2d36668b4567": true, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "5580169d4bdc2d9d138b4585": true, + "55801eed4bdc2d89578b4588": true, + "5580223e4bdc2d1c128b457f": true, + "558022b54bdc2dac148b458d": true, + "55802d5f4bdc2dac148b458e": true, + "55802f5d4bdc2dac148b458f": true, + "558032614bdc2de7118b4585": true, + "559ba5b34bdc2d1f1a8b4582": true, + "55d355e64bdc2d962f8b4569": true, + "55d35ee94bdc2d61338b4568": true, + "55d3632e4bdc2d972f8b4569": true, + "55d447bb4bdc2d892f8b456f": true, + "55d448594bdc2d8c2f8b4569": true, + "55d449444bdc2d962f8b456d": true, + "55d44fd14bdc2d962f8b456e": true, + "55d459824bdc2d892f8b4573": true, + "55d45d3f4bdc2d972f8b456c": true, + "55d45f484bdc2d972f8b456d": true, + "55d480c04bdc2d1d4e8b456a": false, + "55d481904bdc2d8c2f8b456a": true, + "55d482194bdc2d1d4e8b456b": true, + "55d4837c4bdc2d1d4e8b456c": true, + "55d485be4bdc2d962f8b456f": true, + "55d4887d4bdc2d962f8b4570": true, + "55d48a634bdc2d8b2f8b456a": true, + "55d48ebc4bdc2d8c2f8b456c": true, + "55d4ae6c4bdc2d8b2f8b456e": true, + "55d4af3a4bdc2d972f8b456f": true, + "55d4b9964bdc2d1d4e8b456e": true, + "55d5f46a4bdc2d1b198b4567": true, + "55d614004bdc2d86028b4568": true, + "55d6190f4bdc2d87028b4567": true, + "55d7217a4bdc2d86028b456d": false, + "55f84c3c4bdc2d5f408b4576": true, + "560835c74bdc2dc8488b456f": true, + "560836484bdc2d20478b456e": true, + "560836b64bdc2d57468b4567": true, + "560836fb4bdc2d773f8b4569": true, + "560837154bdc2da74d8b4568": true, + "5608373c4bdc2dc8488b4570": true, + "560837544bdc2de22e8b456e": true, + "560837824bdc2d57468b4568": true, + "5608379a4bdc2d26448b4569": true, + "560838c94bdc2d77798b4569": true, + "56083a334bdc2dc8488b4571": true, + "56083be64bdc2d20478b456f": true, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560d61e84bdc2da74d8b4571": true, + "560d657b4bdc2da74d8b4572": true, + "560d75f54bdc2da74d8b4573": true, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a69d4bdc2ded0b8b457b": true, + "5648a7494bdc2d9d488b4583": false, + "5648ac824bdc2ded0b8b457d": true, + "5648ae314bdc2d3d1c8b457f": true, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": true, + "5648b4534bdc2d3d1c8b4580": true, + "5649a2464bdc2d91118b45a8": true, + "5649aa744bdc2ded0b8b457e": false, + "5649ab884bdc2ded0b8b457f": true, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649ae4a4bdc2d1b2b8b4588": true, + "5649af094bdc2df8348b4586": false, + "5649af884bdc2d1b2b8b4589": true, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "5649b2314bdc2d79388b4576": true, + "5649be884bdc2d79388b4577": true, + "5649d9a14bdc2d79388b4580": true, + "5649ed104bdc2d3d1c8b458b": true, + "564ca99c4bdc2d16268b4589": false, + "564ca9df4bdc2d35148b4569": true, + "564caa3d4bdc2d17108b458e": true, + "5656d7c34bdc2d9d198b4587": true, + "5656eb674bdc2d35148b457c": true, + "567143bf4bdc2d1a0f8b4567": true, + "5673de654bdc2d180f8b456d": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59856d2720bd8418b456a": true, + "56d59d3ad2720bdb418b4577": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56dee2bdd2720bc8328b4567": true, + "56deec93d2720bec348b4568": true, + "56deed6ed2720b4c698b4583": true, + "56def37dd2720bec348b456a": true, + "56dfef82d2720bbd668b4567": true, + "56dff026d2720bb8668b4567": true, + "56dff061d2720bb5668b4567": true, + "56dff0bed2720bb0668b4567": true, + "56dff216d2720bbd668b4568": true, + "56dff2ced2720bb4668b4567": true, + "56dff3afd2720bba668b4567": true, + "56dff421d2720b5f5a8b4567": true, + "56dff4a2d2720bbd668b456a": true, + "56dff4ecd2720b5f5a8b4568": true, + "56e0598dd2720bb5668b45a6": true, + "56e05a6ed2720bd0748b4567": true, + "56e05b06d2720bb2668b4586": true, + "56e294cdd2720b603a8b4575": false, + "56e335e4d2720b6c058b456d": true, + "56e33634d2720bd8058b456b": true, + "56e33680d2720be2748b4576": true, + "56ea6fafd2720b844b8b4593": true, + "56ea70acd2720b844b8b4594": true, + "56ea7165d2720b6e518b4583": true, + "56ea7293d2720b8d4b8b45ba": true, + "56ea8180d2720bf2698b456a": true, + "56ea8222d2720b69698b4567": true, + "56ea8d2fd2720b7c698b4570": true, + "56eabcd4d2720b66698b4574": true, + "56eabf3bd2720b75698b4569": true, + "570fd6c2d2720bc6458b457f": true, + "570fd721d2720bc5458b4596": true, + "570fd79bd2720bc7458b4583": true, + "5710c24ad2720bc3458b45a3": false, + "571659bb2459771fb2755a12": true, + "571a26d524597720680fbe8a": true, + "571a279b24597720b4066566": true, + "571a282c2459771fb2755a69": true, + "571a28e524597720b4066567": true, + "571a29dc2459771fb2755a6a": true, + "57235b6f24597759bf5a30f1": true, + "572b7adb24597762ae139821": true, + "572b7fa524597762b747ce82": true, + "5732ee6a24597719ae0c0281": true, + "5734773724597737fd047c14": true, + "57347d3d245977448f7b7f61": true, + "57347d5f245977448b40fa81": true, + "57347d692459774491567cf1": true, + "57347d7224597744596b4e72": false, + "57347d8724597744596b4e76": true, + "57347d90245977448f7b7f65": true, + "57347d9c245977448b40fa85": true, + "57347da92459774491567cf5": true, + "5735fdcd2459776445391d61": true, + "5735ff5c245977640e39ba7e": true, + "573601b42459776410737435": true, + "573602322459776445391df1": true, + "5736026a245977644601dc61": true, + "573603562459776430731618": true, + "573603c924597764442bd9cb": true, + "573718ba2459775a75491131": false, + "573719762459775a626ccbc1": true, + "573719df2459775a626ccbc2": true, + "57371aab2459775a77142f22": true, + "57371b192459775a9f58a5e0": true, + "57371e4124597760ff7b25f1": true, + "57371eb62459776125652ac1": true, + "57371f2b24597761224311f1": true, + "57371f8d24597761006c6a81": true, + "5737201124597760fc4431f1": true, + "5737207f24597760ff7b25f2": true, + "573720e02459776143012541": true, + "57372140245977611f70ee91": true, + "5737218f245977612125ba51": true, + "573722e82459776104581c21": true, + "573724b42459776125652ac2": true, + "5737250c2459776125652acc": true, + "5737256c2459776125652acd": true, + "573725b0245977612125bae2": true, + "5737260b24597761224311f2": true, + "5737266524597761006c6a8c": true, + "573726d824597765d96be361": true, + "5737273924597765dd374461": true, + "573727c624597765cc785b5b": true, + "5737280e24597765cc785b5c": true, + "5737287724597765e1625ae2": true, + "573728cc24597765cc785b5d": true, + "573728f324597765e5728561": true, + "5737292724597765e5728562": true, + "57372a7f24597766fe0de0c1": true, + "57372ac324597767001bc261": true, + "57372b832459776701014e41": true, + "57372bad245977670b7cd242": true, + "57372bd3245977670b7cd243": true, + "57372c21245977670937c6c2": true, + "57372c56245977685e584582": true, + "57372c89245977685d4159b1": true, + "57372d1b2459776862260581": true, + "57372d4c245977685a3da2a1": true, + "57372db0245977685d4159b2": true, + "57372deb245977685d4159b3": true, + "57372e1924597768553071c1": true, + "57372e4a24597768553071c2": true, + "57372e73245977685d4159b4": true, + "57372e94245977685648d3e1": true, + "57372ebf2459776862260582": true, + "57372ee1245977685d4159b5": true, + "57372f2824597769a270a191": true, + "57372f5c24597769917c0131": true, + "57372f7d245977699b53e301": true, + "57372fc52459776998772ca1": true, + "5737300424597769942d5a01": true, + "5737330a2459776af32363a1": true, + "5737339e2459776af261abeb": true, + "573733c72459776b0b7b51b0": true, + "5739d41224597779c3645501": true, + "57486e672459770abd687134": true, + "574d967124597745970e7c94": true, + "574dad8024597745964bf05c": true, + "574db213245977459a2f3f5d": true, + "574eb85c245977648157eec3": true, + "575062b524597720a31c09a1": true, + "57513f07245977207e26a311": true, + "57513f9324597720a7128161": true, + "57513fcc24597720a31c09a6": true, + "5751435d24597720a27126d1": true, + "57514643245977207f2c2d09": true, + "575146b724597720a27126d5": true, + "5751487e245977207e26a315": true, + "5751496424597720a27126da": true, + "5751a25924597722c463c472": true, + "5751a89d24597722aa0e8db0": true, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": true, + "576165642459773c7a400233": true, + "576167ab2459773cad038c43": true, + "57616a9e2459773c7a400234": true, + "57616ca52459773c69055192": true, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "576fd4ec2459777f0b518431": true, + "577d128124597739d65d0e56": true, + "577d141e24597739c5255e01": true, + "57838ad32459774a17445cd2": true, + "57838c962459774a1651ec63": true, + "57838e1b2459774a256959b1": true, + "57838f0b2459774a256959b2": true, + "57838f9f2459774a150289a0": true, + "578395402459774a256959b5": true, + "578395e82459774a0e553c7b": true, + "579204f224597773d619e051": true, + "5798a2832459774b53341029": true, + "57a0dfb82459774d3078b56c": true, + "57a0e5022459774d1673f889": true, + "57a3459f245977764a01f703": true, + "57a9b9ce2459770ee926038d": true, + "57ac965c24597706be5f975c": true, + "57aca93d2459771f2c7e26db": true, + "57acb6222459771ec34b5cb0": true, + "57ade1442459771557167e15": true, + "57adff4f24597737f373b6e6": true, + "57ae0171245977343c27bfcf": true, + "57af48872459771f0b2ebf11": true, + "57c44b372459772d2b39b8ce": true, + "57c44dd02459772d2e0ae249": true, + "57c44e7b2459772d28133248": true, + "57c44f4f2459772d2c627113": true, + "57c44fa82459772d2d75e415": true, + "57c450252459772d28133253": true, + "57c55efc2459772d2c6271e7": true, + "57c55f092459772d291a8463": true, + "57c55f112459772d28133310": true, + "57c55f172459772d27602381": true, + "57c5ac0824597754771e88a9": true, + "57c69dd424597774c03b7bbc": true, + "57c9a89124597704ee6faec1": true, + "57cd379a24597778e7682ecf": false, + "57cff947245977638e6f2a19": true, + "57cffb66245977632f391a99": true, + "57cffcd624597763133760c5": true, + "57cffcdd24597763f5110006": true, + "57cffce524597763b31685d8": true, + "57cffd8224597763b03fc609": true, + "57cffddc24597763133760c6": true, + "57cffe0024597763b03fc60b": true, + "57cffe20245977632f391a9d": true, + "57d14d2524597714373db789": true, + "57d14e1724597714010c3f4b": true, + "57d1519e24597714373db79d": true, + "57d152ec245977144076ccdf": true, + "57d17c5e2459775a5c57d17d": true, + "57d17e212459775a1179a0f5": true, + "57da93632459771cb65bf83f": true, + "57dbb57e2459774673234890": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "57e26ea924597715ca604a09": true, + "57e26fc7245977162a14b800": true, + "57ee59b42459771c7b045da5": true, + "57f3a5ae2459772b0e0bf19e": true, + "57f3c6bd24597738e730fa2f": true, + "57f3c7e024597738ea4ba286": true, + "57f3c8cc2459773ec4480328": true, + "57f4c844245977379d5c14d1": true, + "57fd23e32459772d0805bcf1": true, + "57ffa9f4245977728561e844": true, + "57ffaea724597779f52b3a4d": true, + "57ffb0062459777a045af529": true, + "57ffb0e42459777d047111c5": true, + "5811ce772459770e9e5f9532": false, + "5827272a24597748c74bdeea": true, + "58272b392459774b4c7b3ccd": true, + "58272b842459774abc128d50": true, + "58272d7f2459774f6311ddfd": true, + "583990e32459771419544dd2": true, + "5839a40f24597726f856b511": true, + "5839a7742459773cf9693481": true, + "58491f3324597764bc48fa02": true, + "584924ec24597768f12ae244": true, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "587de4282459771bca0ec90b": true, + "587de5ba2459771c0f1e8a58": true, + "587df583245977373c4f1129": true, + "587e02ff24597743df3deaeb": true, + "587e0531245977466077a0f7": true, + "587e08ee245977446b4410cf": true, + "588200af24597742fa221dfb": true, + "588200c224597743990da9ed": true, + "588200cf2459774414733d55": true, + "588226d124597767ad33f787": true, + "588226dd24597767ad33f789": true, + "588226e62459776e3e094af7": true, + "588226ef24597767af46e39c": true, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "588892092459774ac91d4b11": true, + "5888945a2459774bf43ba385": true, + "5888956924597752983e182d": true, + "5888961624597754281f93f3": true, + "5888976c24597754281f93f5": true, + "5888988e24597752fe43a6fa": true, + "5888996c24597754281f9419": true, + "58889c7324597754281f9439": true, + "58889d0c2459775bc215d981": true, + "588b56d02459771481110ae2": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "58949fac86f77409483e16aa": true, + "5894a05586f774094708ef75": true, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "58a56f8d86f774651579314c": true, + "58a5c12e86f7745d585a2b9e": true, + "58ac1bf086f77420ed183f9f": true, + "58ac60eb86f77401897560ff": true, + "58aeaaa886f7744fc1560f81": true, + "58aeac1b86f77457c419f475": true, + "58c157be86f77403c74b2bb6": true, + "58c157c886f774032749fb06": true, + "58d2664f86f7747fec5834f6": true, + "58d268fc86f774111273f8c2": true, + "58d2912286f7744e27117493": true, + "58d2946386f774496974c37e": true, + "58d2946c86f7744e271174b5": true, + "58d2947686f774485c6a1ee5": true, + "58d2947e86f77447aa070d53": true, + "58d399e486f77442e0016fe7": true, + "58d39b0386f77443380bf13c": true, + "58d39d3d86f77445bb794ae7": true, + "58dd3ad986f77403051cba8f": true, + "5900b89686f7744e704a8747": true, + "590c5d4b86f774784e1b9c45": false, + "590c60fc86f77412b13fddcf": true, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": true, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": true, + "591aef7986f774139d495f03": true, + "591af10186f774139d495f0e": true, + "591af28e86f77414a27a9e1d": true, + "591c4e1186f77410354b316e": true, + "591c4efa86f7741030027726": true, + "591ee00d86f774592f7b841e": true, + "5926bb2186f7744b1c6c6e60": true, + "5926c0df86f77462f647f764": true, + "5926c32286f774616e42de99": true, + "5926c36d86f77467a92a8629": true, + "5926c3b286f774640d189b6b": true, + "5926d2be86f774134d668e4e": true, + "5926d33d86f77410de68ebc0": true, + "5926d3c686f77410de68ebc8": true, + "5926d40686f7740f152b6b7e": true, + "5926dad986f7741f82604363": true, + "5926e16e86f7742f5a0f7ecb": true, + "5926f2e086f7745aae644231": true, + "5926f34786f77469195bfe92": true, + "5929a2a086f7744f4b234d43": true, + "592c2d1a86f7746dbe2af32a": true, + "593d1fa786f7746da62d61ac": true, + "593d489686f7745c6255d58a": true, + "593d490386f7745ee97a1555": true, + "593d493f86f7745e6b2ceb22": true, + "5943d9c186f7745a13413ac9": true, + "5943ee5a86f77413872d25ec": true, + "5943eeeb86f77412d6384f6b": true, + "5947c73886f7747701588af5": true, + "5947db3f86f77447880cf76f": true, + "5947e98b86f774778f1448bc": true, + "5947eab886f77475961d96c5": true, + "5947f92f86f77427344a76b1": true, + "5947fa2486f77425b47c1a9b": true, + "595cf16b86f77427440c32e2": true, + "595cfa8b86f77427437e845b": true, + "5996f6cb86f774678763a6ca": true, + "5996f6d686f77467977ba6cc": true, + "5996f6fc86f7745e585b4de3": true, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a6c86f77414ec448d17": true, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59bfc5c886f7743bf6794e62": true, + "59bfe68886f7746004266202": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c0ec5b86f77435b128bfca": true, + "59c1383d86f774290a37e0ca": true, + "59c63b4486f7747afb151c1c": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "59d6272486f77466146386ff": true, + "59d64ec286f774171d1e0a42": true, + "59d650cf86f7741b846413a4": true, + "59d790f486f77403cb06aec6": true, + "59db3a1d86f77429e05b4e92": true, + "59db3acc86f7742a2c4ab912": true, + "59db3b0886f77429d72fb895": true, + "59db7e1086f77448be30ddf3": true, + "59db7eed86f77461f8380365": true, + "59e0bdb186f774156f04ce82": true, + "59e0be5d86f7742d48765bd2": true, + "59e0bed186f774156f04ce84": true, + "59e0d99486f7744a32234762": true, + "59e3577886f774176a362503": true, + "59e4cf5286f7741778269d8a": true, + "59e4d24686f7741776641ac7": true, + "59e4d3d286f774176a36250a": true, + "59e5f5a486f7746c530b3ce2": true, + "59e6152586f77473dc057aa1": true, + "59e649f986f77411d949b246": true, + "59e6542b86f77411dc52a77a": true, + "59e655cb86f77411dc52a77b": true, + "59e6658b86f77411d949b250": true, + "59e6687d86f77411d949b251": true, + "59e68f6f86f7746c9f75e846": true, + "59e6906286f7746c9f75e847": true, + "59e690b686f7746c9f75e848": true, + "59e6918f86f7746c9f75e849": true, + "59e6920f86f77411d82aa167": true, + "59e6927d86f77411da468256": true, + "59e7635f86f7742cbf2c1095": true, + "59e763f286f7742ee57895da": true, + "59e7643b86f7742cbf2c109a": true, + "59e7708286f7742cbd762753": true, + "59e770b986f7742cbd762754": true, + "59e770f986f7742cbe3164ef": true, + "59e7711e86f7746cae05fbe1": true, + "59e7715586f7742ee5789605": true, + "59e77a2386f7742ee578960a": true, + "59e8977386f77415a553c453": true, + "59eb7ebe86f7740b373438ce": true, + "59ecc28286f7746d7a68aa8c": true, + "59ecc3dd86f7746dc827481c": true, + "59ef13ca86f77445fd0e2483": true, + "59f8a37386f7747af3328f06": true, + "59f98b4986f7746f546d2cef": true, + "59f99a7d86f7745b134aa97b": true, + "59f9cabd86f7743a10721f46": true, + "59f9d81586f7744c7506ee62": true, + "59fafc5086f7740dbe19f6c3": true, + "59fafc9386f774067d462453": true, + "59fafd4b86f7745ca07e1232": true, + "59fb042886f7746c5005a7b2": true, + "59fb137a86f7740adb646af1": true, + "59fb257e86f7742981561852": true, + "59fb375986f7741b681b81a6": true, + "59fc48e086f77463b1118392": true, + "59ff346386f77477562ff5e2": true, + "5a0060fc86f7745793204432": true, + "5a01ad4786f77450561fda02": true, + "5a0abb6e1526d8000a025282": true, + "5a0c27731526d80618476ac4": true, + "5a0c59791526d8dba737bba7": true, + "5a0d63621526d8dba31fe3bf": true, + "5a0d716f1526d8000d26b1e2": true, + "5a0eb980fcdbcb001a3b00a6": true, + "5a0ec13bfcdbcb00165aa685": true, + "5a0ed824fcdbcb0176308b0d": true, + "5a0f096dfcdbcb0176308b15": true, + "5a154d5cfcdbcb001a3b00da": true, + "5a16b672fcdbcb001912fa83": true, + "5a16b7e1fcdbcb00165aa6c9": true, + "5a16b8a9fcdbcb00165aa6ca": true, + "5a16b93dfcdbcbcae6687261": true, + "5a16b9fffcdbcb0176308b34": true, + "5a16ba61fcdbcb098008728a": true, + "5a16badafcdbcb001865f72d": true, + "5a16bb52fcdbcb001a3b00dc": true, + "5a17f98cfcdbcb0980087290": true, + "5a17fb9dfcdbcbcae6687291": true, + "5a17fc70fcdbcb0176308b3d": true, + "5a1eaa87fcdbcb001865f75e": true, + "5a1eacb3fcdbcb09800872be": true, + "5a1ead28fcdbcb001912fa9f": true, + "5a269f97c4a282000b151807": true, + "5a26abfac4a28232980eabff": true, + "5a26ac06c4a282000c5a90a8": true, + "5a26ac0ec4a28200741e1e18": true, + "5a27b281c4a28200741e1e52": true, + "5a27b3d0c4a282000d721ec1": true, + "5a27b6bec4a282000e496f78": true, + "5a27bad7c4a282000b15184b": true, + "5a2a57cfc4a2826c6e06d44a": true, + "5a329052c4a28200741e22d3": true, + "5a32a064c4a28200741e22de": true, + "5a32aa0cc4a28232996e405f": true, + "5a32aa8bc4a2826c6e06d737": true, + "5a339805c4a2826c6e06d73d": true, + "5a33a8ebc4a282000c5a950d": true, + "5a33b2c9c4a282000c5a9511": true, + "5a33b652c4a28232996e407c": true, + "5a33bab6c4a28200741e22f8": true, + "5a33ca0fc4a282000d72292f": true, + "5a33cae9c4a28232980eb086": true, + "5a33e75ac4a2826c6e06d759": true, + "5a34f7f1c4a2826c6e06d75d": true, + "5a34fae7c4a2826c6e06d760": true, + "5a34fbadc4a28200741e230a": true, + "5a34fd2bc4a282329a73b4c5": true, + "5a34fe59c4a282000b1521a2": true, + "5a3501acc4a282000d72293a": true, + "5a351711c4a282000b1521a4": true, + "5a367e5dc4a282000e49738f": true, + "5a37ca54c4a282000d72296a": true, + "5a37cb10c4a282329a73b4e7": true, + "5a38e6bac4a2826c6e06d79b": true, + "5a38ed75c4a28232996e40c6": true, + "5a38ee51c4a282000c5a955c": true, + "5a398ab9c4a282000c5a9842": true, + "5a398b75c4a282000a51a266": true, + "5a3c16fe86f77452b62de32a": true, + "5a43943586f77416ad2f06e2": true, + "5a43957686f7742a2c2f11b0": true, + "5a5f1ce64f39f90b401987bc": true, + "5a6086ea4f39f99cd479502f": true, + "5a608bf24f39f98ffc77720e": true, + "5a69a2ed8dc32e000d46d1f1": true, + "5a6b585a8dc32e5a9c28b4f1": true, + "5a6b592c8dc32e00094b97bf": true, + "5a6b59a08dc32e000b452fb7": true, + "5a6b5b8a8dc32e001207faf3": true, + "5a6b5e468dc32e001207faf5": true, + "5a6b5ed88dc32e000c52ec86": true, + "5a6b5f868dc32e000a311389": true, + "5a6b60158dc32e000a31138b": true, + "5a6f58f68dc32e000a311390": true, + "5a6f5d528dc32e00094b97d9": true, + "5a6f5e048dc32e00094b97da": true, + "5a6f5f078dc32e00094b97dd": true, + "5a702d198dc32e000b452fc3": true, + "5a7033908dc32e000a311392": true, + "5a70366c8dc32e001207fb06": true, + "5a7037338dc32e000d46d257": true, + "5a705e128dc32e000d46d258": true, + "5a718b548dc32e000d46d262": true, + "5a718da68dc32e000d46d264": true, + "5a718f958dc32e00094b97e7": true, + "5a71e0048dc32e000c52ecc8": true, + "5a71e0fb8dc32e00094b97f2": true, + "5a71e1868dc32e00094b97f3": true, + "5a71e22f8dc32e00094b97f4": true, + "5a71e4f48dc32e001207fb26": true, + "5a787ebcc5856700142fdd98": true, + "5a787f25c5856700186c4ab9": true, + "5a787f7ac5856700177af660": true, + "5a787fadc5856700155a6ca1": true, + "5a787fdfc5856700142fdd9a": true, + "5a788031c585673f2b5c1c79": true, + "5a788068c5856700137e4c8f": true, + "5a788089c5856700142fdd9c": true, + "5a7880d0c5856700142fdd9d": true, + "5a78813bc5856700186c4abe": true, + "5a788169c5856700142fdd9e": true, + "5a789261c5856700186c65d3": true, + "5a7893c1c585673f2b5c374d": true, + "5a78948ec5856700177b1124": true, + "5a7ad0c451dfba0013379712": true, + "5a7ad1fb51dfba0013379715": true, + "5a7ad2e851dfba0016153692": true, + "5a7ad4af51dfba0013379717": true, + "5a7ad55551dfba0015068f42": true, + "5a7ad74e51dfba0015068f45": true, + "5a7ae0c351dfba0017554310": true, + "5a7afa25e899ef00135e31b0": true, + "5a7b32a2e899ef00135e345a": true, + "5a7b483fe899ef0016170d15": true, + "5a7b4900e899ef197b331a2a": true, + "5a7b4960e899ef197b331a2d": true, + "5a7c147ce899ef00150bd8b8": true, + "5a7c4850e899ef00150be885": true, + "5a7c74b3e899ef0014332c29": true, + "5a7d90eb159bd400165484f1": true, + "5a7d9104159bd400134c8c21": true, + "5a7d9122159bd4001438dbf4": true, + "5a7d912f159bd400165484f3": true, + "5a7dbfc1159bd40016548fde": true, + "5a800961159bd4315e3a1657": true, + "5a8036fb86f77407252ddc02": true, + "5a80a29286f7742b25692012": true, + "5a9548c9159bd400133e97b3": true, + "5a957c3fa2750c00137fa5f7": true, + "5a966ec8a2750c00171b3f36": true, + "5a966f51a2750c00156aacf6": true, + "5a9685b1a2750c0032157104": true, + "5a9d56c8a2750c0032157146": true, + "5a9d6d00a2750c5c985b5305": true, + "5a9d6d13a2750c00164f6b03": true, + "5a9d6d21a2750c00137fa649": true, + "5a9d6d34a2750c00141e07da": true, + "5a9e81fba2750c00164f6b11": true, + "5a9ea27ca2750c00137fa672": true, + "5a9eb32da2750c00171b3f9c": true, + "5a9fb739a2750c003215717f": true, + "5a9fbacda2750c00141e080f": true, + "5a9fbb74a2750c0032157181": true, + "5a9fbb84a2750c00137fa685": true, + "5a9fc7e6a2750c0032157184": true, + "5aa2b87de5b5b00016327c25": false, + "5aa2b89be5b5b0001569311f": true, + "5aa2b8d7e5b5b00014028f4a": true, + "5aa2b923e5b5b000137b7589": true, + "5aa2b986e5b5b00014028f4c": true, + "5aa2b9aee5b5b00015693121": true, + "5aa2b9ede5b5b000137b758b": true, + "5aa2ba19e5b5b00014028f4e": true, + "5aa2ba46e5b5b000137b758d": true, + "5aa2ba71e5b5b000137b758f": true, + "5aa66a9be5b5b0214e506e89": true, + "5aa66be6e5b5b0214e506e97": true, + "5aa66c72e5b5b00016327c93": true, + "5aa7cfc0e5b5b00015693143": false, + "5aa7d193e5b5b000171d063f": true, + "5aa7e276e5b5b000171d0647": true, + "5aa7e373e5b5b000137b76f0": true, + "5aa7e3abe5b5b000171d064d": true, + "5aa7e454e5b5b0214e506fa2": true, + "5aa7e4a4e5b5b000137b76f2": true, + "5aaa4194e5b5b055d06310a5": true, + "5aaa5dfee5b5b000140293d3": true, + "5aaa5e60e5b5b000140293d6": true, + "5aaf8a0be5b5b00015693243": true, + "5aaf8e43e5b5b00015693246": true, + "5aaf9d53e5b5b00015042a52": true, + "5aafa1c2e5b5b00015042a56": true, + "5aafa49ae5b5b00015042a58": true, + "5aafa857e5b5b00018480968": true, + "5aafbde786f774389d0cbc0f": true, + "5ab24ef9e5b5b00fe93c9209": true, + "5ab372a310e891001717f0d8": true, + "5ab3afb2d8ce87001660304d": true, + "5ab8dab586f77441cd04f2a2": true, + "5ab8dced86f774646209ec87": true, + "5ab8e4ed86f7742d8e50c7fa": true, + "5ab8e79e86f7742d8b372e78": true, + "5ab8e9fcd8ce870019439434": true, + "5ab8ebf186f7742d8b372e80": true, + "5ab8f04f86f774585f4237d8": true, + "5ab8f20c86f7745cdb629fb2": true, + "5ab8f39486f7745cd93a1cca": true, + "5ab8f4ff86f77431c60d91ba": true, + "5ab8f85d86f7745cd93a1cf5": true, + "5abcbb20d8ce87001773e258": true, + "5abcbc27d8ce8700182eceeb": true, + "5abcc328d8ce8700194394f3": true, + "5abccb7dd8ce87001773e277": true, + "5ac4c50d5acfc40019262e87": true, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac66c5d5acfc4001718d314": true, + "5ac66cb05acfc40198510a10": true, + "5ac66d015acfc400180ae6e4": true, + "5ac66d2e5acfc43b321d4b53": true, + "5ac66d725acfc43b321d4b60": true, + "5ac66d9b5acfc4001633997a": true, + "5ac72e475acfc400180ae6fe": true, + "5ac733a45acfc400192630e2": true, + "5ac7655e5acfc40016339a19": false, + "5ac78eaf5acfc4001926317a": true, + "5ac8d6885acfc400180ae7b0": true, + "5addba3e5acfc4001669f0ab": true, + "5addbac75acfc400194dbc56": true, + "5addbb6e5acfc408fb1393fd": true, + "5addbb825acfc408fb139400": true, + "5addbb945acfc4001a5fc44e": true, + "5addbba15acfc400185c2854": true, + "5addbbb25acfc40015621bd9": true, + "5addbf175acfc408fb13965b": true, + "5addbfbb5acfc400194dbcf7": true, + "5addbfd15acfc40015621bde": true, + "5addbfe15acfc4001a5fc58b": true, + "5addbfef5acfc400185c2857": true, + "5addbffe5acfc4001714dfac": true, + "5addc00b5acfc4001669f144": true, + "5addc7005acfc4001669f275": true, + "5addc7ac5acfc400194dbd90": true, + "5addc7db5acfc4001669f279": true, + "5addcce35acfc4001a5fc635": true, + "5addccf45acfc400185c2989": true, + "5adf23995acfc400185c2aeb": true, + "5ae096d95acfc400185c2c81": true, + "5ae30bad5acfc400185c2dc4": true, + "5ae30c9a5acfc408fb139a03": true, + "5ae30db85acfc408fb139a05": true, + "5ae30e795acfc408fb139a0b": true, + "5ae35b315acfc4001714e8b0": true, + "5af0454c86f7746bf20992e8": true, + "5af0548586f7743a532b7e99": true, + "5afd7ded5acfc40017541f5e": true, + "5afd7e095acfc40017541f61": true, + "5afd7e445acfc4001637e35a": true, + "5b04473a5acfc40018632f70": true, + "5b057b4f5acfc4771e1bd3e9": true, + "5b07db875acfc40dc528a5f6": true, + "5b07dd285acfc4001754240d": true, + "5b0800175acfc400153aebd4": true, + "5b099a765acfc47a8607efe3": true, + "5b099a9d5acfc47a8607efe7": true, + "5b099ac65acfc400186331e1": true, + "5b099b7d5acfc400186331e4": true, + "5b099b965acfc400186331e6": true, + "5b099bb25acfc400186331e8": true, + "5b099bf25acfc4001637e683": true, + "5b0bbe4e5acfc40dc528a72d": true, + "5b0bc22d5acfc47a8607f085": true, + "5b0e794b5acfc47a877359b2": true, + "5b1fa9b25acfc40018633c01": true, + "5b1fa9ea5acfc40018633c0a": true, + "5b1faa0f5acfc40dc528aeb5": true, + "5b1fb3e15acfc4001637f068": true, + "5b1fd4e35acfc40018633c39": true, + "5b222d335acfc4771e1be099": true, + "5b222d405acfc400153af4fe": true, + "5b2240bf5acfc40dc528af69": true, + "5b237e425acfc4771e1be0b6": true, + "5b2388675acfc4771e1be0be": true, + "5b2389515acfc4771e1be0c0": true, + "5b2cfa535acfc432ff4db7a0": true, + "5b30ac585acfc433000eb79c": true, + "5b30b0dc5acfc400153b7124": true, + "5b30bc165acfc40016387293": true, + "5b30bc285acfc47a8608615d": true, + "5b31163c5acfc400153b71cb": true, + "5b3116595acfc40019476364": true, + "5b363dd25acfc4001a598fd2": true, + "5b363dea5acfc4771e1c5e7e": true, + "5b363e1b5acfc4771e1c5e80": true, + "5b39f8db5acfc40016387a1b": true, + "5b39ffbd5acfc47a8773fb06": true, + "5b3a08b25acfc4001754880c": true, + "5b3a16655acfc40016387a2a": true, + "5b3a337e5acfc4704b4a19a0": true, + "5b3b6dc75acfc47a8773fb1e": true, + "5b3b6e495acfc4330140bd88": true, + "5b3b713c5acfc4330140bd8d": true, + "5b3b99265acfc4704b4a1afb": true, + "5b3b99475acfc432ff4dcbee": true, + "5b3baf8f5acfc40dc5296692": true, + "5b3cadf35acfc400194776a0": true, + "5b3cbc235acfc4001863ac44": true, + "5b3f7bf05acfc433000ecf6b": true, + "5b3f7c005acfc4704b4a1de8": true, + "5b3f7c1c5acfc40dc5296b1d": true, + "5b40e1525acfc4771e1c6611": true, + "5b40e2bc5acfc40016388216": true, + "5b40e3f35acfc40016388218": true, + "5b40e4035acfc47a87740943": true, + "5b40e5e25acfc4001a599bea": true, + "5b40e61f5acfc4001a599bec": true, + "5b4325355acfc40019478126": true, + "5b4326435acfc433000ed01d": true, + "5b43271c5acfc432ff4dce65": true, + "5b4327aa5acfc400175496e0": true, + "5b4329075acfc400153b78ff": true, + "5b4329f05acfc47a86086aa1": true, + "5b432b2f5acfc4771e1c6622": true, + "5b432b6c5acfc4001a599bf0": true, + "5b432b965acfc47a8774094e": true, + "5b432be65acfc433000ed01f": true, + "5b432c305acfc40019478128": true, + "5b432d215acfc4771e1c6624": true, + "5b432f3d5acfc4704b4a1dfb": true, + "5b44c6ae86f7742d1627baea": true, + "5b44c8ea86f7742d1627baf1": true, + "5b44cad286f77402a54ae7e5": true, + "5b44cd8b86f774503d30cba2": true, + "5b44cf1486f77431723e3d05": true, + "5b44d0de86f774503d30cba8": true, + "5b44d22286f774172b0c9de8": true, + "5b46238386f7741a693bcf9c": true, + "5b4736a986f774040571e998": true, + "5b4736b986f77405cb415c10": true, + "5b7be1125acfc4001876c0e5": true, + "5b7be1265acfc400161d0798": true, + "5b7be1ca5acfc400170e2d2f": true, + "5b7be2345acfc400196d524a": true, + "5b7be4575acfc400161d0832": true, + "5b7be4645acfc400170e2dcc": true, + "5b7be46e5acfc400170e2dcf": true, + "5b7be47f5acfc400170e2dd2": true, + "5b7be4895acfc400170e2dd5": true, + "5b7bebc85acfc43bca706666": true, + "5b7bed205acfc400161d08cc": true, + "5b7bedd75acfc43d825283f9": true, + "5b7bee755acfc400196d5383": true, + "5b7bef1e5acfc43d82528402": true, + "5b7bef5d5acfc43bca7067a3": true, + "5b7bef9c5acfc43d102852ec": true, + "5b7c2d1d5acfc43d1028532a": true, + "5b7c710788a4506dec015957": true, + "5b7d37845acfc400170e2f87": true, + "5b7d63b75acfc400170e2f8a": true, + "5b7d63cf5acfc4001876c8df": true, + "5b7d63de5acfc400170e2f8d": true, + "5b7d64555acfc4001876c8e2": true, + "5b7d645e5acfc400170e2f90": true, + "5b7d671b5acfc43d82528ddd": true, + "5b7d678a5acfc4001a5c4022": true, + "5b7d679f5acfc4001a5c4024": true, + "5b7d68af5acfc400170e30c3": true, + "5b7d693d5acfc43bca706a3d": true, + "5b7d6c105acfc40015109a5f": true, + "5b800e9286f7747a8b04f3ff": true, + "5b800ebc86f774394e230a90": true, + "5b800ed086f7747baf6e2f9e": true, + "5b80242286f77429445e0b47": true, + "5b84038986f774774913b0c1": true, + "5b8403a086f7747ff856f4e2": true, + "5b86a0e586f7745b600ccb23": true, + "5ba26383d4351e00334c93d9": true, + "5ba264f6d4351e0034777d52": true, + "5ba2657ed4351e0035628ff2": true, + "5ba26586d4351e44f824b340": true, + "5ba2678ad4351e44f824b344": true, + "5ba26812d4351e003201fef1": true, + "5ba26835d4351e0035628ff5": true, + "5ba26844d4351e00334c9475": true, + "5ba26acdd4351e003562908e": true, + "5ba26ae8d4351e00367f9bdb": true, + "5ba26b01d4351e0085325a51": true, + "5ba26b17d4351e00367f9bdd": true, + "5ba36f85d4351e0085325c81": true, + "5bae13bad4351e00320204af": true, + "5bae13ded4351e44f824bf38": true, + "5bb20d53d4351e4502010a69": true, + "5bb20d92d4351e00853263eb": true, + "5bb20d9cd4351e00334c9d8a": true, + "5bb20da5d4351e0035629dbf": true, + "5bb20dadd4351e00367faeff": true, + "5bb20dbcd4351e44f824c04e": true, + "5bb20dcad4351e3bac1212da": true, + "5bb20de5d4351e0035629e59": true, + "5bb20df1d4351e00347787d5": true, + "5bb20dfcd4351e00334c9e24": true, + "5bb20e0ed4351e3bac1212dc": true, + "5bb20e18d4351e00320205d5": true, + "5bb20e49d4351e3bac1212de": true, + "5bb20e58d4351e00320205d7": true, + "5bb20e70d4351e0035629f8f": true, + "5bb2475ed4351e00853264e3": true, + "5bbdb811d4351e45020113c7": true, + "5bbdb83fd4351e44f824c44b": true, + "5bbdb870d4351e00367fb67d": true, + "5bbdb8bdd4351e4502011460": true, + "5bbde409d4351e003562b036": true, + "5bbde41ed4351e003562b038": true, + "5bc09a18d4351e003562b68e": true, + "5bc09a30d4351e00367fb7c8": true, + "5bc5a351d4351e003477a414": true, + "5bc5a35cd4351e450201232f": true, + "5bc5a372d4351e44f824d17f": true, + "5bc9c1e2d4351e00367fbcf0": true, + "5bc9c29cd4351e003562b8a3": true, + "5bcf0213d4351e0085327c17": true, + "5bd06f5d86f77427101ad47c": true, + "5bd0716d86f774171822ef4b": true, + "5bd071d786f7747e707b93a3": true, + "5bd073a586f7747e6f135799": true, + "5bd073c986f7747f627e796c": true, + "5bd70322209c4d00d7167b8f": true, + "5bd704e7209c4d00d7167c31": true, + "5be4038986f774527d3fae60": true, + "5bead2e00db834001c062938": true, + "5bed61680db834001d2c45ab": true, + "5bed625c0db834001c062946": true, + "5beec1bd0db834001e6006f3": true, + "5beec2820db834001b095426": true, + "5beec3420db834001b095429": true, + "5beec3e30db8340019619424": true, + "5beec8b20db834001961942a": true, + "5beec8c20db834001d2c465c": true, + "5beec8ea0db834001a6f9dbf": true, + "5beec91a0db834001961942d": true, + "5beec9450db83400970084fd": true, + "5beecbb80db834001d2c465e": true, + "5beed0f50db834001c062b12": true, + "5bf3e03b0db834001d2c4a9c": true, + "5bf3e0490db83400196199af": true, + "5bf3f59f0db834001a6fa060": true, + "5bfd297f0db834001a669119": true, + "5bfd35380db83400232fe5cc": true, + "5bfd36290db834001966869a": true, + "5bfd36ad0db834001c38ef66": true, + "5bfd37c80db834001d23e842": true, + "5bfd384c0db834001a6691d3": true, + "5bfd4c980db834001b73449d": true, + "5bfd4cbe0db834001b73449f": true, + "5bfd4cc90db834001d23e846": true, + "5bfd4cd60db834001c38f095": true, + "5bfe7fb30db8340018089fed": true, + "5bfe86a20db834001d23e8f7": true, + "5bfe86bd0db83400232fe959": true, + "5bfe86df0db834001b734685": true, + "5bfe89510db834001808a127": true, + "5bfea6e90db834001b7347f3": true, + "5bfea7ad0db834001c38f1ee": true, + "5bfeaa0f0db834001b734927": true, + "5bfeb32b0db834001a6694d9": true, + "5bfebc250db834001a6694e1": true, + "5bfebc320db8340019668d79": true, + "5bfebc530db834001d23eb65": true, + "5bfebc5e0db834001a6694e5": true, + "5bffcf7a0db83400232fea79": true, + "5bffd7ed0db834001d23ebf9": true, + "5bffdc370db834001d23eca8": false, + "5bffdd7e0db834001b734a1a": true, + "5bffe7930db834001b734a39": true, + "5bffe7c50db834001d23ece1": true, + "5bffec120db834001c38f5fa": true, + "5bffef760db8340019668fe4": true, + "5c0000c00db834001a6697fc": true, + "5c0006470db834001a6697fe": true, + "5c00076d0db834001d23ee1f": true, + "5c0009510db834001966907f": true, + "5c0102aa0db834001b734ba1": true, + "5c0102b20db834001d23eebc": true, + "5c010a700db834001d23ef5d": true, + "5c010e350db83400232feec7": true, + "5c0111ab0db834001966914d": true, + "5c0125fc0db834001a669aa3": true, + "5c0126f40db834002a125382": true, + "5c012ffc0db834001d23f03f": true, + "5c0505e00db834001b735073": true, + "5c0517910db83400232ffee5": true, + "5c05293e0db83400232fff80": true, + "5c05295e0db834001a66acbb": true, + "5c052a900db834001a66acbd": true, + "5c05413a0db834001c390617": true, + "5c0548ae0db834001966a3c2": true, + "5c0558060db834001b735271": true, + "5c064c400db834001d23f468": true, + "5c06595c0db834001a66af6c": true, + "5c066e3a0db834001b7353f0": true, + "5c066ef40db834001966a595": true, + "5c0672ed0db834001b7353f3": true, + "5c0673fb0db8340023300271": true, + "5c0684e50db834002a12585a": true, + "5c0695860db834001b735461": true, + "5c0696830db834001d23f5da": true, + "5c06c6a80db834001b735491": true, + "5c079ec50db834001966a706": true, + "5c079ed60db834001a66b372": true, + "5c07a8770db8340023300450": true, + "5c07b36c0db834002a1259e9": true, + "5c07b3850db834002330045b": true, + "5c07c5ed0db834001b73571c": true, + "5c07c60e0db834002330051f": true, + "5c07c9660db834001a66b588": true, + "5c07dd120db834001c39092d": true, + "5c07df7f0db834001b73588a": true, + "5c08f87c0db8340019124324": true, + "5c0919b50db834001b7ce3b9": true, + "5c091a4e0db834001d5addc8": true, + "5c093ca986f7740a1867ab12": true, + "5c093e3486f77430cb02e593": true, + "5c0a2cec0db834001b7ce47d": true, + "5c0d2727d174af02a012cf58": true, + "5c0d32fcd174af02a1659c75": true, + "5c0d56a986f774449d5de529": true, + "5c0d591486f7744c505b416f": true, + "5c0d5ae286f7741e46554302": true, + "5c0d5e4486f77478390952fe": true, + "5c0d668f86f7747ccb7f13b2": true, + "5c0d688c86f77413ae3407b2": true, + "5c0e2f26d174af02a9625114": true, + "5c0e2f5cd174af02a012cfc9": true, + "5c0e2f94d174af029f650d56": true, + "5c0e2ff6d174af02a1659d4a": true, + "5c0e3eb886f7742015526062": true, + "5c0e446786f7742013381639": true, + "5c0e51be86f774598e797894": true, + "5c0e530286f7747fa1419862": true, + "5c0e531286f7747fa54205c2": true, + "5c0e531d86f7747fa23f4d42": true, + "5c0e533786f7747fa23f4d47": true, + "5c0e534186f7747fa1419867": true, + "5c0e53c886f7747fa54205c7": true, + "5c0e541586f7747fa54205c9": true, + "5c0e57ba86f7747fa141986d": true, + "5c0e5bab86f77461f55ed1f3": true, + "5c0e5edb86f77461f55ed1f7": true, + "5c0e625a86f7742d77340f62": true, + "5c0e655586f774045612eeb2": true, + "5c0e66e2d174af02a96252f4": true, + "5c0e6a1586f77404597b4965": true, + "5c0e722886f7740458316a57": true, + "5c0e746986f7741453628fe5": true, + "5c0e774286f77468413cc5b2": true, + "5c0e805e86f774683f3dd637": true, + "5c0e842486f77443a74d2976": true, + "5c0e874186f7745dc7616606": true, + "5c0fa877d174af02a012e1cf": true, + "5c0faeddd174af02a962601f": true, + "5c0faf68d174af02a96260b8": true, + "5c0fafb6d174af02a96260ba": true, + "5c10c8fd86f7743d7d706df3": true, + "5c11046cd174af02a012e42b": true, + "5c110624d174af029e69734c": true, + "5c11279ad174af029d64592b": true, + "5c1127bdd174af44217ab8b9": true, + "5c1127d0d174af29be75cf68": true, + "5c1260dc86f7746b106e8748": true, + "5c12619186f7743f871c8a32": true, + "5c1262a286f7743f8a69aab2": true, + "5c165d832e2216398b5a7e36": true, + "5c17664f2e2216398b5a7e3c": true, + "5c1780312e221602b66cc189": true, + "5c17804b2e2216152006c02f": true, + "5c178a942e22164bef5ceca3": true, + "5c1793902e221602b21d3de2": true, + "5c17a7ed2e2216152142459c": true, + "5c18b90d2e2216152142466b": true, + "5c18b9192e2216398b5a8104": true, + "5c1a1cc52e221602b3136e3d": true, + "5c1a1e3f2e221602b66cc4c2": true, + "5c1bc4812e22164bef5cfde7": true, + "5c1bc5612e221602b5429350": true, + "5c1bc5af2e221602b412949b": true, + "5c1bc5fb2e221602b1779b32": true, + "5c1bc7432e221602b412949d": true, + "5c1bc7752e221602b1779b34": true, + "5c1cd46f2e22164bef5cfedb": true, + "5c1cdd302e221602b3137250": true, + "5c1cdd512e22161b267d91ae": true, + "5c3df7d588a4501f290594e5": true, + "5c46fbd72e2216398b5a8c9c": true, + "5c471b5d2e221602b21d4e14": true, + "5c471b7e2e2216152006e46c": true, + "5c471ba12e221602b3137d76": true, + "5c471bd12e221602b4129c3a": true, + "5c471be12e221602b66cd9ac": true, + "5c471bfc2e221602b21d4e17": true, + "5c471c2d2e22164bef5d077f": true, + "5c471c442e221602b542a6f8": true, + "5c471c6c2e221602b66cd9ae": true, + "5c471c842e221615214259b5": true, + "5c471cb32e221602b177afaa": true, + "5c488a752e221602b412af63": true, + "5c48a14f2e2216152006edd7": true, + "5c48a2852e221602b21d5923": true, + "5c48a2a42e221602b66d1e07": true, + "5c48a2c22e221602b313fb6c": true, + "5c4ee3d62e2216152006f302": true, + "5c4eec9b2e2216398b5aaba2": true, + "5c4eecc32e221602b412b440": true, + "5c4eecde2e221602b3140418": true, + "5c501a4d2e221602b412b540": true, + "5c5039be2e221602b177c9ff": true, + "5c503ac82e221602b21d6e9a": true, + "5c503ad32e2216398b5aada2": true, + "5c503af12e221602b177ca02": true, + "5c503b1c2e221602b21d6e9d": true, + "5c503d0a2e221602b542b7ef": true, + "5c5952732e2216398b5abda2": true, + "5c59529a2e221602b177d160": true, + "5c5970672e221602b21d7855": true, + "5c5db5852e2216003a0fe71a": true, + "5c5db5962e2216000e5e46eb": true, + "5c5db5b82e2216003a0fe71d": true, + "5c5db5c62e22160012542255": true, + "5c5db5f22e2216000e5e47e8": true, + "5c5db5fc2e2216000f1b2842": true, + "5c5db6302e2216000e5e47f0": true, + "5c5db63a2e2216000f1b284a": true, + "5c5db6552e2216001026119d": true, + "5c5db6652e221600113fba51": true, + "5c5db6742e2216000f1b2852": true, + "5c5db6b32e221600102611a0": true, + "5c5db6ee2e221600113fba54": true, + "5c5db6f82e2216003a0fe914": true, + "5c6161fb2e221600113fbde5": true, + "5c6162682e22160010261a2b": true, + "5c61627a2e22160012542c55": true, + "5c6165902e22160010261b28": true, + "5c6175362e221600133e3b94": true, + "5c617a5f2e2216000f1e81b3": true, + "5c61a40d2e2216001403158d": true, + "5c6592372e221600133e47d7": true, + "5c6beec32e221601da3578f2": true, + "5c6bf4aa2e2216001219b0ae": true, + "5c6c2c9c2e2216000f2002e4": true, + "5c6d10e82e221601da357b07": true, + "5c6d10fa2e221600106f3f23": true, + "5c6d11072e2216000e69d2e4": true, + "5c6d11152e2216000f2003e7": true, + "5c6d42cb2e2216000e69d7d1": true, + "5c6d450c2e221600114c997d": true, + "5c6d46132e221601da357d56": true, + "5c6d5d8b2e221644fc630b39": true, + "5c6d710d2e22165df16b81e7": true, + "5c6d7b3d2e221600114c9b7d": true, + "5c6d85e02e22165df16b81f4": true, + "5c78f2492e221600114c9f04": true, + "5c78f2612e221600114c9f0d": true, + "5c78f26f2e221601da3581d1": true, + "5c78f2792e221600106f4683": true, + "5c78f2882e22165df16b832e": true, + "5c791e872e2216001219c40a": true, + "5c793fb92e221644f31bfb64": true, + "5c793fc42e221600114ca25d": true, + "5c793fde2e221601da358614": true, + "5c7951452e221644f31bfd5c": true, + "5c7954d52e221600106f4cc7": true, + "5c7955c22e221644f31bfd5e": true, + "5c7d55de2e221644f31bff68": true, + "5c7d55f52e221644f31bff6a": true, + "5c7d560b2e22160bc12c6139": true, + "5c7e5f112e221600106f4ede": true, + "5c7e8fab2e22165df16b889b": true, + "5c7fb51d2e2216001219ce11": true, + "5c7fc87d2e221644f31c0298": true, + "5c82342f2e221644f31c060e": true, + "5c82343a2e221644f31c0611": true, + "5c86592b2e2216000e69e77c": true, + "5c878e9d2e2216000f201903": true, + "5c878ebb2e2216001219d48a": true, + "5c87a07c2e2216001219d4a2": true, + "5c87ca002e221600114cb150": true, + "5c88f24b2e22160bc12c69a6": true, + "5c90c3622e221601da359851": true, + "5c920e902e221644f31c3c99": true, + "5c925fa22e221601da359b7b": true, + "5c99f3592e221644fc633070": true, + "5c9a07572e221644f31c4b32": true, + "5c9a1c3a2e2216000e69fb6a": true, + "5c9a1c422e221600106f69f0": true, + "5c9a25172e2216000f20314e": true, + "5c9a26332e2216001219ea70": true, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": true, + "5ca20ee186f774799474abc2": true, + "5ca2113f86f7740b2547e1d2": true, + "5ca21c6986f77479963115a7": true, + "5cadc1c6ae9215000f2775a4": true, + "5cadc2e0ae9215051e1c21e7": true, + "5cadc390ae921500126a77f1": true, + "5cadc431ae921500113bb8d5": true, + "5cadc55cae921500103bb3be": true, + "5cadd919ae921500126a77f3": true, + "5cadd940ae9215051e1c2316": true, + "5cadd954ae921500103bb3c2": true, + "5cadf6ddae9215051e1c23b2": true, + "5cadf6e5ae921500113bb973": true, + "5cadf6eeae921500134b2799": true, + "5cadfbf7ae92152ac412eeef": true, + "5caf1041ae92157c28402e3f": true, + "5caf1109ae9215753c44119f": true, + "5caf1691ae92152ac412efb9": true, + "5caf16a2ae92152ac412efbc": true, + "5caf17c9ae92150b30006be1": true, + "5caf187cae92157c28402e43": true, + "5cbda392ae92155f3c17c39f": true, + "5cbda9f4ae9215000e5b9bfc": true, + "5cbdaf89ae9215000e5b9c94": true, + "5cbdb1b0ae9215000d50e105": true, + "5cbdc23eae9215001136a407": true, + "5cc6ea78e4a949000e1ea3c1": true, + "5cc6ea85e4a949000e1ea3c3": true, + "5cc70093e4a949033c734312": true, + "5cc700b9e4a949000f0f0f25": true, + "5cc700cae4a949035e43ba72": true, + "5cc700d4e4a949000f0f0f28": true, + "5cc700ede4a949033c734315": true, + "5cc70102e4a949035e43ba74": true, + "5cc7012ae4a949001252b43e": true, + "5cc70146e4a949000d73bf6b": true, + "5cc7015ae4a949001152b4c6": true, + "5cc701aae4a949000e1ea45c": true, + "5cc701d7e4a94900100ac4e7": true, + "5cc80f38e4a949001152b560": true, + "5cc80f53e4a949000e1ea4f8": true, + "5cc80f67e4a949035e43bbba": true, + "5cc80f79e4a949033c7343b2": true, + "5cc80f8fe4a949033b0224a2": true, + "5cc82796e24e8d000f5859a8": true, + "5cc82d76e24e8d00134b4b83": true, + "5cc86832d7f00c000d3a6e6c": true, + "5cc86840d7f00c002412c56c": true, + "5cc9a96cd7f00c011c04e04a": true, + "5cc9ad73d7f00c000e2579d4": true, + "5cc9b815d7f00c000e2579d6": true, + "5cc9bcaed7f00c011c04e179": true, + "5cc9c20cd7f00c001336c65d": true, + "5cda9bcfd7f00c0c0b53e900": true, + "5cdaa99dd7f00c002412d0b2": true, + "5cdd7685d7f00c000f260ed2": true, + "5cdd7693d7f00c0010373aa5": true, + "5cde739cd7f00c0010373bd3": true, + "5cde77a9d7f00c000f261009": true, + "5cde7afdd7f00c000d36b89d": true, + "5cde7b43d7f00c000d36b93e": true, + "5cde8864d7f00c0010373be1": true, + "5cdeac22d7f00c000f26168f": true, + "5cdeac42d7f00c000d36ba73": true, + "5cdeac5cd7f00c000f261694": true, + "5cdeaca5d7f00c00b61c4b70": true, + "5ce69cbad7f00c00b61c5098": true, + "5cebec00d7f00c065c53522a": true, + "5cebec10d7f00c065703d185": true, + "5cebec38d7f00c00110a652a": true, + "5cf12a15d7f00c05464b293f": true, + "5cf13123d7f00c1085616a50": true, + "5cf4e3f3d7f00c06595bc7f0": true, + "5cf4fb76d7f00c065703d3ac": true, + "5cf50850d7f00c056e24104c": true, + "5cf508bfd7f00c056e24104e": true, + "5cf50fc5d7f00c056c53f83c": true, + "5cf518cfd7f00c065b422214": true, + "5cf54404d7f00c108840b2ef": true, + "5cf638cbd7f00c06595bc936": true, + "5cf639aad7f00c065703d455": true, + "5cf656f2d7f00c06585fb6eb": true, + "5cf67a1bd7f00c06585fb6f3": true, + "5cf67cadd7f00c065a5abab7": true, + "5cf6935bd7f00c06585fb791": true, + "5cf6937cd7f00c056c53fb39": true, + "5cf78496d7f00c065703d6ca": true, + "5cf78720d7f00c06595bc93e": true, + "5cf79389d7f00c10941a0c4d": true, + "5cf79599d7f00c10875d9212": true, + "5cf7acfcd7f00c1084477cf2": true, + "5cf8f3b0d7f00c00217872ef": true, + "5cfe8010d7ad1a59283b14c6": true, + "5cff9e5ed7ad1a09407397d4": true, + "5cff9e84d7ad1a049e54ed55": true, + "5d00e0cbd7ad1a6c6566a42d": true, + "5d00ec68d7ad1a04a067e5be": true, + "5d00ede1d7ad1a0940739a76": true, + "5d00ef6dd7ad1a0940739b16": true, + "5d00f63bd7ad1a59283b1c1e": true, + "5d010d1cd7ad1a59283b1ce7": true, + "5d0236dad7ad1a0940739d29": true, + "5d023784d7ad1a049d4aa7f2": true, + "5d024f5cd7ad1a04a067e91a": true, + "5d025cc1d7ad1a53845279ef": true, + "5d02676dd7ad1a049e54f6dc": true, + "5d02677ad7ad1a04a15c0f95": true, + "5d026791d7ad1a04a067ea63": true, + "5d02778e86f774203e7dedbe": true, + "5d02797c86f774203f38e30a": true, + "5d0a29ead7ad1a0026013f27": true, + "5d0a29fed7ad1a002769ad08": true, + "5d0a3a58d7ad1a669c15ca14": true, + "5d0a3e8cd7ad1a6f6a3d35bd": true, + "5d0b5cd3d7ad1a3fe32ad263": true, + "5d10b49bd7ad1a1a560708b0": true, + "5d120a10d7ad1a4e1026ba85": true, + "5d120a28d7ad1a1c8962e295": true, + "5d122e7bd7ad1a07102d6d7f": true, + "5d123102d7ad1a004e475fe5": true, + "5d123a3cd7ad1a004e476058": true, + "5d123b70d7ad1a0ee35e0754": true, + "5d123b7dd7ad1a004f01b262": true, + "5d124c01d7ad1a115c7d59fb": true, + "5d124c0ed7ad1a10d168dd9b": true, + "5d124c1ad7ad1a12227c53a7": true, + "5d133067d7ad1a33013f95b4": true, + "5d1340b3d7ad1a0b52682ed7": true, + "5d1340bdd7ad1a0e8d245aab": true, + "5d1340cad7ad1a0b0b249869": true, + "5d135e83d7ad1a21b83f42d8": true, + "5d135ecbd7ad1a21c176542e": true, + "5d15ce51d7ad1a1eff619092": true, + "5d15cf3bd7ad1a67e71518b2": true, + "5d19cd96d7ad1a4a992c9f52": true, + "5d1b198cd7ad1a604869ad72": true, + "5d1b33a686f7742523398398": true, + "5d1b36a186f7742523398433": true, + "5d1b371186f774253763a656": true, + "5d1b5e94d7ad1a2b865a96b0": true, + "5d1c702ad7ad1a632267f429": true, + "5d1f819086f7744b355c219b": true, + "5d2369418abbc306c62e0c80": true, + "5d25a4a98abbc30b917421a4": true, + "5d25a6538abbc306c62e630d": true, + "5d25a6a48abbc306c62e6310": true, + "5d25a7b88abbc3054f3e60bc": true, + "5d25af8f8abbc3055079fec5": true, + "5d25d0ac8abbc3054f3e61f7": true, + "5d2702e88abbc31ed91efc44": true, + "5d2703038abbc3105103d94c": true, + "5d270b3c8abbc3105335cfb8": true, + "5d270ca28abbc31ee25ee821": true, + "5d2c76ed48f03532f2136169": true, + "5d2c770c48f0354b4a07c100": true, + "5d2c772c48f0355d95672c25": true, + "5d2c829448f0353a5c7d6674": true, + "5d2da1e948f035477b1ce2ba": true, + "5d2dc3e548f035404a1a4798": true, + "5d2f0d8048f0356c925bc3b0": true, + "5d2f213448f0355009199284": true, + "5d2f259b48f0355a844acd74": true, + "5d2f25bc48f03502573e5d85": true, + "5d2f261548f03576f500e7b7": true, + "5d2f2ab648f03550091993ca": true, + "5d2f2d5748f03572ec0c0139": true, + "5d3eb3b0a4b93615055e84d2": true, + "5d3eb44aa4b93650d64e4979": true, + "5d3eb4aba4b93650d64e497d": true, + "5d3eb536a4b9363b1f22f8e2": true, + "5d3eb59ea4b9361c284bb4b2": true, + "5d3eb5b6a4b9361eab311902": true, + "5d3eb5eca4b9363b1f22f8e4": true, + "5d3ef698a4b9361182109872": true, + "5d403f9186f7743cac3f229b": true, + "5d40407c86f774318526545a": true, + "5d43021ca4b9362eab4b5e25": true, + "5d4405aaa4b9361e6a4e6bd3": true, + "5d4405f0a4b9361e6a4e6bd9": true, + "5d440625a4b9361eec4ae6c5": true, + "5d44064fa4b9361e4f6eb8b5": true, + "5d44069ca4b9361ebd26fc37": true, + "5d4406a8a4b9361e4f6eb8b7": true, + "5d440b93a4b9364276578d4b": true, + "5d440b9fa4b93601354d480c": true, + "5d44334ba4b9362b346d1948": true, + "5d443f8fa4b93678dd4a01aa": true, + "5d4aaa54a4b9365392071170": true, + "5d4aaa73a4b9365392071175": true, + "5d4aab30a4b9365435358c55": true, + "5d5d646386f7742797261fd9": true, + "5d5d85c586f774279a21cbdb": true, + "5d5d87f786f77427997cfaef": true, + "5d5d8ca986f7742798716522": true, + "5d5d940f86f7742797262046": true, + "5d5e7d28a4b936645d161203": true, + "5d5e9c74a4b9364855191c40": true, + "5d5fca1ea4b93635fd598c07": true, + "5d67abc1a4b93614ec50137f": true, + "5d6d2e22a4b9361bd5780d05": true, + "5d6d2ef3a4b93618084f58bd": true, + "5d6d3716a4b9361bc8618872": true, + "5d6d3829a4b9361bc8618943": true, + "5d6d3943a4b9360dbc46d0cc": true, + "5d6d3be5a4b9361bc73bc763": true, + "5d6e6772a4b936088465b17c": true, + "5d6e67fba4b9361bc73bc779": true, + "5d6e6806a4b936088465b17e": true, + "5d6e6869a4b9361c140bcfde": true, + "5d6e6891a4b9361bd473feea": true, + "5d6e689ca4b9361bc8618956": true, + "5d6e68a8a4b9360b6c0d54e2": true, + "5d6e68b3a4b9361bca7e50b5": true, + "5d6e68c4a4b9361b93413f79": true, + "5d6e68d1a4b93622fe60e845": true, + "5d6e68dea4b9361bcc29e659": true, + "5d6e68e6a4b9361c140bcfe0": true, + "5d6e6911a4b9361bd5780d52": true, + "5d6e695fa4b936359b35d852": true, + "5d6e69b9a4b9361bc8618958": true, + "5d6e69c7a4b9360b6c0d54e4": true, + "5d6e6a05a4b93618084f58d0": true, + "5d6e6a42a4b9364f07165f52": true, + "5d6e6a53a4b9361bd473feec": true, + "5d6e6a5fa4b93614ec501745": true, + "5d7b6bafa4b93652786f4c76": true, + "5d96141523f0ea1b7f2aacab": true, + "5dcbd56fdbd3d91b3e5468d5": true, + "5dcbd6b46ec07c0c4347a564": true, + "5dcbd6dddbd3d91b3e5468de": true, + "5dcbe9431e1f4616d354987e": true, + "5dcbe965e4ed22586443a79d": true, + "5de652c31b7e3716273428be": true, + "5de653abf76fdc1ce94a5a2a": true, + "5de65547883dde217541644b": true, + "5de6556a205ddc616a6bc4f7": true, + "5de6558e9f98ac2bc65950fc": true, + "5de655be4a9f347bc92edb88": true, + "5de7bd7bfd6b4e6e2276dc25": true, + "5de8e67c4a9f347bc92edbd7": true, + "5de8e8dafd6b4e6e2276dc32": true, + "5de8ea8ffd6b4e6e2276dc35": true, + "5de8eaadbbaf010b10528a6d": true, + "5de8eac42a78646d96665d91": true, + "5de8f237bbaf010b10528a70": true, + "5de8f2d5b74cd90030650c72": true, + "5de8fb539f98ac2bc659513a": true, + "5de8fbad2fbe23140d3ee9c4": true, + "5de8fbf2b74cd90030650c79": true, + "5de8fc0b205ddc616a6bc51b": true, + "5de910da8b6c4240ba2651b5": true, + "5de922d4b11454561e39239f": true, + "5df24cf80dee1b22f862e9bc": true, + "5df256570dee1b22f862e9c4": true, + "5df25b6c0b92095fd441e4cf": true, + "5df25d3bfd6b4e6e2276dc9a": true, + "5df35ddddfc58d14537c2036": true, + "5df35e59c41b2312ea3334d5": true, + "5df35e7f2a78646d96665dd4": true, + "5df35e970b92095fd441e4d2": true, + "5df35ea9c41b2312ea3334d8": true, + "5df35eb2b11454561e3923e2": true, + "5df36948bb49d91fb446d5ad": true, + "5df38a5fb74cd90030650cb6": true, + "5df8a2ca86f7740bfe6df777": true, + "5df8a42886f77412640e2e75": true, + "5df8a4d786f77412672a1e3b": true, + "5df8a58286f77412631087ed": true, + "5df8ce05b11454561e39243b": true, + "5df8e053bb49d91fb446d6a6": true, + "5df8e085bb49d91fb446d6a8": true, + "5df8e4080b92095fd441e594": true, + "5df8f535bb49d91fb446d6b0": true, + "5df8f541c41b2312ea3335e3": true, + "5df916dfbb49d91fb446d6b9": true, + "5df917564a9f347bc92edca3": true, + "5dfa397fb11454561e39246c": true, + "5dfa3cd1b33c0951220c079b": true, + "5dfa3d2b0dee1b22f862eade": true, + "5dfa3d45dfc58d14537c20b0": true, + "5dfa3d7ac41b2312ea33362a": true, + "5dfa3d950dee1b22f862eae0": true, + "5dfcd0e547101c39625f66f9": true, + "5dfce88fe9dc277128008b2e": true, + "5dfe14f30b92095fd441edaf": true, + "5dfe6104585a0c3e995c7b82": true, + "5dff772da3651922b360bf91": true, + "5dff77c759400025ea5150cf": true, + "5dff8db859400025ea5150d4": true, + "5e00903ae9dc277128008b87": true, + "5e0090f7e9dc277128008b93": true, + "5e00c1ad86f774747333222c": true, + "5e00cdd986f7747473332240": true, + "5e00cfa786f77469dc6e5685": true, + "5e01e9e273d8eb11426f5bc3": true, + "5e01ea19e9dc277128008c0b": true, + "5e01ef6886f77445f643baa4": true, + "5e01f31d86f77465cf261343": true, + "5e01f37686f774773c6f6c15": true, + "5e023cf8186a883be655e54f": true, + "5e023d34e8a400319a28ed44": true, + "5e023d48186a883be655e551": true, + "5e023e53d4353e3302577c4c": true, + "5e023e6e34d52a55c3304f71": true, + "5e023e88277cce2b522ff2b1": true, + "5e208b9842457a4a7a33d074": true, + "5e217ba4c1434648c13568cd": true, + "5e2192a498a36665e8337386": true, + "5e21a3c67e40bd02257a008a": true, + "5e21ca18e4d47f0da15e77dd": true, + "5e2af47786f7746d404f3aaa": true, + "5e2af4a786f7746d3f3c3400": true, + "5e2af55f86f7746d4159f07c": true, + "5e32f56fcb6d5863cc5e5ee4": true, + "5e340dcdcb6d5863cc5e5efb": true, + "5e4abb5086f77406975c9342": true, + "5e4abc1f86f774069619fbaa": true, + "5e4abc6786f77406812bd572": true, + "5e4abfed86f77406a2713cf7": true, + "5e4ac41886f77406a511c9a8": true, + "5e4bfc1586f774264f7582d3": true, + "5e4d34ca86f774264f758330": true, + "5e54f76986f7740366043752": true, + "5e54f79686f7744022011103": true, + "5e56991336989c75ab4f03f6": true, + "5e5699df2161e06ac158df6f": true, + "5e569a0156edd02abe09f27d": true, + "5e569a132642e66b0b68015c": true, + "5e569a2e56edd02abe09f280": true, + "5e71f6be86f77429f2683c44": true, + "5e71f70186f77429ee09f183": true, + "5e71fad086f77422443d4604": true, + "5e81c3cbac2bb513793cdc75": true, + "5e81c4ca763d9f754677befa": true, + "5e81c519cb2b95385c177551": true, + "5e81c539cb2b95385c177553": true, + "5e81c550763d9f754677befd": true, + "5e81c6a2ac2bb513793cdc7f": true, + "5e81c6bf763d9f754677beff": true, + "5e81ebcd8e146c7080625e15": true, + "5e81edc13397a21db957f6a1": true, + "5e81ee213397a21db957f6a6": true, + "5e81ee4dcb2b95385c177582": true, + "5e81f423763d9f754677bf2e": true, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": true, + "5e848cc2988a8701445df1e8": true, + "5e848d1c264f7c180b5e35a9": true, + "5e848d2eea0a7c419c2f9bfd": true, + "5e848d51e4dbc5266a4ec63b": true, + "5e848d99865c0f329958c83b": true, + "5e848db4681bea2ada00daa9": true, + "5e848dc4e4dbc5266a4ec63d": true, + "5e85a9f4add9fe03027d9bf1": true, + "5e85aa1a988a8701445df1f5": true, + "5e870397991fd70db46995c8": true, + "5e87071478f43e51ca2de5e1": true, + "5e87076ce2db31558c75a11d": true, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": true, + "5e87114fe2db31558c75a120": true, + "5e87116b81c4ed43e83cefdd": true, + "5e8f3423fd7471236e6e3b64": true, + "5e997f0b86f7741ac73993e2": true, + "5e9dacf986f774054d6b89f4": true, + "5e9db13186f7742f845ee9d3": true, + "5e9dcf5986f7746c417435b3": true, + "5ea02bb600685063ec28bfa1": true, + "5ea034eb5aad6446a939737b": true, + "5ea034f65aad6446a939737e": true, + "5ea03e5009aa976f2e7a514b": true, + "5ea03e9400685063ec28bfa4": true, + "5ea03f7400685063ec28bfa8": true, + "5ea058e01dbce517f324b3e2": true, + "5ea05cf85ad9772e6624305d": true, + "5ea16acdfadf1d18c87b0784": true, + "5ea16ada09aa976f2e7a51be": true, + "5ea16d4d5aad6446a939753d": true, + "5ea172e498dacb342978818e": true, + "5ea17bbc09aa976f2e7a51cd": true, + "5ea17ca01412a1425304d1c0": true, + "5ea18c84ecf1982c7712d9a2": true, + "5ea2a8e200685063ec28c05a": true, + "5ed515c8d380ab312177c0fa": true, + "5ed515e03a40a50460332579": true, + "5ed515ece452db0eb56fc028": true, + "5ed515f6915ec335206e4152": true, + "5ed5160a87bb8443d10680b5": true, + "5ed51652f6c34d2cc26336a1": true, + "5ed5166ad380ab312177c100": true, + "5ede4739e0350d05467f73e8": true, + "5ede47405b097655935d7d16": true, + "5ede474b0c226a66f5402622": true, + "5ede475339ee016e8c534742": true, + "5ede475b549eed7c6d5c18fb": true, + "5eea21647547d6330471b3c9": true, + "5eea217fc64c5d0dfc05712a": true, + "5eeb2ff5ea4f8b73c827350b": true, + "5ef1b9f0c64c5d0dfc0571a1": true, + "5ef1ba28c64c5d0dfc0571a5": true, + "5ef32e4d1c1fd62aea6a150d": true, + "5ef3448ab37dfd6af863525c": true, + "5ef3553c43cb350a955a7ccb": true, + "5ef35bc243cb350a955a7ccd": true, + "5ef35d2ac64c5d0dfc0571b0": true, + "5ef35f46382a846010715a96": true, + "5ef366938cef260c0642acad": true, + "5ef369b08cef260c0642acaf": true, + "5ef5d994dfbc9f3c660ded95": true, + "5ef61964ec7f42238c31e0c1": true, + "5efaf417aeb21837e749c7f2": true, + "5efb0c1bd79ff02a1f5e68d9": true, + "5efb0cabfb3e451d70735af5": true, + "5efb0d4f4bc50b58e81710f3": true, + "5efb0da7a29a85116f6ea05f": true, + "5efb0e16aeb21837e749c7ff": true, + "5efb0fc6aeb21837e749c801": true, + "5f0596629e22f464da6bbdd9": true, + "5f0c892565703e5c461894e9": true, + "5f2a9575926fd9352339381f": true, + "5f2aa43ba9b91d26f20ae6d2": true, + "5f2aa4464b50c14bcf07acdb": true, + "5f2aa4559b44de6b1b4e68d1": true, + "5f2aa46b878ef416f538b567": true, + "5f2aa47a200e2c0ee46efa71": true, + "5f2aa493cd375f14e15eea72": true, + "5f2aa49f9b44de6b1b4e68d4": true, + "5f36a0e5fbf956000b716b65": true, + "5f3e76d86cda304dcc634054": true, + "5f3e772a670e2a7b01739a52": true, + "5f3e777688ca2d00ad199d25": true, + "5f3e778efcd9b651187d7201": true, + "5f3e77b26cda304dcc634057": true, + "5f3e77f59103d430b93f94c1": true, + "5f3e7801153b8571434a924c": true, + "5f3e7823ddc4f03b010e2045": true, + "5f3e7897ddc4f03b010e204a": true, + "5f3e78a7fbf956000b716b8e": true, + "5f4f9eb969cdc30ff33f09db": false, + "5f5e45cc5021ce62144be7aa": true, + "5f5e467b0bc58666c37e7821": true, + "5f5e46b96bdad616ad46d613": true, + "5f5f41476bdad616ad46d631": true, + "5f5f41f56760b4138443b352": true, + "5f60b34a41e30a4ab12a6947": true, + "5f60b85bbdb8e27dee3dc985": true, + "5f60bf4558eff926626a60f2": true, + "5f60c076f2bcbb675b00dac2": true, + "5f60c74e3b85f6263c145586": true, + "5f60c85b58eff926626a60f7": true, + "5f60cd6cf2bcbb675b00dac6": true, + "5f60e6403b85f6263c14558c": true, + "5f60e7788adaa7100c3adb49": true, + "5f60e784f2bcbb675b00dac7": true, + "5f6331e097199b7db2128dc2": true, + "5f6336bbda967c74a42e9932": true, + "5f6339d53ada5942720e2dc3": true, + "5f633f68f5750b524b45f112": true, + "5f633f791b231926f2329f13": true, + "5f633ff5c444ce7e3c30a006": true, + "5f63405df5750b524b45f114": true, + "5f63407e1b231926f2329f15": true, + "5f6340d3ca442212f4047eb2": true, + "5f6341043ada5942720e2dc5": true, + "5f63418ef5750b524b45f116": true, + "5f6372e2865db925d54f3869": true, + "5f647f31b6238e5dd066e196": true, + "5f99418230835532b445e954": true, + "5f994730c91ed922dd355de3": true, + "5f9949d869e2777a0e779ba5": true, + "5fb64bc92b1b027b1f50bcf2": true, + "5fb651b52b1b027b1f50bcff": true, + "5fb651dc85f90547f674b6f4": true, + "5fb65363d1409e5ca04b54f5": true, + "5fb653962b1b027b1f50bd03": true, + "5fb65424956329274326f316": true, + "5fb6548dd1409e5ca04b54f9": true, + "5fb6558ad6f0b2136f2d7eb7": true, + "5fb655a72b1b027b1f50bd06": true, + "5fb655b748c711690e3a8d5a": true, + "5fb6564947ce63734e3fa1da": true, + "5fb6567747ce63734e3fa1dc": true, + "5fbb976df9986c4cff3fe5f2": true, + "5fbb978207e8a97d1f0902d3": true, + "5fbbaa86f9986c4cff3fe5f6": true, + "5fbbc3324e8a554c40648348": true, + "5fbbc34106bde7524f03cbe9": true, + "5fbbc366ca32ed67276c1557": true, + "5fbbc383d5cb881a7363194a": true, + "5fbbfabed5cb881a7363194e": true, + "5fbbfacda56d053a3543f799": true, + "5fbc210bf24b94483f726481": true, + "5fbc226eca32ed67276c155d": true, + "5fbc227aa56d053a3543f79e": true, + "5fbc22ccf24b94483f726483": true, + "5fbcbcf593164a5b6278efb2": true, + "5fbcbd02900b1d5091531dd3": true, + "5fbcbd10ab884124df0cd563": true, + "5fbcbd6c187fea44d52eda14": true, + "5fbcc1d9016cce60e8341ab3": true, + "5fbcc3e4d6fa9c00c571bb58": true, + "5fbcc429900b1d5091531dd7": true, + "5fbcc437d724d907e2077d5c": true, + "5fbcc640016cce60e8341acc": true, + "5fbe3ffdf8b6a877a729ea82": true, + "5fbe760793164a5b6278efc8": true, + "5fbe7618d6fa9c00c571bb6c": true, + "5fc0f9b5d724d907e2077d82": true, + "5fc0f9cbd6fa9c00c571bb90": true, + "5fc0fa362770a0045c59c677": true, + "5fc0fa957283c4046c58147e": true, + "5fc22d7c187fea44d52eda44": true, + "5fc23426900b1d5091531e15": true, + "5fc235db2770a0045c59c683": true, + "5fc2360f900b1d5091531e19": true, + "5fc23636016cce60e8341b05": true, + "5fc23678ab884124df0cd590": true, + "5fc2369685fd526b824a5713": true, + "5fc275cf85fd526b824a571a": true, + "5fc278107283c4046c581489": true, + "5fc382a9d724d907e2077dab": true, + "5fc382b6d6fa9c00c571bbc3": true, + "5fc382c1016cce60e8341b20": true, + "5fc3e272f8b6a877a729eac5": true, + "5fc3e466187fea44d52eda90": true, + "5fc3e4a27283c4046c5814ab": true, + "5fc3e4ee7283c4046c5814af": true, + "5fc3f2d5900b1d5091531e57": true, + "5fc4b97bab884124df0cd5e3": true, + "5fc4b992187fea44d52edaa9": true, + "5fc4b9b17283c4046c5814d7": true, + "5fc53954f8b6a877a729eaeb": true, + "5fc5396e900b1d5091531e72": true, + "5fc64ea372b0dd78d51159dc": true, + "5fca138c2a7b221b2852a5c6": true, + "5fca13ca637ee0341a484f46": true, + "5fce0cf655375d18a253eff0": true, + "5fce0f9b55375d18a253eff2": true, + "5fce16961f152d4312622bc9": true, + "5fd20ff893a8961fc660a954": true, + "5fd4c474dd870108a754b241": true, + "5fd4c4fa16cac650092f6771": true, + "5fd4c5477a8d854fa0105061": true, + "5fd4c60f875c30179f5d04c2": true, + "5fd8d28367cb5e077335170f": true, + "60098ad7c2240c0fe85c570a": true, + "60098af40accd37ef2175f27": true, + "60098b1705871270cd5352a1": true, + "601948682627df266209af05": true, + "60194943740c5d77f6705eea": true, + "601949593ae8f707c4608daa": true, + "601aa3d2b2bcb34913271e6d": true, + "602286df23506e50807090c6": true, + "60228924961b8d75ee233c32": true, + "60228a76d62c9b14ed777a66": true, + "60228a850ddce744014caf69": true, + "602293f023506e50807090cb": true, + "60229948cacb6b0506369e27": true, + "602a95edda11d6478d5a06da": true, + "602a95fe4e02ce1eaa358729": true, + "602a97060ddce744014caf6f": true, + "602a9740da11d6478d5a06dc": true, + "602e3f1254072b51b239f713": true, + "602e620f9b513876d4338d9a": true, + "602e63fb6335467b0c5ac94d": true, + "602e71bd53a60014f9705bfa": true, + "602f85fd9b513876d4338d9c": true, + "603372b4da11d6478d5a07ff": true, + "603372d154072b51b239f9e1": true, + "603372f153a60014f970616d": true, + "603373004e02ce1eaa358814": true, + "6033749e88382f4fab3fd2c5": true, + "60337f5dce399e10262255d1": true, + "60338ff388382f4fab3fd2c8": true, + "60339954d62c9b14ed777c06": true, + "6033fa48ffd42c541047f728": true, + "603409c80ca681766b6a0fb2": true, + "6034cf5fffd42c541047f72e": true, + "6034d0230ca681766b6a0fb5": true, + "6034d103ca006d2dca39b3f0": true, + "6034d2d697633951dc245ea6": true, + "6034e3cb0ddce744014cb870": true, + "6034e3d953a60014f970617b": true, + "6034e3e20ddce744014cb878": true, + "603618feffd42c541047f771": true, + "603619720ca681766b6a0fc4": true, + "60361a7497633951dc245eb4": true, + "60361b0b5a45383c122086a1": true, + "60361b5a9a15b10d96792291": true, + "60363c0c92ec1c31037959f5": true, + "603648ff5a45383c122086ac": true, + "6038b4b292ec1c3103795a0b": true, + "6038b4ca92ec1c3103795a0d": true, + "6038d614d10cbf667352dd44": true, + "6040dd4ddcf9592f401632d2": true, + "6040de02647ad86262233012": true, + "606587252535c57a13424cfd": true, + "60658776f2cb2e02a42ace2b": true, + "6065878ac9cf8012264142fd": true, + "606587a88900dc2d9a55b659": true, + "606587bd6d0bd7580617bacc": true, + "606587d11246154cad35d635": true, + "606587e18900dc2d9a55b65f": true, + "6065880c132d4d12c81fd8da": true, + "6065881d1246154cad35d637": true, + "6065c6e7132d4d12c81fd8e1": true, + "6065dc8a132d4d12c81fd8e3": true, + "606dae0ab0e443224b421bb7": true, + "606ee5c81246154cad35d65e": true, + "606eef46232e5a31c233d500": true, + "606eef756d0bd7580617baf8": true, + "606ef0812535c57a13424d20": true, + "606f262c6d0bd7580617bafa": true, + "606f263a8900dc2d9a55b68d": true, + "606f26752535c57a13424d22": true, + "606f2696f2cb2e02a42aceb1": true, + "6076c1b9f2cb2e02a42acedc": true, + "60785c0d232e5a31c233d51c": true, + "60785ce5132d4d12c81fd918": true, + "607d5aa50494a626335e12ed": true, + "607ea812232e5a31c233d53c": true, + "607f201b3c672b3b3a24a800": true, + "607f20859ee58b18e41ecd90": true, + "607ffb988900dc2d9a55b6e4": true, + "6086b5392535c57a13424d70": true, + "6086b5731246154cad35d6c7": true, + "6087e0336d0bd7580617bb7a": true, + "6087e2a5232e5a31c233d552": true, + "6087e663132d4d12c81fd96b": true, + "609269c3b0e443224b421cc1": true, + "60926df0132d4d12c81fd9df": true, + "609a4b4fe2ff132951242d04": true, + "609a63b6e2ff132951242d09": true, + "609b9e31506cf869cf3eaf41": true, + "609bab8b455afd752b2e6138": true, + "609e8540d5c319764c2bc2e9": true, + "609e860ebd219504d8507525": true, + "60a23797a37c940de7062d02": true, + "60a272cc93ef783291411d8e": true, + "60a2828e8689911a226117f9": true, + "60a283193cb70855c43a381d": true, + "60a3c68c37ea821725773ef5": true, + "60a3c70cde5f453f634816a3": true, + "60a621c49c197e4e8c4455e6": true, + "60a6220e953894617404b00a": true, + "60a7acf20c5cb24b01346648": true, + "60a7ad2a2198820d95707a2e": true, + "60a7ad3a0c5cb24b0134664a": true, + "60b0f988c4449e4cb624c1da": true, + "60b52e5bc7d8103275739d67": true, + "60bf74184a63fc79b60c57f6": true, + "60db29ce99594040e04c4a27": true, + "6113c3586c780c1e710c90bc": true, + "6113cc78d3a39d50044c065a": true, + "6113cce3d92c473c770200c7": true, + "6113d6c3290d254f5e6b27db": true, + "611a30addbdd8440277441dc": true, + "611a31ce5b7ffe001b4649d1": true, + "6123649463849f3d843da7c4": true, + "612368f58b401f4f51239b33": true, + "612781056f3d944a17348d60": true, + "612e0cfc8004cc50514c2d9e": true, + "612e0d3767085e45ef14057f": true, + "612e0d81290d254f5e6b291a": true, + "612e0e04568c120fdd294258": true, + "612e0e3c290d254f5e6b291d": true, + "612e0e55a112697a4b3a66e7": true, + "6130c3dffaa1272e43151c7d": true, + "6130c43c67085e45ef1405a1": true, + "6130c4d51cb55961fa0fd49f": true, + "6130ca3fd92c473c77020dbd": true, + "614451b71e5874611e2c7ae5": true, + "615d8d878004cc50514c3233": true, + "615d8da4d3a39d50044c10e8": true, + "615d8dbd290d254f5e6b2ed6": true, + "615d8df08004cc50514c3236": true, + "615d8e2f1cb55961fa0fd9a4": true, + "615d8e9867085e45ef1409c6": true, + "615d8eb350224f204c1da1cf": true, + "615d8f5dd92c473c770212ef": true, + "615d8f8567085e45ef1409ca": true, + "615d8faecabb9b7ad90f4d5d": true, + "615d8fd3290d254f5e6b2edc": true, + "61605d88ffa6e502ac5e7eeb": true, + "616442e4faa1272e43152193": true, + "616554fe50224f204c1da2aa": true, + "61657230d92c473c770213d7": true, + "616584766ef05c2ce828ef57": true, + "61659f79d92c473c770213ee": true, + "6165ac306ef05c2ce828ef74": true, + "6165ac8c290d254f5e6b2f6c": true, + "6165adcdd3a39d50044c120f": true, + "6165aeedfaa1272e431521e3": true, + "61695095d92c473c7702147a": true, + "61702be9faa1272e431522c3": true, + "61702d8a67085e45ef140b24": true, + "61702f1b67085e45ef140b26": true, + "61703001d92c473c77021497": true, + "61712eae6c780c1e710c9a1d": true, + "617130016c780c1e710c9a24": true, + "617131a4568c120fdd29482d": true, + "61713308d92c473c770214a0": true, + "6171367e1cb55961fa0fdb36": true, + "61713a8fd92c473c770214a4": true, + "61713cc4d8e3106d9806c109": true, + "6171407e50224f204c1da3c5": true, + "61714b2467085e45ef140b2c": true, + "61714eec290d254f5e6b2ffc": true, + "617151c1d92c473c770214ab": true, + "617153016c780c1e710c9a2f": true, + "617154aa1cb55961fa0fdb3b": true, + "617155ee50224f204c1da3cd": true, + "61715e7e67085e45ef140b33": true, + "6176a40f0b8c0312ac75a3d3": true, + "6176a48d732a664031271438": true, + "6176aca650224f204c1da3fb": true, + "617aa4dd8166f034d57de9c5": true, + "617fd91e5539a84ec44ce155": true, + "61816734d8e3106d9806c1f3": true, + "618167441cb55961fa0fdc71": true, + "618167528004cc50514c34f9": true, + "618167616ef05c2ce828f1a8": true, + "6181688c6c780c1e710c9b04": true, + "618168b350224f204c1da4d8": true, + "618168dc8004cc50514c34fc": true, + "61816df1d3a39d50044c139e": true, + "61816dfa6ef05c2ce828f1ad": true, + "61816fcad92c473c770215cc": true, + "61817865d3a39d50044c13a4": true, + "618178aa1cb55961fa0fdc80": true, + "61825d06d92c473c770215de": true, + "61825d136ef05c2ce828f1cc": true, + "61825d24d3a39d50044c13af": true, + "6183afd850224f204c1da514": true, + "6183b0711cb55961fa0fdcad": true, + "6183b084a112697a4b3a6e6c": true, + "6183d53f1cb55961fa0fdcda": true, + "6183fc15d3a39d50044c13e9": true, + "6183fd911cb55961fa0fdce9": true, + "6183fd9e8004cc50514c358f": true, + "618405198004cc50514c3594": true, + "6184055050224f204c1da540": true, + "618407a850224f204c1da549": true, + "61840bedd92c473c77021635": true, + "61840d85568c120fdd2962a5": true, + "618426d96c780c1e710c9b9f": true, + "618428466ef05c2ce828f218": true, + "618a431df1eb8e24b8741deb": true, + "618a5d5852ecee1505530b2a": true, + "618a75c9a3884f56c957ca1b": true, + "618a75f0bd321d49084cd399": true, + "618a760e526131765025aae3": true, + "618aef6d0a5a59657e5f55ee": true, + "618b9643526131765025ab35": true, + "618b9671d14d6d5ab879c5ea": true, + "618b9682a3884f56c957ca78": true, + "618ba27d9008e4636a67f61d": true, + "618ba91477b82356f91ae0e8": true, + "618ba92152ecee1505530bd3": true, + "618bab21526131765025ab3f": true, + "618bb76513f5097c8d5aa2d5": true, + "618cfae774bb2d036a049e7c": true, + "619256e5f8af2c1a4e1f5d92": true, + "619386379fb0c665d5490dbe": true, + "6193a720f8ee7e52e42109ed": true, + "6193d3149fb0c665d5490e32": true, + "6193d338de3cdf1d2614a6fc": true, + "6193d382ed0429009f543e65": true, + "6193d3be7c6c7b169525f0da": true, + "6193d3cded0429009f543e6a": true, + "6193d5d4f8ee7e52e4210a1b": true, + "6193dcd0f8ee7e52e4210a28": true, + "6194ef39de3cdf1d2614a768": true, + "6194efe07c6c7b169525f11b": true, + "6194eff92d2c397d6600348b": true, + "6194f017ed0429009f543eaa": true, + "6194f02d9bb3d20b0946d2f0": true, + "6194f1f918a3974e5e7421e4": true, + "6194f2912d2c397d6600348d": true, + "6194f2df645b5d229654ad77": true, + "6194f3286db0f2477964e67d": true, + "6194f35c18a3974e5e7421e6": true, + "6194f41f9fb0c665d5490e75": true, + "6194f5722d2c397d6600348f": true, + "6194f5a318a3974e5e7421eb": true, + "6194f5d418a3974e5e7421ef": true, + "619621a4de3cdf1d2614a7a7": true, + "619624b26db0f2477964e6b0": true, + "6196255558ef8c428c287d1c": true, + "61962b617c6c7b169525f168": true, + "61962d879bb3d20b0946d385": true, + "6196364158ef8c428c287d9f": true, + "6196365d58ef8c428c287da1": true, + "619636be6db0f2477964e710": true, + "61963a852d2c397d660036ad": true, + "61965d9058ef8c428c287e0d": true, + "619666f4af1f5202c57a952d": true, + "6197b229af1f5202c57a9bea": true, + "619b5db699fb192e7430664f": true, + "619b69037b9de8162902673e": true, + "619bc61e86e01e16f839a999": true, + "619bdd8886e01e16f839a99c": true, + "619bddc6c9546643a67df6ee": true, + "619bddffc9546643a67df6f0": true, + "619bde3dc9546643a67df6f2": true, + "619bde7fc9546643a67df6f4": true, + "619bdeb986e01e16f839a99e": true, + "619bdef8c9546643a67df6f6": true, + "619bdf9cc9546643a67df6f8": true, + "619bdfd4c9546643a67df6fa": true, + "619cbf7d23893217ec30b689": true, + "619cbf9e0a7c3a1a2731940a": true, + "619cf0335771dd3c390269ae": true, + "619d36da53b4d42ee724fae4": true, + "619f4ab2d25cbd424731fb95": true, + "619f4bffd25cbd424731fb97": true, + "619f4cee4c58466fe1228435": true, + "619f4d304c58466fe1228437": true, + "619f4f8c4c58466fe1228439": true, + "619f52454c58466fe122843b": true, + "61a4c8884f95bc3b2c5dc96f": true, + "61b9e1aaef9a1b5d6a79899a": true, + "61bc85697113f767765c7fe7": true, + "61bca7cda0eae612383adf57": true, + "61bcc89aef0f505f0c6cd0fc": true, + "61c18d83b00456371a66814b": true, + "61c18db6dfd64163ea78fbb4": true, + "61f4012adfc9f01a816adda1": true, + "61f7b234ea4ab34f2f59c3ec": true, + "61f7b85367ddd414173fdb36": true, + "61f7c9e189e6fb1a5e3ea78d": true, + "61f8024263dc1250e26eb029": true, + "61f803b8ced75b2e852e35f8": true, + "61faa91878830f069b6b7967": true, + "620109578d82e67e7911abf2": true, + "6217726288ed9f0845317459": true, + "62178be9d0050232da3485d9": true, + "62178c4d4ecf221597654e3d": true, + "622b327b267a1b13a44abea3": true, + "622b379bf9cfc87d675d2de5": true, + "622b3858034a3e17ad0b81f5": true, + "622b38c56762c718e457e246": true, + "622b397c9a3d4327e41843b6": true, + "622b3c081b89c677a33bcda6": true, + "622b3d5cf9cfc87d675d2de9": true, + "622b4d7df9cfc87d675d2ded": true, + "622b4f54dc8dcc0ba8742f85": true, + "622efbcb99f4ea1a4d6c9a15": true, + "622efdf8ec80d870d349b4e5": true, + "622f02437762f55aaa68ac85": true, + "622f039199f4ea1a4d6c9a17": true, + "622f07cfae33bc505b2c4dd5": true, + "622f0ee47762f55aaa68ac87": true, + "622f128cec80d870d349b4e8": true, + "622f140da5958f63c67f1735": true, + "622f14e899892a7f9e08f6c5": true, + "622f16a1a5958f63c67f1737": true, + "623063e994fc3f7b302a9696": true, + "62307b7b10d2321fa8741921": true, + "6231654c71b5bc3baa1078e5": true, + "623166e08c43374ca1567195": true, + "6231670f0b8aa5472d060095": true, + "62330b3ed4dc74626d570b95": true, + "62330bfadc5883093563729b": true, + "62330c18744e5e31df12f516": true, + "62330c40bdd19b369e1e53d1": true, + "62386b2adf47d66e835094b2": true, + "62386b7153757417e93a4e9f": true, + "62389aaba63f32501b1b444f": true, + "62389ba9a63f32501b1b4451": true, + "62389bc9423ed1685422dc57": true, + "62389be94d5d474bf712e709": true, + "623b2e9d11c3296b440d1638": true, + "623c2f4242aee3103f1c44b7": true, + "623c2f652febb22c2777d8d7": true, + "623c3be0484b5003161840dc": true, + "623c3c1f37b4b31470357737": true, + "6241c2c2117ad530666a5108": true, + "6241c316234b593b5676b637": true, + "62444cb99f47004c781903eb": true, + "62444cd3674028188b052799": true, + "624c0570c9b794431568f5d5": true, + "624c09cfbc2e27219346d955": true, + "624c09da2cec124eb67c1046": true, + "624c09e49b98e019a3315b66": true, + "624c0b3340357b5f566e8766": true, + "624c29ce09cd027dff2f8cd7": true, + "624c2e8614da335f1e034d8c": true, + "6259b864ebedf17603599e88": true, + "6259c2c1d714855d182bad85": true, + "6259c3387d6aab70bc23a18d": true, + "6259c3d8012d6678ec38eeb8": true, + "6259c4347d6aab70bc23a190": true, + "625eb0faa6e3a82193267ad9": true, + "625ebcef6f53af4aa66b44dc": true, + "625ec45bb14d7326ac20f572": true, + "625ed7c64d9b6612df732146": true, + "626667e87379c44d557b7550": true, + "626673016f1edc06f30cf6d5": true, + "62669bccdb9ebb4daa44cd14": true, + "6267c6396b642f77f56f5c1c": true, + "6269220d70b6c02e665f2635": true, + "6269545d0e57f218e4548ca2": true, + "626a74340be03179a165e30c": true, + "626a8ae89e664a2e2a75f409": true, + "626a9cb151cb5849f6002890": true, + "626bb8532c923541184624b4": true, + "626becf9582c3e319310b837": true, + "6272370ee4013c5d7e31f418": true, + "6272379924e29f06af4d5ecb": true, + "627254cc9c563e6e442c398f": true, + "6272874a6c47bd74f92e2087": true, + "6275303a9f372d6ea97f9ec7": true, + "627e14b21713922ded6f2c15": true, + "62811cd7308cb521f87a8f99": true, + "62811e2510e26c1f344e6554": true, + "62811e335631d45211793c95": true, + "62811f461d5df4475f46a332": true, + "62811f828193841aca4a45c3": true, + "62811fa609427b40ab14e765": true, + "62811fbf09427b40ab14e767": true, + "6281204f308cb521f87a8f9b": true, + "628120621d5df4475f46a335": true, + "62812081d23f207deb0ab216": true, + "6281209662cba23f6c4d7a19": true, + "628120c21d5df4475f46a337": true, + "628120d309427b40ab14e76d": true, + "628120dd308cb521f87a8fa1": true, + "628120fd5631d45211793c9f": true, + "6281212a09427b40ab14e770": true, + "628121434fa03b6b6c35dc6a": true, + "6284bd5f95250a29bc628a30": true, + "62850c28da09541f43158cca": true, + "628a60ae6b1d481ff772e9c8": true, + "628a664bccaab13006640e47": true, + "628a665a86cbd9750d2ff5e5": true, + "628a6678ccaab13006640e49": true, + "628a66b41d5e41750e314f34": true, + "628a7b23b0f75035732dd565": true, + "628a83c29179c324ed269508": true, + "628a85ee6b1d481ff772e9d5": true, + "628b5638ad252a16da6dd245": true, + "628b8d83717774443b15e248": true, + "628b916469015a4e1711ed8d": true, + "628b9471078f94059a4b9bfb": true, + "628b9784bcf6e2659e09b8a2": true, + "628b9a40717774443b15e9f2": true, + "628b9be6cff66b70c002b14c": true, + "628b9c37a733087d0d7fe84b": true, + "628b9c7d45122232a872358f": true, + "628baf0b967de16aab5a4f36": true, + "628bc7fb408e2b2e9c0801b1": true, + "628c9ab845c59e5b80768a81": true, + "628cd624459354321c4b7fa2": true, + "628d0618d1ba6e4fa07ce5a4": true, + "628dc750b910320f4c27a732": true, + "628e1ffc83ec92260c0f437f": true, + "628e4dd1f477aa12234918aa": true, + "628e4e576d783146b124c64d": true, + "62963c18dbc8ab5f0d382d0b": true, + "62a09d3bcf4a99369e262447": true, + "62a09d79de7ac81993580530": true, + "62a09dd4621468534a797ac7": true, + "62a09e08de7ac81993580532": true, + "62a09e410b9d3c46de5b6e78": true, + "62a09f32621468534a797acb": true, + "62a1b7fbc30cfa1d366af586": true, + "62a5c2c98ec41a51b34739c0": true, + "62a5c333ec21e50cad3b5dc6": true, + "62a5c41e8ec41a51b34739c3": true, + "62a61bbf8ec41a51b34758d2": true, + "62a61c988ec41a51b34758d5": true, + "62e910aaf957f2915e0a5e36": true }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdde", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe4ab2240ca750fd72bbde5", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4ab2240ca750fd72bbddd", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe4ab2240ca750fd72bbdde", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4ab2240ca750fd72bbddf", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe4ab2240ca750fd72bbde5", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4ab2240ca750fd72bbde2", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe4ab2240ca750fd72bbde5", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4ab2240ca750fd72bbde0", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe4ab2240ca750fd72bbde2", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbde1", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe4ab2240ca750fd72bbde2", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbde4", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe4ab2240ca750fd72bbde5", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbde3", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbde4", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdee", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608815684 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbde7", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe4ab2240ca750fd72bbdee", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4ab2240ca750fd72bbde6", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe4ab2240ca750fd72bbde7", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4ab2240ca750fd72bbde8", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe4ab2240ca750fd72bbdee", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4ab2240ca750fd72bbdeb", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe4ab2240ca750fd72bbdee", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4ab2240ca750fd72bbde9", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe4ab2240ca750fd72bbdeb", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdea", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe4ab2240ca750fd72bbdeb", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbded", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe4ab2240ca750fd72bbdee", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbdec", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbded", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdfb", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 14 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 4, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 6, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 24 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 25 + } + ], + "Improvement": {}, + "Production": {} }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdef", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe4ab2240ca750fd72bbdfb", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf1", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe4ab2240ca750fd72bbdfb", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf0", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe4ab2240ca750fd72bbdf1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdf7", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe4ab2240ca750fd72bbdfb", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf4", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe4ab2240ca750fd72bbdf7", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf2", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe4ab2240ca750fd72bbdf4", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf3", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe4ab2240ca750fd72bbdf4", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf5", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe4ab2240ca750fd72bbdf7", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe4ab2240ca750fd72bbdf5", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf6", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe4ab2240ca750fd72bbdf7", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdf9", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe4ab2240ca750fd72bbdfb", - "slotId": "mod_stock" - }, - { - "_id": "5fe4ab2240ca750fd72bbdf8", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe4ab2240ca750fd72bbdf9", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe4ab2240ca750fd72bbdfa", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe4ab2240ca750fd72bbdfb", - "slotId": "mod_charge" - }, - { - "_id": "5fe4ab2240ca750fd72bbe04", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 17206066, + "GameVersion": "edge_of_darkness", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 69, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 2, + "NeedWipeOptions": [], + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Bear", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbdfd", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe4ab2240ca750fd72bbe04", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbdfc", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbdfd", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe02", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe4ab2240ca750fd72bbe04", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4ab2240ca750fd72bbdfe", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe4ab2240ca750fd72bbe02", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4ab2240ca750fd72bbdff", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe4ab2240ca750fd72bbe02", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe00", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe4ab2240ca750fd72bbe02", - "slotId": "mod_stock" - }, - { - "_id": "5fe4ab2240ca750fd72bbe01", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe4ab2240ca750fd72bbe02", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4ab2240ca750fd72bbe03", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe4ab2240ca750fd72bbe04", - "slotId": "mod_charge" - }, - { - "_id": "5fe4ab2240ca750fd72bbe0d", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49444ae6628187a2e77b8", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49444ae6628187a2e77b8", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "f5e6bdac05e699d687993249", + "_tpl": "5857a8bc2459772bad15db29", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "SecuredContainer" + }, { + "_id": "01e9d751f10e4e9aebdd94d5", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Pockets" + }, { + "_id": "5fe49444ae6628187a2e78b8", + "_tpl": "5811ce772459770e9e5f9532" + }, { + "_id": "5fe49444ae6628187a2e78ba", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49444ae6628187a2e78b9", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + }, { + "_id": "6275a53292b3e1de7c0f94fc", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "f55404fc9c2a0063bc1b9293", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000000 + } + }, { + "_id": "c1408429a85d87168d75e04c", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000000 + } + }, { + "_id": "72ec3ef07bf2ddf6c0dab838", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000000 + } + }, { + "_id": "72ec3ef08bf2fdf6c0dab835", + "_tpl": "58ac60eb86f77401897560ff", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 1 + } + }, { + "_id": "6a948d215ed5fc228448ffaa", + "_tpl": "62e910aaf957f2915e0a5e36", + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "location": { + "x": 5, + "y": 0, + "r": "Horizontal", + "isSearched": true + }, + "upd": { + "RecodableComponent": { + "IsEncoded": true + } + } + }, { + "_id": "6a948d215ed5fc228448ffab", + "_tpl": "62e910aaf957f2915e0a5e36", + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "location": { + "x": 6, + "y": 0, + "r": "Horizontal", + "isSearched": true + }, + "upd": { + "RecodableComponent": { + "IsEncoded": false + } + } + } + ], + "questRaidItems": "5fe49444ae6628187a2e78b9", + "questStashItems": "5fe49444ae6628187a2e78ba", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49444ae6628187a2e78b8" }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe06", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe4ab2240ca750fd72bbe0d", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4ab2240ca750fd72bbe05", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe4ab2240ca750fd72bbe06", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4ab2240ca750fd72bbe07", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe4ab2240ca750fd72bbe0d", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4ab2240ca750fd72bbe0a", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe4ab2240ca750fd72bbe0d", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4ab2240ca750fd72bbe08", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe4ab2240ca750fd72bbe0a", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe09", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe4ab2240ca750fd72bbe0a", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe0c", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe4ab2240ca750fd72bbe0d", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbe0b", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4ab2240ca750fd72bbe0c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe16", - "_tpl": "5e870397991fd70db46995c8", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 16 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Notes": { + "Notes": [] }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe0f", - "_tpl": "5e87071478f43e51ca2de5e1", - "parentId": "5fe4ab2240ca750fd72bbe16", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4ab2240ca750fd72bbe0e", - "_tpl": "5e8708d4ae379e67d22e0102", - "parentId": "5fe4ab2240ca750fd72bbe0f", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe10", - "_tpl": "5e87076ce2db31558c75a11d", - "parentId": "5fe4ab2240ca750fd72bbe16", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4ab2240ca750fd72bbe12", - "_tpl": "5e87080c81c4ed43e83cefda", - "parentId": "5fe4ab2240ca750fd72bbe16", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbe11", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4ab2240ca750fd72bbe12", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 8 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe13", - "_tpl": "5e87116b81c4ed43e83cefdd", - "parentId": "5fe4ab2240ca750fd72bbe16", - "slotId": "mod_stock" - }, - { - "_id": "5fe4ab2240ca750fd72bbe14", - "_tpl": "5e87114fe2db31558c75a120", - "parentId": "5fe4ab2240ca750fd72bbe16", - "slotId": "mod_mount", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe15", - "_tpl": "560d5e524bdc2d25448b4571", - "parentId": "5fe4ab2240ca750fd72bbe16", - "slotId": "patron_in_weapon" - }, - { - "_id": "5fe4ab2240ca750fd72bbe1b", - "_tpl": "5bfea6e90db834001b7347f3", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 18 - }, - "parentId": "5fe4ab2240ca750fd72bbe1c", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" }, - { - "_id": "5fe4ab2240ca750fd72bbdaf", - "_tpl": "5bfebc5e0db834001a6694e5", - "parentId": "5fe4ab2240ca750fd72bbe1b", - "slotId": "mod_mount" + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cd946231388ce000d572fe3", + "5cd945d71388ce000a659dfb" + ], + "trader": { + "initialLoyaltyLevel": 4, + "initialSalesSum": 2600000, + "initialStanding": 6, + "jaegerUnlocked": true, + "setQuestsAvailableForFinish": true, + "setQuestsAvailableForStart": false }, - { - "_id": "5fe4ab2240ca750fd72bbdb0", - "_tpl": "57c5ac0824597754771e88a9", - "parentId": "5fe4ab2240ca750fd72bbdaf", - "slotId": "mod_scope", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe18", - "_tpl": "5bfeaa0f0db834001b734927", - "parentId": "5fe4ab2240ca750fd72bbe1b", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4ab2240ca750fd72bbe17", - "_tpl": "58dd3ad986f77403051cba8f", - "parentId": "5fe4ab2240ca750fd72bbe18", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 10 - } - }, - { - "_id": "5fe4ab2240ca750fd72bbe19", - "_tpl": "5bfeb32b0db834001a6694d9", - "parentId": "5fe4ab2240ca750fd72bbe1b", - "slotId": "mod_stock" - }, - { - "_id": "5fe4ab2240ca750fd72bbe1a", - "_tpl": "5bfebc320db8340019668d79", - "parentId": "5fe4ab2240ca750fd72bbe1b", - "slotId": "mod_barrel" - }, - { - "_id": "5fe4ab2240ca750fd72bbe1e", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe4ab2240ca750fd72bbe1d", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - } - ], - "questRaidItems": "5fe4ab2240ca750fd72bbe1d", - "questStashItems": "5fe4ab2240ca750fd72bbe1e", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe4ab2240ca750fd72bbe1c" + "weaponbuilds": {} }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cde9ec17d6c8b04723cf479", - "5cde9e957d6c8b0474535da7" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0.2, - "jaegerUnlocked": false - }, - "weaponbuilds": {} - } - }, - "SPT Developer": { - "bear": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c6", - "templateId": "5811ce772459770e9e5f9532", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cc0858d14c02e000c6bea66", - "Feet": "5cc085bb14c02e000e67a5c5", - "Hands": "5cc0876314c02e000c6bea6b", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447ac644bdc2d6c208b4567": true, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448c1d04bdc2dff2f8b4569": true, - "5448fee04bdc2dbc018b4567": false, - "5448ff904bdc2d6f028b456e": true, - "5449016a4bdc2d6f028b456f": false, - "544909bb4bdc2d6f028b4577": true, - "544a11ac4bdc2d470e8b456a": false, - "544a378f4bdc2d30388b4567": true, - "544a37c44bdc2d25388b4567": true, - "544a38634bdc2d58388b4568": true, - "544a3a774bdc2d3a388b4567": true, - "544a5caa4bdc2d1a388b4568": true, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": true, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "544fb62a4bdc2dfb738b4568": true, - "544fb6cc4bdc2d34748b456e": true, - "54527a984bdc2d4e668b4567": true, - "54527ac44bdc2d36668b4567": true, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "5580169d4bdc2d9d138b4585": true, - "55801eed4bdc2d89578b4588": true, - "5580223e4bdc2d1c128b457f": true, - "558022b54bdc2dac148b458d": true, - "55802d5f4bdc2dac148b458e": true, - "55802f5d4bdc2dac148b458f": true, - "558032614bdc2de7118b4585": true, - "559ba5b34bdc2d1f1a8b4582": true, - "55d355e64bdc2d962f8b4569": true, - "55d35ee94bdc2d61338b4568": true, - "55d3632e4bdc2d972f8b4569": true, - "55d447bb4bdc2d892f8b456f": true, - "55d448594bdc2d8c2f8b4569": true, - "55d449444bdc2d962f8b456d": true, - "55d44fd14bdc2d962f8b456e": true, - "55d459824bdc2d892f8b4573": true, - "55d45d3f4bdc2d972f8b456c": true, - "55d45f484bdc2d972f8b456d": true, - "55d480c04bdc2d1d4e8b456a": false, - "55d481904bdc2d8c2f8b456a": true, - "55d482194bdc2d1d4e8b456b": true, - "55d4837c4bdc2d1d4e8b456c": true, - "55d485be4bdc2d962f8b456f": true, - "55d4887d4bdc2d962f8b4570": true, - "55d48a634bdc2d8b2f8b456a": true, - "55d48ebc4bdc2d8c2f8b456c": true, - "55d4ae6c4bdc2d8b2f8b456e": true, - "55d4af3a4bdc2d972f8b456f": true, - "55d4b9964bdc2d1d4e8b456e": true, - "55d5f46a4bdc2d1b198b4567": true, - "55d614004bdc2d86028b4568": true, - "55d6190f4bdc2d87028b4567": true, - "55d7217a4bdc2d86028b456d": false, - "55f84c3c4bdc2d5f408b4576": true, - "560835c74bdc2dc8488b456f": true, - "560836484bdc2d20478b456e": true, - "560836b64bdc2d57468b4567": true, - "560836fb4bdc2d773f8b4569": true, - "560837154bdc2da74d8b4568": true, - "5608373c4bdc2dc8488b4570": true, - "560837544bdc2de22e8b456e": true, - "560837824bdc2d57468b4568": true, - "5608379a4bdc2d26448b4569": true, - "560838c94bdc2d77798b4569": true, - "56083a334bdc2dc8488b4571": true, - "56083be64bdc2d20478b456f": true, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560d61e84bdc2da74d8b4571": true, - "560d657b4bdc2da74d8b4572": true, - "560d75f54bdc2da74d8b4573": true, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a69d4bdc2ded0b8b457b": true, - "5648a7494bdc2d9d488b4583": false, - "5648ac824bdc2ded0b8b457d": true, - "5648ae314bdc2d3d1c8b457f": true, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": true, - "5648b4534bdc2d3d1c8b4580": true, - "5649a2464bdc2d91118b45a8": true, - "5649aa744bdc2ded0b8b457e": false, - "5649ab884bdc2ded0b8b457f": true, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649ae4a4bdc2d1b2b8b4588": true, - "5649af094bdc2df8348b4586": false, - "5649af884bdc2d1b2b8b4589": true, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "5649b2314bdc2d79388b4576": true, - "5649be884bdc2d79388b4577": true, - "5649d9a14bdc2d79388b4580": true, - "5649ed104bdc2d3d1c8b458b": true, - "564ca99c4bdc2d16268b4589": false, - "564ca9df4bdc2d35148b4569": true, - "564caa3d4bdc2d17108b458e": true, - "5656d7c34bdc2d9d198b4587": true, - "5656eb674bdc2d35148b457c": true, - "567143bf4bdc2d1a0f8b4567": true, - "5673de654bdc2d180f8b456d": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59856d2720bd8418b456a": true, - "56d59d3ad2720bdb418b4577": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56dee2bdd2720bc8328b4567": true, - "56deec93d2720bec348b4568": true, - "56deed6ed2720b4c698b4583": true, - "56def37dd2720bec348b456a": true, - "56dfef82d2720bbd668b4567": true, - "56dff026d2720bb8668b4567": true, - "56dff061d2720bb5668b4567": true, - "56dff0bed2720bb0668b4567": true, - "56dff216d2720bbd668b4568": true, - "56dff2ced2720bb4668b4567": true, - "56dff3afd2720bba668b4567": true, - "56dff421d2720b5f5a8b4567": true, - "56dff4a2d2720bbd668b456a": true, - "56dff4ecd2720b5f5a8b4568": true, - "56e0598dd2720bb5668b45a6": true, - "56e05a6ed2720bd0748b4567": true, - "56e05b06d2720bb2668b4586": true, - "56e294cdd2720b603a8b4575": false, - "56e335e4d2720b6c058b456d": true, - "56e33634d2720bd8058b456b": true, - "56e33680d2720be2748b4576": true, - "56ea6fafd2720b844b8b4593": true, - "56ea70acd2720b844b8b4594": true, - "56ea7165d2720b6e518b4583": true, - "56ea7293d2720b8d4b8b45ba": true, - "56ea8180d2720bf2698b456a": true, - "56ea8222d2720b69698b4567": true, - "56ea8d2fd2720b7c698b4570": true, - "56eabcd4d2720b66698b4574": true, - "56eabf3bd2720b75698b4569": true, - "570fd6c2d2720bc6458b457f": true, - "570fd721d2720bc5458b4596": true, - "570fd79bd2720bc7458b4583": true, - "5710c24ad2720bc3458b45a3": false, - "571659bb2459771fb2755a12": true, - "571a26d524597720680fbe8a": true, - "571a279b24597720b4066566": true, - "571a282c2459771fb2755a69": true, - "571a28e524597720b4066567": true, - "571a29dc2459771fb2755a6a": true, - "57235b6f24597759bf5a30f1": true, - "572b7adb24597762ae139821": true, - "572b7fa524597762b747ce82": true, - "5732ee6a24597719ae0c0281": true, - "5734773724597737fd047c14": true, - "57347d3d245977448f7b7f61": true, - "57347d5f245977448b40fa81": true, - "57347d692459774491567cf1": true, - "57347d7224597744596b4e72": false, - "57347d8724597744596b4e76": true, - "57347d90245977448f7b7f65": true, - "57347d9c245977448b40fa85": true, - "57347da92459774491567cf5": true, - "5735fdcd2459776445391d61": true, - "5735ff5c245977640e39ba7e": true, - "573601b42459776410737435": true, - "573602322459776445391df1": true, - "5736026a245977644601dc61": true, - "573603562459776430731618": true, - "573603c924597764442bd9cb": true, - "573718ba2459775a75491131": false, - "573719762459775a626ccbc1": true, - "573719df2459775a626ccbc2": true, - "57371aab2459775a77142f22": true, - "57371b192459775a9f58a5e0": true, - "57371e4124597760ff7b25f1": true, - "57371eb62459776125652ac1": true, - "57371f2b24597761224311f1": true, - "57371f8d24597761006c6a81": true, - "5737201124597760fc4431f1": true, - "5737207f24597760ff7b25f2": true, - "573720e02459776143012541": true, - "57372140245977611f70ee91": true, - "5737218f245977612125ba51": true, - "573722e82459776104581c21": true, - "573724b42459776125652ac2": true, - "5737250c2459776125652acc": true, - "5737256c2459776125652acd": true, - "573725b0245977612125bae2": true, - "5737260b24597761224311f2": true, - "5737266524597761006c6a8c": true, - "573726d824597765d96be361": true, - "5737273924597765dd374461": true, - "573727c624597765cc785b5b": true, - "5737280e24597765cc785b5c": true, - "5737287724597765e1625ae2": true, - "573728cc24597765cc785b5d": true, - "573728f324597765e5728561": true, - "5737292724597765e5728562": true, - "57372a7f24597766fe0de0c1": true, - "57372ac324597767001bc261": true, - "57372b832459776701014e41": true, - "57372bad245977670b7cd242": true, - "57372bd3245977670b7cd243": true, - "57372c21245977670937c6c2": true, - "57372c56245977685e584582": true, - "57372c89245977685d4159b1": true, - "57372d1b2459776862260581": true, - "57372d4c245977685a3da2a1": true, - "57372db0245977685d4159b2": true, - "57372deb245977685d4159b3": true, - "57372e1924597768553071c1": true, - "57372e4a24597768553071c2": true, - "57372e73245977685d4159b4": true, - "57372e94245977685648d3e1": true, - "57372ebf2459776862260582": true, - "57372ee1245977685d4159b5": true, - "57372f2824597769a270a191": true, - "57372f5c24597769917c0131": true, - "57372f7d245977699b53e301": true, - "57372fc52459776998772ca1": true, - "5737300424597769942d5a01": true, - "5737330a2459776af32363a1": true, - "5737339e2459776af261abeb": true, - "573733c72459776b0b7b51b0": true, - "5739d41224597779c3645501": true, - "57486e672459770abd687134": true, - "574d967124597745970e7c94": true, - "574dad8024597745964bf05c": true, - "574db213245977459a2f3f5d": true, - "574eb85c245977648157eec3": true, - "575062b524597720a31c09a1": true, - "57513f07245977207e26a311": true, - "57513f9324597720a7128161": true, - "57513fcc24597720a31c09a6": true, - "5751435d24597720a27126d1": true, - "57514643245977207f2c2d09": true, - "575146b724597720a27126d5": true, - "5751487e245977207e26a315": true, - "5751496424597720a27126da": true, - "5751a25924597722c463c472": true, - "5751a89d24597722aa0e8db0": true, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": true, - "576165642459773c7a400233": true, - "576167ab2459773cad038c43": true, - "57616a9e2459773c7a400234": true, - "57616ca52459773c69055192": true, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "576fd4ec2459777f0b518431": true, - "577d128124597739d65d0e56": true, - "577d141e24597739c5255e01": true, - "57838ad32459774a17445cd2": true, - "57838c962459774a1651ec63": true, - "57838e1b2459774a256959b1": true, - "57838f0b2459774a256959b2": true, - "57838f9f2459774a150289a0": true, - "578395402459774a256959b5": true, - "578395e82459774a0e553c7b": true, - "579204f224597773d619e051": true, - "5798a2832459774b53341029": true, - "57a0dfb82459774d3078b56c": true, - "57a0e5022459774d1673f889": true, - "57a3459f245977764a01f703": true, - "57a9b9ce2459770ee926038d": true, - "57ac965c24597706be5f975c": true, - "57aca93d2459771f2c7e26db": true, - "57acb6222459771ec34b5cb0": true, - "57ade1442459771557167e15": true, - "57adff4f24597737f373b6e6": true, - "57ae0171245977343c27bfcf": true, - "57af48872459771f0b2ebf11": true, - "57c44b372459772d2b39b8ce": true, - "57c44dd02459772d2e0ae249": true, - "57c44e7b2459772d28133248": true, - "57c44f4f2459772d2c627113": true, - "57c44fa82459772d2d75e415": true, - "57c450252459772d28133253": true, - "57c55efc2459772d2c6271e7": true, - "57c55f092459772d291a8463": true, - "57c55f112459772d28133310": true, - "57c55f172459772d27602381": true, - "57c5ac0824597754771e88a9": true, - "57c69dd424597774c03b7bbc": true, - "57c9a89124597704ee6faec1": true, - "57cd379a24597778e7682ecf": false, - "57cff947245977638e6f2a19": true, - "57cffb66245977632f391a99": true, - "57cffcd624597763133760c5": true, - "57cffcdd24597763f5110006": true, - "57cffce524597763b31685d8": true, - "57cffd8224597763b03fc609": true, - "57cffddc24597763133760c6": true, - "57cffe0024597763b03fc60b": true, - "57cffe20245977632f391a9d": true, - "57d14d2524597714373db789": true, - "57d14e1724597714010c3f4b": true, - "57d1519e24597714373db79d": true, - "57d152ec245977144076ccdf": true, - "57d17c5e2459775a5c57d17d": true, - "57d17e212459775a1179a0f5": true, - "57da93632459771cb65bf83f": true, - "57dbb57e2459774673234890": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "57e26ea924597715ca604a09": true, - "57e26fc7245977162a14b800": true, - "57ee59b42459771c7b045da5": true, - "57f3a5ae2459772b0e0bf19e": true, - "57f3c6bd24597738e730fa2f": true, - "57f3c7e024597738ea4ba286": true, - "57f3c8cc2459773ec4480328": true, - "57f4c844245977379d5c14d1": true, - "57fd23e32459772d0805bcf1": true, - "57ffa9f4245977728561e844": true, - "57ffaea724597779f52b3a4d": true, - "57ffb0062459777a045af529": true, - "57ffb0e42459777d047111c5": true, - "5811ce772459770e9e5f9532": false, - "5827272a24597748c74bdeea": true, - "58272b392459774b4c7b3ccd": true, - "58272b842459774abc128d50": true, - "58272d7f2459774f6311ddfd": true, - "583990e32459771419544dd2": true, - "5839a40f24597726f856b511": true, - "5839a7742459773cf9693481": true, - "58491f3324597764bc48fa02": true, - "584924ec24597768f12ae244": true, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "587de4282459771bca0ec90b": true, - "587de5ba2459771c0f1e8a58": true, - "587df583245977373c4f1129": true, - "587e02ff24597743df3deaeb": true, - "587e0531245977466077a0f7": true, - "587e08ee245977446b4410cf": true, - "588200af24597742fa221dfb": true, - "588200c224597743990da9ed": true, - "588200cf2459774414733d55": true, - "588226d124597767ad33f787": true, - "588226dd24597767ad33f789": true, - "588226e62459776e3e094af7": true, - "588226ef24597767af46e39c": true, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "588892092459774ac91d4b11": true, - "5888945a2459774bf43ba385": true, - "5888956924597752983e182d": true, - "5888961624597754281f93f3": true, - "5888976c24597754281f93f5": true, - "5888988e24597752fe43a6fa": true, - "5888996c24597754281f9419": true, - "58889c7324597754281f9439": true, - "58889d0c2459775bc215d981": true, - "588b56d02459771481110ae2": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "58949fac86f77409483e16aa": true, - "5894a05586f774094708ef75": true, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "58a56f8d86f774651579314c": true, - "58a5c12e86f7745d585a2b9e": true, - "58ac1bf086f77420ed183f9f": true, - "58ac60eb86f77401897560ff": true, - "58aeaaa886f7744fc1560f81": true, - "58aeac1b86f77457c419f475": true, - "58c157be86f77403c74b2bb6": true, - "58c157c886f774032749fb06": true, - "58d2664f86f7747fec5834f6": true, - "58d268fc86f774111273f8c2": true, - "58d2912286f7744e27117493": true, - "58d2946386f774496974c37e": true, - "58d2946c86f7744e271174b5": true, - "58d2947686f774485c6a1ee5": true, - "58d2947e86f77447aa070d53": true, - "58d399e486f77442e0016fe7": true, - "58d39b0386f77443380bf13c": true, - "58d39d3d86f77445bb794ae7": true, - "58dd3ad986f77403051cba8f": true, - "5900b89686f7744e704a8747": true, - "590c5d4b86f774784e1b9c45": false, - "590c60fc86f77412b13fddcf": true, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": true, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": true, - "591aef7986f774139d495f03": true, - "591af10186f774139d495f0e": true, - "591af28e86f77414a27a9e1d": true, - "591c4e1186f77410354b316e": true, - "591c4efa86f7741030027726": true, - "591ee00d86f774592f7b841e": true, - "5926bb2186f7744b1c6c6e60": true, - "5926c0df86f77462f647f764": true, - "5926c32286f774616e42de99": true, - "5926c36d86f77467a92a8629": true, - "5926c3b286f774640d189b6b": true, - "5926d2be86f774134d668e4e": true, - "5926d33d86f77410de68ebc0": true, - "5926d3c686f77410de68ebc8": true, - "5926d40686f7740f152b6b7e": true, - "5926dad986f7741f82604363": true, - "5926e16e86f7742f5a0f7ecb": true, - "5926f2e086f7745aae644231": true, - "5926f34786f77469195bfe92": true, - "5929a2a086f7744f4b234d43": true, - "592c2d1a86f7746dbe2af32a": true, - "593d1fa786f7746da62d61ac": true, - "593d489686f7745c6255d58a": true, - "593d490386f7745ee97a1555": true, - "593d493f86f7745e6b2ceb22": true, - "5943d9c186f7745a13413ac9": true, - "5943ee5a86f77413872d25ec": true, - "5943eeeb86f77412d6384f6b": true, - "5947c73886f7747701588af5": true, - "5947db3f86f77447880cf76f": true, - "5947e98b86f774778f1448bc": true, - "5947eab886f77475961d96c5": true, - "5947f92f86f77427344a76b1": true, - "5947fa2486f77425b47c1a9b": true, - "595cf16b86f77427440c32e2": true, - "595cfa8b86f77427437e845b": true, - "5996f6cb86f774678763a6ca": true, - "5996f6d686f77467977ba6cc": true, - "5996f6fc86f7745e585b4de3": true, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a6c86f77414ec448d17": true, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59bfc5c886f7743bf6794e62": true, - "59bfe68886f7746004266202": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c0ec5b86f77435b128bfca": true, - "59c1383d86f774290a37e0ca": true, - "59c63b4486f7747afb151c1c": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "59d6272486f77466146386ff": true, - "59d64ec286f774171d1e0a42": true, - "59d650cf86f7741b846413a4": true, - "59d790f486f77403cb06aec6": true, - "59db3a1d86f77429e05b4e92": true, - "59db3acc86f7742a2c4ab912": true, - "59db3b0886f77429d72fb895": true, - "59db7e1086f77448be30ddf3": true, - "59db7eed86f77461f8380365": true, - "59e0bdb186f774156f04ce82": true, - "59e0be5d86f7742d48765bd2": true, - "59e0bed186f774156f04ce84": true, - "59e0d99486f7744a32234762": true, - "59e3577886f774176a362503": true, - "59e4cf5286f7741778269d8a": true, - "59e4d24686f7741776641ac7": true, - "59e4d3d286f774176a36250a": true, - "59e5f5a486f7746c530b3ce2": true, - "59e6152586f77473dc057aa1": true, - "59e649f986f77411d949b246": true, - "59e6542b86f77411dc52a77a": true, - "59e655cb86f77411dc52a77b": true, - "59e6658b86f77411d949b250": true, - "59e6687d86f77411d949b251": true, - "59e68f6f86f7746c9f75e846": true, - "59e6906286f7746c9f75e847": true, - "59e690b686f7746c9f75e848": true, - "59e6918f86f7746c9f75e849": true, - "59e6920f86f77411d82aa167": true, - "59e6927d86f77411da468256": true, - "59e7635f86f7742cbf2c1095": true, - "59e763f286f7742ee57895da": true, - "59e7643b86f7742cbf2c109a": true, - "59e7708286f7742cbd762753": true, - "59e770b986f7742cbd762754": true, - "59e770f986f7742cbe3164ef": true, - "59e7711e86f7746cae05fbe1": true, - "59e7715586f7742ee5789605": true, - "59e77a2386f7742ee578960a": true, - "59e8977386f77415a553c453": true, - "59eb7ebe86f7740b373438ce": true, - "59ecc28286f7746d7a68aa8c": true, - "59ecc3dd86f7746dc827481c": true, - "59ef13ca86f77445fd0e2483": true, - "59f8a37386f7747af3328f06": true, - "59f98b4986f7746f546d2cef": true, - "59f99a7d86f7745b134aa97b": true, - "59f9cabd86f7743a10721f46": true, - "59f9d81586f7744c7506ee62": true, - "59fafc5086f7740dbe19f6c3": true, - "59fafc9386f774067d462453": true, - "59fafd4b86f7745ca07e1232": true, - "59fb042886f7746c5005a7b2": true, - "59fb137a86f7740adb646af1": true, - "59fb257e86f7742981561852": true, - "59fb375986f7741b681b81a6": true, - "59fc48e086f77463b1118392": true, - "59ff346386f77477562ff5e2": true, - "5a0060fc86f7745793204432": true, - "5a01ad4786f77450561fda02": true, - "5a0abb6e1526d8000a025282": true, - "5a0c27731526d80618476ac4": true, - "5a0c59791526d8dba737bba7": true, - "5a0d63621526d8dba31fe3bf": true, - "5a0d716f1526d8000d26b1e2": true, - "5a0eb980fcdbcb001a3b00a6": true, - "5a0ec13bfcdbcb00165aa685": true, - "5a0ed824fcdbcb0176308b0d": true, - "5a0f096dfcdbcb0176308b15": true, - "5a154d5cfcdbcb001a3b00da": true, - "5a16b672fcdbcb001912fa83": true, - "5a16b7e1fcdbcb00165aa6c9": true, - "5a16b8a9fcdbcb00165aa6ca": true, - "5a16b93dfcdbcbcae6687261": true, - "5a16b9fffcdbcb0176308b34": true, - "5a16ba61fcdbcb098008728a": true, - "5a16badafcdbcb001865f72d": true, - "5a16bb52fcdbcb001a3b00dc": true, - "5a17f98cfcdbcb0980087290": true, - "5a17fb9dfcdbcbcae6687291": true, - "5a17fc70fcdbcb0176308b3d": true, - "5a1eaa87fcdbcb001865f75e": true, - "5a1eacb3fcdbcb09800872be": true, - "5a1ead28fcdbcb001912fa9f": true, - "5a269f97c4a282000b151807": true, - "5a26abfac4a28232980eabff": true, - "5a26ac06c4a282000c5a90a8": true, - "5a26ac0ec4a28200741e1e18": true, - "5a27b281c4a28200741e1e52": true, - "5a27b3d0c4a282000d721ec1": true, - "5a27b6bec4a282000e496f78": true, - "5a27bad7c4a282000b15184b": true, - "5a2a57cfc4a2826c6e06d44a": true, - "5a329052c4a28200741e22d3": true, - "5a32a064c4a28200741e22de": true, - "5a32aa0cc4a28232996e405f": true, - "5a32aa8bc4a2826c6e06d737": true, - "5a339805c4a2826c6e06d73d": true, - "5a33a8ebc4a282000c5a950d": true, - "5a33b2c9c4a282000c5a9511": true, - "5a33b652c4a28232996e407c": true, - "5a33bab6c4a28200741e22f8": true, - "5a33ca0fc4a282000d72292f": true, - "5a33cae9c4a28232980eb086": true, - "5a33e75ac4a2826c6e06d759": true, - "5a34f7f1c4a2826c6e06d75d": true, - "5a34fae7c4a2826c6e06d760": true, - "5a34fbadc4a28200741e230a": true, - "5a34fd2bc4a282329a73b4c5": true, - "5a34fe59c4a282000b1521a2": true, - "5a3501acc4a282000d72293a": true, - "5a351711c4a282000b1521a4": true, - "5a367e5dc4a282000e49738f": true, - "5a37ca54c4a282000d72296a": true, - "5a37cb10c4a282329a73b4e7": true, - "5a38e6bac4a2826c6e06d79b": true, - "5a38ed75c4a28232996e40c6": true, - "5a38ee51c4a282000c5a955c": true, - "5a398ab9c4a282000c5a9842": true, - "5a398b75c4a282000a51a266": true, - "5a3c16fe86f77452b62de32a": true, - "5a43943586f77416ad2f06e2": true, - "5a43957686f7742a2c2f11b0": true, - "5a5f1ce64f39f90b401987bc": true, - "5a6086ea4f39f99cd479502f": true, - "5a608bf24f39f98ffc77720e": true, - "5a69a2ed8dc32e000d46d1f1": true, - "5a6b585a8dc32e5a9c28b4f1": true, - "5a6b592c8dc32e00094b97bf": true, - "5a6b59a08dc32e000b452fb7": true, - "5a6b5b8a8dc32e001207faf3": true, - "5a6b5e468dc32e001207faf5": true, - "5a6b5ed88dc32e000c52ec86": true, - "5a6b5f868dc32e000a311389": true, - "5a6b60158dc32e000a31138b": true, - "5a6f58f68dc32e000a311390": true, - "5a6f5d528dc32e00094b97d9": true, - "5a6f5e048dc32e00094b97da": true, - "5a6f5f078dc32e00094b97dd": true, - "5a702d198dc32e000b452fc3": true, - "5a7033908dc32e000a311392": true, - "5a70366c8dc32e001207fb06": true, - "5a7037338dc32e000d46d257": true, - "5a705e128dc32e000d46d258": true, - "5a718b548dc32e000d46d262": true, - "5a718da68dc32e000d46d264": true, - "5a718f958dc32e00094b97e7": true, - "5a71e0048dc32e000c52ecc8": true, - "5a71e0fb8dc32e00094b97f2": true, - "5a71e1868dc32e00094b97f3": true, - "5a71e22f8dc32e00094b97f4": true, - "5a71e4f48dc32e001207fb26": true, - "5a787ebcc5856700142fdd98": true, - "5a787f25c5856700186c4ab9": true, - "5a787f7ac5856700177af660": true, - "5a787fadc5856700155a6ca1": true, - "5a787fdfc5856700142fdd9a": true, - "5a788031c585673f2b5c1c79": true, - "5a788068c5856700137e4c8f": true, - "5a788089c5856700142fdd9c": true, - "5a7880d0c5856700142fdd9d": true, - "5a78813bc5856700186c4abe": true, - "5a788169c5856700142fdd9e": true, - "5a789261c5856700186c65d3": true, - "5a7893c1c585673f2b5c374d": true, - "5a78948ec5856700177b1124": true, - "5a7ad0c451dfba0013379712": true, - "5a7ad1fb51dfba0013379715": true, - "5a7ad2e851dfba0016153692": true, - "5a7ad4af51dfba0013379717": true, - "5a7ad55551dfba0015068f42": true, - "5a7ad74e51dfba0015068f45": true, - "5a7ae0c351dfba0017554310": true, - "5a7afa25e899ef00135e31b0": true, - "5a7b32a2e899ef00135e345a": true, - "5a7b483fe899ef0016170d15": true, - "5a7b4900e899ef197b331a2a": true, - "5a7b4960e899ef197b331a2d": true, - "5a7c147ce899ef00150bd8b8": true, - "5a7c4850e899ef00150be885": true, - "5a7c74b3e899ef0014332c29": true, - "5a7d90eb159bd400165484f1": true, - "5a7d9104159bd400134c8c21": true, - "5a7d9122159bd4001438dbf4": true, - "5a7d912f159bd400165484f3": true, - "5a7dbfc1159bd40016548fde": true, - "5a800961159bd4315e3a1657": true, - "5a8036fb86f77407252ddc02": true, - "5a80a29286f7742b25692012": true, - "5a9548c9159bd400133e97b3": true, - "5a957c3fa2750c00137fa5f7": true, - "5a966ec8a2750c00171b3f36": true, - "5a966f51a2750c00156aacf6": true, - "5a9685b1a2750c0032157104": true, - "5a9d56c8a2750c0032157146": true, - "5a9d6d00a2750c5c985b5305": true, - "5a9d6d13a2750c00164f6b03": true, - "5a9d6d21a2750c00137fa649": true, - "5a9d6d34a2750c00141e07da": true, - "5a9e81fba2750c00164f6b11": true, - "5a9ea27ca2750c00137fa672": true, - "5a9eb32da2750c00171b3f9c": true, - "5a9fb739a2750c003215717f": true, - "5a9fbacda2750c00141e080f": true, - "5a9fbb74a2750c0032157181": true, - "5a9fbb84a2750c00137fa685": true, - "5a9fc7e6a2750c0032157184": true, - "5aa2b87de5b5b00016327c25": false, - "5aa2b89be5b5b0001569311f": true, - "5aa2b8d7e5b5b00014028f4a": true, - "5aa2b923e5b5b000137b7589": true, - "5aa2b986e5b5b00014028f4c": true, - "5aa2b9aee5b5b00015693121": true, - "5aa2b9ede5b5b000137b758b": true, - "5aa2ba19e5b5b00014028f4e": true, - "5aa2ba46e5b5b000137b758d": true, - "5aa2ba71e5b5b000137b758f": true, - "5aa66a9be5b5b0214e506e89": true, - "5aa66be6e5b5b0214e506e97": true, - "5aa66c72e5b5b00016327c93": true, - "5aa7cfc0e5b5b00015693143": false, - "5aa7d193e5b5b000171d063f": true, - "5aa7e276e5b5b000171d0647": true, - "5aa7e373e5b5b000137b76f0": true, - "5aa7e3abe5b5b000171d064d": true, - "5aa7e454e5b5b0214e506fa2": true, - "5aa7e4a4e5b5b000137b76f2": true, - "5aaa4194e5b5b055d06310a5": true, - "5aaa5dfee5b5b000140293d3": true, - "5aaa5e60e5b5b000140293d6": true, - "5aaf8a0be5b5b00015693243": true, - "5aaf8e43e5b5b00015693246": true, - "5aaf9d53e5b5b00015042a52": true, - "5aafa1c2e5b5b00015042a56": true, - "5aafa49ae5b5b00015042a58": true, - "5aafa857e5b5b00018480968": true, - "5aafbde786f774389d0cbc0f": true, - "5ab24ef9e5b5b00fe93c9209": true, - "5ab372a310e891001717f0d8": true, - "5ab3afb2d8ce87001660304d": true, - "5ab8dab586f77441cd04f2a2": true, - "5ab8dced86f774646209ec87": true, - "5ab8e4ed86f7742d8e50c7fa": true, - "5ab8e79e86f7742d8b372e78": true, - "5ab8e9fcd8ce870019439434": true, - "5ab8ebf186f7742d8b372e80": true, - "5ab8f04f86f774585f4237d8": true, - "5ab8f20c86f7745cdb629fb2": true, - "5ab8f39486f7745cd93a1cca": true, - "5ab8f4ff86f77431c60d91ba": true, - "5ab8f85d86f7745cd93a1cf5": true, - "5abcbb20d8ce87001773e258": true, - "5abcbc27d8ce8700182eceeb": true, - "5abcc328d8ce8700194394f3": true, - "5abccb7dd8ce87001773e277": true, - "5ac4c50d5acfc40019262e87": true, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac66c5d5acfc4001718d314": true, - "5ac66cb05acfc40198510a10": true, - "5ac66d015acfc400180ae6e4": true, - "5ac66d2e5acfc43b321d4b53": true, - "5ac66d725acfc43b321d4b60": true, - "5ac66d9b5acfc4001633997a": true, - "5ac72e475acfc400180ae6fe": true, - "5ac733a45acfc400192630e2": true, - "5ac7655e5acfc40016339a19": false, - "5ac78eaf5acfc4001926317a": true, - "5ac8d6885acfc400180ae7b0": true, - "5addba3e5acfc4001669f0ab": true, - "5addbac75acfc400194dbc56": true, - "5addbb6e5acfc408fb1393fd": true, - "5addbb825acfc408fb139400": true, - "5addbb945acfc4001a5fc44e": true, - "5addbba15acfc400185c2854": true, - "5addbbb25acfc40015621bd9": true, - "5addbf175acfc408fb13965b": true, - "5addbfbb5acfc400194dbcf7": true, - "5addbfd15acfc40015621bde": true, - "5addbfe15acfc4001a5fc58b": true, - "5addbfef5acfc400185c2857": true, - "5addbffe5acfc4001714dfac": true, - "5addc00b5acfc4001669f144": true, - "5addc7005acfc4001669f275": true, - "5addc7ac5acfc400194dbd90": true, - "5addc7db5acfc4001669f279": true, - "5addcce35acfc4001a5fc635": true, - "5addccf45acfc400185c2989": true, - "5adf23995acfc400185c2aeb": true, - "5ae096d95acfc400185c2c81": true, - "5ae30bad5acfc400185c2dc4": true, - "5ae30c9a5acfc408fb139a03": true, - "5ae30db85acfc408fb139a05": true, - "5ae30e795acfc408fb139a0b": true, - "5ae35b315acfc4001714e8b0": true, - "5af0454c86f7746bf20992e8": true, - "5af0548586f7743a532b7e99": true, - "5afd7ded5acfc40017541f5e": true, - "5afd7e095acfc40017541f61": true, - "5afd7e445acfc4001637e35a": true, - "5b04473a5acfc40018632f70": true, - "5b057b4f5acfc4771e1bd3e9": true, - "5b07db875acfc40dc528a5f6": true, - "5b07dd285acfc4001754240d": true, - "5b0800175acfc400153aebd4": true, - "5b099a765acfc47a8607efe3": true, - "5b099a9d5acfc47a8607efe7": true, - "5b099ac65acfc400186331e1": true, - "5b099b7d5acfc400186331e4": true, - "5b099b965acfc400186331e6": true, - "5b099bb25acfc400186331e8": true, - "5b099bf25acfc4001637e683": true, - "5b0bbe4e5acfc40dc528a72d": true, - "5b0bc22d5acfc47a8607f085": true, - "5b0e794b5acfc47a877359b2": true, - "5b1fa9b25acfc40018633c01": true, - "5b1fa9ea5acfc40018633c0a": true, - "5b1faa0f5acfc40dc528aeb5": true, - "5b1fb3e15acfc4001637f068": true, - "5b1fd4e35acfc40018633c39": true, - "5b222d335acfc4771e1be099": true, - "5b222d405acfc400153af4fe": true, - "5b2240bf5acfc40dc528af69": true, - "5b237e425acfc4771e1be0b6": true, - "5b2388675acfc4771e1be0be": true, - "5b2389515acfc4771e1be0c0": true, - "5b2cfa535acfc432ff4db7a0": true, - "5b30ac585acfc433000eb79c": true, - "5b30b0dc5acfc400153b7124": true, - "5b30bc165acfc40016387293": true, - "5b30bc285acfc47a8608615d": true, - "5b31163c5acfc400153b71cb": true, - "5b3116595acfc40019476364": true, - "5b363dd25acfc4001a598fd2": true, - "5b363dea5acfc4771e1c5e7e": true, - "5b363e1b5acfc4771e1c5e80": true, - "5b39f8db5acfc40016387a1b": true, - "5b39ffbd5acfc47a8773fb06": true, - "5b3a08b25acfc4001754880c": true, - "5b3a16655acfc40016387a2a": true, - "5b3a337e5acfc4704b4a19a0": true, - "5b3b6dc75acfc47a8773fb1e": true, - "5b3b6e495acfc4330140bd88": true, - "5b3b713c5acfc4330140bd8d": true, - "5b3b99265acfc4704b4a1afb": true, - "5b3b99475acfc432ff4dcbee": true, - "5b3baf8f5acfc40dc5296692": true, - "5b3cadf35acfc400194776a0": true, - "5b3cbc235acfc4001863ac44": true, - "5b3f7bf05acfc433000ecf6b": true, - "5b3f7c005acfc4704b4a1de8": true, - "5b3f7c1c5acfc40dc5296b1d": true, - "5b40e1525acfc4771e1c6611": true, - "5b40e2bc5acfc40016388216": true, - "5b40e3f35acfc40016388218": true, - "5b40e4035acfc47a87740943": true, - "5b40e5e25acfc4001a599bea": true, - "5b40e61f5acfc4001a599bec": true, - "5b4325355acfc40019478126": true, - "5b4326435acfc433000ed01d": true, - "5b43271c5acfc432ff4dce65": true, - "5b4327aa5acfc400175496e0": true, - "5b4329075acfc400153b78ff": true, - "5b4329f05acfc47a86086aa1": true, - "5b432b2f5acfc4771e1c6622": true, - "5b432b6c5acfc4001a599bf0": true, - "5b432b965acfc47a8774094e": true, - "5b432be65acfc433000ed01f": true, - "5b432c305acfc40019478128": true, - "5b432d215acfc4771e1c6624": true, - "5b432f3d5acfc4704b4a1dfb": true, - "5b44c6ae86f7742d1627baea": true, - "5b44c8ea86f7742d1627baf1": true, - "5b44cad286f77402a54ae7e5": true, - "5b44cd8b86f774503d30cba2": true, - "5b44cf1486f77431723e3d05": true, - "5b44d0de86f774503d30cba8": true, - "5b44d22286f774172b0c9de8": true, - "5b46238386f7741a693bcf9c": true, - "5b4736a986f774040571e998": true, - "5b4736b986f77405cb415c10": true, - "5b7be1125acfc4001876c0e5": true, - "5b7be1265acfc400161d0798": true, - "5b7be1ca5acfc400170e2d2f": true, - "5b7be2345acfc400196d524a": true, - "5b7be4575acfc400161d0832": true, - "5b7be4645acfc400170e2dcc": true, - "5b7be46e5acfc400170e2dcf": true, - "5b7be47f5acfc400170e2dd2": true, - "5b7be4895acfc400170e2dd5": true, - "5b7bebc85acfc43bca706666": true, - "5b7bed205acfc400161d08cc": true, - "5b7bedd75acfc43d825283f9": true, - "5b7bee755acfc400196d5383": true, - "5b7bef1e5acfc43d82528402": true, - "5b7bef5d5acfc43bca7067a3": true, - "5b7bef9c5acfc43d102852ec": true, - "5b7c2d1d5acfc43d1028532a": true, - "5b7c710788a4506dec015957": true, - "5b7d37845acfc400170e2f87": true, - "5b7d63b75acfc400170e2f8a": true, - "5b7d63cf5acfc4001876c8df": true, - "5b7d63de5acfc400170e2f8d": true, - "5b7d64555acfc4001876c8e2": true, - "5b7d645e5acfc400170e2f90": true, - "5b7d671b5acfc43d82528ddd": true, - "5b7d678a5acfc4001a5c4022": true, - "5b7d679f5acfc4001a5c4024": true, - "5b7d68af5acfc400170e30c3": true, - "5b7d693d5acfc43bca706a3d": true, - "5b7d6c105acfc40015109a5f": true, - "5b800e9286f7747a8b04f3ff": true, - "5b800ebc86f774394e230a90": true, - "5b800ed086f7747baf6e2f9e": true, - "5b80242286f77429445e0b47": true, - "5b84038986f774774913b0c1": true, - "5b8403a086f7747ff856f4e2": true, - "5b86a0e586f7745b600ccb23": true, - "5ba26383d4351e00334c93d9": true, - "5ba264f6d4351e0034777d52": true, - "5ba2657ed4351e0035628ff2": true, - "5ba26586d4351e44f824b340": true, - "5ba2678ad4351e44f824b344": true, - "5ba26812d4351e003201fef1": true, - "5ba26835d4351e0035628ff5": true, - "5ba26844d4351e00334c9475": true, - "5ba26acdd4351e003562908e": true, - "5ba26ae8d4351e00367f9bdb": true, - "5ba26b01d4351e0085325a51": true, - "5ba26b17d4351e00367f9bdd": true, - "5ba36f85d4351e0085325c81": true, - "5bae13bad4351e00320204af": true, - "5bae13ded4351e44f824bf38": true, - "5bb20d53d4351e4502010a69": true, - "5bb20d92d4351e00853263eb": true, - "5bb20d9cd4351e00334c9d8a": true, - "5bb20da5d4351e0035629dbf": true, - "5bb20dadd4351e00367faeff": true, - "5bb20dbcd4351e44f824c04e": true, - "5bb20dcad4351e3bac1212da": true, - "5bb20de5d4351e0035629e59": true, - "5bb20df1d4351e00347787d5": true, - "5bb20dfcd4351e00334c9e24": true, - "5bb20e0ed4351e3bac1212dc": true, - "5bb20e18d4351e00320205d5": true, - "5bb20e49d4351e3bac1212de": true, - "5bb20e58d4351e00320205d7": true, - "5bb20e70d4351e0035629f8f": true, - "5bb2475ed4351e00853264e3": true, - "5bbdb811d4351e45020113c7": true, - "5bbdb83fd4351e44f824c44b": true, - "5bbdb870d4351e00367fb67d": true, - "5bbdb8bdd4351e4502011460": true, - "5bbde409d4351e003562b036": true, - "5bbde41ed4351e003562b038": true, - "5bc09a18d4351e003562b68e": true, - "5bc09a30d4351e00367fb7c8": true, - "5bc5a351d4351e003477a414": true, - "5bc5a35cd4351e450201232f": true, - "5bc5a372d4351e44f824d17f": true, - "5bc9c1e2d4351e00367fbcf0": true, - "5bc9c29cd4351e003562b8a3": true, - "5bcf0213d4351e0085327c17": true, - "5bd06f5d86f77427101ad47c": true, - "5bd0716d86f774171822ef4b": true, - "5bd071d786f7747e707b93a3": true, - "5bd073a586f7747e6f135799": true, - "5bd073c986f7747f627e796c": true, - "5bd70322209c4d00d7167b8f": true, - "5bd704e7209c4d00d7167c31": true, - "5be4038986f774527d3fae60": true, - "5bead2e00db834001c062938": true, - "5bed61680db834001d2c45ab": true, - "5bed625c0db834001c062946": true, - "5beec1bd0db834001e6006f3": true, - "5beec2820db834001b095426": true, - "5beec3420db834001b095429": true, - "5beec3e30db8340019619424": true, - "5beec8b20db834001961942a": true, - "5beec8c20db834001d2c465c": true, - "5beec8ea0db834001a6f9dbf": true, - "5beec91a0db834001961942d": true, - "5beec9450db83400970084fd": true, - "5beecbb80db834001d2c465e": true, - "5beed0f50db834001c062b12": true, - "5bf3e03b0db834001d2c4a9c": true, - "5bf3e0490db83400196199af": true, - "5bf3f59f0db834001a6fa060": true, - "5bfd297f0db834001a669119": true, - "5bfd35380db83400232fe5cc": true, - "5bfd36290db834001966869a": true, - "5bfd36ad0db834001c38ef66": true, - "5bfd37c80db834001d23e842": true, - "5bfd384c0db834001a6691d3": true, - "5bfd4c980db834001b73449d": true, - "5bfd4cbe0db834001b73449f": true, - "5bfd4cc90db834001d23e846": true, - "5bfd4cd60db834001c38f095": true, - "5bfe7fb30db8340018089fed": true, - "5bfe86a20db834001d23e8f7": true, - "5bfe86bd0db83400232fe959": true, - "5bfe86df0db834001b734685": true, - "5bfe89510db834001808a127": true, - "5bfea6e90db834001b7347f3": true, - "5bfea7ad0db834001c38f1ee": true, - "5bfeaa0f0db834001b734927": true, - "5bfeb32b0db834001a6694d9": true, - "5bfebc250db834001a6694e1": true, - "5bfebc320db8340019668d79": true, - "5bfebc530db834001d23eb65": true, - "5bfebc5e0db834001a6694e5": true, - "5bffcf7a0db83400232fea79": true, - "5bffd7ed0db834001d23ebf9": true, - "5bffdc370db834001d23eca8": false, - "5bffdd7e0db834001b734a1a": true, - "5bffe7930db834001b734a39": true, - "5bffe7c50db834001d23ece1": true, - "5bffec120db834001c38f5fa": true, - "5bffef760db8340019668fe4": true, - "5c0000c00db834001a6697fc": true, - "5c0006470db834001a6697fe": true, - "5c00076d0db834001d23ee1f": true, - "5c0009510db834001966907f": true, - "5c0102aa0db834001b734ba1": true, - "5c0102b20db834001d23eebc": true, - "5c010a700db834001d23ef5d": true, - "5c010e350db83400232feec7": true, - "5c0111ab0db834001966914d": true, - "5c0125fc0db834001a669aa3": true, - "5c0126f40db834002a125382": true, - "5c012ffc0db834001d23f03f": true, - "5c0505e00db834001b735073": true, - "5c0517910db83400232ffee5": true, - "5c05293e0db83400232fff80": true, - "5c05295e0db834001a66acbb": true, - "5c052a900db834001a66acbd": true, - "5c05413a0db834001c390617": true, - "5c0548ae0db834001966a3c2": true, - "5c0558060db834001b735271": true, - "5c064c400db834001d23f468": true, - "5c06595c0db834001a66af6c": true, - "5c066e3a0db834001b7353f0": true, - "5c066ef40db834001966a595": true, - "5c0672ed0db834001b7353f3": true, - "5c0673fb0db8340023300271": true, - "5c0684e50db834002a12585a": true, - "5c0695860db834001b735461": true, - "5c0696830db834001d23f5da": true, - "5c06c6a80db834001b735491": true, - "5c079ec50db834001966a706": true, - "5c079ed60db834001a66b372": true, - "5c07a8770db8340023300450": true, - "5c07b36c0db834002a1259e9": true, - "5c07b3850db834002330045b": true, - "5c07c5ed0db834001b73571c": true, - "5c07c60e0db834002330051f": true, - "5c07c9660db834001a66b588": true, - "5c07dd120db834001c39092d": true, - "5c07df7f0db834001b73588a": true, - "5c08f87c0db8340019124324": true, - "5c0919b50db834001b7ce3b9": true, - "5c091a4e0db834001d5addc8": true, - "5c093ca986f7740a1867ab12": true, - "5c093e3486f77430cb02e593": true, - "5c0a2cec0db834001b7ce47d": true, - "5c0d2727d174af02a012cf58": true, - "5c0d32fcd174af02a1659c75": true, - "5c0d56a986f774449d5de529": true, - "5c0d591486f7744c505b416f": true, - "5c0d5ae286f7741e46554302": true, - "5c0d5e4486f77478390952fe": true, - "5c0d668f86f7747ccb7f13b2": true, - "5c0d688c86f77413ae3407b2": true, - "5c0e2f26d174af02a9625114": true, - "5c0e2f5cd174af02a012cfc9": true, - "5c0e2f94d174af029f650d56": true, - "5c0e2ff6d174af02a1659d4a": true, - "5c0e3eb886f7742015526062": true, - "5c0e446786f7742013381639": true, - "5c0e51be86f774598e797894": true, - "5c0e530286f7747fa1419862": true, - "5c0e531286f7747fa54205c2": true, - "5c0e531d86f7747fa23f4d42": true, - "5c0e533786f7747fa23f4d47": true, - "5c0e534186f7747fa1419867": true, - "5c0e53c886f7747fa54205c7": true, - "5c0e541586f7747fa54205c9": true, - "5c0e57ba86f7747fa141986d": true, - "5c0e5bab86f77461f55ed1f3": true, - "5c0e5edb86f77461f55ed1f7": true, - "5c0e625a86f7742d77340f62": true, - "5c0e655586f774045612eeb2": true, - "5c0e66e2d174af02a96252f4": true, - "5c0e6a1586f77404597b4965": true, - "5c0e722886f7740458316a57": true, - "5c0e746986f7741453628fe5": true, - "5c0e774286f77468413cc5b2": true, - "5c0e805e86f774683f3dd637": true, - "5c0e842486f77443a74d2976": true, - "5c0e874186f7745dc7616606": true, - "5c0fa877d174af02a012e1cf": true, - "5c0faeddd174af02a962601f": true, - "5c0faf68d174af02a96260b8": true, - "5c0fafb6d174af02a96260ba": true, - "5c10c8fd86f7743d7d706df3": true, - "5c11046cd174af02a012e42b": true, - "5c110624d174af029e69734c": true, - "5c11279ad174af029d64592b": true, - "5c1127bdd174af44217ab8b9": true, - "5c1127d0d174af29be75cf68": true, - "5c1260dc86f7746b106e8748": true, - "5c12619186f7743f871c8a32": true, - "5c1262a286f7743f8a69aab2": true, - "5c165d832e2216398b5a7e36": true, - "5c17664f2e2216398b5a7e3c": true, - "5c1780312e221602b66cc189": true, - "5c17804b2e2216152006c02f": true, - "5c178a942e22164bef5ceca3": true, - "5c1793902e221602b21d3de2": true, - "5c17a7ed2e2216152142459c": true, - "5c18b90d2e2216152142466b": true, - "5c18b9192e2216398b5a8104": true, - "5c1a1cc52e221602b3136e3d": true, - "5c1a1e3f2e221602b66cc4c2": true, - "5c1bc4812e22164bef5cfde7": true, - "5c1bc5612e221602b5429350": true, - "5c1bc5af2e221602b412949b": true, - "5c1bc5fb2e221602b1779b32": true, - "5c1bc7432e221602b412949d": true, - "5c1bc7752e221602b1779b34": true, - "5c1cd46f2e22164bef5cfedb": true, - "5c1cdd302e221602b3137250": true, - "5c1cdd512e22161b267d91ae": true, - "5c3df7d588a4501f290594e5": true, - "5c46fbd72e2216398b5a8c9c": true, - "5c471b5d2e221602b21d4e14": true, - "5c471b7e2e2216152006e46c": true, - "5c471ba12e221602b3137d76": true, - "5c471bd12e221602b4129c3a": true, - "5c471be12e221602b66cd9ac": true, - "5c471bfc2e221602b21d4e17": true, - "5c471c2d2e22164bef5d077f": true, - "5c471c442e221602b542a6f8": true, - "5c471c6c2e221602b66cd9ae": true, - "5c471c842e221615214259b5": true, - "5c471cb32e221602b177afaa": true, - "5c488a752e221602b412af63": true, - "5c48a14f2e2216152006edd7": true, - "5c48a2852e221602b21d5923": true, - "5c48a2a42e221602b66d1e07": true, - "5c48a2c22e221602b313fb6c": true, - "5c4ee3d62e2216152006f302": true, - "5c4eec9b2e2216398b5aaba2": true, - "5c4eecc32e221602b412b440": true, - "5c4eecde2e221602b3140418": true, - "5c501a4d2e221602b412b540": true, - "5c5039be2e221602b177c9ff": true, - "5c503ac82e221602b21d6e9a": true, - "5c503ad32e2216398b5aada2": true, - "5c503af12e221602b177ca02": true, - "5c503b1c2e221602b21d6e9d": true, - "5c503d0a2e221602b542b7ef": true, - "5c5952732e2216398b5abda2": true, - "5c59529a2e221602b177d160": true, - "5c5970672e221602b21d7855": true, - "5c5db5852e2216003a0fe71a": true, - "5c5db5962e2216000e5e46eb": true, - "5c5db5b82e2216003a0fe71d": true, - "5c5db5c62e22160012542255": true, - "5c5db5f22e2216000e5e47e8": true, - "5c5db5fc2e2216000f1b2842": true, - "5c5db6302e2216000e5e47f0": true, - "5c5db63a2e2216000f1b284a": true, - "5c5db6552e2216001026119d": true, - "5c5db6652e221600113fba51": true, - "5c5db6742e2216000f1b2852": true, - "5c5db6b32e221600102611a0": true, - "5c5db6ee2e221600113fba54": true, - "5c5db6f82e2216003a0fe914": true, - "5c6161fb2e221600113fbde5": true, - "5c6162682e22160010261a2b": true, - "5c61627a2e22160012542c55": true, - "5c6165902e22160010261b28": true, - "5c6175362e221600133e3b94": true, - "5c617a5f2e2216000f1e81b3": true, - "5c61a40d2e2216001403158d": true, - "5c6592372e221600133e47d7": true, - "5c6beec32e221601da3578f2": true, - "5c6bf4aa2e2216001219b0ae": true, - "5c6c2c9c2e2216000f2002e4": true, - "5c6d10e82e221601da357b07": true, - "5c6d10fa2e221600106f3f23": true, - "5c6d11072e2216000e69d2e4": true, - "5c6d11152e2216000f2003e7": true, - "5c6d42cb2e2216000e69d7d1": true, - "5c6d450c2e221600114c997d": true, - "5c6d46132e221601da357d56": true, - "5c6d5d8b2e221644fc630b39": true, - "5c6d710d2e22165df16b81e7": true, - "5c6d7b3d2e221600114c9b7d": true, - "5c6d85e02e22165df16b81f4": true, - "5c78f2492e221600114c9f04": true, - "5c78f2612e221600114c9f0d": true, - "5c78f26f2e221601da3581d1": true, - "5c78f2792e221600106f4683": true, - "5c78f2882e22165df16b832e": true, - "5c791e872e2216001219c40a": true, - "5c793fb92e221644f31bfb64": true, - "5c793fc42e221600114ca25d": true, - "5c793fde2e221601da358614": true, - "5c7951452e221644f31bfd5c": true, - "5c7954d52e221600106f4cc7": true, - "5c7955c22e221644f31bfd5e": true, - "5c7d55de2e221644f31bff68": true, - "5c7d55f52e221644f31bff6a": true, - "5c7d560b2e22160bc12c6139": true, - "5c7e5f112e221600106f4ede": true, - "5c7e8fab2e22165df16b889b": true, - "5c7fb51d2e2216001219ce11": true, - "5c7fc87d2e221644f31c0298": true, - "5c82342f2e221644f31c060e": true, - "5c82343a2e221644f31c0611": true, - "5c86592b2e2216000e69e77c": true, - "5c878e9d2e2216000f201903": true, - "5c878ebb2e2216001219d48a": true, - "5c87a07c2e2216001219d4a2": true, - "5c87ca002e221600114cb150": true, - "5c88f24b2e22160bc12c69a6": true, - "5c90c3622e221601da359851": true, - "5c920e902e221644f31c3c99": true, - "5c925fa22e221601da359b7b": true, - "5c99f3592e221644fc633070": true, - "5c9a07572e221644f31c4b32": true, - "5c9a1c3a2e2216000e69fb6a": true, - "5c9a1c422e221600106f69f0": true, - "5c9a25172e2216000f20314e": true, - "5c9a26332e2216001219ea70": true, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": true, - "5ca20ee186f774799474abc2": true, - "5ca2113f86f7740b2547e1d2": true, - "5ca21c6986f77479963115a7": true, - "5cadc1c6ae9215000f2775a4": true, - "5cadc2e0ae9215051e1c21e7": true, - "5cadc390ae921500126a77f1": true, - "5cadc431ae921500113bb8d5": true, - "5cadc55cae921500103bb3be": true, - "5cadd919ae921500126a77f3": true, - "5cadd940ae9215051e1c2316": true, - "5cadd954ae921500103bb3c2": true, - "5cadf6ddae9215051e1c23b2": true, - "5cadf6e5ae921500113bb973": true, - "5cadf6eeae921500134b2799": true, - "5cadfbf7ae92152ac412eeef": true, - "5caf1041ae92157c28402e3f": true, - "5caf1109ae9215753c44119f": true, - "5caf1691ae92152ac412efb9": true, - "5caf16a2ae92152ac412efbc": true, - "5caf17c9ae92150b30006be1": true, - "5caf187cae92157c28402e43": true, - "5cbda392ae92155f3c17c39f": true, - "5cbda9f4ae9215000e5b9bfc": true, - "5cbdaf89ae9215000e5b9c94": true, - "5cbdb1b0ae9215000d50e105": true, - "5cbdc23eae9215001136a407": true, - "5cc6ea78e4a949000e1ea3c1": true, - "5cc6ea85e4a949000e1ea3c3": true, - "5cc70093e4a949033c734312": true, - "5cc700b9e4a949000f0f0f25": true, - "5cc700cae4a949035e43ba72": true, - "5cc700d4e4a949000f0f0f28": true, - "5cc700ede4a949033c734315": true, - "5cc70102e4a949035e43ba74": true, - "5cc7012ae4a949001252b43e": true, - "5cc70146e4a949000d73bf6b": true, - "5cc7015ae4a949001152b4c6": true, - "5cc701aae4a949000e1ea45c": true, - "5cc701d7e4a94900100ac4e7": true, - "5cc80f38e4a949001152b560": true, - "5cc80f53e4a949000e1ea4f8": true, - "5cc80f67e4a949035e43bbba": true, - "5cc80f79e4a949033c7343b2": true, - "5cc80f8fe4a949033b0224a2": true, - "5cc82796e24e8d000f5859a8": true, - "5cc82d76e24e8d00134b4b83": true, - "5cc86832d7f00c000d3a6e6c": true, - "5cc86840d7f00c002412c56c": true, - "5cc9a96cd7f00c011c04e04a": true, - "5cc9ad73d7f00c000e2579d4": true, - "5cc9b815d7f00c000e2579d6": true, - "5cc9bcaed7f00c011c04e179": true, - "5cc9c20cd7f00c001336c65d": true, - "5cda9bcfd7f00c0c0b53e900": true, - "5cdaa99dd7f00c002412d0b2": true, - "5cdd7685d7f00c000f260ed2": true, - "5cdd7693d7f00c0010373aa5": true, - "5cde739cd7f00c0010373bd3": true, - "5cde77a9d7f00c000f261009": true, - "5cde7afdd7f00c000d36b89d": true, - "5cde7b43d7f00c000d36b93e": true, - "5cde8864d7f00c0010373be1": true, - "5cdeac22d7f00c000f26168f": true, - "5cdeac42d7f00c000d36ba73": true, - "5cdeac5cd7f00c000f261694": true, - "5cdeaca5d7f00c00b61c4b70": true, - "5ce69cbad7f00c00b61c5098": true, - "5cebec00d7f00c065c53522a": true, - "5cebec10d7f00c065703d185": true, - "5cebec38d7f00c00110a652a": true, - "5cf12a15d7f00c05464b293f": true, - "5cf13123d7f00c1085616a50": true, - "5cf4e3f3d7f00c06595bc7f0": true, - "5cf4fb76d7f00c065703d3ac": true, - "5cf50850d7f00c056e24104c": true, - "5cf508bfd7f00c056e24104e": true, - "5cf50fc5d7f00c056c53f83c": true, - "5cf518cfd7f00c065b422214": true, - "5cf54404d7f00c108840b2ef": true, - "5cf638cbd7f00c06595bc936": true, - "5cf639aad7f00c065703d455": true, - "5cf656f2d7f00c06585fb6eb": true, - "5cf67a1bd7f00c06585fb6f3": true, - "5cf67cadd7f00c065a5abab7": true, - "5cf6935bd7f00c06585fb791": true, - "5cf6937cd7f00c056c53fb39": true, - "5cf78496d7f00c065703d6ca": true, - "5cf78720d7f00c06595bc93e": true, - "5cf79389d7f00c10941a0c4d": true, - "5cf79599d7f00c10875d9212": true, - "5cf7acfcd7f00c1084477cf2": true, - "5cf8f3b0d7f00c00217872ef": true, - "5cfe8010d7ad1a59283b14c6": true, - "5cff9e5ed7ad1a09407397d4": true, - "5cff9e84d7ad1a049e54ed55": true, - "5d00e0cbd7ad1a6c6566a42d": true, - "5d00ec68d7ad1a04a067e5be": true, - "5d00ede1d7ad1a0940739a76": true, - "5d00ef6dd7ad1a0940739b16": true, - "5d00f63bd7ad1a59283b1c1e": true, - "5d010d1cd7ad1a59283b1ce7": true, - "5d0236dad7ad1a0940739d29": true, - "5d023784d7ad1a049d4aa7f2": true, - "5d024f5cd7ad1a04a067e91a": true, - "5d025cc1d7ad1a53845279ef": true, - "5d02676dd7ad1a049e54f6dc": true, - "5d02677ad7ad1a04a15c0f95": true, - "5d026791d7ad1a04a067ea63": true, - "5d02778e86f774203e7dedbe": true, - "5d02797c86f774203f38e30a": true, - "5d0a29ead7ad1a0026013f27": true, - "5d0a29fed7ad1a002769ad08": true, - "5d0a3a58d7ad1a669c15ca14": true, - "5d0a3e8cd7ad1a6f6a3d35bd": true, - "5d0b5cd3d7ad1a3fe32ad263": true, - "5d10b49bd7ad1a1a560708b0": true, - "5d120a10d7ad1a4e1026ba85": true, - "5d120a28d7ad1a1c8962e295": true, - "5d122e7bd7ad1a07102d6d7f": true, - "5d123102d7ad1a004e475fe5": true, - "5d123a3cd7ad1a004e476058": true, - "5d123b70d7ad1a0ee35e0754": true, - "5d123b7dd7ad1a004f01b262": true, - "5d124c01d7ad1a115c7d59fb": true, - "5d124c0ed7ad1a10d168dd9b": true, - "5d124c1ad7ad1a12227c53a7": true, - "5d133067d7ad1a33013f95b4": true, - "5d1340b3d7ad1a0b52682ed7": true, - "5d1340bdd7ad1a0e8d245aab": true, - "5d1340cad7ad1a0b0b249869": true, - "5d135e83d7ad1a21b83f42d8": true, - "5d135ecbd7ad1a21c176542e": true, - "5d15ce51d7ad1a1eff619092": true, - "5d15cf3bd7ad1a67e71518b2": true, - "5d19cd96d7ad1a4a992c9f52": true, - "5d1b198cd7ad1a604869ad72": true, - "5d1b33a686f7742523398398": true, - "5d1b36a186f7742523398433": true, - "5d1b371186f774253763a656": true, - "5d1b5e94d7ad1a2b865a96b0": true, - "5d1c702ad7ad1a632267f429": true, - "5d1f819086f7744b355c219b": true, - "5d2369418abbc306c62e0c80": true, - "5d25a4a98abbc30b917421a4": true, - "5d25a6538abbc306c62e630d": true, - "5d25a6a48abbc306c62e6310": true, - "5d25a7b88abbc3054f3e60bc": true, - "5d25af8f8abbc3055079fec5": true, - "5d25d0ac8abbc3054f3e61f7": true, - "5d2702e88abbc31ed91efc44": true, - "5d2703038abbc3105103d94c": true, - "5d270b3c8abbc3105335cfb8": true, - "5d270ca28abbc31ee25ee821": true, - "5d2c76ed48f03532f2136169": true, - "5d2c770c48f0354b4a07c100": true, - "5d2c772c48f0355d95672c25": true, - "5d2c829448f0353a5c7d6674": true, - "5d2da1e948f035477b1ce2ba": true, - "5d2dc3e548f035404a1a4798": true, - "5d2f0d8048f0356c925bc3b0": true, - "5d2f213448f0355009199284": true, - "5d2f259b48f0355a844acd74": true, - "5d2f25bc48f03502573e5d85": true, - "5d2f261548f03576f500e7b7": true, - "5d2f2ab648f03550091993ca": true, - "5d2f2d5748f03572ec0c0139": true, - "5d3eb3b0a4b93615055e84d2": true, - "5d3eb44aa4b93650d64e4979": true, - "5d3eb4aba4b93650d64e497d": true, - "5d3eb536a4b9363b1f22f8e2": true, - "5d3eb59ea4b9361c284bb4b2": true, - "5d3eb5b6a4b9361eab311902": true, - "5d3eb5eca4b9363b1f22f8e4": true, - "5d3ef698a4b9361182109872": true, - "5d403f9186f7743cac3f229b": true, - "5d40407c86f774318526545a": true, - "5d43021ca4b9362eab4b5e25": true, - "5d4405aaa4b9361e6a4e6bd3": true, - "5d4405f0a4b9361e6a4e6bd9": true, - "5d440625a4b9361eec4ae6c5": true, - "5d44064fa4b9361e4f6eb8b5": true, - "5d44069ca4b9361ebd26fc37": true, - "5d4406a8a4b9361e4f6eb8b7": true, - "5d440b93a4b9364276578d4b": true, - "5d440b9fa4b93601354d480c": true, - "5d44334ba4b9362b346d1948": true, - "5d443f8fa4b93678dd4a01aa": true, - "5d4aaa54a4b9365392071170": true, - "5d4aaa73a4b9365392071175": true, - "5d4aab30a4b9365435358c55": true, - "5d5d646386f7742797261fd9": true, - "5d5d85c586f774279a21cbdb": true, - "5d5d87f786f77427997cfaef": true, - "5d5d8ca986f7742798716522": true, - "5d5d940f86f7742797262046": true, - "5d5e7d28a4b936645d161203": true, - "5d5e9c74a4b9364855191c40": true, - "5d5fca1ea4b93635fd598c07": true, - "5d67abc1a4b93614ec50137f": true, - "5d6d2e22a4b9361bd5780d05": true, - "5d6d2ef3a4b93618084f58bd": true, - "5d6d3716a4b9361bc8618872": true, - "5d6d3829a4b9361bc8618943": true, - "5d6d3943a4b9360dbc46d0cc": true, - "5d6d3be5a4b9361bc73bc763": true, - "5d6e6772a4b936088465b17c": true, - "5d6e67fba4b9361bc73bc779": true, - "5d6e6806a4b936088465b17e": true, - "5d6e6869a4b9361c140bcfde": true, - "5d6e6891a4b9361bd473feea": true, - "5d6e689ca4b9361bc8618956": true, - "5d6e68a8a4b9360b6c0d54e2": true, - "5d6e68b3a4b9361bca7e50b5": true, - "5d6e68c4a4b9361b93413f79": true, - "5d6e68d1a4b93622fe60e845": true, - "5d6e68dea4b9361bcc29e659": true, - "5d6e68e6a4b9361c140bcfe0": true, - "5d6e6911a4b9361bd5780d52": true, - "5d6e695fa4b936359b35d852": true, - "5d6e69b9a4b9361bc8618958": true, - "5d6e69c7a4b9360b6c0d54e4": true, - "5d6e6a05a4b93618084f58d0": true, - "5d6e6a42a4b9364f07165f52": true, - "5d6e6a53a4b9361bd473feec": true, - "5d6e6a5fa4b93614ec501745": true, - "5d7b6bafa4b93652786f4c76": true, - "5d96141523f0ea1b7f2aacab": true, - "5dcbd56fdbd3d91b3e5468d5": true, - "5dcbd6b46ec07c0c4347a564": true, - "5dcbd6dddbd3d91b3e5468de": true, - "5dcbe9431e1f4616d354987e": true, - "5dcbe965e4ed22586443a79d": true, - "5de652c31b7e3716273428be": true, - "5de653abf76fdc1ce94a5a2a": true, - "5de65547883dde217541644b": true, - "5de6556a205ddc616a6bc4f7": true, - "5de6558e9f98ac2bc65950fc": true, - "5de655be4a9f347bc92edb88": true, - "5de7bd7bfd6b4e6e2276dc25": true, - "5de8e67c4a9f347bc92edbd7": true, - "5de8e8dafd6b4e6e2276dc32": true, - "5de8ea8ffd6b4e6e2276dc35": true, - "5de8eaadbbaf010b10528a6d": true, - "5de8eac42a78646d96665d91": true, - "5de8f237bbaf010b10528a70": true, - "5de8f2d5b74cd90030650c72": true, - "5de8fb539f98ac2bc659513a": true, - "5de8fbad2fbe23140d3ee9c4": true, - "5de8fbf2b74cd90030650c79": true, - "5de8fc0b205ddc616a6bc51b": true, - "5de910da8b6c4240ba2651b5": true, - "5de922d4b11454561e39239f": true, - "5df24cf80dee1b22f862e9bc": true, - "5df256570dee1b22f862e9c4": true, - "5df25b6c0b92095fd441e4cf": true, - "5df25d3bfd6b4e6e2276dc9a": true, - "5df35ddddfc58d14537c2036": true, - "5df35e59c41b2312ea3334d5": true, - "5df35e7f2a78646d96665dd4": true, - "5df35e970b92095fd441e4d2": true, - "5df35ea9c41b2312ea3334d8": true, - "5df35eb2b11454561e3923e2": true, - "5df36948bb49d91fb446d5ad": true, - "5df38a5fb74cd90030650cb6": true, - "5df8a2ca86f7740bfe6df777": true, - "5df8a42886f77412640e2e75": true, - "5df8a4d786f77412672a1e3b": true, - "5df8a58286f77412631087ed": true, - "5df8ce05b11454561e39243b": true, - "5df8e053bb49d91fb446d6a6": true, - "5df8e085bb49d91fb446d6a8": true, - "5df8e4080b92095fd441e594": true, - "5df8f535bb49d91fb446d6b0": true, - "5df8f541c41b2312ea3335e3": true, - "5df916dfbb49d91fb446d6b9": true, - "5df917564a9f347bc92edca3": true, - "5dfa397fb11454561e39246c": true, - "5dfa3cd1b33c0951220c079b": true, - "5dfa3d2b0dee1b22f862eade": true, - "5dfa3d45dfc58d14537c20b0": true, - "5dfa3d7ac41b2312ea33362a": true, - "5dfa3d950dee1b22f862eae0": true, - "5dfcd0e547101c39625f66f9": true, - "5dfce88fe9dc277128008b2e": true, - "5dfe14f30b92095fd441edaf": true, - "5dfe6104585a0c3e995c7b82": true, - "5dff772da3651922b360bf91": true, - "5dff77c759400025ea5150cf": true, - "5dff8db859400025ea5150d4": true, - "5e00903ae9dc277128008b87": true, - "5e0090f7e9dc277128008b93": true, - "5e00c1ad86f774747333222c": true, - "5e00cdd986f7747473332240": true, - "5e00cfa786f77469dc6e5685": true, - "5e01e9e273d8eb11426f5bc3": true, - "5e01ea19e9dc277128008c0b": true, - "5e01ef6886f77445f643baa4": true, - "5e01f31d86f77465cf261343": true, - "5e01f37686f774773c6f6c15": true, - "5e023cf8186a883be655e54f": true, - "5e023d34e8a400319a28ed44": true, - "5e023d48186a883be655e551": true, - "5e023e53d4353e3302577c4c": true, - "5e023e6e34d52a55c3304f71": true, - "5e023e88277cce2b522ff2b1": true, - "5e208b9842457a4a7a33d074": true, - "5e217ba4c1434648c13568cd": true, - "5e2192a498a36665e8337386": true, - "5e21a3c67e40bd02257a008a": true, - "5e21ca18e4d47f0da15e77dd": true, - "5e2af47786f7746d404f3aaa": true, - "5e2af4a786f7746d3f3c3400": true, - "5e2af55f86f7746d4159f07c": true, - "5e32f56fcb6d5863cc5e5ee4": true, - "5e340dcdcb6d5863cc5e5efb": true, - "5e4abb5086f77406975c9342": true, - "5e4abc1f86f774069619fbaa": true, - "5e4abc6786f77406812bd572": true, - "5e4abfed86f77406a2713cf7": true, - "5e4ac41886f77406a511c9a8": true, - "5e4bfc1586f774264f7582d3": true, - "5e4d34ca86f774264f758330": true, - "5e54f76986f7740366043752": true, - "5e54f79686f7744022011103": true, - "5e56991336989c75ab4f03f6": true, - "5e5699df2161e06ac158df6f": true, - "5e569a0156edd02abe09f27d": true, - "5e569a132642e66b0b68015c": true, - "5e569a2e56edd02abe09f280": true, - "5e71f6be86f77429f2683c44": true, - "5e71f70186f77429ee09f183": true, - "5e71fad086f77422443d4604": true, - "5e81c3cbac2bb513793cdc75": true, - "5e81c4ca763d9f754677befa": true, - "5e81c519cb2b95385c177551": true, - "5e81c539cb2b95385c177553": true, - "5e81c550763d9f754677befd": true, - "5e81c6a2ac2bb513793cdc7f": true, - "5e81c6bf763d9f754677beff": true, - "5e81ebcd8e146c7080625e15": true, - "5e81edc13397a21db957f6a1": true, - "5e81ee213397a21db957f6a6": true, - "5e81ee4dcb2b95385c177582": true, - "5e81f423763d9f754677bf2e": true, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": true, - "5e848cc2988a8701445df1e8": true, - "5e848d1c264f7c180b5e35a9": true, - "5e848d2eea0a7c419c2f9bfd": true, - "5e848d51e4dbc5266a4ec63b": true, - "5e848d99865c0f329958c83b": true, - "5e848db4681bea2ada00daa9": true, - "5e848dc4e4dbc5266a4ec63d": true, - "5e85a9f4add9fe03027d9bf1": true, - "5e85aa1a988a8701445df1f5": true, - "5e870397991fd70db46995c8": true, - "5e87071478f43e51ca2de5e1": true, - "5e87076ce2db31558c75a11d": true, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": true, - "5e87114fe2db31558c75a120": true, - "5e87116b81c4ed43e83cefdd": true, - "5e8f3423fd7471236e6e3b64": true, - "5e997f0b86f7741ac73993e2": true, - "5e9dacf986f774054d6b89f4": true, - "5e9db13186f7742f845ee9d3": true, - "5e9dcf5986f7746c417435b3": true, - "5ea02bb600685063ec28bfa1": true, - "5ea034eb5aad6446a939737b": true, - "5ea034f65aad6446a939737e": true, - "5ea03e5009aa976f2e7a514b": true, - "5ea03e9400685063ec28bfa4": true, - "5ea03f7400685063ec28bfa8": true, - "5ea058e01dbce517f324b3e2": true, - "5ea05cf85ad9772e6624305d": true, - "5ea16acdfadf1d18c87b0784": true, - "5ea16ada09aa976f2e7a51be": true, - "5ea16d4d5aad6446a939753d": true, - "5ea172e498dacb342978818e": true, - "5ea17bbc09aa976f2e7a51cd": true, - "5ea17ca01412a1425304d1c0": true, - "5ea18c84ecf1982c7712d9a2": true, - "5ea2a8e200685063ec28c05a": true, - "5ed515c8d380ab312177c0fa": true, - "5ed515e03a40a50460332579": true, - "5ed515ece452db0eb56fc028": true, - "5ed515f6915ec335206e4152": true, - "5ed5160a87bb8443d10680b5": true, - "5ed51652f6c34d2cc26336a1": true, - "5ed5166ad380ab312177c100": true, - "5ede4739e0350d05467f73e8": true, - "5ede47405b097655935d7d16": true, - "5ede474b0c226a66f5402622": true, - "5ede475339ee016e8c534742": true, - "5ede475b549eed7c6d5c18fb": true, - "5eea21647547d6330471b3c9": true, - "5eea217fc64c5d0dfc05712a": true, - "5eeb2ff5ea4f8b73c827350b": true, - "5ef1b9f0c64c5d0dfc0571a1": true, - "5ef1ba28c64c5d0dfc0571a5": true, - "5ef32e4d1c1fd62aea6a150d": true, - "5ef3448ab37dfd6af863525c": true, - "5ef3553c43cb350a955a7ccb": true, - "5ef35bc243cb350a955a7ccd": true, - "5ef35d2ac64c5d0dfc0571b0": true, - "5ef35f46382a846010715a96": true, - "5ef366938cef260c0642acad": true, - "5ef369b08cef260c0642acaf": true, - "5ef5d994dfbc9f3c660ded95": true, - "5ef61964ec7f42238c31e0c1": true, - "5efaf417aeb21837e749c7f2": true, - "5efb0c1bd79ff02a1f5e68d9": true, - "5efb0cabfb3e451d70735af5": true, - "5efb0d4f4bc50b58e81710f3": true, - "5efb0da7a29a85116f6ea05f": true, - "5efb0e16aeb21837e749c7ff": true, - "5efb0fc6aeb21837e749c801": true, - "5f0596629e22f464da6bbdd9": true, - "5f0c892565703e5c461894e9": true, - "5f2a9575926fd9352339381f": true, - "5f2aa43ba9b91d26f20ae6d2": true, - "5f2aa4464b50c14bcf07acdb": true, - "5f2aa4559b44de6b1b4e68d1": true, - "5f2aa46b878ef416f538b567": true, - "5f2aa47a200e2c0ee46efa71": true, - "5f2aa493cd375f14e15eea72": true, - "5f2aa49f9b44de6b1b4e68d4": true, - "5f36a0e5fbf956000b716b65": true, - "5f3e76d86cda304dcc634054": true, - "5f3e772a670e2a7b01739a52": true, - "5f3e777688ca2d00ad199d25": true, - "5f3e778efcd9b651187d7201": true, - "5f3e77b26cda304dcc634057": true, - "5f3e77f59103d430b93f94c1": true, - "5f3e7801153b8571434a924c": true, - "5f3e7823ddc4f03b010e2045": true, - "5f3e7897ddc4f03b010e204a": true, - "5f3e78a7fbf956000b716b8e": true, - "5f4f9eb969cdc30ff33f09db": false, - "5f5e45cc5021ce62144be7aa": true, - "5f5e467b0bc58666c37e7821": true, - "5f5e46b96bdad616ad46d613": true, - "5f5f41476bdad616ad46d631": true, - "5f5f41f56760b4138443b352": true, - "5f60b34a41e30a4ab12a6947": true, - "5f60b85bbdb8e27dee3dc985": true, - "5f60bf4558eff926626a60f2": true, - "5f60c076f2bcbb675b00dac2": true, - "5f60c74e3b85f6263c145586": true, - "5f60c85b58eff926626a60f7": true, - "5f60cd6cf2bcbb675b00dac6": true, - "5f60e6403b85f6263c14558c": true, - "5f60e7788adaa7100c3adb49": true, - "5f60e784f2bcbb675b00dac7": true, - "5f6331e097199b7db2128dc2": true, - "5f6336bbda967c74a42e9932": true, - "5f6339d53ada5942720e2dc3": true, - "5f633f68f5750b524b45f112": true, - "5f633f791b231926f2329f13": true, - "5f633ff5c444ce7e3c30a006": true, - "5f63405df5750b524b45f114": true, - "5f63407e1b231926f2329f15": true, - "5f6340d3ca442212f4047eb2": true, - "5f6341043ada5942720e2dc5": true, - "5f63418ef5750b524b45f116": true, - "5f6372e2865db925d54f3869": true, - "5f647f31b6238e5dd066e196": true, - "5f99418230835532b445e954": true, - "5f994730c91ed922dd355de3": true, - "5f9949d869e2777a0e779ba5": true, - "5fb64bc92b1b027b1f50bcf2": true, - "5fb651b52b1b027b1f50bcff": true, - "5fb651dc85f90547f674b6f4": true, - "5fb65363d1409e5ca04b54f5": true, - "5fb653962b1b027b1f50bd03": true, - "5fb65424956329274326f316": true, - "5fb6548dd1409e5ca04b54f9": true, - "5fb6558ad6f0b2136f2d7eb7": true, - "5fb655a72b1b027b1f50bd06": true, - "5fb655b748c711690e3a8d5a": true, - "5fb6564947ce63734e3fa1da": true, - "5fb6567747ce63734e3fa1dc": true, - "5fbb976df9986c4cff3fe5f2": true, - "5fbb978207e8a97d1f0902d3": true, - "5fbbaa86f9986c4cff3fe5f6": true, - "5fbbc3324e8a554c40648348": true, - "5fbbc34106bde7524f03cbe9": true, - "5fbbc366ca32ed67276c1557": true, - "5fbbc383d5cb881a7363194a": true, - "5fbbfabed5cb881a7363194e": true, - "5fbbfacda56d053a3543f799": true, - "5fbc210bf24b94483f726481": true, - "5fbc226eca32ed67276c155d": true, - "5fbc227aa56d053a3543f79e": true, - "5fbc22ccf24b94483f726483": true, - "5fbcbcf593164a5b6278efb2": true, - "5fbcbd02900b1d5091531dd3": true, - "5fbcbd10ab884124df0cd563": true, - "5fbcbd6c187fea44d52eda14": true, - "5fbcc1d9016cce60e8341ab3": true, - "5fbcc3e4d6fa9c00c571bb58": true, - "5fbcc429900b1d5091531dd7": true, - "5fbcc437d724d907e2077d5c": true, - "5fbcc640016cce60e8341acc": true, - "5fbe3ffdf8b6a877a729ea82": true, - "5fbe760793164a5b6278efc8": true, - "5fbe7618d6fa9c00c571bb6c": true, - "5fc0f9b5d724d907e2077d82": true, - "5fc0f9cbd6fa9c00c571bb90": true, - "5fc0fa362770a0045c59c677": true, - "5fc0fa957283c4046c58147e": true, - "5fc22d7c187fea44d52eda44": true, - "5fc23426900b1d5091531e15": true, - "5fc235db2770a0045c59c683": true, - "5fc2360f900b1d5091531e19": true, - "5fc23636016cce60e8341b05": true, - "5fc23678ab884124df0cd590": true, - "5fc2369685fd526b824a5713": true, - "5fc275cf85fd526b824a571a": true, - "5fc278107283c4046c581489": true, - "5fc382a9d724d907e2077dab": true, - "5fc382b6d6fa9c00c571bbc3": true, - "5fc382c1016cce60e8341b20": true, - "5fc3e272f8b6a877a729eac5": true, - "5fc3e466187fea44d52eda90": true, - "5fc3e4a27283c4046c5814ab": true, - "5fc3e4ee7283c4046c5814af": true, - "5fc3f2d5900b1d5091531e57": true, - "5fc4b97bab884124df0cd5e3": true, - "5fc4b992187fea44d52edaa9": true, - "5fc4b9b17283c4046c5814d7": true, - "5fc53954f8b6a877a729eaeb": true, - "5fc5396e900b1d5091531e72": true, - "5fc64ea372b0dd78d51159dc": true, - "5fca138c2a7b221b2852a5c6": true, - "5fca13ca637ee0341a484f46": true, - "5fce0cf655375d18a253eff0": true, - "5fce0f9b55375d18a253eff2": true, - "5fce16961f152d4312622bc9": true, - "5fd20ff893a8961fc660a954": true, - "5fd4c474dd870108a754b241": true, - "5fd4c4fa16cac650092f6771": true, - "5fd4c5477a8d854fa0105061": true, - "5fd4c60f875c30179f5d04c2": true, - "5fd8d28367cb5e077335170f": true, - "60098ad7c2240c0fe85c570a": true, - "60098af40accd37ef2175f27": true, - "60098b1705871270cd5352a1": true, - "601948682627df266209af05": true, - "60194943740c5d77f6705eea": true, - "601949593ae8f707c4608daa": true, - "601aa3d2b2bcb34913271e6d": true, - "602286df23506e50807090c6": true, - "60228924961b8d75ee233c32": true, - "60228a76d62c9b14ed777a66": true, - "60228a850ddce744014caf69": true, - "602293f023506e50807090cb": true, - "60229948cacb6b0506369e27": true, - "602a95edda11d6478d5a06da": true, - "602a95fe4e02ce1eaa358729": true, - "602a97060ddce744014caf6f": true, - "602a9740da11d6478d5a06dc": true, - "602e3f1254072b51b239f713": true, - "602e620f9b513876d4338d9a": true, - "602e63fb6335467b0c5ac94d": true, - "602e71bd53a60014f9705bfa": true, - "602f85fd9b513876d4338d9c": true, - "603372b4da11d6478d5a07ff": true, - "603372d154072b51b239f9e1": true, - "603372f153a60014f970616d": true, - "603373004e02ce1eaa358814": true, - "6033749e88382f4fab3fd2c5": true, - "60337f5dce399e10262255d1": true, - "60338ff388382f4fab3fd2c8": true, - "60339954d62c9b14ed777c06": true, - "6033fa48ffd42c541047f728": true, - "603409c80ca681766b6a0fb2": true, - "6034cf5fffd42c541047f72e": true, - "6034d0230ca681766b6a0fb5": true, - "6034d103ca006d2dca39b3f0": true, - "6034d2d697633951dc245ea6": true, - "6034e3cb0ddce744014cb870": true, - "6034e3d953a60014f970617b": true, - "6034e3e20ddce744014cb878": true, - "603618feffd42c541047f771": true, - "603619720ca681766b6a0fc4": true, - "60361a7497633951dc245eb4": true, - "60361b0b5a45383c122086a1": true, - "60361b5a9a15b10d96792291": true, - "60363c0c92ec1c31037959f5": true, - "603648ff5a45383c122086ac": true, - "6038b4b292ec1c3103795a0b": true, - "6038b4ca92ec1c3103795a0d": true, - "6038d614d10cbf667352dd44": true, - "6040dd4ddcf9592f401632d2": true, - "6040de02647ad86262233012": true, - "606587252535c57a13424cfd": true, - "60658776f2cb2e02a42ace2b": true, - "6065878ac9cf8012264142fd": true, - "606587a88900dc2d9a55b659": true, - "606587bd6d0bd7580617bacc": true, - "606587d11246154cad35d635": true, - "606587e18900dc2d9a55b65f": true, - "6065880c132d4d12c81fd8da": true, - "6065881d1246154cad35d637": true, - "6065c6e7132d4d12c81fd8e1": true, - "6065dc8a132d4d12c81fd8e3": true, - "606dae0ab0e443224b421bb7": true, - "606ee5c81246154cad35d65e": true, - "606eef46232e5a31c233d500": true, - "606eef756d0bd7580617baf8": true, - "606ef0812535c57a13424d20": true, - "606f262c6d0bd7580617bafa": true, - "606f263a8900dc2d9a55b68d": true, - "606f26752535c57a13424d22": true, - "606f2696f2cb2e02a42aceb1": true, - "6076c1b9f2cb2e02a42acedc": true, - "60785c0d232e5a31c233d51c": true, - "60785ce5132d4d12c81fd918": true, - "607d5aa50494a626335e12ed": true, - "607ea812232e5a31c233d53c": true, - "607f201b3c672b3b3a24a800": true, - "607f20859ee58b18e41ecd90": true, - "607ffb988900dc2d9a55b6e4": true, - "6086b5392535c57a13424d70": true, - "6086b5731246154cad35d6c7": true, - "6087e0336d0bd7580617bb7a": true, - "6087e2a5232e5a31c233d552": true, - "6087e663132d4d12c81fd96b": true, - "609269c3b0e443224b421cc1": true, - "60926df0132d4d12c81fd9df": true, - "609a4b4fe2ff132951242d04": true, - "609a63b6e2ff132951242d09": true, - "609b9e31506cf869cf3eaf41": true, - "609bab8b455afd752b2e6138": true, - "609e8540d5c319764c2bc2e9": true, - "609e860ebd219504d8507525": true, - "60a23797a37c940de7062d02": true, - "60a272cc93ef783291411d8e": true, - "60a2828e8689911a226117f9": true, - "60a283193cb70855c43a381d": true, - "60a3c68c37ea821725773ef5": true, - "60a3c70cde5f453f634816a3": true, - "60a621c49c197e4e8c4455e6": true, - "60a6220e953894617404b00a": true, - "60a7acf20c5cb24b01346648": true, - "60a7ad2a2198820d95707a2e": true, - "60a7ad3a0c5cb24b0134664a": true, - "60b0f988c4449e4cb624c1da": true, - "60b52e5bc7d8103275739d67": true, - "60bf74184a63fc79b60c57f6": true, - "60db29ce99594040e04c4a27": true, - "6113c3586c780c1e710c90bc": true, - "6113cc78d3a39d50044c065a": true, - "6113cce3d92c473c770200c7": true, - "6113d6c3290d254f5e6b27db": true, - "611a30addbdd8440277441dc": true, - "611a31ce5b7ffe001b4649d1": true, - "6123649463849f3d843da7c4": true, - "612368f58b401f4f51239b33": true, - "612781056f3d944a17348d60": true, - "612e0cfc8004cc50514c2d9e": true, - "612e0d3767085e45ef14057f": true, - "612e0d81290d254f5e6b291a": true, - "612e0e04568c120fdd294258": true, - "612e0e3c290d254f5e6b291d": true, - "612e0e55a112697a4b3a66e7": true, - "6130c3dffaa1272e43151c7d": true, - "6130c43c67085e45ef1405a1": true, - "6130c4d51cb55961fa0fd49f": true, - "6130ca3fd92c473c77020dbd": true, - "614451b71e5874611e2c7ae5": true, - "615d8d878004cc50514c3233": true, - "615d8da4d3a39d50044c10e8": true, - "615d8dbd290d254f5e6b2ed6": true, - "615d8df08004cc50514c3236": true, - "615d8e2f1cb55961fa0fd9a4": true, - "615d8e9867085e45ef1409c6": true, - "615d8eb350224f204c1da1cf": true, - "615d8f5dd92c473c770212ef": true, - "615d8f8567085e45ef1409ca": true, - "615d8faecabb9b7ad90f4d5d": true, - "615d8fd3290d254f5e6b2edc": true, - "61605d88ffa6e502ac5e7eeb": true, - "616442e4faa1272e43152193": true, - "616554fe50224f204c1da2aa": true, - "61657230d92c473c770213d7": true, - "616584766ef05c2ce828ef57": true, - "61659f79d92c473c770213ee": true, - "6165ac306ef05c2ce828ef74": true, - "6165ac8c290d254f5e6b2f6c": true, - "6165adcdd3a39d50044c120f": true, - "6165aeedfaa1272e431521e3": true, - "61695095d92c473c7702147a": true, - "61702be9faa1272e431522c3": true, - "61702d8a67085e45ef140b24": true, - "61702f1b67085e45ef140b26": true, - "61703001d92c473c77021497": true, - "61712eae6c780c1e710c9a1d": true, - "617130016c780c1e710c9a24": true, - "617131a4568c120fdd29482d": true, - "61713308d92c473c770214a0": true, - "6171367e1cb55961fa0fdb36": true, - "61713a8fd92c473c770214a4": true, - "61713cc4d8e3106d9806c109": true, - "6171407e50224f204c1da3c5": true, - "61714b2467085e45ef140b2c": true, - "61714eec290d254f5e6b2ffc": true, - "617151c1d92c473c770214ab": true, - "617153016c780c1e710c9a2f": true, - "617154aa1cb55961fa0fdb3b": true, - "617155ee50224f204c1da3cd": true, - "61715e7e67085e45ef140b33": true, - "6176a40f0b8c0312ac75a3d3": true, - "6176a48d732a664031271438": true, - "6176aca650224f204c1da3fb": true, - "617aa4dd8166f034d57de9c5": true, - "617fd91e5539a84ec44ce155": true, - "61816734d8e3106d9806c1f3": true, - "618167441cb55961fa0fdc71": true, - "618167528004cc50514c34f9": true, - "618167616ef05c2ce828f1a8": true, - "6181688c6c780c1e710c9b04": true, - "618168b350224f204c1da4d8": true, - "618168dc8004cc50514c34fc": true, - "61816df1d3a39d50044c139e": true, - "61816dfa6ef05c2ce828f1ad": true, - "61816fcad92c473c770215cc": true, - "61817865d3a39d50044c13a4": true, - "618178aa1cb55961fa0fdc80": true, - "61825d06d92c473c770215de": true, - "61825d136ef05c2ce828f1cc": true, - "61825d24d3a39d50044c13af": true, - "6183afd850224f204c1da514": true, - "6183b0711cb55961fa0fdcad": true, - "6183b084a112697a4b3a6e6c": true, - "6183d53f1cb55961fa0fdcda": true, - "6183fc15d3a39d50044c13e9": true, - "6183fd911cb55961fa0fdce9": true, - "6183fd9e8004cc50514c358f": true, - "618405198004cc50514c3594": true, - "6184055050224f204c1da540": true, - "618407a850224f204c1da549": true, - "61840bedd92c473c77021635": true, - "61840d85568c120fdd2962a5": true, - "618426d96c780c1e710c9b9f": true, - "618428466ef05c2ce828f218": true, - "618a431df1eb8e24b8741deb": true, - "618a5d5852ecee1505530b2a": true, - "618a75c9a3884f56c957ca1b": true, - "618a75f0bd321d49084cd399": true, - "618a760e526131765025aae3": true, - "618aef6d0a5a59657e5f55ee": true, - "618b9643526131765025ab35": true, - "618b9671d14d6d5ab879c5ea": true, - "618b9682a3884f56c957ca78": true, - "618ba27d9008e4636a67f61d": true, - "618ba91477b82356f91ae0e8": true, - "618ba92152ecee1505530bd3": true, - "618bab21526131765025ab3f": true, - "618bb76513f5097c8d5aa2d5": true, - "618cfae774bb2d036a049e7c": true, - "619256e5f8af2c1a4e1f5d92": true, - "619386379fb0c665d5490dbe": true, - "6193a720f8ee7e52e42109ed": true, - "6193d3149fb0c665d5490e32": true, - "6193d338de3cdf1d2614a6fc": true, - "6193d382ed0429009f543e65": true, - "6193d3be7c6c7b169525f0da": true, - "6193d3cded0429009f543e6a": true, - "6193d5d4f8ee7e52e4210a1b": true, - "6193dcd0f8ee7e52e4210a28": true, - "6194ef39de3cdf1d2614a768": true, - "6194efe07c6c7b169525f11b": true, - "6194eff92d2c397d6600348b": true, - "6194f017ed0429009f543eaa": true, - "6194f02d9bb3d20b0946d2f0": true, - "6194f1f918a3974e5e7421e4": true, - "6194f2912d2c397d6600348d": true, - "6194f2df645b5d229654ad77": true, - "6194f3286db0f2477964e67d": true, - "6194f35c18a3974e5e7421e6": true, - "6194f41f9fb0c665d5490e75": true, - "6194f5722d2c397d6600348f": true, - "6194f5a318a3974e5e7421eb": true, - "6194f5d418a3974e5e7421ef": true, - "619621a4de3cdf1d2614a7a7": true, - "619624b26db0f2477964e6b0": true, - "6196255558ef8c428c287d1c": true, - "61962b617c6c7b169525f168": true, - "61962d879bb3d20b0946d385": true, - "6196364158ef8c428c287d9f": true, - "6196365d58ef8c428c287da1": true, - "619636be6db0f2477964e710": true, - "61963a852d2c397d660036ad": true, - "61965d9058ef8c428c287e0d": true, - "619666f4af1f5202c57a952d": true, - "6197b229af1f5202c57a9bea": true, - "619b5db699fb192e7430664f": true, - "619b69037b9de8162902673e": true, - "619bc61e86e01e16f839a999": true, - "619bdd8886e01e16f839a99c": true, - "619bddc6c9546643a67df6ee": true, - "619bddffc9546643a67df6f0": true, - "619bde3dc9546643a67df6f2": true, - "619bde7fc9546643a67df6f4": true, - "619bdeb986e01e16f839a99e": true, - "619bdef8c9546643a67df6f6": true, - "619bdf9cc9546643a67df6f8": true, - "619bdfd4c9546643a67df6fa": true, - "619cbf7d23893217ec30b689": true, - "619cbf9e0a7c3a1a2731940a": true, - "619cf0335771dd3c390269ae": true, - "619d36da53b4d42ee724fae4": true, - "619f4ab2d25cbd424731fb95": true, - "619f4bffd25cbd424731fb97": true, - "619f4cee4c58466fe1228435": true, - "619f4d304c58466fe1228437": true, - "619f4f8c4c58466fe1228439": true, - "619f52454c58466fe122843b": true, - "61a4c8884f95bc3b2c5dc96f": true, - "61b9e1aaef9a1b5d6a79899a": true, - "61bc85697113f767765c7fe7": true, - "61bca7cda0eae612383adf57": true, - "61bcc89aef0f505f0c6cd0fc": true, - "61c18d83b00456371a66814b": true, - "61c18db6dfd64163ea78fbb4": true, - "61f4012adfc9f01a816adda1": true, - "61f7b234ea4ab34f2f59c3ec": true, - "61f7b85367ddd414173fdb36": true, - "61f7c9e189e6fb1a5e3ea78d": true, - "61f8024263dc1250e26eb029": true, - "61f803b8ced75b2e852e35f8": true, - "61faa91878830f069b6b7967": true, - "620109578d82e67e7911abf2": true, - "6217726288ed9f0845317459": true, - "62178be9d0050232da3485d9": true, - "62178c4d4ecf221597654e3d": true, - "622b327b267a1b13a44abea3": true, - "622b379bf9cfc87d675d2de5": true, - "622b3858034a3e17ad0b81f5": true, - "622b38c56762c718e457e246": true, - "622b397c9a3d4327e41843b6": true, - "622b3c081b89c677a33bcda6": true, - "622b3d5cf9cfc87d675d2de9": true, - "622b4d7df9cfc87d675d2ded": true, - "622b4f54dc8dcc0ba8742f85": true, - "622efbcb99f4ea1a4d6c9a15": true, - "622efdf8ec80d870d349b4e5": true, - "622f02437762f55aaa68ac85": true, - "622f039199f4ea1a4d6c9a17": true, - "622f07cfae33bc505b2c4dd5": true, - "622f0ee47762f55aaa68ac87": true, - "622f128cec80d870d349b4e8": true, - "622f140da5958f63c67f1735": true, - "622f14e899892a7f9e08f6c5": true, - "622f16a1a5958f63c67f1737": true, - "623063e994fc3f7b302a9696": true, - "62307b7b10d2321fa8741921": true, - "6231654c71b5bc3baa1078e5": true, - "623166e08c43374ca1567195": true, - "6231670f0b8aa5472d060095": true, - "62330b3ed4dc74626d570b95": true, - "62330bfadc5883093563729b": true, - "62330c18744e5e31df12f516": true, - "62330c40bdd19b369e1e53d1": true, - "62386b2adf47d66e835094b2": true, - "62386b7153757417e93a4e9f": true, - "62389aaba63f32501b1b444f": true, - "62389ba9a63f32501b1b4451": true, - "62389bc9423ed1685422dc57": true, - "62389be94d5d474bf712e709": true, - "623b2e9d11c3296b440d1638": true, - "623c2f4242aee3103f1c44b7": true, - "623c2f652febb22c2777d8d7": true, - "623c3be0484b5003161840dc": true, - "623c3c1f37b4b31470357737": true, - "6241c2c2117ad530666a5108": true, - "6241c316234b593b5676b637": true, - "62444cb99f47004c781903eb": true, - "62444cd3674028188b052799": true, - "624c0570c9b794431568f5d5": true, - "624c09cfbc2e27219346d955": true, - "624c09da2cec124eb67c1046": true, - "624c09e49b98e019a3315b66": true, - "624c0b3340357b5f566e8766": true, - "624c29ce09cd027dff2f8cd7": true, - "624c2e8614da335f1e034d8c": true, - "6259b864ebedf17603599e88": true, - "6259c2c1d714855d182bad85": true, - "6259c3387d6aab70bc23a18d": true, - "6259c3d8012d6678ec38eeb8": true, - "6259c4347d6aab70bc23a190": true, - "625eb0faa6e3a82193267ad9": true, - "625ebcef6f53af4aa66b44dc": true, - "625ec45bb14d7326ac20f572": true, - "625ed7c64d9b6612df732146": true, - "626667e87379c44d557b7550": true, - "626673016f1edc06f30cf6d5": true, - "62669bccdb9ebb4daa44cd14": true, - "6267c6396b642f77f56f5c1c": true, - "6269220d70b6c02e665f2635": true, - "6269545d0e57f218e4548ca2": true, - "626a74340be03179a165e30c": true, - "626a8ae89e664a2e2a75f409": true, - "626a9cb151cb5849f6002890": true, - "626bb8532c923541184624b4": true, - "626becf9582c3e319310b837": true, - "6272370ee4013c5d7e31f418": true, - "6272379924e29f06af4d5ecb": true, - "627254cc9c563e6e442c398f": true, - "6272874a6c47bd74f92e2087": true, - "6275303a9f372d6ea97f9ec7": true, - "627e14b21713922ded6f2c15": true, - "62811cd7308cb521f87a8f99": true, - "62811e2510e26c1f344e6554": true, - "62811e335631d45211793c95": true, - "62811f461d5df4475f46a332": true, - "62811f828193841aca4a45c3": true, - "62811fa609427b40ab14e765": true, - "62811fbf09427b40ab14e767": true, - "6281204f308cb521f87a8f9b": true, - "628120621d5df4475f46a335": true, - "62812081d23f207deb0ab216": true, - "6281209662cba23f6c4d7a19": true, - "628120c21d5df4475f46a337": true, - "628120d309427b40ab14e76d": true, - "628120dd308cb521f87a8fa1": true, - "628120fd5631d45211793c9f": true, - "6281212a09427b40ab14e770": true, - "628121434fa03b6b6c35dc6a": true, - "6284bd5f95250a29bc628a30": true, - "62850c28da09541f43158cca": true, - "628a60ae6b1d481ff772e9c8": true, - "628a664bccaab13006640e47": true, - "628a665a86cbd9750d2ff5e5": true, - "628a6678ccaab13006640e49": true, - "628a66b41d5e41750e314f34": true, - "628a7b23b0f75035732dd565": true, - "628a83c29179c324ed269508": true, - "628a85ee6b1d481ff772e9d5": true, - "628b5638ad252a16da6dd245": true, - "628b8d83717774443b15e248": true, - "628b916469015a4e1711ed8d": true, - "628b9471078f94059a4b9bfb": true, - "628b9784bcf6e2659e09b8a2": true, - "628b9a40717774443b15e9f2": true, - "628b9be6cff66b70c002b14c": true, - "628b9c37a733087d0d7fe84b": true, - "628b9c7d45122232a872358f": true, - "628baf0b967de16aab5a4f36": true, - "628bc7fb408e2b2e9c0801b1": true, - "628c9ab845c59e5b80768a81": true, - "628cd624459354321c4b7fa2": true, - "628d0618d1ba6e4fa07ce5a4": true, - "628dc750b910320f4c27a732": true, - "628e1ffc83ec92260c0f437f": true, - "628e4dd1f477aa12234918aa": true, - "628e4e576d783146b124c64d": true, - "62963c18dbc8ab5f0d382d0b": true, - "62a09d3bcf4a99369e262447": true, - "62a09d79de7ac81993580530": true, - "62a09dd4621468534a797ac7": true, - "62a09e08de7ac81993580532": true, - "62a09e410b9d3c46de5b6e78": true, - "62a09f32621468534a797acb": true, - "62a1b7fbc30cfa1d366af586": true, - "62a5c2c98ec41a51b34739c0": true, - "62a5c333ec21e50cad3b5dc6": true, - "62a5c41e8ec41a51b34739c3": true, - "62a61bbf8ec41a51b34758d2": true, - "62a61c988ec41a51b34758d5": true, - "62e910aaf957f2915e0a5e36": true - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608815684 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 4, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 6, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 24 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 25 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 17206066, - "GameVersion": "edge_of_darkness", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 69, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 2, - "NeedWipeOptions": [], - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Bear", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49444ae6628187a2e77b8", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49444ae6628187a2e77b8", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "f5e6bdac05e699d687993249", - "_tpl": "5857a8bc2459772bad15db29", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "SecuredContainer" - }, - { - "_id": "01e9d751f10e4e9aebdd94d5", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Pockets" - }, - { - "_id": "5fe49444ae6628187a2e78b8", - "_tpl": "5811ce772459770e9e5f9532" - }, - { - "_id": "5fe49444ae6628187a2e78ba", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49444ae6628187a2e78b9", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - }, - { - "_id": "6275a53292b3e1de7c0f94fc", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "f55404fc9c2a0063bc1b9293", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000000 - } - }, - { - "_id": "c1408429a85d87168d75e04c", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000000 - } - }, - { - "_id": "72ec3ef07bf2ddf6c0dab838", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000000 - } - }, - { - "_id": "72ec3ef08bf2fdf6c0dab835", - "_tpl": "58ac60eb86f77401897560ff", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 1 - } - }, - { - "_id": "6a948d215ed5fc228448ffaa", - "_tpl": "62e910aaf957f2915e0a5e36", - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "location": { - "x": 5, - "y": 0, - "r": "Horizontal", - "isSearched": true - }, - "upd": { - "RecodableComponent": { - "IsEncoded": true - } - } - }, - { - "_id": "6a948d215ed5fc228448ffab", - "_tpl": "62e910aaf957f2915e0a5e36", - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "location": { - "x": 6, - "y": 0, - "r": "Horizontal", - "isSearched": true - }, - "upd": { - "RecodableComponent": { - "IsEncoded": false - } - } - } - ], - "questRaidItems": "5fe49444ae6628187a2e78b9", - "questStashItems": "5fe49444ae6628187a2e78ba", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49444ae6628187a2e78b8" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cd946231388ce000d572fe3", - "5cd945d71388ce000a659dfb" - ], - "trader": { - "initialLoyaltyLevel": 4, - "initialSalesSum": 2600000, - "initialStanding": 6, - "jaegerUnlocked": true, - "setQuestsAvailableForFinish": true, - "setQuestsAvailableForStart": false - }, - "weaponbuilds": {} + "usec": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c6", + "templateId": "5811ce772459770e9e5f9532", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cde95d97d6c8b647a3769b0", + "Feet": "5cde95ef7d6c8b04713c4f2d", + "Hands": "5cde95fa7d6c8b04737c2d13", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5447ac644bdc2d6c208b4567": true, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448c1d04bdc2dff2f8b4569": true, + "5448fee04bdc2dbc018b4567": false, + "5448ff904bdc2d6f028b456e": true, + "5449016a4bdc2d6f028b456f": false, + "544909bb4bdc2d6f028b4577": true, + "544a11ac4bdc2d470e8b456a": false, + "544a378f4bdc2d30388b4567": true, + "544a37c44bdc2d25388b4567": true, + "544a38634bdc2d58388b4568": true, + "544a3a774bdc2d3a388b4567": true, + "544a5caa4bdc2d1a388b4568": true, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": true, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "544fb62a4bdc2dfb738b4568": true, + "544fb6cc4bdc2d34748b456e": true, + "54527a984bdc2d4e668b4567": true, + "54527ac44bdc2d36668b4567": true, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "5580169d4bdc2d9d138b4585": true, + "55801eed4bdc2d89578b4588": true, + "5580223e4bdc2d1c128b457f": true, + "558022b54bdc2dac148b458d": true, + "55802d5f4bdc2dac148b458e": true, + "55802f5d4bdc2dac148b458f": true, + "558032614bdc2de7118b4585": true, + "559ba5b34bdc2d1f1a8b4582": true, + "55d355e64bdc2d962f8b4569": true, + "55d35ee94bdc2d61338b4568": true, + "55d3632e4bdc2d972f8b4569": true, + "55d447bb4bdc2d892f8b456f": true, + "55d448594bdc2d8c2f8b4569": true, + "55d449444bdc2d962f8b456d": true, + "55d44fd14bdc2d962f8b456e": true, + "55d459824bdc2d892f8b4573": true, + "55d45d3f4bdc2d972f8b456c": true, + "55d45f484bdc2d972f8b456d": true, + "55d480c04bdc2d1d4e8b456a": false, + "55d481904bdc2d8c2f8b456a": true, + "55d482194bdc2d1d4e8b456b": true, + "55d4837c4bdc2d1d4e8b456c": true, + "55d485be4bdc2d962f8b456f": true, + "55d4887d4bdc2d962f8b4570": true, + "55d48a634bdc2d8b2f8b456a": true, + "55d48ebc4bdc2d8c2f8b456c": true, + "55d4ae6c4bdc2d8b2f8b456e": true, + "55d4af3a4bdc2d972f8b456f": true, + "55d4b9964bdc2d1d4e8b456e": true, + "55d5f46a4bdc2d1b198b4567": true, + "55d614004bdc2d86028b4568": true, + "55d6190f4bdc2d87028b4567": true, + "55d7217a4bdc2d86028b456d": false, + "55f84c3c4bdc2d5f408b4576": true, + "560835c74bdc2dc8488b456f": true, + "560836484bdc2d20478b456e": true, + "560836b64bdc2d57468b4567": true, + "560836fb4bdc2d773f8b4569": true, + "560837154bdc2da74d8b4568": true, + "5608373c4bdc2dc8488b4570": true, + "560837544bdc2de22e8b456e": true, + "560837824bdc2d57468b4568": true, + "5608379a4bdc2d26448b4569": true, + "560838c94bdc2d77798b4569": true, + "56083a334bdc2dc8488b4571": true, + "56083be64bdc2d20478b456f": true, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560d61e84bdc2da74d8b4571": true, + "560d657b4bdc2da74d8b4572": true, + "560d75f54bdc2da74d8b4573": true, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a69d4bdc2ded0b8b457b": true, + "5648a7494bdc2d9d488b4583": false, + "5648ac824bdc2ded0b8b457d": true, + "5648ae314bdc2d3d1c8b457f": true, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": true, + "5648b4534bdc2d3d1c8b4580": true, + "5649a2464bdc2d91118b45a8": true, + "5649aa744bdc2ded0b8b457e": false, + "5649ab884bdc2ded0b8b457f": true, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649ae4a4bdc2d1b2b8b4588": true, + "5649af094bdc2df8348b4586": false, + "5649af884bdc2d1b2b8b4589": true, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "5649b2314bdc2d79388b4576": true, + "5649be884bdc2d79388b4577": true, + "5649d9a14bdc2d79388b4580": true, + "5649ed104bdc2d3d1c8b458b": true, + "564ca99c4bdc2d16268b4589": false, + "564ca9df4bdc2d35148b4569": true, + "564caa3d4bdc2d17108b458e": true, + "5656d7c34bdc2d9d198b4587": true, + "5656eb674bdc2d35148b457c": true, + "567143bf4bdc2d1a0f8b4567": true, + "5673de654bdc2d180f8b456d": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59856d2720bd8418b456a": true, + "56d59d3ad2720bdb418b4577": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56dee2bdd2720bc8328b4567": true, + "56deec93d2720bec348b4568": true, + "56deed6ed2720b4c698b4583": true, + "56def37dd2720bec348b456a": true, + "56dfef82d2720bbd668b4567": true, + "56dff026d2720bb8668b4567": true, + "56dff061d2720bb5668b4567": true, + "56dff0bed2720bb0668b4567": true, + "56dff216d2720bbd668b4568": true, + "56dff2ced2720bb4668b4567": true, + "56dff3afd2720bba668b4567": true, + "56dff421d2720b5f5a8b4567": true, + "56dff4a2d2720bbd668b456a": true, + "56dff4ecd2720b5f5a8b4568": true, + "56e0598dd2720bb5668b45a6": true, + "56e05a6ed2720bd0748b4567": true, + "56e05b06d2720bb2668b4586": true, + "56e294cdd2720b603a8b4575": false, + "56e335e4d2720b6c058b456d": true, + "56e33634d2720bd8058b456b": true, + "56e33680d2720be2748b4576": true, + "56ea6fafd2720b844b8b4593": true, + "56ea70acd2720b844b8b4594": true, + "56ea7165d2720b6e518b4583": true, + "56ea7293d2720b8d4b8b45ba": true, + "56ea8180d2720bf2698b456a": true, + "56ea8222d2720b69698b4567": true, + "56ea8d2fd2720b7c698b4570": true, + "56eabcd4d2720b66698b4574": true, + "56eabf3bd2720b75698b4569": true, + "570fd6c2d2720bc6458b457f": true, + "570fd721d2720bc5458b4596": true, + "570fd79bd2720bc7458b4583": true, + "5710c24ad2720bc3458b45a3": false, + "571659bb2459771fb2755a12": true, + "571a26d524597720680fbe8a": true, + "571a279b24597720b4066566": true, + "571a282c2459771fb2755a69": true, + "571a28e524597720b4066567": true, + "571a29dc2459771fb2755a6a": true, + "57235b6f24597759bf5a30f1": true, + "572b7adb24597762ae139821": true, + "572b7fa524597762b747ce82": true, + "5732ee6a24597719ae0c0281": true, + "5734773724597737fd047c14": true, + "57347d3d245977448f7b7f61": true, + "57347d5f245977448b40fa81": true, + "57347d692459774491567cf1": true, + "57347d7224597744596b4e72": false, + "57347d8724597744596b4e76": true, + "57347d90245977448f7b7f65": true, + "57347d9c245977448b40fa85": true, + "57347da92459774491567cf5": true, + "5735fdcd2459776445391d61": true, + "5735ff5c245977640e39ba7e": true, + "573601b42459776410737435": true, + "573602322459776445391df1": true, + "5736026a245977644601dc61": true, + "573603562459776430731618": true, + "573603c924597764442bd9cb": true, + "573718ba2459775a75491131": false, + "573719762459775a626ccbc1": true, + "573719df2459775a626ccbc2": true, + "57371aab2459775a77142f22": true, + "57371b192459775a9f58a5e0": true, + "57371e4124597760ff7b25f1": true, + "57371eb62459776125652ac1": true, + "57371f2b24597761224311f1": true, + "57371f8d24597761006c6a81": true, + "5737201124597760fc4431f1": true, + "5737207f24597760ff7b25f2": true, + "573720e02459776143012541": true, + "57372140245977611f70ee91": true, + "5737218f245977612125ba51": true, + "573722e82459776104581c21": true, + "573724b42459776125652ac2": true, + "5737250c2459776125652acc": true, + "5737256c2459776125652acd": true, + "573725b0245977612125bae2": true, + "5737260b24597761224311f2": true, + "5737266524597761006c6a8c": true, + "573726d824597765d96be361": true, + "5737273924597765dd374461": true, + "573727c624597765cc785b5b": true, + "5737280e24597765cc785b5c": true, + "5737287724597765e1625ae2": true, + "573728cc24597765cc785b5d": true, + "573728f324597765e5728561": true, + "5737292724597765e5728562": true, + "57372a7f24597766fe0de0c1": true, + "57372ac324597767001bc261": true, + "57372b832459776701014e41": true, + "57372bad245977670b7cd242": true, + "57372bd3245977670b7cd243": true, + "57372c21245977670937c6c2": true, + "57372c56245977685e584582": true, + "57372c89245977685d4159b1": true, + "57372d1b2459776862260581": true, + "57372d4c245977685a3da2a1": true, + "57372db0245977685d4159b2": true, + "57372deb245977685d4159b3": true, + "57372e1924597768553071c1": true, + "57372e4a24597768553071c2": true, + "57372e73245977685d4159b4": true, + "57372e94245977685648d3e1": true, + "57372ebf2459776862260582": true, + "57372ee1245977685d4159b5": true, + "57372f2824597769a270a191": true, + "57372f5c24597769917c0131": true, + "57372f7d245977699b53e301": true, + "57372fc52459776998772ca1": true, + "5737300424597769942d5a01": true, + "5737330a2459776af32363a1": true, + "5737339e2459776af261abeb": true, + "573733c72459776b0b7b51b0": true, + "5739d41224597779c3645501": true, + "57486e672459770abd687134": true, + "574d967124597745970e7c94": true, + "574dad8024597745964bf05c": true, + "574db213245977459a2f3f5d": true, + "574eb85c245977648157eec3": true, + "575062b524597720a31c09a1": true, + "57513f07245977207e26a311": true, + "57513f9324597720a7128161": true, + "57513fcc24597720a31c09a6": true, + "5751435d24597720a27126d1": true, + "57514643245977207f2c2d09": true, + "575146b724597720a27126d5": true, + "5751487e245977207e26a315": true, + "5751496424597720a27126da": true, + "5751a25924597722c463c472": true, + "5751a89d24597722aa0e8db0": true, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": true, + "576165642459773c7a400233": true, + "576167ab2459773cad038c43": true, + "57616a9e2459773c7a400234": true, + "57616ca52459773c69055192": true, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "576fd4ec2459777f0b518431": true, + "577d128124597739d65d0e56": true, + "577d141e24597739c5255e01": true, + "57838ad32459774a17445cd2": true, + "57838c962459774a1651ec63": true, + "57838e1b2459774a256959b1": true, + "57838f0b2459774a256959b2": true, + "57838f9f2459774a150289a0": true, + "578395402459774a256959b5": true, + "578395e82459774a0e553c7b": true, + "579204f224597773d619e051": true, + "5798a2832459774b53341029": true, + "57a0dfb82459774d3078b56c": true, + "57a0e5022459774d1673f889": true, + "57a3459f245977764a01f703": true, + "57a9b9ce2459770ee926038d": true, + "57ac965c24597706be5f975c": true, + "57aca93d2459771f2c7e26db": true, + "57acb6222459771ec34b5cb0": true, + "57ade1442459771557167e15": true, + "57adff4f24597737f373b6e6": true, + "57ae0171245977343c27bfcf": true, + "57af48872459771f0b2ebf11": true, + "57c44b372459772d2b39b8ce": true, + "57c44dd02459772d2e0ae249": true, + "57c44e7b2459772d28133248": true, + "57c44f4f2459772d2c627113": true, + "57c44fa82459772d2d75e415": true, + "57c450252459772d28133253": true, + "57c55efc2459772d2c6271e7": true, + "57c55f092459772d291a8463": true, + "57c55f112459772d28133310": true, + "57c55f172459772d27602381": true, + "57c5ac0824597754771e88a9": true, + "57c69dd424597774c03b7bbc": true, + "57c9a89124597704ee6faec1": true, + "57cd379a24597778e7682ecf": false, + "57cff947245977638e6f2a19": true, + "57cffb66245977632f391a99": true, + "57cffcd624597763133760c5": true, + "57cffcdd24597763f5110006": true, + "57cffce524597763b31685d8": true, + "57cffd8224597763b03fc609": true, + "57cffddc24597763133760c6": true, + "57cffe0024597763b03fc60b": true, + "57cffe20245977632f391a9d": true, + "57d14d2524597714373db789": true, + "57d14e1724597714010c3f4b": true, + "57d1519e24597714373db79d": true, + "57d152ec245977144076ccdf": true, + "57d17c5e2459775a5c57d17d": true, + "57d17e212459775a1179a0f5": true, + "57da93632459771cb65bf83f": true, + "57dbb57e2459774673234890": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "57e26ea924597715ca604a09": true, + "57e26fc7245977162a14b800": true, + "57ee59b42459771c7b045da5": true, + "57f3a5ae2459772b0e0bf19e": true, + "57f3c6bd24597738e730fa2f": true, + "57f3c7e024597738ea4ba286": true, + "57f3c8cc2459773ec4480328": true, + "57f4c844245977379d5c14d1": true, + "57fd23e32459772d0805bcf1": true, + "57ffa9f4245977728561e844": true, + "57ffaea724597779f52b3a4d": true, + "57ffb0062459777a045af529": true, + "57ffb0e42459777d047111c5": true, + "5811ce772459770e9e5f9532": false, + "5827272a24597748c74bdeea": true, + "58272b392459774b4c7b3ccd": true, + "58272b842459774abc128d50": true, + "58272d7f2459774f6311ddfd": true, + "583990e32459771419544dd2": true, + "5839a40f24597726f856b511": true, + "5839a7742459773cf9693481": true, + "58491f3324597764bc48fa02": true, + "584924ec24597768f12ae244": true, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "587de4282459771bca0ec90b": true, + "587de5ba2459771c0f1e8a58": true, + "587df583245977373c4f1129": true, + "587e02ff24597743df3deaeb": true, + "587e0531245977466077a0f7": true, + "587e08ee245977446b4410cf": true, + "588200af24597742fa221dfb": true, + "588200c224597743990da9ed": true, + "588200cf2459774414733d55": true, + "588226d124597767ad33f787": true, + "588226dd24597767ad33f789": true, + "588226e62459776e3e094af7": true, + "588226ef24597767af46e39c": true, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "588892092459774ac91d4b11": true, + "5888945a2459774bf43ba385": true, + "5888956924597752983e182d": true, + "5888961624597754281f93f3": true, + "5888976c24597754281f93f5": true, + "5888988e24597752fe43a6fa": true, + "5888996c24597754281f9419": true, + "58889c7324597754281f9439": true, + "58889d0c2459775bc215d981": true, + "588b56d02459771481110ae2": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "58949fac86f77409483e16aa": true, + "5894a05586f774094708ef75": true, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "58a56f8d86f774651579314c": true, + "58a5c12e86f7745d585a2b9e": true, + "58ac1bf086f77420ed183f9f": true, + "58ac60eb86f77401897560ff": true, + "58aeaaa886f7744fc1560f81": true, + "58aeac1b86f77457c419f475": true, + "58c157be86f77403c74b2bb6": true, + "58c157c886f774032749fb06": true, + "58d2664f86f7747fec5834f6": true, + "58d268fc86f774111273f8c2": true, + "58d2912286f7744e27117493": true, + "58d2946386f774496974c37e": true, + "58d2946c86f7744e271174b5": true, + "58d2947686f774485c6a1ee5": true, + "58d2947e86f77447aa070d53": true, + "58d399e486f77442e0016fe7": true, + "58d39b0386f77443380bf13c": true, + "58d39d3d86f77445bb794ae7": true, + "58dd3ad986f77403051cba8f": true, + "5900b89686f7744e704a8747": true, + "590c5d4b86f774784e1b9c45": false, + "590c60fc86f77412b13fddcf": true, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": true, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": true, + "591aef7986f774139d495f03": true, + "591af10186f774139d495f0e": true, + "591af28e86f77414a27a9e1d": true, + "591c4e1186f77410354b316e": true, + "591c4efa86f7741030027726": true, + "591ee00d86f774592f7b841e": true, + "5926bb2186f7744b1c6c6e60": true, + "5926c0df86f77462f647f764": true, + "5926c32286f774616e42de99": true, + "5926c36d86f77467a92a8629": true, + "5926c3b286f774640d189b6b": true, + "5926d2be86f774134d668e4e": true, + "5926d33d86f77410de68ebc0": true, + "5926d3c686f77410de68ebc8": true, + "5926d40686f7740f152b6b7e": true, + "5926dad986f7741f82604363": true, + "5926e16e86f7742f5a0f7ecb": true, + "5926f2e086f7745aae644231": true, + "5926f34786f77469195bfe92": true, + "5929a2a086f7744f4b234d43": true, + "592c2d1a86f7746dbe2af32a": true, + "593d1fa786f7746da62d61ac": true, + "593d489686f7745c6255d58a": true, + "593d490386f7745ee97a1555": true, + "593d493f86f7745e6b2ceb22": true, + "5943d9c186f7745a13413ac9": true, + "5943ee5a86f77413872d25ec": true, + "5943eeeb86f77412d6384f6b": true, + "5947c73886f7747701588af5": true, + "5947db3f86f77447880cf76f": true, + "5947e98b86f774778f1448bc": true, + "5947eab886f77475961d96c5": true, + "5947f92f86f77427344a76b1": true, + "5947fa2486f77425b47c1a9b": true, + "595cf16b86f77427440c32e2": true, + "595cfa8b86f77427437e845b": true, + "5996f6cb86f774678763a6ca": true, + "5996f6d686f77467977ba6cc": true, + "5996f6fc86f7745e585b4de3": true, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a6c86f77414ec448d17": true, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59bfc5c886f7743bf6794e62": true, + "59bfe68886f7746004266202": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c0ec5b86f77435b128bfca": true, + "59c1383d86f774290a37e0ca": true, + "59c63b4486f7747afb151c1c": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "59d6272486f77466146386ff": true, + "59d64ec286f774171d1e0a42": true, + "59d650cf86f7741b846413a4": true, + "59d790f486f77403cb06aec6": true, + "59db3a1d86f77429e05b4e92": true, + "59db3acc86f7742a2c4ab912": true, + "59db3b0886f77429d72fb895": true, + "59db7e1086f77448be30ddf3": true, + "59db7eed86f77461f8380365": true, + "59e0bdb186f774156f04ce82": true, + "59e0be5d86f7742d48765bd2": true, + "59e0bed186f774156f04ce84": true, + "59e0d99486f7744a32234762": true, + "59e3577886f774176a362503": true, + "59e4cf5286f7741778269d8a": true, + "59e4d24686f7741776641ac7": true, + "59e4d3d286f774176a36250a": true, + "59e5f5a486f7746c530b3ce2": true, + "59e6152586f77473dc057aa1": true, + "59e649f986f77411d949b246": true, + "59e6542b86f77411dc52a77a": true, + "59e655cb86f77411dc52a77b": true, + "59e6658b86f77411d949b250": true, + "59e6687d86f77411d949b251": true, + "59e68f6f86f7746c9f75e846": true, + "59e6906286f7746c9f75e847": true, + "59e690b686f7746c9f75e848": true, + "59e6918f86f7746c9f75e849": true, + "59e6920f86f77411d82aa167": true, + "59e6927d86f77411da468256": true, + "59e7635f86f7742cbf2c1095": true, + "59e763f286f7742ee57895da": true, + "59e7643b86f7742cbf2c109a": true, + "59e7708286f7742cbd762753": true, + "59e770b986f7742cbd762754": true, + "59e770f986f7742cbe3164ef": true, + "59e7711e86f7746cae05fbe1": true, + "59e7715586f7742ee5789605": true, + "59e77a2386f7742ee578960a": true, + "59e8977386f77415a553c453": true, + "59eb7ebe86f7740b373438ce": true, + "59ecc28286f7746d7a68aa8c": true, + "59ecc3dd86f7746dc827481c": true, + "59ef13ca86f77445fd0e2483": true, + "59f8a37386f7747af3328f06": true, + "59f98b4986f7746f546d2cef": true, + "59f99a7d86f7745b134aa97b": true, + "59f9cabd86f7743a10721f46": true, + "59f9d81586f7744c7506ee62": true, + "59fafc5086f7740dbe19f6c3": true, + "59fafc9386f774067d462453": true, + "59fafd4b86f7745ca07e1232": true, + "59fb042886f7746c5005a7b2": true, + "59fb137a86f7740adb646af1": true, + "59fb257e86f7742981561852": true, + "59fb375986f7741b681b81a6": true, + "59fc48e086f77463b1118392": true, + "59ff346386f77477562ff5e2": true, + "5a0060fc86f7745793204432": true, + "5a01ad4786f77450561fda02": true, + "5a0abb6e1526d8000a025282": true, + "5a0c27731526d80618476ac4": true, + "5a0c59791526d8dba737bba7": true, + "5a0d63621526d8dba31fe3bf": true, + "5a0d716f1526d8000d26b1e2": true, + "5a0eb980fcdbcb001a3b00a6": true, + "5a0ec13bfcdbcb00165aa685": true, + "5a0ed824fcdbcb0176308b0d": true, + "5a0f096dfcdbcb0176308b15": true, + "5a154d5cfcdbcb001a3b00da": true, + "5a16b672fcdbcb001912fa83": true, + "5a16b7e1fcdbcb00165aa6c9": true, + "5a16b8a9fcdbcb00165aa6ca": true, + "5a16b93dfcdbcbcae6687261": true, + "5a16b9fffcdbcb0176308b34": true, + "5a16ba61fcdbcb098008728a": true, + "5a16badafcdbcb001865f72d": true, + "5a16bb52fcdbcb001a3b00dc": true, + "5a17f98cfcdbcb0980087290": true, + "5a17fb9dfcdbcbcae6687291": true, + "5a17fc70fcdbcb0176308b3d": true, + "5a1eaa87fcdbcb001865f75e": true, + "5a1eacb3fcdbcb09800872be": true, + "5a1ead28fcdbcb001912fa9f": true, + "5a269f97c4a282000b151807": true, + "5a26abfac4a28232980eabff": true, + "5a26ac06c4a282000c5a90a8": true, + "5a26ac0ec4a28200741e1e18": true, + "5a27b281c4a28200741e1e52": true, + "5a27b3d0c4a282000d721ec1": true, + "5a27b6bec4a282000e496f78": true, + "5a27bad7c4a282000b15184b": true, + "5a2a57cfc4a2826c6e06d44a": true, + "5a329052c4a28200741e22d3": true, + "5a32a064c4a28200741e22de": true, + "5a32aa0cc4a28232996e405f": true, + "5a32aa8bc4a2826c6e06d737": true, + "5a339805c4a2826c6e06d73d": true, + "5a33a8ebc4a282000c5a950d": true, + "5a33b2c9c4a282000c5a9511": true, + "5a33b652c4a28232996e407c": true, + "5a33bab6c4a28200741e22f8": true, + "5a33ca0fc4a282000d72292f": true, + "5a33cae9c4a28232980eb086": true, + "5a33e75ac4a2826c6e06d759": true, + "5a34f7f1c4a2826c6e06d75d": true, + "5a34fae7c4a2826c6e06d760": true, + "5a34fbadc4a28200741e230a": true, + "5a34fd2bc4a282329a73b4c5": true, + "5a34fe59c4a282000b1521a2": true, + "5a3501acc4a282000d72293a": true, + "5a351711c4a282000b1521a4": true, + "5a367e5dc4a282000e49738f": true, + "5a37ca54c4a282000d72296a": true, + "5a37cb10c4a282329a73b4e7": true, + "5a38e6bac4a2826c6e06d79b": true, + "5a38ed75c4a28232996e40c6": true, + "5a38ee51c4a282000c5a955c": true, + "5a398ab9c4a282000c5a9842": true, + "5a398b75c4a282000a51a266": true, + "5a3c16fe86f77452b62de32a": true, + "5a43943586f77416ad2f06e2": true, + "5a43957686f7742a2c2f11b0": true, + "5a5f1ce64f39f90b401987bc": true, + "5a6086ea4f39f99cd479502f": true, + "5a608bf24f39f98ffc77720e": true, + "5a69a2ed8dc32e000d46d1f1": true, + "5a6b585a8dc32e5a9c28b4f1": true, + "5a6b592c8dc32e00094b97bf": true, + "5a6b59a08dc32e000b452fb7": true, + "5a6b5b8a8dc32e001207faf3": true, + "5a6b5e468dc32e001207faf5": true, + "5a6b5ed88dc32e000c52ec86": true, + "5a6b5f868dc32e000a311389": true, + "5a6b60158dc32e000a31138b": true, + "5a6f58f68dc32e000a311390": true, + "5a6f5d528dc32e00094b97d9": true, + "5a6f5e048dc32e00094b97da": true, + "5a6f5f078dc32e00094b97dd": true, + "5a702d198dc32e000b452fc3": true, + "5a7033908dc32e000a311392": true, + "5a70366c8dc32e001207fb06": true, + "5a7037338dc32e000d46d257": true, + "5a705e128dc32e000d46d258": true, + "5a718b548dc32e000d46d262": true, + "5a718da68dc32e000d46d264": true, + "5a718f958dc32e00094b97e7": true, + "5a71e0048dc32e000c52ecc8": true, + "5a71e0fb8dc32e00094b97f2": true, + "5a71e1868dc32e00094b97f3": true, + "5a71e22f8dc32e00094b97f4": true, + "5a71e4f48dc32e001207fb26": true, + "5a787ebcc5856700142fdd98": true, + "5a787f25c5856700186c4ab9": true, + "5a787f7ac5856700177af660": true, + "5a787fadc5856700155a6ca1": true, + "5a787fdfc5856700142fdd9a": true, + "5a788031c585673f2b5c1c79": true, + "5a788068c5856700137e4c8f": true, + "5a788089c5856700142fdd9c": true, + "5a7880d0c5856700142fdd9d": true, + "5a78813bc5856700186c4abe": true, + "5a788169c5856700142fdd9e": true, + "5a789261c5856700186c65d3": true, + "5a7893c1c585673f2b5c374d": true, + "5a78948ec5856700177b1124": true, + "5a7ad0c451dfba0013379712": true, + "5a7ad1fb51dfba0013379715": true, + "5a7ad2e851dfba0016153692": true, + "5a7ad4af51dfba0013379717": true, + "5a7ad55551dfba0015068f42": true, + "5a7ad74e51dfba0015068f45": true, + "5a7ae0c351dfba0017554310": true, + "5a7afa25e899ef00135e31b0": true, + "5a7b32a2e899ef00135e345a": true, + "5a7b483fe899ef0016170d15": true, + "5a7b4900e899ef197b331a2a": true, + "5a7b4960e899ef197b331a2d": true, + "5a7c147ce899ef00150bd8b8": true, + "5a7c4850e899ef00150be885": true, + "5a7c74b3e899ef0014332c29": true, + "5a7d90eb159bd400165484f1": true, + "5a7d9104159bd400134c8c21": true, + "5a7d9122159bd4001438dbf4": true, + "5a7d912f159bd400165484f3": true, + "5a7dbfc1159bd40016548fde": true, + "5a800961159bd4315e3a1657": true, + "5a8036fb86f77407252ddc02": true, + "5a80a29286f7742b25692012": true, + "5a9548c9159bd400133e97b3": true, + "5a957c3fa2750c00137fa5f7": true, + "5a966ec8a2750c00171b3f36": true, + "5a966f51a2750c00156aacf6": true, + "5a9685b1a2750c0032157104": true, + "5a9d56c8a2750c0032157146": true, + "5a9d6d00a2750c5c985b5305": true, + "5a9d6d13a2750c00164f6b03": true, + "5a9d6d21a2750c00137fa649": true, + "5a9d6d34a2750c00141e07da": true, + "5a9e81fba2750c00164f6b11": true, + "5a9ea27ca2750c00137fa672": true, + "5a9eb32da2750c00171b3f9c": true, + "5a9fb739a2750c003215717f": true, + "5a9fbacda2750c00141e080f": true, + "5a9fbb74a2750c0032157181": true, + "5a9fbb84a2750c00137fa685": true, + "5a9fc7e6a2750c0032157184": true, + "5aa2b87de5b5b00016327c25": false, + "5aa2b89be5b5b0001569311f": true, + "5aa2b8d7e5b5b00014028f4a": true, + "5aa2b923e5b5b000137b7589": true, + "5aa2b986e5b5b00014028f4c": true, + "5aa2b9aee5b5b00015693121": true, + "5aa2b9ede5b5b000137b758b": true, + "5aa2ba19e5b5b00014028f4e": true, + "5aa2ba46e5b5b000137b758d": true, + "5aa2ba71e5b5b000137b758f": true, + "5aa66a9be5b5b0214e506e89": true, + "5aa66be6e5b5b0214e506e97": true, + "5aa66c72e5b5b00016327c93": true, + "5aa7cfc0e5b5b00015693143": false, + "5aa7d193e5b5b000171d063f": true, + "5aa7e276e5b5b000171d0647": true, + "5aa7e373e5b5b000137b76f0": true, + "5aa7e3abe5b5b000171d064d": true, + "5aa7e454e5b5b0214e506fa2": true, + "5aa7e4a4e5b5b000137b76f2": true, + "5aaa4194e5b5b055d06310a5": true, + "5aaa5dfee5b5b000140293d3": true, + "5aaa5e60e5b5b000140293d6": true, + "5aaf8a0be5b5b00015693243": true, + "5aaf8e43e5b5b00015693246": true, + "5aaf9d53e5b5b00015042a52": true, + "5aafa1c2e5b5b00015042a56": true, + "5aafa49ae5b5b00015042a58": true, + "5aafa857e5b5b00018480968": true, + "5aafbde786f774389d0cbc0f": true, + "5ab24ef9e5b5b00fe93c9209": true, + "5ab372a310e891001717f0d8": true, + "5ab3afb2d8ce87001660304d": true, + "5ab8dab586f77441cd04f2a2": true, + "5ab8dced86f774646209ec87": true, + "5ab8e4ed86f7742d8e50c7fa": true, + "5ab8e79e86f7742d8b372e78": true, + "5ab8e9fcd8ce870019439434": true, + "5ab8ebf186f7742d8b372e80": true, + "5ab8f04f86f774585f4237d8": true, + "5ab8f20c86f7745cdb629fb2": true, + "5ab8f39486f7745cd93a1cca": true, + "5ab8f4ff86f77431c60d91ba": true, + "5ab8f85d86f7745cd93a1cf5": true, + "5abcbb20d8ce87001773e258": true, + "5abcbc27d8ce8700182eceeb": true, + "5abcc328d8ce8700194394f3": true, + "5abccb7dd8ce87001773e277": true, + "5ac4c50d5acfc40019262e87": true, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac66c5d5acfc4001718d314": true, + "5ac66cb05acfc40198510a10": true, + "5ac66d015acfc400180ae6e4": true, + "5ac66d2e5acfc43b321d4b53": true, + "5ac66d725acfc43b321d4b60": true, + "5ac66d9b5acfc4001633997a": true, + "5ac72e475acfc400180ae6fe": true, + "5ac733a45acfc400192630e2": true, + "5ac7655e5acfc40016339a19": false, + "5ac78eaf5acfc4001926317a": true, + "5ac8d6885acfc400180ae7b0": true, + "5addba3e5acfc4001669f0ab": true, + "5addbac75acfc400194dbc56": true, + "5addbb6e5acfc408fb1393fd": true, + "5addbb825acfc408fb139400": true, + "5addbb945acfc4001a5fc44e": true, + "5addbba15acfc400185c2854": true, + "5addbbb25acfc40015621bd9": true, + "5addbf175acfc408fb13965b": true, + "5addbfbb5acfc400194dbcf7": true, + "5addbfd15acfc40015621bde": true, + "5addbfe15acfc4001a5fc58b": true, + "5addbfef5acfc400185c2857": true, + "5addbffe5acfc4001714dfac": true, + "5addc00b5acfc4001669f144": true, + "5addc7005acfc4001669f275": true, + "5addc7ac5acfc400194dbd90": true, + "5addc7db5acfc4001669f279": true, + "5addcce35acfc4001a5fc635": true, + "5addccf45acfc400185c2989": true, + "5adf23995acfc400185c2aeb": true, + "5ae096d95acfc400185c2c81": true, + "5ae30bad5acfc400185c2dc4": true, + "5ae30c9a5acfc408fb139a03": true, + "5ae30db85acfc408fb139a05": true, + "5ae30e795acfc408fb139a0b": true, + "5ae35b315acfc4001714e8b0": true, + "5af0454c86f7746bf20992e8": true, + "5af0548586f7743a532b7e99": true, + "5afd7ded5acfc40017541f5e": true, + "5afd7e095acfc40017541f61": true, + "5afd7e445acfc4001637e35a": true, + "5b04473a5acfc40018632f70": true, + "5b057b4f5acfc4771e1bd3e9": true, + "5b07db875acfc40dc528a5f6": true, + "5b07dd285acfc4001754240d": true, + "5b0800175acfc400153aebd4": true, + "5b099a765acfc47a8607efe3": true, + "5b099a9d5acfc47a8607efe7": true, + "5b099ac65acfc400186331e1": true, + "5b099b7d5acfc400186331e4": true, + "5b099b965acfc400186331e6": true, + "5b099bb25acfc400186331e8": true, + "5b099bf25acfc4001637e683": true, + "5b0bbe4e5acfc40dc528a72d": true, + "5b0bc22d5acfc47a8607f085": true, + "5b0e794b5acfc47a877359b2": true, + "5b1fa9b25acfc40018633c01": true, + "5b1fa9ea5acfc40018633c0a": true, + "5b1faa0f5acfc40dc528aeb5": true, + "5b1fb3e15acfc4001637f068": true, + "5b1fd4e35acfc40018633c39": true, + "5b222d335acfc4771e1be099": true, + "5b222d405acfc400153af4fe": true, + "5b2240bf5acfc40dc528af69": true, + "5b237e425acfc4771e1be0b6": true, + "5b2388675acfc4771e1be0be": true, + "5b2389515acfc4771e1be0c0": true, + "5b2cfa535acfc432ff4db7a0": true, + "5b30ac585acfc433000eb79c": true, + "5b30b0dc5acfc400153b7124": true, + "5b30bc165acfc40016387293": true, + "5b30bc285acfc47a8608615d": true, + "5b31163c5acfc400153b71cb": true, + "5b3116595acfc40019476364": true, + "5b363dd25acfc4001a598fd2": true, + "5b363dea5acfc4771e1c5e7e": true, + "5b363e1b5acfc4771e1c5e80": true, + "5b39f8db5acfc40016387a1b": true, + "5b39ffbd5acfc47a8773fb06": true, + "5b3a08b25acfc4001754880c": true, + "5b3a16655acfc40016387a2a": true, + "5b3a337e5acfc4704b4a19a0": true, + "5b3b6dc75acfc47a8773fb1e": true, + "5b3b6e495acfc4330140bd88": true, + "5b3b713c5acfc4330140bd8d": true, + "5b3b99265acfc4704b4a1afb": true, + "5b3b99475acfc432ff4dcbee": true, + "5b3baf8f5acfc40dc5296692": true, + "5b3cadf35acfc400194776a0": true, + "5b3cbc235acfc4001863ac44": true, + "5b3f7bf05acfc433000ecf6b": true, + "5b3f7c005acfc4704b4a1de8": true, + "5b3f7c1c5acfc40dc5296b1d": true, + "5b40e1525acfc4771e1c6611": true, + "5b40e2bc5acfc40016388216": true, + "5b40e3f35acfc40016388218": true, + "5b40e4035acfc47a87740943": true, + "5b40e5e25acfc4001a599bea": true, + "5b40e61f5acfc4001a599bec": true, + "5b4325355acfc40019478126": true, + "5b4326435acfc433000ed01d": true, + "5b43271c5acfc432ff4dce65": true, + "5b4327aa5acfc400175496e0": true, + "5b4329075acfc400153b78ff": true, + "5b4329f05acfc47a86086aa1": true, + "5b432b2f5acfc4771e1c6622": true, + "5b432b6c5acfc4001a599bf0": true, + "5b432b965acfc47a8774094e": true, + "5b432be65acfc433000ed01f": true, + "5b432c305acfc40019478128": true, + "5b432d215acfc4771e1c6624": true, + "5b432f3d5acfc4704b4a1dfb": true, + "5b44c6ae86f7742d1627baea": true, + "5b44c8ea86f7742d1627baf1": true, + "5b44cad286f77402a54ae7e5": true, + "5b44cd8b86f774503d30cba2": true, + "5b44cf1486f77431723e3d05": true, + "5b44d0de86f774503d30cba8": true, + "5b44d22286f774172b0c9de8": true, + "5b46238386f7741a693bcf9c": true, + "5b4736a986f774040571e998": true, + "5b4736b986f77405cb415c10": true, + "5b7be1125acfc4001876c0e5": true, + "5b7be1265acfc400161d0798": true, + "5b7be1ca5acfc400170e2d2f": true, + "5b7be2345acfc400196d524a": true, + "5b7be4575acfc400161d0832": true, + "5b7be4645acfc400170e2dcc": true, + "5b7be46e5acfc400170e2dcf": true, + "5b7be47f5acfc400170e2dd2": true, + "5b7be4895acfc400170e2dd5": true, + "5b7bebc85acfc43bca706666": true, + "5b7bed205acfc400161d08cc": true, + "5b7bedd75acfc43d825283f9": true, + "5b7bee755acfc400196d5383": true, + "5b7bef1e5acfc43d82528402": true, + "5b7bef5d5acfc43bca7067a3": true, + "5b7bef9c5acfc43d102852ec": true, + "5b7c2d1d5acfc43d1028532a": true, + "5b7c710788a4506dec015957": true, + "5b7d37845acfc400170e2f87": true, + "5b7d63b75acfc400170e2f8a": true, + "5b7d63cf5acfc4001876c8df": true, + "5b7d63de5acfc400170e2f8d": true, + "5b7d64555acfc4001876c8e2": true, + "5b7d645e5acfc400170e2f90": true, + "5b7d671b5acfc43d82528ddd": true, + "5b7d678a5acfc4001a5c4022": true, + "5b7d679f5acfc4001a5c4024": true, + "5b7d68af5acfc400170e30c3": true, + "5b7d693d5acfc43bca706a3d": true, + "5b7d6c105acfc40015109a5f": true, + "5b800e9286f7747a8b04f3ff": true, + "5b800ebc86f774394e230a90": true, + "5b800ed086f7747baf6e2f9e": true, + "5b80242286f77429445e0b47": true, + "5b84038986f774774913b0c1": true, + "5b8403a086f7747ff856f4e2": true, + "5b86a0e586f7745b600ccb23": true, + "5ba26383d4351e00334c93d9": true, + "5ba264f6d4351e0034777d52": true, + "5ba2657ed4351e0035628ff2": true, + "5ba26586d4351e44f824b340": true, + "5ba2678ad4351e44f824b344": true, + "5ba26812d4351e003201fef1": true, + "5ba26835d4351e0035628ff5": true, + "5ba26844d4351e00334c9475": true, + "5ba26acdd4351e003562908e": true, + "5ba26ae8d4351e00367f9bdb": true, + "5ba26b01d4351e0085325a51": true, + "5ba26b17d4351e00367f9bdd": true, + "5ba36f85d4351e0085325c81": true, + "5bae13bad4351e00320204af": true, + "5bae13ded4351e44f824bf38": true, + "5bb20d53d4351e4502010a69": true, + "5bb20d92d4351e00853263eb": true, + "5bb20d9cd4351e00334c9d8a": true, + "5bb20da5d4351e0035629dbf": true, + "5bb20dadd4351e00367faeff": true, + "5bb20dbcd4351e44f824c04e": true, + "5bb20dcad4351e3bac1212da": true, + "5bb20de5d4351e0035629e59": true, + "5bb20df1d4351e00347787d5": true, + "5bb20dfcd4351e00334c9e24": true, + "5bb20e0ed4351e3bac1212dc": true, + "5bb20e18d4351e00320205d5": true, + "5bb20e49d4351e3bac1212de": true, + "5bb20e58d4351e00320205d7": true, + "5bb20e70d4351e0035629f8f": true, + "5bb2475ed4351e00853264e3": true, + "5bbdb811d4351e45020113c7": true, + "5bbdb83fd4351e44f824c44b": true, + "5bbdb870d4351e00367fb67d": true, + "5bbdb8bdd4351e4502011460": true, + "5bbde409d4351e003562b036": true, + "5bbde41ed4351e003562b038": true, + "5bc09a18d4351e003562b68e": true, + "5bc09a30d4351e00367fb7c8": true, + "5bc5a351d4351e003477a414": true, + "5bc5a35cd4351e450201232f": true, + "5bc5a372d4351e44f824d17f": true, + "5bc9c1e2d4351e00367fbcf0": true, + "5bc9c29cd4351e003562b8a3": true, + "5bcf0213d4351e0085327c17": true, + "5bd06f5d86f77427101ad47c": true, + "5bd0716d86f774171822ef4b": true, + "5bd071d786f7747e707b93a3": true, + "5bd073a586f7747e6f135799": true, + "5bd073c986f7747f627e796c": true, + "5bd70322209c4d00d7167b8f": true, + "5bd704e7209c4d00d7167c31": true, + "5be4038986f774527d3fae60": true, + "5bead2e00db834001c062938": true, + "5bed61680db834001d2c45ab": true, + "5bed625c0db834001c062946": true, + "5beec1bd0db834001e6006f3": true, + "5beec2820db834001b095426": true, + "5beec3420db834001b095429": true, + "5beec3e30db8340019619424": true, + "5beec8b20db834001961942a": true, + "5beec8c20db834001d2c465c": true, + "5beec8ea0db834001a6f9dbf": true, + "5beec91a0db834001961942d": true, + "5beec9450db83400970084fd": true, + "5beecbb80db834001d2c465e": true, + "5beed0f50db834001c062b12": true, + "5bf3e03b0db834001d2c4a9c": true, + "5bf3e0490db83400196199af": true, + "5bf3f59f0db834001a6fa060": true, + "5bfd297f0db834001a669119": true, + "5bfd35380db83400232fe5cc": true, + "5bfd36290db834001966869a": true, + "5bfd36ad0db834001c38ef66": true, + "5bfd37c80db834001d23e842": true, + "5bfd384c0db834001a6691d3": true, + "5bfd4c980db834001b73449d": true, + "5bfd4cbe0db834001b73449f": true, + "5bfd4cc90db834001d23e846": true, + "5bfd4cd60db834001c38f095": true, + "5bfe7fb30db8340018089fed": true, + "5bfe86a20db834001d23e8f7": true, + "5bfe86bd0db83400232fe959": true, + "5bfe86df0db834001b734685": true, + "5bfe89510db834001808a127": true, + "5bfea6e90db834001b7347f3": true, + "5bfea7ad0db834001c38f1ee": true, + "5bfeaa0f0db834001b734927": true, + "5bfeb32b0db834001a6694d9": true, + "5bfebc250db834001a6694e1": true, + "5bfebc320db8340019668d79": true, + "5bfebc530db834001d23eb65": true, + "5bfebc5e0db834001a6694e5": true, + "5bffcf7a0db83400232fea79": true, + "5bffd7ed0db834001d23ebf9": true, + "5bffdc370db834001d23eca8": false, + "5bffdd7e0db834001b734a1a": true, + "5bffe7930db834001b734a39": true, + "5bffe7c50db834001d23ece1": true, + "5bffec120db834001c38f5fa": true, + "5bffef760db8340019668fe4": true, + "5c0000c00db834001a6697fc": true, + "5c0006470db834001a6697fe": true, + "5c00076d0db834001d23ee1f": true, + "5c0009510db834001966907f": true, + "5c0102aa0db834001b734ba1": true, + "5c0102b20db834001d23eebc": true, + "5c010a700db834001d23ef5d": true, + "5c010e350db83400232feec7": true, + "5c0111ab0db834001966914d": true, + "5c0125fc0db834001a669aa3": true, + "5c0126f40db834002a125382": true, + "5c012ffc0db834001d23f03f": true, + "5c0505e00db834001b735073": true, + "5c0517910db83400232ffee5": true, + "5c05293e0db83400232fff80": true, + "5c05295e0db834001a66acbb": true, + "5c052a900db834001a66acbd": true, + "5c05413a0db834001c390617": true, + "5c0548ae0db834001966a3c2": true, + "5c0558060db834001b735271": true, + "5c064c400db834001d23f468": true, + "5c06595c0db834001a66af6c": true, + "5c066e3a0db834001b7353f0": true, + "5c066ef40db834001966a595": true, + "5c0672ed0db834001b7353f3": true, + "5c0673fb0db8340023300271": true, + "5c0684e50db834002a12585a": true, + "5c0695860db834001b735461": true, + "5c0696830db834001d23f5da": true, + "5c06c6a80db834001b735491": true, + "5c079ec50db834001966a706": true, + "5c079ed60db834001a66b372": true, + "5c07a8770db8340023300450": true, + "5c07b36c0db834002a1259e9": true, + "5c07b3850db834002330045b": true, + "5c07c5ed0db834001b73571c": true, + "5c07c60e0db834002330051f": true, + "5c07c9660db834001a66b588": true, + "5c07dd120db834001c39092d": true, + "5c07df7f0db834001b73588a": true, + "5c08f87c0db8340019124324": true, + "5c0919b50db834001b7ce3b9": true, + "5c091a4e0db834001d5addc8": true, + "5c093ca986f7740a1867ab12": true, + "5c093e3486f77430cb02e593": true, + "5c0a2cec0db834001b7ce47d": true, + "5c0d2727d174af02a012cf58": true, + "5c0d32fcd174af02a1659c75": true, + "5c0d56a986f774449d5de529": true, + "5c0d591486f7744c505b416f": true, + "5c0d5ae286f7741e46554302": true, + "5c0d5e4486f77478390952fe": true, + "5c0d668f86f7747ccb7f13b2": true, + "5c0d688c86f77413ae3407b2": true, + "5c0e2f26d174af02a9625114": true, + "5c0e2f5cd174af02a012cfc9": true, + "5c0e2f94d174af029f650d56": true, + "5c0e2ff6d174af02a1659d4a": true, + "5c0e3eb886f7742015526062": true, + "5c0e446786f7742013381639": true, + "5c0e51be86f774598e797894": true, + "5c0e530286f7747fa1419862": true, + "5c0e531286f7747fa54205c2": true, + "5c0e531d86f7747fa23f4d42": true, + "5c0e533786f7747fa23f4d47": true, + "5c0e534186f7747fa1419867": true, + "5c0e53c886f7747fa54205c7": true, + "5c0e541586f7747fa54205c9": true, + "5c0e57ba86f7747fa141986d": true, + "5c0e5bab86f77461f55ed1f3": true, + "5c0e5edb86f77461f55ed1f7": true, + "5c0e625a86f7742d77340f62": true, + "5c0e655586f774045612eeb2": true, + "5c0e66e2d174af02a96252f4": true, + "5c0e6a1586f77404597b4965": true, + "5c0e722886f7740458316a57": true, + "5c0e746986f7741453628fe5": true, + "5c0e774286f77468413cc5b2": true, + "5c0e805e86f774683f3dd637": true, + "5c0e842486f77443a74d2976": true, + "5c0e874186f7745dc7616606": true, + "5c0fa877d174af02a012e1cf": true, + "5c0faeddd174af02a962601f": true, + "5c0faf68d174af02a96260b8": true, + "5c0fafb6d174af02a96260ba": true, + "5c10c8fd86f7743d7d706df3": true, + "5c11046cd174af02a012e42b": true, + "5c110624d174af029e69734c": true, + "5c11279ad174af029d64592b": true, + "5c1127bdd174af44217ab8b9": true, + "5c1127d0d174af29be75cf68": true, + "5c1260dc86f7746b106e8748": true, + "5c12619186f7743f871c8a32": true, + "5c1262a286f7743f8a69aab2": true, + "5c165d832e2216398b5a7e36": true, + "5c17664f2e2216398b5a7e3c": true, + "5c1780312e221602b66cc189": true, + "5c17804b2e2216152006c02f": true, + "5c178a942e22164bef5ceca3": true, + "5c1793902e221602b21d3de2": true, + "5c17a7ed2e2216152142459c": true, + "5c18b90d2e2216152142466b": true, + "5c18b9192e2216398b5a8104": true, + "5c1a1cc52e221602b3136e3d": true, + "5c1a1e3f2e221602b66cc4c2": true, + "5c1bc4812e22164bef5cfde7": true, + "5c1bc5612e221602b5429350": true, + "5c1bc5af2e221602b412949b": true, + "5c1bc5fb2e221602b1779b32": true, + "5c1bc7432e221602b412949d": true, + "5c1bc7752e221602b1779b34": true, + "5c1cd46f2e22164bef5cfedb": true, + "5c1cdd302e221602b3137250": true, + "5c1cdd512e22161b267d91ae": true, + "5c3df7d588a4501f290594e5": true, + "5c46fbd72e2216398b5a8c9c": true, + "5c471b5d2e221602b21d4e14": true, + "5c471b7e2e2216152006e46c": true, + "5c471ba12e221602b3137d76": true, + "5c471bd12e221602b4129c3a": true, + "5c471be12e221602b66cd9ac": true, + "5c471bfc2e221602b21d4e17": true, + "5c471c2d2e22164bef5d077f": true, + "5c471c442e221602b542a6f8": true, + "5c471c6c2e221602b66cd9ae": true, + "5c471c842e221615214259b5": true, + "5c471cb32e221602b177afaa": true, + "5c488a752e221602b412af63": true, + "5c48a14f2e2216152006edd7": true, + "5c48a2852e221602b21d5923": true, + "5c48a2a42e221602b66d1e07": true, + "5c48a2c22e221602b313fb6c": true, + "5c4ee3d62e2216152006f302": true, + "5c4eec9b2e2216398b5aaba2": true, + "5c4eecc32e221602b412b440": true, + "5c4eecde2e221602b3140418": true, + "5c501a4d2e221602b412b540": true, + "5c5039be2e221602b177c9ff": true, + "5c503ac82e221602b21d6e9a": true, + "5c503ad32e2216398b5aada2": true, + "5c503af12e221602b177ca02": true, + "5c503b1c2e221602b21d6e9d": true, + "5c503d0a2e221602b542b7ef": true, + "5c5952732e2216398b5abda2": true, + "5c59529a2e221602b177d160": true, + "5c5970672e221602b21d7855": true, + "5c5db5852e2216003a0fe71a": true, + "5c5db5962e2216000e5e46eb": true, + "5c5db5b82e2216003a0fe71d": true, + "5c5db5c62e22160012542255": true, + "5c5db5f22e2216000e5e47e8": true, + "5c5db5fc2e2216000f1b2842": true, + "5c5db6302e2216000e5e47f0": true, + "5c5db63a2e2216000f1b284a": true, + "5c5db6552e2216001026119d": true, + "5c5db6652e221600113fba51": true, + "5c5db6742e2216000f1b2852": true, + "5c5db6b32e221600102611a0": true, + "5c5db6ee2e221600113fba54": true, + "5c5db6f82e2216003a0fe914": true, + "5c6161fb2e221600113fbde5": true, + "5c6162682e22160010261a2b": true, + "5c61627a2e22160012542c55": true, + "5c6165902e22160010261b28": true, + "5c6175362e221600133e3b94": true, + "5c617a5f2e2216000f1e81b3": true, + "5c61a40d2e2216001403158d": true, + "5c6592372e221600133e47d7": true, + "5c6beec32e221601da3578f2": true, + "5c6bf4aa2e2216001219b0ae": true, + "5c6c2c9c2e2216000f2002e4": true, + "5c6d10e82e221601da357b07": true, + "5c6d10fa2e221600106f3f23": true, + "5c6d11072e2216000e69d2e4": true, + "5c6d11152e2216000f2003e7": true, + "5c6d42cb2e2216000e69d7d1": true, + "5c6d450c2e221600114c997d": true, + "5c6d46132e221601da357d56": true, + "5c6d5d8b2e221644fc630b39": true, + "5c6d710d2e22165df16b81e7": true, + "5c6d7b3d2e221600114c9b7d": true, + "5c6d85e02e22165df16b81f4": true, + "5c78f2492e221600114c9f04": true, + "5c78f2612e221600114c9f0d": true, + "5c78f26f2e221601da3581d1": true, + "5c78f2792e221600106f4683": true, + "5c78f2882e22165df16b832e": true, + "5c791e872e2216001219c40a": true, + "5c793fb92e221644f31bfb64": true, + "5c793fc42e221600114ca25d": true, + "5c793fde2e221601da358614": true, + "5c7951452e221644f31bfd5c": true, + "5c7954d52e221600106f4cc7": true, + "5c7955c22e221644f31bfd5e": true, + "5c7d55de2e221644f31bff68": true, + "5c7d55f52e221644f31bff6a": true, + "5c7d560b2e22160bc12c6139": true, + "5c7e5f112e221600106f4ede": true, + "5c7e8fab2e22165df16b889b": true, + "5c7fb51d2e2216001219ce11": true, + "5c7fc87d2e221644f31c0298": true, + "5c82342f2e221644f31c060e": true, + "5c82343a2e221644f31c0611": true, + "5c86592b2e2216000e69e77c": true, + "5c878e9d2e2216000f201903": true, + "5c878ebb2e2216001219d48a": true, + "5c87a07c2e2216001219d4a2": true, + "5c87ca002e221600114cb150": true, + "5c88f24b2e22160bc12c69a6": true, + "5c90c3622e221601da359851": true, + "5c920e902e221644f31c3c99": true, + "5c925fa22e221601da359b7b": true, + "5c99f3592e221644fc633070": true, + "5c9a07572e221644f31c4b32": true, + "5c9a1c3a2e2216000e69fb6a": true, + "5c9a1c422e221600106f69f0": true, + "5c9a25172e2216000f20314e": true, + "5c9a26332e2216001219ea70": true, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": true, + "5ca20ee186f774799474abc2": true, + "5ca2113f86f7740b2547e1d2": true, + "5ca21c6986f77479963115a7": true, + "5cadc1c6ae9215000f2775a4": true, + "5cadc2e0ae9215051e1c21e7": true, + "5cadc390ae921500126a77f1": true, + "5cadc431ae921500113bb8d5": true, + "5cadc55cae921500103bb3be": true, + "5cadd919ae921500126a77f3": true, + "5cadd940ae9215051e1c2316": true, + "5cadd954ae921500103bb3c2": true, + "5cadf6ddae9215051e1c23b2": true, + "5cadf6e5ae921500113bb973": true, + "5cadf6eeae921500134b2799": true, + "5cadfbf7ae92152ac412eeef": true, + "5caf1041ae92157c28402e3f": true, + "5caf1109ae9215753c44119f": true, + "5caf1691ae92152ac412efb9": true, + "5caf16a2ae92152ac412efbc": true, + "5caf17c9ae92150b30006be1": true, + "5caf187cae92157c28402e43": true, + "5cbda392ae92155f3c17c39f": true, + "5cbda9f4ae9215000e5b9bfc": true, + "5cbdaf89ae9215000e5b9c94": true, + "5cbdb1b0ae9215000d50e105": true, + "5cbdc23eae9215001136a407": true, + "5cc6ea78e4a949000e1ea3c1": true, + "5cc6ea85e4a949000e1ea3c3": true, + "5cc70093e4a949033c734312": true, + "5cc700b9e4a949000f0f0f25": true, + "5cc700cae4a949035e43ba72": true, + "5cc700d4e4a949000f0f0f28": true, + "5cc700ede4a949033c734315": true, + "5cc70102e4a949035e43ba74": true, + "5cc7012ae4a949001252b43e": true, + "5cc70146e4a949000d73bf6b": true, + "5cc7015ae4a949001152b4c6": true, + "5cc701aae4a949000e1ea45c": true, + "5cc701d7e4a94900100ac4e7": true, + "5cc80f38e4a949001152b560": true, + "5cc80f53e4a949000e1ea4f8": true, + "5cc80f67e4a949035e43bbba": true, + "5cc80f79e4a949033c7343b2": true, + "5cc80f8fe4a949033b0224a2": true, + "5cc82796e24e8d000f5859a8": true, + "5cc82d76e24e8d00134b4b83": true, + "5cc86832d7f00c000d3a6e6c": true, + "5cc86840d7f00c002412c56c": true, + "5cc9a96cd7f00c011c04e04a": true, + "5cc9ad73d7f00c000e2579d4": true, + "5cc9b815d7f00c000e2579d6": true, + "5cc9bcaed7f00c011c04e179": true, + "5cc9c20cd7f00c001336c65d": true, + "5cda9bcfd7f00c0c0b53e900": true, + "5cdaa99dd7f00c002412d0b2": true, + "5cdd7685d7f00c000f260ed2": true, + "5cdd7693d7f00c0010373aa5": true, + "5cde739cd7f00c0010373bd3": true, + "5cde77a9d7f00c000f261009": true, + "5cde7afdd7f00c000d36b89d": true, + "5cde7b43d7f00c000d36b93e": true, + "5cde8864d7f00c0010373be1": true, + "5cdeac22d7f00c000f26168f": true, + "5cdeac42d7f00c000d36ba73": true, + "5cdeac5cd7f00c000f261694": true, + "5cdeaca5d7f00c00b61c4b70": true, + "5ce69cbad7f00c00b61c5098": true, + "5cebec00d7f00c065c53522a": true, + "5cebec10d7f00c065703d185": true, + "5cebec38d7f00c00110a652a": true, + "5cf12a15d7f00c05464b293f": true, + "5cf13123d7f00c1085616a50": true, + "5cf4e3f3d7f00c06595bc7f0": true, + "5cf4fb76d7f00c065703d3ac": true, + "5cf50850d7f00c056e24104c": true, + "5cf508bfd7f00c056e24104e": true, + "5cf50fc5d7f00c056c53f83c": true, + "5cf518cfd7f00c065b422214": true, + "5cf54404d7f00c108840b2ef": true, + "5cf638cbd7f00c06595bc936": true, + "5cf639aad7f00c065703d455": true, + "5cf656f2d7f00c06585fb6eb": true, + "5cf67a1bd7f00c06585fb6f3": true, + "5cf67cadd7f00c065a5abab7": true, + "5cf6935bd7f00c06585fb791": true, + "5cf6937cd7f00c056c53fb39": true, + "5cf78496d7f00c065703d6ca": true, + "5cf78720d7f00c06595bc93e": true, + "5cf79389d7f00c10941a0c4d": true, + "5cf79599d7f00c10875d9212": true, + "5cf7acfcd7f00c1084477cf2": true, + "5cf8f3b0d7f00c00217872ef": true, + "5cfe8010d7ad1a59283b14c6": true, + "5cff9e5ed7ad1a09407397d4": true, + "5cff9e84d7ad1a049e54ed55": true, + "5d00e0cbd7ad1a6c6566a42d": true, + "5d00ec68d7ad1a04a067e5be": true, + "5d00ede1d7ad1a0940739a76": true, + "5d00ef6dd7ad1a0940739b16": true, + "5d00f63bd7ad1a59283b1c1e": true, + "5d010d1cd7ad1a59283b1ce7": true, + "5d0236dad7ad1a0940739d29": true, + "5d023784d7ad1a049d4aa7f2": true, + "5d024f5cd7ad1a04a067e91a": true, + "5d025cc1d7ad1a53845279ef": true, + "5d02676dd7ad1a049e54f6dc": true, + "5d02677ad7ad1a04a15c0f95": true, + "5d026791d7ad1a04a067ea63": true, + "5d02778e86f774203e7dedbe": true, + "5d02797c86f774203f38e30a": true, + "5d0a29ead7ad1a0026013f27": true, + "5d0a29fed7ad1a002769ad08": true, + "5d0a3a58d7ad1a669c15ca14": true, + "5d0a3e8cd7ad1a6f6a3d35bd": true, + "5d0b5cd3d7ad1a3fe32ad263": true, + "5d10b49bd7ad1a1a560708b0": true, + "5d120a10d7ad1a4e1026ba85": true, + "5d120a28d7ad1a1c8962e295": true, + "5d122e7bd7ad1a07102d6d7f": true, + "5d123102d7ad1a004e475fe5": true, + "5d123a3cd7ad1a004e476058": true, + "5d123b70d7ad1a0ee35e0754": true, + "5d123b7dd7ad1a004f01b262": true, + "5d124c01d7ad1a115c7d59fb": true, + "5d124c0ed7ad1a10d168dd9b": true, + "5d124c1ad7ad1a12227c53a7": true, + "5d133067d7ad1a33013f95b4": true, + "5d1340b3d7ad1a0b52682ed7": true, + "5d1340bdd7ad1a0e8d245aab": true, + "5d1340cad7ad1a0b0b249869": true, + "5d135e83d7ad1a21b83f42d8": true, + "5d135ecbd7ad1a21c176542e": true, + "5d15ce51d7ad1a1eff619092": true, + "5d15cf3bd7ad1a67e71518b2": true, + "5d19cd96d7ad1a4a992c9f52": true, + "5d1b198cd7ad1a604869ad72": true, + "5d1b33a686f7742523398398": true, + "5d1b36a186f7742523398433": true, + "5d1b371186f774253763a656": true, + "5d1b5e94d7ad1a2b865a96b0": true, + "5d1c702ad7ad1a632267f429": true, + "5d1f819086f7744b355c219b": true, + "5d2369418abbc306c62e0c80": true, + "5d25a4a98abbc30b917421a4": true, + "5d25a6538abbc306c62e630d": true, + "5d25a6a48abbc306c62e6310": true, + "5d25a7b88abbc3054f3e60bc": true, + "5d25af8f8abbc3055079fec5": true, + "5d25d0ac8abbc3054f3e61f7": true, + "5d2702e88abbc31ed91efc44": true, + "5d2703038abbc3105103d94c": true, + "5d270b3c8abbc3105335cfb8": true, + "5d270ca28abbc31ee25ee821": true, + "5d2c76ed48f03532f2136169": true, + "5d2c770c48f0354b4a07c100": true, + "5d2c772c48f0355d95672c25": true, + "5d2c829448f0353a5c7d6674": true, + "5d2da1e948f035477b1ce2ba": true, + "5d2dc3e548f035404a1a4798": true, + "5d2f0d8048f0356c925bc3b0": true, + "5d2f213448f0355009199284": true, + "5d2f259b48f0355a844acd74": true, + "5d2f25bc48f03502573e5d85": true, + "5d2f261548f03576f500e7b7": true, + "5d2f2ab648f03550091993ca": true, + "5d2f2d5748f03572ec0c0139": true, + "5d3eb3b0a4b93615055e84d2": true, + "5d3eb44aa4b93650d64e4979": true, + "5d3eb4aba4b93650d64e497d": true, + "5d3eb536a4b9363b1f22f8e2": true, + "5d3eb59ea4b9361c284bb4b2": true, + "5d3eb5b6a4b9361eab311902": true, + "5d3eb5eca4b9363b1f22f8e4": true, + "5d3ef698a4b9361182109872": true, + "5d403f9186f7743cac3f229b": true, + "5d40407c86f774318526545a": true, + "5d43021ca4b9362eab4b5e25": true, + "5d4405aaa4b9361e6a4e6bd3": true, + "5d4405f0a4b9361e6a4e6bd9": true, + "5d440625a4b9361eec4ae6c5": true, + "5d44064fa4b9361e4f6eb8b5": true, + "5d44069ca4b9361ebd26fc37": true, + "5d4406a8a4b9361e4f6eb8b7": true, + "5d440b93a4b9364276578d4b": true, + "5d440b9fa4b93601354d480c": true, + "5d44334ba4b9362b346d1948": true, + "5d443f8fa4b93678dd4a01aa": true, + "5d4aaa54a4b9365392071170": true, + "5d4aaa73a4b9365392071175": true, + "5d4aab30a4b9365435358c55": true, + "5d5d646386f7742797261fd9": true, + "5d5d85c586f774279a21cbdb": true, + "5d5d87f786f77427997cfaef": true, + "5d5d8ca986f7742798716522": true, + "5d5d940f86f7742797262046": true, + "5d5e7d28a4b936645d161203": true, + "5d5e9c74a4b9364855191c40": true, + "5d5fca1ea4b93635fd598c07": true, + "5d67abc1a4b93614ec50137f": true, + "5d6d2e22a4b9361bd5780d05": true, + "5d6d2ef3a4b93618084f58bd": true, + "5d6d3716a4b9361bc8618872": true, + "5d6d3829a4b9361bc8618943": true, + "5d6d3943a4b9360dbc46d0cc": true, + "5d6d3be5a4b9361bc73bc763": true, + "5d6e6772a4b936088465b17c": true, + "5d6e67fba4b9361bc73bc779": true, + "5d6e6806a4b936088465b17e": true, + "5d6e6869a4b9361c140bcfde": true, + "5d6e6891a4b9361bd473feea": true, + "5d6e689ca4b9361bc8618956": true, + "5d6e68a8a4b9360b6c0d54e2": true, + "5d6e68b3a4b9361bca7e50b5": true, + "5d6e68c4a4b9361b93413f79": true, + "5d6e68d1a4b93622fe60e845": true, + "5d6e68dea4b9361bcc29e659": true, + "5d6e68e6a4b9361c140bcfe0": true, + "5d6e6911a4b9361bd5780d52": true, + "5d6e695fa4b936359b35d852": true, + "5d6e69b9a4b9361bc8618958": true, + "5d6e69c7a4b9360b6c0d54e4": true, + "5d6e6a05a4b93618084f58d0": true, + "5d6e6a42a4b9364f07165f52": true, + "5d6e6a53a4b9361bd473feec": true, + "5d6e6a5fa4b93614ec501745": true, + "5d7b6bafa4b93652786f4c76": true, + "5d96141523f0ea1b7f2aacab": true, + "5dcbd56fdbd3d91b3e5468d5": true, + "5dcbd6b46ec07c0c4347a564": true, + "5dcbd6dddbd3d91b3e5468de": true, + "5dcbe9431e1f4616d354987e": true, + "5dcbe965e4ed22586443a79d": true, + "5de652c31b7e3716273428be": true, + "5de653abf76fdc1ce94a5a2a": true, + "5de65547883dde217541644b": true, + "5de6556a205ddc616a6bc4f7": true, + "5de6558e9f98ac2bc65950fc": true, + "5de655be4a9f347bc92edb88": true, + "5de7bd7bfd6b4e6e2276dc25": true, + "5de8e67c4a9f347bc92edbd7": true, + "5de8e8dafd6b4e6e2276dc32": true, + "5de8ea8ffd6b4e6e2276dc35": true, + "5de8eaadbbaf010b10528a6d": true, + "5de8eac42a78646d96665d91": true, + "5de8f237bbaf010b10528a70": true, + "5de8f2d5b74cd90030650c72": true, + "5de8fb539f98ac2bc659513a": true, + "5de8fbad2fbe23140d3ee9c4": true, + "5de8fbf2b74cd90030650c79": true, + "5de8fc0b205ddc616a6bc51b": true, + "5de910da8b6c4240ba2651b5": true, + "5de922d4b11454561e39239f": true, + "5df24cf80dee1b22f862e9bc": true, + "5df256570dee1b22f862e9c4": true, + "5df25b6c0b92095fd441e4cf": true, + "5df25d3bfd6b4e6e2276dc9a": true, + "5df35ddddfc58d14537c2036": true, + "5df35e59c41b2312ea3334d5": true, + "5df35e7f2a78646d96665dd4": true, + "5df35e970b92095fd441e4d2": true, + "5df35ea9c41b2312ea3334d8": true, + "5df35eb2b11454561e3923e2": true, + "5df36948bb49d91fb446d5ad": true, + "5df38a5fb74cd90030650cb6": true, + "5df8a2ca86f7740bfe6df777": true, + "5df8a42886f77412640e2e75": true, + "5df8a4d786f77412672a1e3b": true, + "5df8a58286f77412631087ed": true, + "5df8ce05b11454561e39243b": true, + "5df8e053bb49d91fb446d6a6": true, + "5df8e085bb49d91fb446d6a8": true, + "5df8e4080b92095fd441e594": true, + "5df8f535bb49d91fb446d6b0": true, + "5df8f541c41b2312ea3335e3": true, + "5df916dfbb49d91fb446d6b9": true, + "5df917564a9f347bc92edca3": true, + "5dfa397fb11454561e39246c": true, + "5dfa3cd1b33c0951220c079b": true, + "5dfa3d2b0dee1b22f862eade": true, + "5dfa3d45dfc58d14537c20b0": true, + "5dfa3d7ac41b2312ea33362a": true, + "5dfa3d950dee1b22f862eae0": true, + "5dfcd0e547101c39625f66f9": true, + "5dfce88fe9dc277128008b2e": true, + "5dfe14f30b92095fd441edaf": true, + "5dfe6104585a0c3e995c7b82": true, + "5dff772da3651922b360bf91": true, + "5dff77c759400025ea5150cf": true, + "5dff8db859400025ea5150d4": true, + "5e00903ae9dc277128008b87": true, + "5e0090f7e9dc277128008b93": true, + "5e00c1ad86f774747333222c": true, + "5e00cdd986f7747473332240": true, + "5e00cfa786f77469dc6e5685": true, + "5e01e9e273d8eb11426f5bc3": true, + "5e01ea19e9dc277128008c0b": true, + "5e01ef6886f77445f643baa4": true, + "5e01f31d86f77465cf261343": true, + "5e01f37686f774773c6f6c15": true, + "5e023cf8186a883be655e54f": true, + "5e023d34e8a400319a28ed44": true, + "5e023d48186a883be655e551": true, + "5e023e53d4353e3302577c4c": true, + "5e023e6e34d52a55c3304f71": true, + "5e023e88277cce2b522ff2b1": true, + "5e208b9842457a4a7a33d074": true, + "5e217ba4c1434648c13568cd": true, + "5e2192a498a36665e8337386": true, + "5e21a3c67e40bd02257a008a": true, + "5e21ca18e4d47f0da15e77dd": true, + "5e2af47786f7746d404f3aaa": true, + "5e2af4a786f7746d3f3c3400": true, + "5e2af55f86f7746d4159f07c": true, + "5e32f56fcb6d5863cc5e5ee4": true, + "5e340dcdcb6d5863cc5e5efb": true, + "5e4abb5086f77406975c9342": true, + "5e4abc1f86f774069619fbaa": true, + "5e4abc6786f77406812bd572": true, + "5e4abfed86f77406a2713cf7": true, + "5e4ac41886f77406a511c9a8": true, + "5e4bfc1586f774264f7582d3": true, + "5e4d34ca86f774264f758330": true, + "5e54f76986f7740366043752": true, + "5e54f79686f7744022011103": true, + "5e56991336989c75ab4f03f6": true, + "5e5699df2161e06ac158df6f": true, + "5e569a0156edd02abe09f27d": true, + "5e569a132642e66b0b68015c": true, + "5e569a2e56edd02abe09f280": true, + "5e71f6be86f77429f2683c44": true, + "5e71f70186f77429ee09f183": true, + "5e71fad086f77422443d4604": true, + "5e81c3cbac2bb513793cdc75": true, + "5e81c4ca763d9f754677befa": true, + "5e81c519cb2b95385c177551": true, + "5e81c539cb2b95385c177553": true, + "5e81c550763d9f754677befd": true, + "5e81c6a2ac2bb513793cdc7f": true, + "5e81c6bf763d9f754677beff": true, + "5e81ebcd8e146c7080625e15": true, + "5e81edc13397a21db957f6a1": true, + "5e81ee213397a21db957f6a6": true, + "5e81ee4dcb2b95385c177582": true, + "5e81f423763d9f754677bf2e": true, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": true, + "5e848cc2988a8701445df1e8": true, + "5e848d1c264f7c180b5e35a9": true, + "5e848d2eea0a7c419c2f9bfd": true, + "5e848d51e4dbc5266a4ec63b": true, + "5e848d99865c0f329958c83b": true, + "5e848db4681bea2ada00daa9": true, + "5e848dc4e4dbc5266a4ec63d": true, + "5e85a9f4add9fe03027d9bf1": true, + "5e85aa1a988a8701445df1f5": true, + "5e870397991fd70db46995c8": true, + "5e87071478f43e51ca2de5e1": true, + "5e87076ce2db31558c75a11d": true, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": true, + "5e87114fe2db31558c75a120": true, + "5e87116b81c4ed43e83cefdd": true, + "5e8f3423fd7471236e6e3b64": true, + "5e997f0b86f7741ac73993e2": true, + "5e9dacf986f774054d6b89f4": true, + "5e9db13186f7742f845ee9d3": true, + "5e9dcf5986f7746c417435b3": true, + "5ea02bb600685063ec28bfa1": true, + "5ea034eb5aad6446a939737b": true, + "5ea034f65aad6446a939737e": true, + "5ea03e5009aa976f2e7a514b": true, + "5ea03e9400685063ec28bfa4": true, + "5ea03f7400685063ec28bfa8": true, + "5ea058e01dbce517f324b3e2": true, + "5ea05cf85ad9772e6624305d": true, + "5ea16acdfadf1d18c87b0784": true, + "5ea16ada09aa976f2e7a51be": true, + "5ea16d4d5aad6446a939753d": true, + "5ea172e498dacb342978818e": true, + "5ea17bbc09aa976f2e7a51cd": true, + "5ea17ca01412a1425304d1c0": true, + "5ea18c84ecf1982c7712d9a2": true, + "5ea2a8e200685063ec28c05a": true, + "5ed515c8d380ab312177c0fa": true, + "5ed515e03a40a50460332579": true, + "5ed515ece452db0eb56fc028": true, + "5ed515f6915ec335206e4152": true, + "5ed5160a87bb8443d10680b5": true, + "5ed51652f6c34d2cc26336a1": true, + "5ed5166ad380ab312177c100": true, + "5ede4739e0350d05467f73e8": true, + "5ede47405b097655935d7d16": true, + "5ede474b0c226a66f5402622": true, + "5ede475339ee016e8c534742": true, + "5ede475b549eed7c6d5c18fb": true, + "5eea21647547d6330471b3c9": true, + "5eea217fc64c5d0dfc05712a": true, + "5eeb2ff5ea4f8b73c827350b": true, + "5ef1b9f0c64c5d0dfc0571a1": true, + "5ef1ba28c64c5d0dfc0571a5": true, + "5ef32e4d1c1fd62aea6a150d": true, + "5ef3448ab37dfd6af863525c": true, + "5ef3553c43cb350a955a7ccb": true, + "5ef35bc243cb350a955a7ccd": true, + "5ef35d2ac64c5d0dfc0571b0": true, + "5ef35f46382a846010715a96": true, + "5ef366938cef260c0642acad": true, + "5ef369b08cef260c0642acaf": true, + "5ef5d994dfbc9f3c660ded95": true, + "5ef61964ec7f42238c31e0c1": true, + "5efaf417aeb21837e749c7f2": true, + "5efb0c1bd79ff02a1f5e68d9": true, + "5efb0cabfb3e451d70735af5": true, + "5efb0d4f4bc50b58e81710f3": true, + "5efb0da7a29a85116f6ea05f": true, + "5efb0e16aeb21837e749c7ff": true, + "5efb0fc6aeb21837e749c801": true, + "5f0596629e22f464da6bbdd9": true, + "5f0c892565703e5c461894e9": true, + "5f2a9575926fd9352339381f": true, + "5f2aa43ba9b91d26f20ae6d2": true, + "5f2aa4464b50c14bcf07acdb": true, + "5f2aa4559b44de6b1b4e68d1": true, + "5f2aa46b878ef416f538b567": true, + "5f2aa47a200e2c0ee46efa71": true, + "5f2aa493cd375f14e15eea72": true, + "5f2aa49f9b44de6b1b4e68d4": true, + "5f36a0e5fbf956000b716b65": true, + "5f3e76d86cda304dcc634054": true, + "5f3e772a670e2a7b01739a52": true, + "5f3e777688ca2d00ad199d25": true, + "5f3e778efcd9b651187d7201": true, + "5f3e77b26cda304dcc634057": true, + "5f3e77f59103d430b93f94c1": true, + "5f3e7801153b8571434a924c": true, + "5f3e7823ddc4f03b010e2045": true, + "5f3e7897ddc4f03b010e204a": true, + "5f3e78a7fbf956000b716b8e": true, + "5f4f9eb969cdc30ff33f09db": false, + "5f5e45cc5021ce62144be7aa": true, + "5f5e467b0bc58666c37e7821": true, + "5f5e46b96bdad616ad46d613": true, + "5f5f41476bdad616ad46d631": true, + "5f5f41f56760b4138443b352": true, + "5f60b34a41e30a4ab12a6947": true, + "5f60b85bbdb8e27dee3dc985": true, + "5f60bf4558eff926626a60f2": true, + "5f60c076f2bcbb675b00dac2": true, + "5f60c74e3b85f6263c145586": true, + "5f60c85b58eff926626a60f7": true, + "5f60cd6cf2bcbb675b00dac6": true, + "5f60e6403b85f6263c14558c": true, + "5f60e7788adaa7100c3adb49": true, + "5f60e784f2bcbb675b00dac7": true, + "5f6331e097199b7db2128dc2": true, + "5f6336bbda967c74a42e9932": true, + "5f6339d53ada5942720e2dc3": true, + "5f633f68f5750b524b45f112": true, + "5f633f791b231926f2329f13": true, + "5f633ff5c444ce7e3c30a006": true, + "5f63405df5750b524b45f114": true, + "5f63407e1b231926f2329f15": true, + "5f6340d3ca442212f4047eb2": true, + "5f6341043ada5942720e2dc5": true, + "5f63418ef5750b524b45f116": true, + "5f6372e2865db925d54f3869": true, + "5f647f31b6238e5dd066e196": true, + "5f99418230835532b445e954": true, + "5f994730c91ed922dd355de3": true, + "5f9949d869e2777a0e779ba5": true, + "5fb64bc92b1b027b1f50bcf2": true, + "5fb651b52b1b027b1f50bcff": true, + "5fb651dc85f90547f674b6f4": true, + "5fb65363d1409e5ca04b54f5": true, + "5fb653962b1b027b1f50bd03": true, + "5fb65424956329274326f316": true, + "5fb6548dd1409e5ca04b54f9": true, + "5fb6558ad6f0b2136f2d7eb7": true, + "5fb655a72b1b027b1f50bd06": true, + "5fb655b748c711690e3a8d5a": true, + "5fb6564947ce63734e3fa1da": true, + "5fb6567747ce63734e3fa1dc": true, + "5fbb976df9986c4cff3fe5f2": true, + "5fbb978207e8a97d1f0902d3": true, + "5fbbaa86f9986c4cff3fe5f6": true, + "5fbbc3324e8a554c40648348": true, + "5fbbc34106bde7524f03cbe9": true, + "5fbbc366ca32ed67276c1557": true, + "5fbbc383d5cb881a7363194a": true, + "5fbbfabed5cb881a7363194e": true, + "5fbbfacda56d053a3543f799": true, + "5fbc210bf24b94483f726481": true, + "5fbc226eca32ed67276c155d": true, + "5fbc227aa56d053a3543f79e": true, + "5fbc22ccf24b94483f726483": true, + "5fbcbcf593164a5b6278efb2": true, + "5fbcbd02900b1d5091531dd3": true, + "5fbcbd10ab884124df0cd563": true, + "5fbcbd6c187fea44d52eda14": true, + "5fbcc1d9016cce60e8341ab3": true, + "5fbcc3e4d6fa9c00c571bb58": true, + "5fbcc429900b1d5091531dd7": true, + "5fbcc437d724d907e2077d5c": true, + "5fbcc640016cce60e8341acc": true, + "5fbe3ffdf8b6a877a729ea82": true, + "5fbe760793164a5b6278efc8": true, + "5fbe7618d6fa9c00c571bb6c": true, + "5fc0f9b5d724d907e2077d82": true, + "5fc0f9cbd6fa9c00c571bb90": true, + "5fc0fa362770a0045c59c677": true, + "5fc0fa957283c4046c58147e": true, + "5fc22d7c187fea44d52eda44": true, + "5fc23426900b1d5091531e15": true, + "5fc235db2770a0045c59c683": true, + "5fc2360f900b1d5091531e19": true, + "5fc23636016cce60e8341b05": true, + "5fc23678ab884124df0cd590": true, + "5fc2369685fd526b824a5713": true, + "5fc275cf85fd526b824a571a": true, + "5fc278107283c4046c581489": true, + "5fc382a9d724d907e2077dab": true, + "5fc382b6d6fa9c00c571bbc3": true, + "5fc382c1016cce60e8341b20": true, + "5fc3e272f8b6a877a729eac5": true, + "5fc3e466187fea44d52eda90": true, + "5fc3e4a27283c4046c5814ab": true, + "5fc3e4ee7283c4046c5814af": true, + "5fc3f2d5900b1d5091531e57": true, + "5fc4b97bab884124df0cd5e3": true, + "5fc4b992187fea44d52edaa9": true, + "5fc4b9b17283c4046c5814d7": true, + "5fc53954f8b6a877a729eaeb": true, + "5fc5396e900b1d5091531e72": true, + "5fc64ea372b0dd78d51159dc": true, + "5fca138c2a7b221b2852a5c6": true, + "5fca13ca637ee0341a484f46": true, + "5fce0cf655375d18a253eff0": true, + "5fce0f9b55375d18a253eff2": true, + "5fce16961f152d4312622bc9": true, + "5fd20ff893a8961fc660a954": true, + "5fd4c474dd870108a754b241": true, + "5fd4c4fa16cac650092f6771": true, + "5fd4c5477a8d854fa0105061": true, + "5fd4c60f875c30179f5d04c2": true, + "5fd8d28367cb5e077335170f": true, + "60098ad7c2240c0fe85c570a": true, + "60098af40accd37ef2175f27": true, + "60098b1705871270cd5352a1": true, + "601948682627df266209af05": true, + "60194943740c5d77f6705eea": true, + "601949593ae8f707c4608daa": true, + "601aa3d2b2bcb34913271e6d": true, + "602286df23506e50807090c6": true, + "60228924961b8d75ee233c32": true, + "60228a76d62c9b14ed777a66": true, + "60228a850ddce744014caf69": true, + "602293f023506e50807090cb": true, + "60229948cacb6b0506369e27": true, + "602a95edda11d6478d5a06da": true, + "602a95fe4e02ce1eaa358729": true, + "602a97060ddce744014caf6f": true, + "602a9740da11d6478d5a06dc": true, + "602e3f1254072b51b239f713": true, + "602e620f9b513876d4338d9a": true, + "602e63fb6335467b0c5ac94d": true, + "602e71bd53a60014f9705bfa": true, + "602f85fd9b513876d4338d9c": true, + "603372b4da11d6478d5a07ff": true, + "603372d154072b51b239f9e1": true, + "603372f153a60014f970616d": true, + "603373004e02ce1eaa358814": true, + "6033749e88382f4fab3fd2c5": true, + "60337f5dce399e10262255d1": true, + "60338ff388382f4fab3fd2c8": true, + "60339954d62c9b14ed777c06": true, + "6033fa48ffd42c541047f728": true, + "603409c80ca681766b6a0fb2": true, + "6034cf5fffd42c541047f72e": true, + "6034d0230ca681766b6a0fb5": true, + "6034d103ca006d2dca39b3f0": true, + "6034d2d697633951dc245ea6": true, + "6034e3cb0ddce744014cb870": true, + "6034e3d953a60014f970617b": true, + "6034e3e20ddce744014cb878": true, + "603618feffd42c541047f771": true, + "603619720ca681766b6a0fc4": true, + "60361a7497633951dc245eb4": true, + "60361b0b5a45383c122086a1": true, + "60361b5a9a15b10d96792291": true, + "60363c0c92ec1c31037959f5": true, + "603648ff5a45383c122086ac": true, + "6038b4b292ec1c3103795a0b": true, + "6038b4ca92ec1c3103795a0d": true, + "6038d614d10cbf667352dd44": true, + "6040dd4ddcf9592f401632d2": true, + "6040de02647ad86262233012": true, + "606587252535c57a13424cfd": true, + "60658776f2cb2e02a42ace2b": true, + "6065878ac9cf8012264142fd": true, + "606587a88900dc2d9a55b659": true, + "606587bd6d0bd7580617bacc": true, + "606587d11246154cad35d635": true, + "606587e18900dc2d9a55b65f": true, + "6065880c132d4d12c81fd8da": true, + "6065881d1246154cad35d637": true, + "6065c6e7132d4d12c81fd8e1": true, + "6065dc8a132d4d12c81fd8e3": true, + "606dae0ab0e443224b421bb7": true, + "606ee5c81246154cad35d65e": true, + "606eef46232e5a31c233d500": true, + "606eef756d0bd7580617baf8": true, + "606ef0812535c57a13424d20": true, + "606f262c6d0bd7580617bafa": true, + "606f263a8900dc2d9a55b68d": true, + "606f26752535c57a13424d22": true, + "606f2696f2cb2e02a42aceb1": true, + "6076c1b9f2cb2e02a42acedc": true, + "60785c0d232e5a31c233d51c": true, + "60785ce5132d4d12c81fd918": true, + "607d5aa50494a626335e12ed": true, + "607ea812232e5a31c233d53c": true, + "607f201b3c672b3b3a24a800": true, + "607f20859ee58b18e41ecd90": true, + "607ffb988900dc2d9a55b6e4": true, + "6086b5392535c57a13424d70": true, + "6086b5731246154cad35d6c7": true, + "6087e0336d0bd7580617bb7a": true, + "6087e2a5232e5a31c233d552": true, + "6087e663132d4d12c81fd96b": true, + "609269c3b0e443224b421cc1": true, + "60926df0132d4d12c81fd9df": true, + "609a4b4fe2ff132951242d04": true, + "609a63b6e2ff132951242d09": true, + "609b9e31506cf869cf3eaf41": true, + "609bab8b455afd752b2e6138": true, + "609e8540d5c319764c2bc2e9": true, + "609e860ebd219504d8507525": true, + "60a23797a37c940de7062d02": true, + "60a272cc93ef783291411d8e": true, + "60a2828e8689911a226117f9": true, + "60a283193cb70855c43a381d": true, + "60a3c68c37ea821725773ef5": true, + "60a3c70cde5f453f634816a3": true, + "60a621c49c197e4e8c4455e6": true, + "60a6220e953894617404b00a": true, + "60a7acf20c5cb24b01346648": true, + "60a7ad2a2198820d95707a2e": true, + "60a7ad3a0c5cb24b0134664a": true, + "60b0f988c4449e4cb624c1da": true, + "60b52e5bc7d8103275739d67": true, + "60bf74184a63fc79b60c57f6": true, + "60db29ce99594040e04c4a27": true, + "6113c3586c780c1e710c90bc": true, + "6113cc78d3a39d50044c065a": true, + "6113cce3d92c473c770200c7": true, + "6113d6c3290d254f5e6b27db": true, + "611a30addbdd8440277441dc": true, + "611a31ce5b7ffe001b4649d1": true, + "6123649463849f3d843da7c4": true, + "612368f58b401f4f51239b33": true, + "612781056f3d944a17348d60": true, + "612e0cfc8004cc50514c2d9e": true, + "612e0d3767085e45ef14057f": true, + "612e0d81290d254f5e6b291a": true, + "612e0e04568c120fdd294258": true, + "612e0e3c290d254f5e6b291d": true, + "612e0e55a112697a4b3a66e7": true, + "6130c3dffaa1272e43151c7d": true, + "6130c43c67085e45ef1405a1": true, + "6130c4d51cb55961fa0fd49f": true, + "6130ca3fd92c473c77020dbd": true, + "614451b71e5874611e2c7ae5": true, + "615d8d878004cc50514c3233": true, + "615d8da4d3a39d50044c10e8": true, + "615d8dbd290d254f5e6b2ed6": true, + "615d8df08004cc50514c3236": true, + "615d8e2f1cb55961fa0fd9a4": true, + "615d8e9867085e45ef1409c6": true, + "615d8eb350224f204c1da1cf": true, + "615d8f5dd92c473c770212ef": true, + "615d8f8567085e45ef1409ca": true, + "615d8faecabb9b7ad90f4d5d": true, + "615d8fd3290d254f5e6b2edc": true, + "61605d88ffa6e502ac5e7eeb": true, + "616442e4faa1272e43152193": true, + "616554fe50224f204c1da2aa": true, + "61657230d92c473c770213d7": true, + "616584766ef05c2ce828ef57": true, + "61659f79d92c473c770213ee": true, + "6165ac306ef05c2ce828ef74": true, + "6165ac8c290d254f5e6b2f6c": true, + "6165adcdd3a39d50044c120f": true, + "6165aeedfaa1272e431521e3": true, + "61695095d92c473c7702147a": true, + "61702be9faa1272e431522c3": true, + "61702d8a67085e45ef140b24": true, + "61702f1b67085e45ef140b26": true, + "61703001d92c473c77021497": true, + "61712eae6c780c1e710c9a1d": true, + "617130016c780c1e710c9a24": true, + "617131a4568c120fdd29482d": true, + "61713308d92c473c770214a0": true, + "6171367e1cb55961fa0fdb36": true, + "61713a8fd92c473c770214a4": true, + "61713cc4d8e3106d9806c109": true, + "6171407e50224f204c1da3c5": true, + "61714b2467085e45ef140b2c": true, + "61714eec290d254f5e6b2ffc": true, + "617151c1d92c473c770214ab": true, + "617153016c780c1e710c9a2f": true, + "617154aa1cb55961fa0fdb3b": true, + "617155ee50224f204c1da3cd": true, + "61715e7e67085e45ef140b33": true, + "6176a40f0b8c0312ac75a3d3": true, + "6176a48d732a664031271438": true, + "6176aca650224f204c1da3fb": true, + "617aa4dd8166f034d57de9c5": true, + "617fd91e5539a84ec44ce155": true, + "61816734d8e3106d9806c1f3": true, + "618167441cb55961fa0fdc71": true, + "618167528004cc50514c34f9": true, + "618167616ef05c2ce828f1a8": true, + "6181688c6c780c1e710c9b04": true, + "618168b350224f204c1da4d8": true, + "618168dc8004cc50514c34fc": true, + "61816df1d3a39d50044c139e": true, + "61816dfa6ef05c2ce828f1ad": true, + "61816fcad92c473c770215cc": true, + "61817865d3a39d50044c13a4": true, + "618178aa1cb55961fa0fdc80": true, + "61825d06d92c473c770215de": true, + "61825d136ef05c2ce828f1cc": true, + "61825d24d3a39d50044c13af": true, + "6183afd850224f204c1da514": true, + "6183b0711cb55961fa0fdcad": true, + "6183b084a112697a4b3a6e6c": true, + "6183d53f1cb55961fa0fdcda": true, + "6183fc15d3a39d50044c13e9": true, + "6183fd911cb55961fa0fdce9": true, + "6183fd9e8004cc50514c358f": true, + "618405198004cc50514c3594": true, + "6184055050224f204c1da540": true, + "618407a850224f204c1da549": true, + "61840bedd92c473c77021635": true, + "61840d85568c120fdd2962a5": true, + "618426d96c780c1e710c9b9f": true, + "618428466ef05c2ce828f218": true, + "618a431df1eb8e24b8741deb": true, + "618a5d5852ecee1505530b2a": true, + "618a75c9a3884f56c957ca1b": true, + "618a75f0bd321d49084cd399": true, + "618a760e526131765025aae3": true, + "618aef6d0a5a59657e5f55ee": true, + "618b9643526131765025ab35": true, + "618b9671d14d6d5ab879c5ea": true, + "618b9682a3884f56c957ca78": true, + "618ba27d9008e4636a67f61d": true, + "618ba91477b82356f91ae0e8": true, + "618ba92152ecee1505530bd3": true, + "618bab21526131765025ab3f": true, + "618bb76513f5097c8d5aa2d5": true, + "618cfae774bb2d036a049e7c": true, + "619256e5f8af2c1a4e1f5d92": true, + "619386379fb0c665d5490dbe": true, + "6193a720f8ee7e52e42109ed": true, + "6193d3149fb0c665d5490e32": true, + "6193d338de3cdf1d2614a6fc": true, + "6193d382ed0429009f543e65": true, + "6193d3be7c6c7b169525f0da": true, + "6193d3cded0429009f543e6a": true, + "6193d5d4f8ee7e52e4210a1b": true, + "6193dcd0f8ee7e52e4210a28": true, + "6194ef39de3cdf1d2614a768": true, + "6194efe07c6c7b169525f11b": true, + "6194eff92d2c397d6600348b": true, + "6194f017ed0429009f543eaa": true, + "6194f02d9bb3d20b0946d2f0": true, + "6194f1f918a3974e5e7421e4": true, + "6194f2912d2c397d6600348d": true, + "6194f2df645b5d229654ad77": true, + "6194f3286db0f2477964e67d": true, + "6194f35c18a3974e5e7421e6": true, + "6194f41f9fb0c665d5490e75": true, + "6194f5722d2c397d6600348f": true, + "6194f5a318a3974e5e7421eb": true, + "6194f5d418a3974e5e7421ef": true, + "619621a4de3cdf1d2614a7a7": true, + "619624b26db0f2477964e6b0": true, + "6196255558ef8c428c287d1c": true, + "61962b617c6c7b169525f168": true, + "61962d879bb3d20b0946d385": true, + "6196364158ef8c428c287d9f": true, + "6196365d58ef8c428c287da1": true, + "619636be6db0f2477964e710": true, + "61963a852d2c397d660036ad": true, + "61965d9058ef8c428c287e0d": true, + "619666f4af1f5202c57a952d": true, + "6197b229af1f5202c57a9bea": true, + "619b5db699fb192e7430664f": true, + "619b69037b9de8162902673e": true, + "619bc61e86e01e16f839a999": true, + "619bdd8886e01e16f839a99c": true, + "619bddc6c9546643a67df6ee": true, + "619bddffc9546643a67df6f0": true, + "619bde3dc9546643a67df6f2": true, + "619bde7fc9546643a67df6f4": true, + "619bdeb986e01e16f839a99e": true, + "619bdef8c9546643a67df6f6": true, + "619bdf9cc9546643a67df6f8": true, + "619bdfd4c9546643a67df6fa": true, + "619cbf7d23893217ec30b689": true, + "619cbf9e0a7c3a1a2731940a": true, + "619cf0335771dd3c390269ae": true, + "619d36da53b4d42ee724fae4": true, + "619f4ab2d25cbd424731fb95": true, + "619f4bffd25cbd424731fb97": true, + "619f4cee4c58466fe1228435": true, + "619f4d304c58466fe1228437": true, + "619f4f8c4c58466fe1228439": true, + "619f52454c58466fe122843b": true, + "61a4c8884f95bc3b2c5dc96f": true, + "61b9e1aaef9a1b5d6a79899a": true, + "61bc85697113f767765c7fe7": true, + "61bca7cda0eae612383adf57": true, + "61bcc89aef0f505f0c6cd0fc": true, + "61c18d83b00456371a66814b": true, + "61c18db6dfd64163ea78fbb4": true, + "61f4012adfc9f01a816adda1": true, + "61f7b234ea4ab34f2f59c3ec": true, + "61f7b85367ddd414173fdb36": true, + "61f7c9e189e6fb1a5e3ea78d": true, + "61f8024263dc1250e26eb029": true, + "61f803b8ced75b2e852e35f8": true, + "61faa91878830f069b6b7967": true, + "620109578d82e67e7911abf2": true, + "6217726288ed9f0845317459": true, + "62178be9d0050232da3485d9": true, + "62178c4d4ecf221597654e3d": true, + "622b327b267a1b13a44abea3": true, + "622b379bf9cfc87d675d2de5": true, + "622b3858034a3e17ad0b81f5": true, + "622b38c56762c718e457e246": true, + "622b397c9a3d4327e41843b6": true, + "622b3c081b89c677a33bcda6": true, + "622b3d5cf9cfc87d675d2de9": true, + "622b4d7df9cfc87d675d2ded": true, + "622b4f54dc8dcc0ba8742f85": true, + "622efbcb99f4ea1a4d6c9a15": true, + "622efdf8ec80d870d349b4e5": true, + "622f02437762f55aaa68ac85": true, + "622f039199f4ea1a4d6c9a17": true, + "622f07cfae33bc505b2c4dd5": true, + "622f0ee47762f55aaa68ac87": true, + "622f128cec80d870d349b4e8": true, + "622f140da5958f63c67f1735": true, + "622f14e899892a7f9e08f6c5": true, + "622f16a1a5958f63c67f1737": true, + "623063e994fc3f7b302a9696": true, + "62307b7b10d2321fa8741921": true, + "6231654c71b5bc3baa1078e5": true, + "623166e08c43374ca1567195": true, + "6231670f0b8aa5472d060095": true, + "62330b3ed4dc74626d570b95": true, + "62330bfadc5883093563729b": true, + "62330c18744e5e31df12f516": true, + "62330c40bdd19b369e1e53d1": true, + "62386b2adf47d66e835094b2": true, + "62386b7153757417e93a4e9f": true, + "62389aaba63f32501b1b444f": true, + "62389ba9a63f32501b1b4451": true, + "62389bc9423ed1685422dc57": true, + "62389be94d5d474bf712e709": true, + "623b2e9d11c3296b440d1638": true, + "623c2f4242aee3103f1c44b7": true, + "623c2f652febb22c2777d8d7": true, + "623c3be0484b5003161840dc": true, + "623c3c1f37b4b31470357737": true, + "6241c2c2117ad530666a5108": true, + "6241c316234b593b5676b637": true, + "62444cb99f47004c781903eb": true, + "62444cd3674028188b052799": true, + "624c0570c9b794431568f5d5": true, + "624c09cfbc2e27219346d955": true, + "624c09da2cec124eb67c1046": true, + "624c09e49b98e019a3315b66": true, + "624c0b3340357b5f566e8766": true, + "624c29ce09cd027dff2f8cd7": true, + "624c2e8614da335f1e034d8c": true, + "6259b864ebedf17603599e88": true, + "6259c2c1d714855d182bad85": true, + "6259c3387d6aab70bc23a18d": true, + "6259c3d8012d6678ec38eeb8": true, + "6259c4347d6aab70bc23a190": true, + "625eb0faa6e3a82193267ad9": true, + "625ebcef6f53af4aa66b44dc": true, + "625ec45bb14d7326ac20f572": true, + "625ed7c64d9b6612df732146": true, + "626667e87379c44d557b7550": true, + "626673016f1edc06f30cf6d5": true, + "62669bccdb9ebb4daa44cd14": true, + "6267c6396b642f77f56f5c1c": true, + "6269220d70b6c02e665f2635": true, + "6269545d0e57f218e4548ca2": true, + "626a74340be03179a165e30c": true, + "626a8ae89e664a2e2a75f409": true, + "626a9cb151cb5849f6002890": true, + "626bb8532c923541184624b4": true, + "626becf9582c3e319310b837": true, + "6272370ee4013c5d7e31f418": true, + "6272379924e29f06af4d5ecb": true, + "627254cc9c563e6e442c398f": true, + "6272874a6c47bd74f92e2087": true, + "6275303a9f372d6ea97f9ec7": true, + "627e14b21713922ded6f2c15": true, + "62811cd7308cb521f87a8f99": true, + "62811e2510e26c1f344e6554": true, + "62811e335631d45211793c95": true, + "62811f461d5df4475f46a332": true, + "62811f828193841aca4a45c3": true, + "62811fa609427b40ab14e765": true, + "62811fbf09427b40ab14e767": true, + "6281204f308cb521f87a8f9b": true, + "628120621d5df4475f46a335": true, + "62812081d23f207deb0ab216": true, + "6281209662cba23f6c4d7a19": true, + "628120c21d5df4475f46a337": true, + "628120d309427b40ab14e76d": true, + "628120dd308cb521f87a8fa1": true, + "628120fd5631d45211793c9f": true, + "6281212a09427b40ab14e770": true, + "628121434fa03b6b6c35dc6a": true, + "6284bd5f95250a29bc628a30": true, + "62850c28da09541f43158cca": true, + "628a60ae6b1d481ff772e9c8": true, + "628a664bccaab13006640e47": true, + "628a665a86cbd9750d2ff5e5": true, + "628a6678ccaab13006640e49": true, + "628a66b41d5e41750e314f34": true, + "628a7b23b0f75035732dd565": true, + "628a83c29179c324ed269508": true, + "628a85ee6b1d481ff772e9d5": true, + "628b5638ad252a16da6dd245": true, + "628b8d83717774443b15e248": true, + "628b916469015a4e1711ed8d": true, + "628b9471078f94059a4b9bfb": true, + "628b9784bcf6e2659e09b8a2": true, + "628b9a40717774443b15e9f2": true, + "628b9be6cff66b70c002b14c": true, + "628b9c37a733087d0d7fe84b": true, + "628b9c7d45122232a872358f": true, + "628baf0b967de16aab5a4f36": true, + "628bc7fb408e2b2e9c0801b1": true, + "628c9ab845c59e5b80768a81": true, + "628cd624459354321c4b7fa2": true, + "628d0618d1ba6e4fa07ce5a4": true, + "628dc750b910320f4c27a732": true, + "628e1ffc83ec92260c0f437f": true, + "628e4dd1f477aa12234918aa": true, + "628e4e576d783146b124c64d": true, + "62963c18dbc8ab5f0d382d0b": true, + "62a09d3bcf4a99369e262447": true, + "62a09d79de7ac81993580530": true, + "62a09dd4621468534a797ac7": true, + "62a09e08de7ac81993580532": true, + "62a09e410b9d3c46de5b6e78": true, + "62a09f32621468534a797acb": true, + "62a1b7fbc30cfa1d366af586": true, + "62a5c2c98ec41a51b34739c0": true, + "62a5c333ec21e50cad3b5dc6": true, + "62a5c41e8ec41a51b34739c3": true, + "62a61bbf8ec41a51b34758d2": true, + "62a61c988ec41a51b34758d5": true + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608815684 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 4, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 6, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 24 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 25 + } + ], + "Improvement": {}, + "Production": {} + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 17206066, + "GameVersion": "edge_of_darkness", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 69, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 2, + "NeedWipeOptions": [], + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Usec", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49444ae6628187a2e77b8", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49444ae6628187a2e77b8", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "f5e6bdac05e699d687993249", + "_tpl": "5857a8bc2459772bad15db29", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "SecuredContainer" + }, { + "_id": "01e9d751f10e4e9aebdd94d5", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Pockets" + }, { + "_id": "5fe49444ae6628187a2e78b8", + "_tpl": "5811ce772459770e9e5f9532" + }, { + "_id": "5fe49444ae6628187a2e78ba", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49444ae6628187a2e78b9", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + }, { + "_id": "6275a53292b3e1de7c0f94fc", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "f55404fc9c2a0063bc1b9293", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000000 + } + }, { + "_id": "c1408429a85d87168d75e04c", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000000 + } + }, { + "_id": "72ec3ef07bf2ddf6c0dab838", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000000 + } + }, { + "_id": "72ec3ef08bf2fdf6c0dab835", + "_tpl": "58ac60eb86f77401897560ff", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 1 + } + } + ], + "questRaidItems": "5fe49444ae6628187a2e78b9", + "questStashItems": "5fe49444ae6628187a2e78ba", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49444ae6628187a2e78b8" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 4000 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cde9ec17d6c8b04723cf479", + "5cde9e957d6c8b0474535da7" + ], + "trader": { + "initialLoyaltyLevel": 4, + "initialSalesSum": 2600000, + "initialStanding": 6, + "jaegerUnlocked": true, + "setQuestsAvailableForStart": true + }, + "weaponbuilds": {} + } }, - "usec": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c6", - "templateId": "5811ce772459770e9e5f9532", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] + "SPT Easy start": { + "descriptionLocaleKey": "launcher-profile_spteasystart", + "bear": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c6", + "templateId": "5811ce772459770e9e5f9532", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cc0858d14c02e000c6bea66", + "Feet": "5cc085bb14c02e000e67a5c5", + "Hands": "5cc0876314c02e000c6bea6b", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5447ac644bdc2d6c208b4567": true, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448c1d04bdc2dff2f8b4569": true, + "5448fee04bdc2dbc018b4567": false, + "5448ff904bdc2d6f028b456e": true, + "5449016a4bdc2d6f028b456f": false, + "544909bb4bdc2d6f028b4577": true, + "544a11ac4bdc2d470e8b456a": false, + "544a378f4bdc2d30388b4567": true, + "544a37c44bdc2d25388b4567": true, + "544a38634bdc2d58388b4568": true, + "544a3a774bdc2d3a388b4567": true, + "544a5caa4bdc2d1a388b4568": true, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": true, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "544fb62a4bdc2dfb738b4568": true, + "544fb6cc4bdc2d34748b456e": true, + "54527a984bdc2d4e668b4567": true, + "54527ac44bdc2d36668b4567": true, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "5580169d4bdc2d9d138b4585": true, + "55801eed4bdc2d89578b4588": true, + "5580223e4bdc2d1c128b457f": true, + "558022b54bdc2dac148b458d": true, + "55802d5f4bdc2dac148b458e": true, + "55802f5d4bdc2dac148b458f": true, + "558032614bdc2de7118b4585": true, + "559ba5b34bdc2d1f1a8b4582": true, + "55d355e64bdc2d962f8b4569": true, + "55d35ee94bdc2d61338b4568": true, + "55d3632e4bdc2d972f8b4569": true, + "55d447bb4bdc2d892f8b456f": true, + "55d448594bdc2d8c2f8b4569": true, + "55d449444bdc2d962f8b456d": true, + "55d44fd14bdc2d962f8b456e": true, + "55d459824bdc2d892f8b4573": true, + "55d45d3f4bdc2d972f8b456c": true, + "55d45f484bdc2d972f8b456d": true, + "55d480c04bdc2d1d4e8b456a": false, + "55d481904bdc2d8c2f8b456a": true, + "55d482194bdc2d1d4e8b456b": true, + "55d4837c4bdc2d1d4e8b456c": true, + "55d485be4bdc2d962f8b456f": true, + "55d4887d4bdc2d962f8b4570": true, + "55d48a634bdc2d8b2f8b456a": true, + "55d48ebc4bdc2d8c2f8b456c": true, + "55d4ae6c4bdc2d8b2f8b456e": true, + "55d4af3a4bdc2d972f8b456f": true, + "55d4b9964bdc2d1d4e8b456e": true, + "55d5f46a4bdc2d1b198b4567": true, + "55d614004bdc2d86028b4568": true, + "55d6190f4bdc2d87028b4567": true, + "55d7217a4bdc2d86028b456d": false, + "55f84c3c4bdc2d5f408b4576": true, + "560835c74bdc2dc8488b456f": true, + "560836484bdc2d20478b456e": true, + "560836b64bdc2d57468b4567": true, + "560836fb4bdc2d773f8b4569": true, + "560837154bdc2da74d8b4568": true, + "5608373c4bdc2dc8488b4570": true, + "560837544bdc2de22e8b456e": true, + "560837824bdc2d57468b4568": true, + "5608379a4bdc2d26448b4569": true, + "560838c94bdc2d77798b4569": true, + "56083a334bdc2dc8488b4571": true, + "56083be64bdc2d20478b456f": true, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560d61e84bdc2da74d8b4571": true, + "560d657b4bdc2da74d8b4572": true, + "560d75f54bdc2da74d8b4573": true, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a69d4bdc2ded0b8b457b": true, + "5648a7494bdc2d9d488b4583": false, + "5648ac824bdc2ded0b8b457d": true, + "5648ae314bdc2d3d1c8b457f": true, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": true, + "5648b4534bdc2d3d1c8b4580": true, + "5649a2464bdc2d91118b45a8": true, + "5649aa744bdc2ded0b8b457e": false, + "5649ab884bdc2ded0b8b457f": true, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649ae4a4bdc2d1b2b8b4588": true, + "5649af094bdc2df8348b4586": false, + "5649af884bdc2d1b2b8b4589": true, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "5649b2314bdc2d79388b4576": true, + "5649be884bdc2d79388b4577": true, + "5649d9a14bdc2d79388b4580": true, + "5649ed104bdc2d3d1c8b458b": true, + "564ca99c4bdc2d16268b4589": false, + "564ca9df4bdc2d35148b4569": true, + "564caa3d4bdc2d17108b458e": true, + "5656d7c34bdc2d9d198b4587": true, + "5656eb674bdc2d35148b457c": true, + "567143bf4bdc2d1a0f8b4567": true, + "5673de654bdc2d180f8b456d": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59856d2720bd8418b456a": true, + "56d59d3ad2720bdb418b4577": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56dee2bdd2720bc8328b4567": true, + "56deec93d2720bec348b4568": true, + "56deed6ed2720b4c698b4583": true, + "56def37dd2720bec348b456a": true, + "56dfef82d2720bbd668b4567": true, + "56dff026d2720bb8668b4567": true, + "56dff061d2720bb5668b4567": true, + "56dff0bed2720bb0668b4567": true, + "56dff216d2720bbd668b4568": true, + "56dff2ced2720bb4668b4567": true, + "56dff3afd2720bba668b4567": true, + "56dff421d2720b5f5a8b4567": true, + "56dff4a2d2720bbd668b456a": true, + "56dff4ecd2720b5f5a8b4568": true, + "56e0598dd2720bb5668b45a6": true, + "56e05a6ed2720bd0748b4567": true, + "56e05b06d2720bb2668b4586": true, + "56e294cdd2720b603a8b4575": false, + "56e335e4d2720b6c058b456d": true, + "56e33634d2720bd8058b456b": true, + "56e33680d2720be2748b4576": true, + "56ea6fafd2720b844b8b4593": true, + "56ea70acd2720b844b8b4594": true, + "56ea7165d2720b6e518b4583": true, + "56ea7293d2720b8d4b8b45ba": true, + "56ea8180d2720bf2698b456a": true, + "56ea8222d2720b69698b4567": true, + "56ea8d2fd2720b7c698b4570": true, + "56eabcd4d2720b66698b4574": true, + "56eabf3bd2720b75698b4569": true, + "570fd6c2d2720bc6458b457f": true, + "570fd721d2720bc5458b4596": true, + "570fd79bd2720bc7458b4583": true, + "5710c24ad2720bc3458b45a3": false, + "571659bb2459771fb2755a12": true, + "571a26d524597720680fbe8a": true, + "571a279b24597720b4066566": true, + "571a282c2459771fb2755a69": true, + "571a28e524597720b4066567": true, + "571a29dc2459771fb2755a6a": true, + "57235b6f24597759bf5a30f1": true, + "572b7adb24597762ae139821": true, + "572b7fa524597762b747ce82": true, + "5732ee6a24597719ae0c0281": true, + "5734773724597737fd047c14": true, + "57347d3d245977448f7b7f61": true, + "57347d5f245977448b40fa81": true, + "57347d692459774491567cf1": true, + "57347d7224597744596b4e72": false, + "57347d8724597744596b4e76": true, + "57347d90245977448f7b7f65": true, + "57347d9c245977448b40fa85": true, + "57347da92459774491567cf5": true, + "5735fdcd2459776445391d61": true, + "5735ff5c245977640e39ba7e": true, + "573601b42459776410737435": true, + "573602322459776445391df1": true, + "5736026a245977644601dc61": true, + "573603562459776430731618": true, + "573603c924597764442bd9cb": true, + "573718ba2459775a75491131": false, + "573719762459775a626ccbc1": true, + "573719df2459775a626ccbc2": true, + "57371aab2459775a77142f22": true, + "57371b192459775a9f58a5e0": true, + "57371e4124597760ff7b25f1": true, + "57371eb62459776125652ac1": true, + "57371f2b24597761224311f1": true, + "57371f8d24597761006c6a81": true, + "5737201124597760fc4431f1": true, + "5737207f24597760ff7b25f2": true, + "573720e02459776143012541": true, + "57372140245977611f70ee91": true, + "5737218f245977612125ba51": true, + "573722e82459776104581c21": true, + "573724b42459776125652ac2": true, + "5737250c2459776125652acc": true, + "5737256c2459776125652acd": true, + "573725b0245977612125bae2": true, + "5737260b24597761224311f2": true, + "5737266524597761006c6a8c": true, + "573726d824597765d96be361": true, + "5737273924597765dd374461": true, + "573727c624597765cc785b5b": true, + "5737280e24597765cc785b5c": true, + "5737287724597765e1625ae2": true, + "573728cc24597765cc785b5d": true, + "573728f324597765e5728561": true, + "5737292724597765e5728562": true, + "57372a7f24597766fe0de0c1": true, + "57372ac324597767001bc261": true, + "57372b832459776701014e41": true, + "57372bad245977670b7cd242": true, + "57372bd3245977670b7cd243": true, + "57372c21245977670937c6c2": true, + "57372c56245977685e584582": true, + "57372c89245977685d4159b1": true, + "57372d1b2459776862260581": true, + "57372d4c245977685a3da2a1": true, + "57372db0245977685d4159b2": true, + "57372deb245977685d4159b3": true, + "57372e1924597768553071c1": true, + "57372e4a24597768553071c2": true, + "57372e73245977685d4159b4": true, + "57372e94245977685648d3e1": true, + "57372ebf2459776862260582": true, + "57372ee1245977685d4159b5": true, + "57372f2824597769a270a191": true, + "57372f5c24597769917c0131": true, + "57372f7d245977699b53e301": true, + "57372fc52459776998772ca1": true, + "5737300424597769942d5a01": true, + "5737330a2459776af32363a1": true, + "5737339e2459776af261abeb": true, + "573733c72459776b0b7b51b0": true, + "5739d41224597779c3645501": true, + "57486e672459770abd687134": true, + "574d967124597745970e7c94": true, + "574dad8024597745964bf05c": true, + "574db213245977459a2f3f5d": true, + "574eb85c245977648157eec3": true, + "575062b524597720a31c09a1": true, + "57513f07245977207e26a311": true, + "57513f9324597720a7128161": true, + "57513fcc24597720a31c09a6": true, + "5751435d24597720a27126d1": true, + "57514643245977207f2c2d09": true, + "575146b724597720a27126d5": true, + "5751487e245977207e26a315": true, + "5751496424597720a27126da": true, + "5751a25924597722c463c472": true, + "5751a89d24597722aa0e8db0": true, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": true, + "576165642459773c7a400233": true, + "576167ab2459773cad038c43": true, + "57616a9e2459773c7a400234": true, + "57616ca52459773c69055192": true, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "576fd4ec2459777f0b518431": true, + "577d128124597739d65d0e56": true, + "577d141e24597739c5255e01": true, + "57838ad32459774a17445cd2": true, + "57838c962459774a1651ec63": true, + "57838e1b2459774a256959b1": true, + "57838f0b2459774a256959b2": true, + "57838f9f2459774a150289a0": true, + "578395402459774a256959b5": true, + "578395e82459774a0e553c7b": true, + "579204f224597773d619e051": true, + "5798a2832459774b53341029": true, + "57a0dfb82459774d3078b56c": true, + "57a0e5022459774d1673f889": true, + "57a3459f245977764a01f703": true, + "57a9b9ce2459770ee926038d": true, + "57ac965c24597706be5f975c": true, + "57aca93d2459771f2c7e26db": true, + "57acb6222459771ec34b5cb0": true, + "57ade1442459771557167e15": true, + "57adff4f24597737f373b6e6": true, + "57ae0171245977343c27bfcf": true, + "57af48872459771f0b2ebf11": true, + "57c44b372459772d2b39b8ce": true, + "57c44dd02459772d2e0ae249": true, + "57c44e7b2459772d28133248": true, + "57c44f4f2459772d2c627113": true, + "57c44fa82459772d2d75e415": true, + "57c450252459772d28133253": true, + "57c55efc2459772d2c6271e7": true, + "57c55f092459772d291a8463": true, + "57c55f112459772d28133310": true, + "57c55f172459772d27602381": true, + "57c5ac0824597754771e88a9": true, + "57c69dd424597774c03b7bbc": true, + "57c9a89124597704ee6faec1": true, + "57cd379a24597778e7682ecf": false, + "57cff947245977638e6f2a19": true, + "57cffb66245977632f391a99": true, + "57cffcd624597763133760c5": true, + "57cffcdd24597763f5110006": true, + "57cffce524597763b31685d8": true, + "57cffd8224597763b03fc609": true, + "57cffddc24597763133760c6": true, + "57cffe0024597763b03fc60b": true, + "57cffe20245977632f391a9d": true, + "57d14d2524597714373db789": true, + "57d14e1724597714010c3f4b": true, + "57d1519e24597714373db79d": true, + "57d152ec245977144076ccdf": true, + "57d17c5e2459775a5c57d17d": true, + "57d17e212459775a1179a0f5": true, + "57da93632459771cb65bf83f": true, + "57dbb57e2459774673234890": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "57e26ea924597715ca604a09": true, + "57e26fc7245977162a14b800": true, + "57ee59b42459771c7b045da5": true, + "57f3a5ae2459772b0e0bf19e": true, + "57f3c6bd24597738e730fa2f": true, + "57f3c7e024597738ea4ba286": true, + "57f3c8cc2459773ec4480328": true, + "57f4c844245977379d5c14d1": true, + "57fd23e32459772d0805bcf1": true, + "57ffa9f4245977728561e844": true, + "57ffaea724597779f52b3a4d": true, + "57ffb0062459777a045af529": true, + "57ffb0e42459777d047111c5": true, + "5811ce772459770e9e5f9532": false, + "5827272a24597748c74bdeea": true, + "58272b392459774b4c7b3ccd": true, + "58272b842459774abc128d50": true, + "58272d7f2459774f6311ddfd": true, + "583990e32459771419544dd2": true, + "5839a40f24597726f856b511": true, + "5839a7742459773cf9693481": true, + "58491f3324597764bc48fa02": true, + "584924ec24597768f12ae244": true, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "587de4282459771bca0ec90b": true, + "587de5ba2459771c0f1e8a58": true, + "587df583245977373c4f1129": true, + "587e02ff24597743df3deaeb": true, + "587e0531245977466077a0f7": true, + "587e08ee245977446b4410cf": true, + "588200af24597742fa221dfb": true, + "588200c224597743990da9ed": true, + "588200cf2459774414733d55": true, + "588226d124597767ad33f787": true, + "588226dd24597767ad33f789": true, + "588226e62459776e3e094af7": true, + "588226ef24597767af46e39c": true, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "588892092459774ac91d4b11": true, + "5888945a2459774bf43ba385": true, + "5888956924597752983e182d": true, + "5888961624597754281f93f3": true, + "5888976c24597754281f93f5": true, + "5888988e24597752fe43a6fa": true, + "5888996c24597754281f9419": true, + "58889c7324597754281f9439": true, + "58889d0c2459775bc215d981": true, + "588b56d02459771481110ae2": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "58949fac86f77409483e16aa": true, + "5894a05586f774094708ef75": true, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "58a56f8d86f774651579314c": true, + "58a5c12e86f7745d585a2b9e": true, + "58ac1bf086f77420ed183f9f": true, + "58ac60eb86f77401897560ff": true, + "58aeaaa886f7744fc1560f81": true, + "58aeac1b86f77457c419f475": true, + "58c157be86f77403c74b2bb6": true, + "58c157c886f774032749fb06": true, + "58d2664f86f7747fec5834f6": true, + "58d268fc86f774111273f8c2": true, + "58d2912286f7744e27117493": true, + "58d2946386f774496974c37e": true, + "58d2946c86f7744e271174b5": true, + "58d2947686f774485c6a1ee5": true, + "58d2947e86f77447aa070d53": true, + "58d399e486f77442e0016fe7": true, + "58d39b0386f77443380bf13c": true, + "58d39d3d86f77445bb794ae7": true, + "58dd3ad986f77403051cba8f": true, + "5900b89686f7744e704a8747": true, + "590c5d4b86f774784e1b9c45": false, + "590c60fc86f77412b13fddcf": true, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": true, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": true, + "591aef7986f774139d495f03": true, + "591af10186f774139d495f0e": true, + "591af28e86f77414a27a9e1d": true, + "591c4e1186f77410354b316e": true, + "591c4efa86f7741030027726": true, + "591ee00d86f774592f7b841e": true, + "5926bb2186f7744b1c6c6e60": true, + "5926c0df86f77462f647f764": true, + "5926c32286f774616e42de99": true, + "5926c36d86f77467a92a8629": true, + "5926c3b286f774640d189b6b": true, + "5926d2be86f774134d668e4e": true, + "5926d33d86f77410de68ebc0": true, + "5926d3c686f77410de68ebc8": true, + "5926d40686f7740f152b6b7e": true, + "5926dad986f7741f82604363": true, + "5926e16e86f7742f5a0f7ecb": true, + "5926f2e086f7745aae644231": true, + "5926f34786f77469195bfe92": true, + "5929a2a086f7744f4b234d43": true, + "592c2d1a86f7746dbe2af32a": true, + "593d1fa786f7746da62d61ac": true, + "593d489686f7745c6255d58a": true, + "593d490386f7745ee97a1555": true, + "593d493f86f7745e6b2ceb22": true, + "5943d9c186f7745a13413ac9": true, + "5943ee5a86f77413872d25ec": true, + "5943eeeb86f77412d6384f6b": true, + "5947c73886f7747701588af5": true, + "5947db3f86f77447880cf76f": true, + "5947e98b86f774778f1448bc": true, + "5947eab886f77475961d96c5": true, + "5947f92f86f77427344a76b1": true, + "5947fa2486f77425b47c1a9b": true, + "595cf16b86f77427440c32e2": true, + "595cfa8b86f77427437e845b": true, + "5996f6cb86f774678763a6ca": true, + "5996f6d686f77467977ba6cc": true, + "5996f6fc86f7745e585b4de3": true, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a6c86f77414ec448d17": true, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59bfc5c886f7743bf6794e62": true, + "59bfe68886f7746004266202": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c0ec5b86f77435b128bfca": true, + "59c1383d86f774290a37e0ca": true, + "59c63b4486f7747afb151c1c": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "59d6272486f77466146386ff": true, + "59d64ec286f774171d1e0a42": true, + "59d650cf86f7741b846413a4": true, + "59d790f486f77403cb06aec6": true, + "59db3a1d86f77429e05b4e92": true, + "59db3acc86f7742a2c4ab912": true, + "59db3b0886f77429d72fb895": true, + "59db7e1086f77448be30ddf3": true, + "59db7eed86f77461f8380365": true, + "59e0bdb186f774156f04ce82": true, + "59e0be5d86f7742d48765bd2": true, + "59e0bed186f774156f04ce84": true, + "59e0d99486f7744a32234762": true, + "59e3577886f774176a362503": true, + "59e4cf5286f7741778269d8a": true, + "59e4d24686f7741776641ac7": true, + "59e4d3d286f774176a36250a": true, + "59e5f5a486f7746c530b3ce2": true, + "59e6152586f77473dc057aa1": true, + "59e649f986f77411d949b246": true, + "59e6542b86f77411dc52a77a": true, + "59e655cb86f77411dc52a77b": true, + "59e6658b86f77411d949b250": true, + "59e6687d86f77411d949b251": true, + "59e68f6f86f7746c9f75e846": true, + "59e6906286f7746c9f75e847": true, + "59e690b686f7746c9f75e848": true, + "59e6918f86f7746c9f75e849": true, + "59e6920f86f77411d82aa167": true, + "59e6927d86f77411da468256": true, + "59e7635f86f7742cbf2c1095": true, + "59e763f286f7742ee57895da": true, + "59e7643b86f7742cbf2c109a": true, + "59e7708286f7742cbd762753": true, + "59e770b986f7742cbd762754": true, + "59e770f986f7742cbe3164ef": true, + "59e7711e86f7746cae05fbe1": true, + "59e7715586f7742ee5789605": true, + "59e77a2386f7742ee578960a": true, + "59e8977386f77415a553c453": true, + "59eb7ebe86f7740b373438ce": true, + "59ecc28286f7746d7a68aa8c": true, + "59ecc3dd86f7746dc827481c": true, + "59ef13ca86f77445fd0e2483": true, + "59f8a37386f7747af3328f06": true, + "59f98b4986f7746f546d2cef": true, + "59f99a7d86f7745b134aa97b": true, + "59f9cabd86f7743a10721f46": true, + "59f9d81586f7744c7506ee62": true, + "59fafc5086f7740dbe19f6c3": true, + "59fafc9386f774067d462453": true, + "59fafd4b86f7745ca07e1232": true, + "59fb042886f7746c5005a7b2": true, + "59fb137a86f7740adb646af1": true, + "59fb257e86f7742981561852": true, + "59fb375986f7741b681b81a6": true, + "59fc48e086f77463b1118392": true, + "59ff346386f77477562ff5e2": true, + "5a0060fc86f7745793204432": true, + "5a01ad4786f77450561fda02": true, + "5a0abb6e1526d8000a025282": true, + "5a0c27731526d80618476ac4": true, + "5a0c59791526d8dba737bba7": true, + "5a0d63621526d8dba31fe3bf": true, + "5a0d716f1526d8000d26b1e2": true, + "5a0eb980fcdbcb001a3b00a6": true, + "5a0ec13bfcdbcb00165aa685": true, + "5a0ed824fcdbcb0176308b0d": true, + "5a0f096dfcdbcb0176308b15": true, + "5a154d5cfcdbcb001a3b00da": true, + "5a16b672fcdbcb001912fa83": true, + "5a16b7e1fcdbcb00165aa6c9": true, + "5a16b8a9fcdbcb00165aa6ca": true, + "5a16b93dfcdbcbcae6687261": true, + "5a16b9fffcdbcb0176308b34": true, + "5a16ba61fcdbcb098008728a": true, + "5a16badafcdbcb001865f72d": true, + "5a16bb52fcdbcb001a3b00dc": true, + "5a17f98cfcdbcb0980087290": true, + "5a17fb9dfcdbcbcae6687291": true, + "5a17fc70fcdbcb0176308b3d": true, + "5a1eaa87fcdbcb001865f75e": true, + "5a1eacb3fcdbcb09800872be": true, + "5a1ead28fcdbcb001912fa9f": true, + "5a269f97c4a282000b151807": true, + "5a26abfac4a28232980eabff": true, + "5a26ac06c4a282000c5a90a8": true, + "5a26ac0ec4a28200741e1e18": true, + "5a27b281c4a28200741e1e52": true, + "5a27b3d0c4a282000d721ec1": true, + "5a27b6bec4a282000e496f78": true, + "5a27bad7c4a282000b15184b": true, + "5a2a57cfc4a2826c6e06d44a": true, + "5a329052c4a28200741e22d3": true, + "5a32a064c4a28200741e22de": true, + "5a32aa0cc4a28232996e405f": true, + "5a32aa8bc4a2826c6e06d737": true, + "5a339805c4a2826c6e06d73d": true, + "5a33a8ebc4a282000c5a950d": true, + "5a33b2c9c4a282000c5a9511": true, + "5a33b652c4a28232996e407c": true, + "5a33bab6c4a28200741e22f8": true, + "5a33ca0fc4a282000d72292f": true, + "5a33cae9c4a28232980eb086": true, + "5a33e75ac4a2826c6e06d759": true, + "5a34f7f1c4a2826c6e06d75d": true, + "5a34fae7c4a2826c6e06d760": true, + "5a34fbadc4a28200741e230a": true, + "5a34fd2bc4a282329a73b4c5": true, + "5a34fe59c4a282000b1521a2": true, + "5a3501acc4a282000d72293a": true, + "5a351711c4a282000b1521a4": true, + "5a367e5dc4a282000e49738f": true, + "5a37ca54c4a282000d72296a": true, + "5a37cb10c4a282329a73b4e7": true, + "5a38e6bac4a2826c6e06d79b": true, + "5a38ed75c4a28232996e40c6": true, + "5a38ee51c4a282000c5a955c": true, + "5a398ab9c4a282000c5a9842": true, + "5a398b75c4a282000a51a266": true, + "5a3c16fe86f77452b62de32a": true, + "5a43943586f77416ad2f06e2": true, + "5a43957686f7742a2c2f11b0": true, + "5a5f1ce64f39f90b401987bc": true, + "5a6086ea4f39f99cd479502f": true, + "5a608bf24f39f98ffc77720e": true, + "5a69a2ed8dc32e000d46d1f1": true, + "5a6b585a8dc32e5a9c28b4f1": true, + "5a6b592c8dc32e00094b97bf": true, + "5a6b59a08dc32e000b452fb7": true, + "5a6b5b8a8dc32e001207faf3": true, + "5a6b5e468dc32e001207faf5": true, + "5a6b5ed88dc32e000c52ec86": true, + "5a6b5f868dc32e000a311389": true, + "5a6b60158dc32e000a31138b": true, + "5a6f58f68dc32e000a311390": true, + "5a6f5d528dc32e00094b97d9": true, + "5a6f5e048dc32e00094b97da": true, + "5a6f5f078dc32e00094b97dd": true, + "5a702d198dc32e000b452fc3": true, + "5a7033908dc32e000a311392": true, + "5a70366c8dc32e001207fb06": true, + "5a7037338dc32e000d46d257": true, + "5a705e128dc32e000d46d258": true, + "5a718b548dc32e000d46d262": true, + "5a718da68dc32e000d46d264": true, + "5a718f958dc32e00094b97e7": true, + "5a71e0048dc32e000c52ecc8": true, + "5a71e0fb8dc32e00094b97f2": true, + "5a71e1868dc32e00094b97f3": true, + "5a71e22f8dc32e00094b97f4": true, + "5a71e4f48dc32e001207fb26": true, + "5a787ebcc5856700142fdd98": true, + "5a787f25c5856700186c4ab9": true, + "5a787f7ac5856700177af660": true, + "5a787fadc5856700155a6ca1": true, + "5a787fdfc5856700142fdd9a": true, + "5a788031c585673f2b5c1c79": true, + "5a788068c5856700137e4c8f": true, + "5a788089c5856700142fdd9c": true, + "5a7880d0c5856700142fdd9d": true, + "5a78813bc5856700186c4abe": true, + "5a788169c5856700142fdd9e": true, + "5a789261c5856700186c65d3": true, + "5a7893c1c585673f2b5c374d": true, + "5a78948ec5856700177b1124": true, + "5a7ad0c451dfba0013379712": true, + "5a7ad1fb51dfba0013379715": true, + "5a7ad2e851dfba0016153692": true, + "5a7ad4af51dfba0013379717": true, + "5a7ad55551dfba0015068f42": true, + "5a7ad74e51dfba0015068f45": true, + "5a7ae0c351dfba0017554310": true, + "5a7afa25e899ef00135e31b0": true, + "5a7b32a2e899ef00135e345a": true, + "5a7b483fe899ef0016170d15": true, + "5a7b4900e899ef197b331a2a": true, + "5a7b4960e899ef197b331a2d": true, + "5a7c147ce899ef00150bd8b8": true, + "5a7c4850e899ef00150be885": true, + "5a7c74b3e899ef0014332c29": true, + "5a7d90eb159bd400165484f1": true, + "5a7d9104159bd400134c8c21": true, + "5a7d9122159bd4001438dbf4": true, + "5a7d912f159bd400165484f3": true, + "5a7dbfc1159bd40016548fde": true, + "5a800961159bd4315e3a1657": true, + "5a8036fb86f77407252ddc02": true, + "5a80a29286f7742b25692012": true, + "5a9548c9159bd400133e97b3": true, + "5a957c3fa2750c00137fa5f7": true, + "5a966ec8a2750c00171b3f36": true, + "5a966f51a2750c00156aacf6": true, + "5a9685b1a2750c0032157104": true, + "5a9d56c8a2750c0032157146": true, + "5a9d6d00a2750c5c985b5305": true, + "5a9d6d13a2750c00164f6b03": true, + "5a9d6d21a2750c00137fa649": true, + "5a9d6d34a2750c00141e07da": true, + "5a9e81fba2750c00164f6b11": true, + "5a9ea27ca2750c00137fa672": true, + "5a9eb32da2750c00171b3f9c": true, + "5a9fb739a2750c003215717f": true, + "5a9fbacda2750c00141e080f": true, + "5a9fbb74a2750c0032157181": true, + "5a9fbb84a2750c00137fa685": true, + "5a9fc7e6a2750c0032157184": true, + "5aa2b87de5b5b00016327c25": false, + "5aa2b89be5b5b0001569311f": true, + "5aa2b8d7e5b5b00014028f4a": true, + "5aa2b923e5b5b000137b7589": true, + "5aa2b986e5b5b00014028f4c": true, + "5aa2b9aee5b5b00015693121": true, + "5aa2b9ede5b5b000137b758b": true, + "5aa2ba19e5b5b00014028f4e": true, + "5aa2ba46e5b5b000137b758d": true, + "5aa2ba71e5b5b000137b758f": true, + "5aa66a9be5b5b0214e506e89": true, + "5aa66be6e5b5b0214e506e97": true, + "5aa66c72e5b5b00016327c93": true, + "5aa7cfc0e5b5b00015693143": false, + "5aa7d193e5b5b000171d063f": true, + "5aa7e276e5b5b000171d0647": true, + "5aa7e373e5b5b000137b76f0": true, + "5aa7e3abe5b5b000171d064d": true, + "5aa7e454e5b5b0214e506fa2": true, + "5aa7e4a4e5b5b000137b76f2": true, + "5aaa4194e5b5b055d06310a5": true, + "5aaa5dfee5b5b000140293d3": true, + "5aaa5e60e5b5b000140293d6": true, + "5aaf8a0be5b5b00015693243": true, + "5aaf8e43e5b5b00015693246": true, + "5aaf9d53e5b5b00015042a52": true, + "5aafa1c2e5b5b00015042a56": true, + "5aafa49ae5b5b00015042a58": true, + "5aafa857e5b5b00018480968": true, + "5aafbde786f774389d0cbc0f": true, + "5ab24ef9e5b5b00fe93c9209": true, + "5ab372a310e891001717f0d8": true, + "5ab3afb2d8ce87001660304d": true, + "5ab8dab586f77441cd04f2a2": true, + "5ab8dced86f774646209ec87": true, + "5ab8e4ed86f7742d8e50c7fa": true, + "5ab8e79e86f7742d8b372e78": true, + "5ab8e9fcd8ce870019439434": true, + "5ab8ebf186f7742d8b372e80": true, + "5ab8f04f86f774585f4237d8": true, + "5ab8f20c86f7745cdb629fb2": true, + "5ab8f39486f7745cd93a1cca": true, + "5ab8f4ff86f77431c60d91ba": true, + "5ab8f85d86f7745cd93a1cf5": true, + "5abcbb20d8ce87001773e258": true, + "5abcbc27d8ce8700182eceeb": true, + "5abcc328d8ce8700194394f3": true, + "5abccb7dd8ce87001773e277": true, + "5ac4c50d5acfc40019262e87": true, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac66c5d5acfc4001718d314": true, + "5ac66cb05acfc40198510a10": true, + "5ac66d015acfc400180ae6e4": true, + "5ac66d2e5acfc43b321d4b53": true, + "5ac66d725acfc43b321d4b60": true, + "5ac66d9b5acfc4001633997a": true, + "5ac72e475acfc400180ae6fe": true, + "5ac733a45acfc400192630e2": true, + "5ac7655e5acfc40016339a19": false, + "5ac78eaf5acfc4001926317a": true, + "5ac8d6885acfc400180ae7b0": true, + "5addba3e5acfc4001669f0ab": true, + "5addbac75acfc400194dbc56": true, + "5addbb6e5acfc408fb1393fd": true, + "5addbb825acfc408fb139400": true, + "5addbb945acfc4001a5fc44e": true, + "5addbba15acfc400185c2854": true, + "5addbbb25acfc40015621bd9": true, + "5addbf175acfc408fb13965b": true, + "5addbfbb5acfc400194dbcf7": true, + "5addbfd15acfc40015621bde": true, + "5addbfe15acfc4001a5fc58b": true, + "5addbfef5acfc400185c2857": true, + "5addbffe5acfc4001714dfac": true, + "5addc00b5acfc4001669f144": true, + "5addc7005acfc4001669f275": true, + "5addc7ac5acfc400194dbd90": true, + "5addc7db5acfc4001669f279": true, + "5addcce35acfc4001a5fc635": true, + "5addccf45acfc400185c2989": true, + "5adf23995acfc400185c2aeb": true, + "5ae096d95acfc400185c2c81": true, + "5ae30bad5acfc400185c2dc4": true, + "5ae30c9a5acfc408fb139a03": true, + "5ae30db85acfc408fb139a05": true, + "5ae30e795acfc408fb139a0b": true, + "5ae35b315acfc4001714e8b0": true, + "5af0454c86f7746bf20992e8": true, + "5af0548586f7743a532b7e99": true, + "5afd7ded5acfc40017541f5e": true, + "5afd7e095acfc40017541f61": true, + "5afd7e445acfc4001637e35a": true, + "5b04473a5acfc40018632f70": true, + "5b057b4f5acfc4771e1bd3e9": true, + "5b07db875acfc40dc528a5f6": true, + "5b07dd285acfc4001754240d": true, + "5b0800175acfc400153aebd4": true, + "5b099a765acfc47a8607efe3": true, + "5b099a9d5acfc47a8607efe7": true, + "5b099ac65acfc400186331e1": true, + "5b099b7d5acfc400186331e4": true, + "5b099b965acfc400186331e6": true, + "5b099bb25acfc400186331e8": true, + "5b099bf25acfc4001637e683": true, + "5b0bbe4e5acfc40dc528a72d": true, + "5b0bc22d5acfc47a8607f085": true, + "5b0e794b5acfc47a877359b2": true, + "5b1fa9b25acfc40018633c01": true, + "5b1fa9ea5acfc40018633c0a": true, + "5b1faa0f5acfc40dc528aeb5": true, + "5b1fb3e15acfc4001637f068": true, + "5b1fd4e35acfc40018633c39": true, + "5b222d335acfc4771e1be099": true, + "5b222d405acfc400153af4fe": true, + "5b2240bf5acfc40dc528af69": true, + "5b237e425acfc4771e1be0b6": true, + "5b2388675acfc4771e1be0be": true, + "5b2389515acfc4771e1be0c0": true, + "5b2cfa535acfc432ff4db7a0": true, + "5b30ac585acfc433000eb79c": true, + "5b30b0dc5acfc400153b7124": true, + "5b30bc165acfc40016387293": true, + "5b30bc285acfc47a8608615d": true, + "5b31163c5acfc400153b71cb": true, + "5b3116595acfc40019476364": true, + "5b363dd25acfc4001a598fd2": true, + "5b363dea5acfc4771e1c5e7e": true, + "5b363e1b5acfc4771e1c5e80": true, + "5b39f8db5acfc40016387a1b": true, + "5b39ffbd5acfc47a8773fb06": true, + "5b3a08b25acfc4001754880c": true, + "5b3a16655acfc40016387a2a": true, + "5b3a337e5acfc4704b4a19a0": true, + "5b3b6dc75acfc47a8773fb1e": true, + "5b3b6e495acfc4330140bd88": true, + "5b3b713c5acfc4330140bd8d": true, + "5b3b99265acfc4704b4a1afb": true, + "5b3b99475acfc432ff4dcbee": true, + "5b3baf8f5acfc40dc5296692": true, + "5b3cadf35acfc400194776a0": true, + "5b3cbc235acfc4001863ac44": true, + "5b3f7bf05acfc433000ecf6b": true, + "5b3f7c005acfc4704b4a1de8": true, + "5b3f7c1c5acfc40dc5296b1d": true, + "5b40e1525acfc4771e1c6611": true, + "5b40e2bc5acfc40016388216": true, + "5b40e3f35acfc40016388218": true, + "5b40e4035acfc47a87740943": true, + "5b40e5e25acfc4001a599bea": true, + "5b40e61f5acfc4001a599bec": true, + "5b4325355acfc40019478126": true, + "5b4326435acfc433000ed01d": true, + "5b43271c5acfc432ff4dce65": true, + "5b4327aa5acfc400175496e0": true, + "5b4329075acfc400153b78ff": true, + "5b4329f05acfc47a86086aa1": true, + "5b432b2f5acfc4771e1c6622": true, + "5b432b6c5acfc4001a599bf0": true, + "5b432b965acfc47a8774094e": true, + "5b432be65acfc433000ed01f": true, + "5b432c305acfc40019478128": true, + "5b432d215acfc4771e1c6624": true, + "5b432f3d5acfc4704b4a1dfb": true, + "5b44c6ae86f7742d1627baea": true, + "5b44c8ea86f7742d1627baf1": true, + "5b44cad286f77402a54ae7e5": true, + "5b44cd8b86f774503d30cba2": true, + "5b44cf1486f77431723e3d05": true, + "5b44d0de86f774503d30cba8": true, + "5b44d22286f774172b0c9de8": true, + "5b46238386f7741a693bcf9c": true, + "5b4736a986f774040571e998": true, + "5b4736b986f77405cb415c10": true, + "5b7be1125acfc4001876c0e5": true, + "5b7be1265acfc400161d0798": true, + "5b7be1ca5acfc400170e2d2f": true, + "5b7be2345acfc400196d524a": true, + "5b7be4575acfc400161d0832": true, + "5b7be4645acfc400170e2dcc": true, + "5b7be46e5acfc400170e2dcf": true, + "5b7be47f5acfc400170e2dd2": true, + "5b7be4895acfc400170e2dd5": true, + "5b7bebc85acfc43bca706666": true, + "5b7bed205acfc400161d08cc": true, + "5b7bedd75acfc43d825283f9": true, + "5b7bee755acfc400196d5383": true, + "5b7bef1e5acfc43d82528402": true, + "5b7bef5d5acfc43bca7067a3": true, + "5b7bef9c5acfc43d102852ec": true, + "5b7c2d1d5acfc43d1028532a": true, + "5b7c710788a4506dec015957": true, + "5b7d37845acfc400170e2f87": true, + "5b7d63b75acfc400170e2f8a": true, + "5b7d63cf5acfc4001876c8df": true, + "5b7d63de5acfc400170e2f8d": true, + "5b7d64555acfc4001876c8e2": true, + "5b7d645e5acfc400170e2f90": true, + "5b7d671b5acfc43d82528ddd": true, + "5b7d678a5acfc4001a5c4022": true, + "5b7d679f5acfc4001a5c4024": true, + "5b7d68af5acfc400170e30c3": true, + "5b7d693d5acfc43bca706a3d": true, + "5b7d6c105acfc40015109a5f": true, + "5b800e9286f7747a8b04f3ff": true, + "5b800ebc86f774394e230a90": true, + "5b800ed086f7747baf6e2f9e": true, + "5b80242286f77429445e0b47": true, + "5b84038986f774774913b0c1": true, + "5b8403a086f7747ff856f4e2": true, + "5b86a0e586f7745b600ccb23": true, + "5ba26383d4351e00334c93d9": true, + "5ba264f6d4351e0034777d52": true, + "5ba2657ed4351e0035628ff2": true, + "5ba26586d4351e44f824b340": true, + "5ba2678ad4351e44f824b344": true, + "5ba26812d4351e003201fef1": true, + "5ba26835d4351e0035628ff5": true, + "5ba26844d4351e00334c9475": true, + "5ba26acdd4351e003562908e": true, + "5ba26ae8d4351e00367f9bdb": true, + "5ba26b01d4351e0085325a51": true, + "5ba26b17d4351e00367f9bdd": true, + "5ba36f85d4351e0085325c81": true, + "5bae13bad4351e00320204af": true, + "5bae13ded4351e44f824bf38": true, + "5bb20d53d4351e4502010a69": true, + "5bb20d92d4351e00853263eb": true, + "5bb20d9cd4351e00334c9d8a": true, + "5bb20da5d4351e0035629dbf": true, + "5bb20dadd4351e00367faeff": true, + "5bb20dbcd4351e44f824c04e": true, + "5bb20dcad4351e3bac1212da": true, + "5bb20de5d4351e0035629e59": true, + "5bb20df1d4351e00347787d5": true, + "5bb20dfcd4351e00334c9e24": true, + "5bb20e0ed4351e3bac1212dc": true, + "5bb20e18d4351e00320205d5": true, + "5bb20e49d4351e3bac1212de": true, + "5bb20e58d4351e00320205d7": true, + "5bb20e70d4351e0035629f8f": true, + "5bb2475ed4351e00853264e3": true, + "5bbdb811d4351e45020113c7": true, + "5bbdb83fd4351e44f824c44b": true, + "5bbdb870d4351e00367fb67d": true, + "5bbdb8bdd4351e4502011460": true, + "5bbde409d4351e003562b036": true, + "5bbde41ed4351e003562b038": true, + "5bc09a18d4351e003562b68e": true, + "5bc09a30d4351e00367fb7c8": true, + "5bc5a351d4351e003477a414": true, + "5bc5a35cd4351e450201232f": true, + "5bc5a372d4351e44f824d17f": true, + "5bc9c1e2d4351e00367fbcf0": true, + "5bc9c29cd4351e003562b8a3": true, + "5bcf0213d4351e0085327c17": true, + "5bd06f5d86f77427101ad47c": true, + "5bd0716d86f774171822ef4b": true, + "5bd071d786f7747e707b93a3": true, + "5bd073a586f7747e6f135799": true, + "5bd073c986f7747f627e796c": true, + "5bd70322209c4d00d7167b8f": true, + "5bd704e7209c4d00d7167c31": true, + "5be4038986f774527d3fae60": true, + "5bead2e00db834001c062938": true, + "5bed61680db834001d2c45ab": true, + "5bed625c0db834001c062946": true, + "5beec1bd0db834001e6006f3": true, + "5beec2820db834001b095426": true, + "5beec3420db834001b095429": true, + "5beec3e30db8340019619424": true, + "5beec8b20db834001961942a": true, + "5beec8c20db834001d2c465c": true, + "5beec8ea0db834001a6f9dbf": true, + "5beec91a0db834001961942d": true, + "5beec9450db83400970084fd": true, + "5beecbb80db834001d2c465e": true, + "5beed0f50db834001c062b12": true, + "5bf3e03b0db834001d2c4a9c": true, + "5bf3e0490db83400196199af": true, + "5bf3f59f0db834001a6fa060": true, + "5bfd297f0db834001a669119": true, + "5bfd35380db83400232fe5cc": true, + "5bfd36290db834001966869a": true, + "5bfd36ad0db834001c38ef66": true, + "5bfd37c80db834001d23e842": true, + "5bfd384c0db834001a6691d3": true, + "5bfd4c980db834001b73449d": true, + "5bfd4cbe0db834001b73449f": true, + "5bfd4cc90db834001d23e846": true, + "5bfd4cd60db834001c38f095": true, + "5bfe7fb30db8340018089fed": true, + "5bfe86a20db834001d23e8f7": true, + "5bfe86bd0db83400232fe959": true, + "5bfe86df0db834001b734685": true, + "5bfe89510db834001808a127": true, + "5bfea6e90db834001b7347f3": true, + "5bfea7ad0db834001c38f1ee": true, + "5bfeaa0f0db834001b734927": true, + "5bfeb32b0db834001a6694d9": true, + "5bfebc250db834001a6694e1": true, + "5bfebc320db8340019668d79": true, + "5bfebc530db834001d23eb65": true, + "5bfebc5e0db834001a6694e5": true, + "5bffcf7a0db83400232fea79": true, + "5bffd7ed0db834001d23ebf9": true, + "5bffdc370db834001d23eca8": false, + "5bffdd7e0db834001b734a1a": true, + "5bffe7930db834001b734a39": true, + "5bffe7c50db834001d23ece1": true, + "5bffec120db834001c38f5fa": true, + "5bffef760db8340019668fe4": true, + "5c0000c00db834001a6697fc": true, + "5c0006470db834001a6697fe": true, + "5c00076d0db834001d23ee1f": true, + "5c0009510db834001966907f": true, + "5c0102aa0db834001b734ba1": true, + "5c0102b20db834001d23eebc": true, + "5c010a700db834001d23ef5d": true, + "5c010e350db83400232feec7": true, + "5c0111ab0db834001966914d": true, + "5c0125fc0db834001a669aa3": true, + "5c0126f40db834002a125382": true, + "5c012ffc0db834001d23f03f": true, + "5c0505e00db834001b735073": true, + "5c0517910db83400232ffee5": true, + "5c05293e0db83400232fff80": true, + "5c05295e0db834001a66acbb": true, + "5c052a900db834001a66acbd": true, + "5c05413a0db834001c390617": true, + "5c0548ae0db834001966a3c2": true, + "5c0558060db834001b735271": true, + "5c064c400db834001d23f468": true, + "5c06595c0db834001a66af6c": true, + "5c066e3a0db834001b7353f0": true, + "5c066ef40db834001966a595": true, + "5c0672ed0db834001b7353f3": true, + "5c0673fb0db8340023300271": true, + "5c0684e50db834002a12585a": true, + "5c0695860db834001b735461": true, + "5c0696830db834001d23f5da": true, + "5c06c6a80db834001b735491": true, + "5c079ec50db834001966a706": true, + "5c079ed60db834001a66b372": true, + "5c07a8770db8340023300450": true, + "5c07b36c0db834002a1259e9": true, + "5c07b3850db834002330045b": true, + "5c07c5ed0db834001b73571c": true, + "5c07c60e0db834002330051f": true, + "5c07c9660db834001a66b588": true, + "5c07dd120db834001c39092d": true, + "5c07df7f0db834001b73588a": true, + "5c08f87c0db8340019124324": true, + "5c0919b50db834001b7ce3b9": true, + "5c091a4e0db834001d5addc8": true, + "5c093ca986f7740a1867ab12": true, + "5c093e3486f77430cb02e593": true, + "5c0a2cec0db834001b7ce47d": true, + "5c0d2727d174af02a012cf58": true, + "5c0d32fcd174af02a1659c75": true, + "5c0d56a986f774449d5de529": true, + "5c0d591486f7744c505b416f": true, + "5c0d5ae286f7741e46554302": true, + "5c0d5e4486f77478390952fe": true, + "5c0d668f86f7747ccb7f13b2": true, + "5c0d688c86f77413ae3407b2": true, + "5c0e2f26d174af02a9625114": true, + "5c0e2f5cd174af02a012cfc9": true, + "5c0e2f94d174af029f650d56": true, + "5c0e2ff6d174af02a1659d4a": true, + "5c0e3eb886f7742015526062": true, + "5c0e446786f7742013381639": true, + "5c0e51be86f774598e797894": true, + "5c0e530286f7747fa1419862": true, + "5c0e531286f7747fa54205c2": true, + "5c0e531d86f7747fa23f4d42": true, + "5c0e533786f7747fa23f4d47": true, + "5c0e534186f7747fa1419867": true, + "5c0e53c886f7747fa54205c7": true, + "5c0e541586f7747fa54205c9": true, + "5c0e57ba86f7747fa141986d": true, + "5c0e5bab86f77461f55ed1f3": true, + "5c0e5edb86f77461f55ed1f7": true, + "5c0e625a86f7742d77340f62": true, + "5c0e655586f774045612eeb2": true, + "5c0e66e2d174af02a96252f4": true, + "5c0e6a1586f77404597b4965": true, + "5c0e722886f7740458316a57": true, + "5c0e746986f7741453628fe5": true, + "5c0e774286f77468413cc5b2": true, + "5c0e805e86f774683f3dd637": true, + "5c0e842486f77443a74d2976": true, + "5c0e874186f7745dc7616606": true, + "5c0fa877d174af02a012e1cf": true, + "5c0faeddd174af02a962601f": true, + "5c0faf68d174af02a96260b8": true, + "5c0fafb6d174af02a96260ba": true, + "5c10c8fd86f7743d7d706df3": true, + "5c11046cd174af02a012e42b": true, + "5c110624d174af029e69734c": true, + "5c11279ad174af029d64592b": true, + "5c1127bdd174af44217ab8b9": true, + "5c1127d0d174af29be75cf68": true, + "5c1260dc86f7746b106e8748": true, + "5c12619186f7743f871c8a32": true, + "5c1262a286f7743f8a69aab2": true, + "5c165d832e2216398b5a7e36": true, + "5c17664f2e2216398b5a7e3c": true, + "5c1780312e221602b66cc189": true, + "5c17804b2e2216152006c02f": true, + "5c178a942e22164bef5ceca3": true, + "5c1793902e221602b21d3de2": true, + "5c17a7ed2e2216152142459c": true, + "5c18b90d2e2216152142466b": true, + "5c18b9192e2216398b5a8104": true, + "5c1a1cc52e221602b3136e3d": true, + "5c1a1e3f2e221602b66cc4c2": true, + "5c1bc4812e22164bef5cfde7": true, + "5c1bc5612e221602b5429350": true, + "5c1bc5af2e221602b412949b": true, + "5c1bc5fb2e221602b1779b32": true, + "5c1bc7432e221602b412949d": true, + "5c1bc7752e221602b1779b34": true, + "5c1cd46f2e22164bef5cfedb": true, + "5c1cdd302e221602b3137250": true, + "5c1cdd512e22161b267d91ae": true, + "5c3df7d588a4501f290594e5": true, + "5c46fbd72e2216398b5a8c9c": true, + "5c471b5d2e221602b21d4e14": true, + "5c471b7e2e2216152006e46c": true, + "5c471ba12e221602b3137d76": true, + "5c471bd12e221602b4129c3a": true, + "5c471be12e221602b66cd9ac": true, + "5c471bfc2e221602b21d4e17": true, + "5c471c2d2e22164bef5d077f": true, + "5c471c442e221602b542a6f8": true, + "5c471c6c2e221602b66cd9ae": true, + "5c471c842e221615214259b5": true, + "5c471cb32e221602b177afaa": true, + "5c488a752e221602b412af63": true, + "5c48a14f2e2216152006edd7": true, + "5c48a2852e221602b21d5923": true, + "5c48a2a42e221602b66d1e07": true, + "5c48a2c22e221602b313fb6c": true, + "5c4ee3d62e2216152006f302": true, + "5c4eec9b2e2216398b5aaba2": true, + "5c4eecc32e221602b412b440": true, + "5c4eecde2e221602b3140418": true, + "5c501a4d2e221602b412b540": true, + "5c5039be2e221602b177c9ff": true, + "5c503ac82e221602b21d6e9a": true, + "5c503ad32e2216398b5aada2": true, + "5c503af12e221602b177ca02": true, + "5c503b1c2e221602b21d6e9d": true, + "5c503d0a2e221602b542b7ef": true, + "5c5952732e2216398b5abda2": true, + "5c59529a2e221602b177d160": true, + "5c5970672e221602b21d7855": true, + "5c5db5852e2216003a0fe71a": true, + "5c5db5962e2216000e5e46eb": true, + "5c5db5b82e2216003a0fe71d": true, + "5c5db5c62e22160012542255": true, + "5c5db5f22e2216000e5e47e8": true, + "5c5db5fc2e2216000f1b2842": true, + "5c5db6302e2216000e5e47f0": true, + "5c5db63a2e2216000f1b284a": true, + "5c5db6552e2216001026119d": true, + "5c5db6652e221600113fba51": true, + "5c5db6742e2216000f1b2852": true, + "5c5db6b32e221600102611a0": true, + "5c5db6ee2e221600113fba54": true, + "5c5db6f82e2216003a0fe914": true, + "5c6161fb2e221600113fbde5": true, + "5c6162682e22160010261a2b": true, + "5c61627a2e22160012542c55": true, + "5c6165902e22160010261b28": true, + "5c6175362e221600133e3b94": true, + "5c617a5f2e2216000f1e81b3": true, + "5c61a40d2e2216001403158d": true, + "5c6592372e221600133e47d7": true, + "5c6beec32e221601da3578f2": true, + "5c6bf4aa2e2216001219b0ae": true, + "5c6c2c9c2e2216000f2002e4": true, + "5c6d10e82e221601da357b07": true, + "5c6d10fa2e221600106f3f23": true, + "5c6d11072e2216000e69d2e4": true, + "5c6d11152e2216000f2003e7": true, + "5c6d42cb2e2216000e69d7d1": true, + "5c6d450c2e221600114c997d": true, + "5c6d46132e221601da357d56": true, + "5c6d5d8b2e221644fc630b39": true, + "5c6d710d2e22165df16b81e7": true, + "5c6d7b3d2e221600114c9b7d": true, + "5c6d85e02e22165df16b81f4": true, + "5c78f2492e221600114c9f04": true, + "5c78f2612e221600114c9f0d": true, + "5c78f26f2e221601da3581d1": true, + "5c78f2792e221600106f4683": true, + "5c78f2882e22165df16b832e": true, + "5c791e872e2216001219c40a": true, + "5c793fb92e221644f31bfb64": true, + "5c793fc42e221600114ca25d": true, + "5c793fde2e221601da358614": true, + "5c7951452e221644f31bfd5c": true, + "5c7954d52e221600106f4cc7": true, + "5c7955c22e221644f31bfd5e": true, + "5c7d55de2e221644f31bff68": true, + "5c7d55f52e221644f31bff6a": true, + "5c7d560b2e22160bc12c6139": true, + "5c7e5f112e221600106f4ede": true, + "5c7e8fab2e22165df16b889b": true, + "5c7fb51d2e2216001219ce11": true, + "5c7fc87d2e221644f31c0298": true, + "5c82342f2e221644f31c060e": true, + "5c82343a2e221644f31c0611": true, + "5c86592b2e2216000e69e77c": true, + "5c878e9d2e2216000f201903": true, + "5c878ebb2e2216001219d48a": true, + "5c87a07c2e2216001219d4a2": true, + "5c87ca002e221600114cb150": true, + "5c88f24b2e22160bc12c69a6": true, + "5c90c3622e221601da359851": true, + "5c920e902e221644f31c3c99": true, + "5c925fa22e221601da359b7b": true, + "5c99f3592e221644fc633070": true, + "5c9a07572e221644f31c4b32": true, + "5c9a1c3a2e2216000e69fb6a": true, + "5c9a1c422e221600106f69f0": true, + "5c9a25172e2216000f20314e": true, + "5c9a26332e2216001219ea70": true, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": true, + "5ca20ee186f774799474abc2": true, + "5ca2113f86f7740b2547e1d2": true, + "5ca21c6986f77479963115a7": true, + "5cadc1c6ae9215000f2775a4": true, + "5cadc2e0ae9215051e1c21e7": true, + "5cadc390ae921500126a77f1": true, + "5cadc431ae921500113bb8d5": true, + "5cadc55cae921500103bb3be": true, + "5cadd919ae921500126a77f3": true, + "5cadd940ae9215051e1c2316": true, + "5cadd954ae921500103bb3c2": true, + "5cadf6ddae9215051e1c23b2": true, + "5cadf6e5ae921500113bb973": true, + "5cadf6eeae921500134b2799": true, + "5cadfbf7ae92152ac412eeef": true, + "5caf1041ae92157c28402e3f": true, + "5caf1109ae9215753c44119f": true, + "5caf1691ae92152ac412efb9": true, + "5caf16a2ae92152ac412efbc": true, + "5caf17c9ae92150b30006be1": true, + "5caf187cae92157c28402e43": true, + "5cbda392ae92155f3c17c39f": true, + "5cbda9f4ae9215000e5b9bfc": true, + "5cbdaf89ae9215000e5b9c94": true, + "5cbdb1b0ae9215000d50e105": true, + "5cbdc23eae9215001136a407": true, + "5cc6ea78e4a949000e1ea3c1": true, + "5cc6ea85e4a949000e1ea3c3": true, + "5cc70093e4a949033c734312": true, + "5cc700b9e4a949000f0f0f25": true, + "5cc700cae4a949035e43ba72": true, + "5cc700d4e4a949000f0f0f28": true, + "5cc700ede4a949033c734315": true, + "5cc70102e4a949035e43ba74": true, + "5cc7012ae4a949001252b43e": true, + "5cc70146e4a949000d73bf6b": true, + "5cc7015ae4a949001152b4c6": true, + "5cc701aae4a949000e1ea45c": true, + "5cc701d7e4a94900100ac4e7": true, + "5cc80f38e4a949001152b560": true, + "5cc80f53e4a949000e1ea4f8": true, + "5cc80f67e4a949035e43bbba": true, + "5cc80f79e4a949033c7343b2": true, + "5cc80f8fe4a949033b0224a2": true, + "5cc82796e24e8d000f5859a8": true, + "5cc82d76e24e8d00134b4b83": true, + "5cc86832d7f00c000d3a6e6c": true, + "5cc86840d7f00c002412c56c": true, + "5cc9a96cd7f00c011c04e04a": true, + "5cc9ad73d7f00c000e2579d4": true, + "5cc9b815d7f00c000e2579d6": true, + "5cc9bcaed7f00c011c04e179": true, + "5cc9c20cd7f00c001336c65d": true, + "5cda9bcfd7f00c0c0b53e900": true, + "5cdaa99dd7f00c002412d0b2": true, + "5cdd7685d7f00c000f260ed2": true, + "5cdd7693d7f00c0010373aa5": true, + "5cde739cd7f00c0010373bd3": true, + "5cde77a9d7f00c000f261009": true, + "5cde7afdd7f00c000d36b89d": true, + "5cde7b43d7f00c000d36b93e": true, + "5cde8864d7f00c0010373be1": true, + "5cdeac22d7f00c000f26168f": true, + "5cdeac42d7f00c000d36ba73": true, + "5cdeac5cd7f00c000f261694": true, + "5cdeaca5d7f00c00b61c4b70": true, + "5ce69cbad7f00c00b61c5098": true, + "5cebec00d7f00c065c53522a": true, + "5cebec10d7f00c065703d185": true, + "5cebec38d7f00c00110a652a": true, + "5cf12a15d7f00c05464b293f": true, + "5cf13123d7f00c1085616a50": true, + "5cf4e3f3d7f00c06595bc7f0": true, + "5cf4fb76d7f00c065703d3ac": true, + "5cf50850d7f00c056e24104c": true, + "5cf508bfd7f00c056e24104e": true, + "5cf50fc5d7f00c056c53f83c": true, + "5cf518cfd7f00c065b422214": true, + "5cf54404d7f00c108840b2ef": true, + "5cf638cbd7f00c06595bc936": true, + "5cf639aad7f00c065703d455": true, + "5cf656f2d7f00c06585fb6eb": true, + "5cf67a1bd7f00c06585fb6f3": true, + "5cf67cadd7f00c065a5abab7": true, + "5cf6935bd7f00c06585fb791": true, + "5cf6937cd7f00c056c53fb39": true, + "5cf78496d7f00c065703d6ca": true, + "5cf78720d7f00c06595bc93e": true, + "5cf79389d7f00c10941a0c4d": true, + "5cf79599d7f00c10875d9212": true, + "5cf7acfcd7f00c1084477cf2": true, + "5cf8f3b0d7f00c00217872ef": true, + "5cfe8010d7ad1a59283b14c6": true, + "5cff9e5ed7ad1a09407397d4": true, + "5cff9e84d7ad1a049e54ed55": true, + "5d00e0cbd7ad1a6c6566a42d": true, + "5d00ec68d7ad1a04a067e5be": true, + "5d00ede1d7ad1a0940739a76": true, + "5d00ef6dd7ad1a0940739b16": true, + "5d00f63bd7ad1a59283b1c1e": true, + "5d010d1cd7ad1a59283b1ce7": true, + "5d0236dad7ad1a0940739d29": true, + "5d023784d7ad1a049d4aa7f2": true, + "5d024f5cd7ad1a04a067e91a": true, + "5d025cc1d7ad1a53845279ef": true, + "5d02676dd7ad1a049e54f6dc": true, + "5d02677ad7ad1a04a15c0f95": true, + "5d026791d7ad1a04a067ea63": true, + "5d02778e86f774203e7dedbe": true, + "5d02797c86f774203f38e30a": true, + "5d0a29ead7ad1a0026013f27": true, + "5d0a29fed7ad1a002769ad08": true, + "5d0a3a58d7ad1a669c15ca14": true, + "5d0a3e8cd7ad1a6f6a3d35bd": true, + "5d0b5cd3d7ad1a3fe32ad263": true, + "5d10b49bd7ad1a1a560708b0": true, + "5d120a10d7ad1a4e1026ba85": true, + "5d120a28d7ad1a1c8962e295": true, + "5d122e7bd7ad1a07102d6d7f": true, + "5d123102d7ad1a004e475fe5": true, + "5d123a3cd7ad1a004e476058": true, + "5d123b70d7ad1a0ee35e0754": true, + "5d123b7dd7ad1a004f01b262": true, + "5d124c01d7ad1a115c7d59fb": true, + "5d124c0ed7ad1a10d168dd9b": true, + "5d124c1ad7ad1a12227c53a7": true, + "5d133067d7ad1a33013f95b4": true, + "5d1340b3d7ad1a0b52682ed7": true, + "5d1340bdd7ad1a0e8d245aab": true, + "5d1340cad7ad1a0b0b249869": true, + "5d135e83d7ad1a21b83f42d8": true, + "5d135ecbd7ad1a21c176542e": true, + "5d15ce51d7ad1a1eff619092": true, + "5d15cf3bd7ad1a67e71518b2": true, + "5d19cd96d7ad1a4a992c9f52": true, + "5d1b198cd7ad1a604869ad72": true, + "5d1b33a686f7742523398398": true, + "5d1b36a186f7742523398433": true, + "5d1b371186f774253763a656": true, + "5d1b5e94d7ad1a2b865a96b0": true, + "5d1c702ad7ad1a632267f429": true, + "5d1f819086f7744b355c219b": true, + "5d2369418abbc306c62e0c80": true, + "5d25a4a98abbc30b917421a4": true, + "5d25a6538abbc306c62e630d": true, + "5d25a6a48abbc306c62e6310": true, + "5d25a7b88abbc3054f3e60bc": true, + "5d25af8f8abbc3055079fec5": true, + "5d25d0ac8abbc3054f3e61f7": true, + "5d2702e88abbc31ed91efc44": true, + "5d2703038abbc3105103d94c": true, + "5d270b3c8abbc3105335cfb8": true, + "5d270ca28abbc31ee25ee821": true, + "5d2c76ed48f03532f2136169": true, + "5d2c770c48f0354b4a07c100": true, + "5d2c772c48f0355d95672c25": true, + "5d2c829448f0353a5c7d6674": true, + "5d2da1e948f035477b1ce2ba": true, + "5d2dc3e548f035404a1a4798": true, + "5d2f0d8048f0356c925bc3b0": true, + "5d2f213448f0355009199284": true, + "5d2f259b48f0355a844acd74": true, + "5d2f25bc48f03502573e5d85": true, + "5d2f261548f03576f500e7b7": true, + "5d2f2ab648f03550091993ca": true, + "5d2f2d5748f03572ec0c0139": true, + "5d3eb3b0a4b93615055e84d2": true, + "5d3eb44aa4b93650d64e4979": true, + "5d3eb4aba4b93650d64e497d": true, + "5d3eb536a4b9363b1f22f8e2": true, + "5d3eb59ea4b9361c284bb4b2": true, + "5d3eb5b6a4b9361eab311902": true, + "5d3eb5eca4b9363b1f22f8e4": true, + "5d3ef698a4b9361182109872": true, + "5d403f9186f7743cac3f229b": true, + "5d40407c86f774318526545a": true, + "5d43021ca4b9362eab4b5e25": true, + "5d4405aaa4b9361e6a4e6bd3": true, + "5d4405f0a4b9361e6a4e6bd9": true, + "5d440625a4b9361eec4ae6c5": true, + "5d44064fa4b9361e4f6eb8b5": true, + "5d44069ca4b9361ebd26fc37": true, + "5d4406a8a4b9361e4f6eb8b7": true, + "5d440b93a4b9364276578d4b": true, + "5d440b9fa4b93601354d480c": true, + "5d44334ba4b9362b346d1948": true, + "5d443f8fa4b93678dd4a01aa": true, + "5d4aaa54a4b9365392071170": true, + "5d4aaa73a4b9365392071175": true, + "5d4aab30a4b9365435358c55": true, + "5d5d646386f7742797261fd9": true, + "5d5d85c586f774279a21cbdb": true, + "5d5d87f786f77427997cfaef": true, + "5d5d8ca986f7742798716522": true, + "5d5d940f86f7742797262046": true, + "5d5e7d28a4b936645d161203": true, + "5d5e9c74a4b9364855191c40": true, + "5d5fca1ea4b93635fd598c07": true, + "5d67abc1a4b93614ec50137f": true, + "5d6d2e22a4b9361bd5780d05": true, + "5d6d2ef3a4b93618084f58bd": true, + "5d6d3716a4b9361bc8618872": true, + "5d6d3829a4b9361bc8618943": true, + "5d6d3943a4b9360dbc46d0cc": true, + "5d6d3be5a4b9361bc73bc763": true, + "5d6e6772a4b936088465b17c": true, + "5d6e67fba4b9361bc73bc779": true, + "5d6e6806a4b936088465b17e": true, + "5d6e6869a4b9361c140bcfde": true, + "5d6e6891a4b9361bd473feea": true, + "5d6e689ca4b9361bc8618956": true, + "5d6e68a8a4b9360b6c0d54e2": true, + "5d6e68b3a4b9361bca7e50b5": true, + "5d6e68c4a4b9361b93413f79": true, + "5d6e68d1a4b93622fe60e845": true, + "5d6e68dea4b9361bcc29e659": true, + "5d6e68e6a4b9361c140bcfe0": true, + "5d6e6911a4b9361bd5780d52": true, + "5d6e695fa4b936359b35d852": true, + "5d6e69b9a4b9361bc8618958": true, + "5d6e69c7a4b9360b6c0d54e4": true, + "5d6e6a05a4b93618084f58d0": true, + "5d6e6a42a4b9364f07165f52": true, + "5d6e6a53a4b9361bd473feec": true, + "5d6e6a5fa4b93614ec501745": true, + "5d7b6bafa4b93652786f4c76": true, + "5d96141523f0ea1b7f2aacab": true, + "5dcbd56fdbd3d91b3e5468d5": true, + "5dcbd6b46ec07c0c4347a564": true, + "5dcbd6dddbd3d91b3e5468de": true, + "5dcbe9431e1f4616d354987e": true, + "5dcbe965e4ed22586443a79d": true, + "5de652c31b7e3716273428be": true, + "5de653abf76fdc1ce94a5a2a": true, + "5de65547883dde217541644b": true, + "5de6556a205ddc616a6bc4f7": true, + "5de6558e9f98ac2bc65950fc": true, + "5de655be4a9f347bc92edb88": true, + "5de7bd7bfd6b4e6e2276dc25": true, + "5de8e67c4a9f347bc92edbd7": true, + "5de8e8dafd6b4e6e2276dc32": true, + "5de8ea8ffd6b4e6e2276dc35": true, + "5de8eaadbbaf010b10528a6d": true, + "5de8eac42a78646d96665d91": true, + "5de8f237bbaf010b10528a70": true, + "5de8f2d5b74cd90030650c72": true, + "5de8fb539f98ac2bc659513a": true, + "5de8fbad2fbe23140d3ee9c4": true, + "5de8fbf2b74cd90030650c79": true, + "5de8fc0b205ddc616a6bc51b": true, + "5de910da8b6c4240ba2651b5": true, + "5de922d4b11454561e39239f": true, + "5df24cf80dee1b22f862e9bc": true, + "5df256570dee1b22f862e9c4": true, + "5df25b6c0b92095fd441e4cf": true, + "5df25d3bfd6b4e6e2276dc9a": true, + "5df35ddddfc58d14537c2036": true, + "5df35e59c41b2312ea3334d5": true, + "5df35e7f2a78646d96665dd4": true, + "5df35e970b92095fd441e4d2": true, + "5df35ea9c41b2312ea3334d8": true, + "5df35eb2b11454561e3923e2": true, + "5df36948bb49d91fb446d5ad": true, + "5df38a5fb74cd90030650cb6": true, + "5df8a2ca86f7740bfe6df777": true, + "5df8a42886f77412640e2e75": true, + "5df8a4d786f77412672a1e3b": true, + "5df8a58286f77412631087ed": true, + "5df8ce05b11454561e39243b": true, + "5df8e053bb49d91fb446d6a6": true, + "5df8e085bb49d91fb446d6a8": true, + "5df8e4080b92095fd441e594": true, + "5df8f535bb49d91fb446d6b0": true, + "5df8f541c41b2312ea3335e3": true, + "5df916dfbb49d91fb446d6b9": true, + "5df917564a9f347bc92edca3": true, + "5dfa397fb11454561e39246c": true, + "5dfa3cd1b33c0951220c079b": true, + "5dfa3d2b0dee1b22f862eade": true, + "5dfa3d45dfc58d14537c20b0": true, + "5dfa3d7ac41b2312ea33362a": true, + "5dfa3d950dee1b22f862eae0": true, + "5dfcd0e547101c39625f66f9": true, + "5dfce88fe9dc277128008b2e": true, + "5dfe14f30b92095fd441edaf": true, + "5dfe6104585a0c3e995c7b82": true, + "5dff772da3651922b360bf91": true, + "5dff77c759400025ea5150cf": true, + "5dff8db859400025ea5150d4": true, + "5e00903ae9dc277128008b87": true, + "5e0090f7e9dc277128008b93": true, + "5e00c1ad86f774747333222c": true, + "5e00cdd986f7747473332240": true, + "5e00cfa786f77469dc6e5685": true, + "5e01e9e273d8eb11426f5bc3": true, + "5e01ea19e9dc277128008c0b": true, + "5e01ef6886f77445f643baa4": true, + "5e01f31d86f77465cf261343": true, + "5e01f37686f774773c6f6c15": true, + "5e023cf8186a883be655e54f": true, + "5e023d34e8a400319a28ed44": true, + "5e023d48186a883be655e551": true, + "5e023e53d4353e3302577c4c": true, + "5e023e6e34d52a55c3304f71": true, + "5e023e88277cce2b522ff2b1": true, + "5e208b9842457a4a7a33d074": true, + "5e217ba4c1434648c13568cd": true, + "5e2192a498a36665e8337386": true, + "5e21a3c67e40bd02257a008a": true, + "5e21ca18e4d47f0da15e77dd": true, + "5e2af47786f7746d404f3aaa": true, + "5e2af4a786f7746d3f3c3400": true, + "5e2af55f86f7746d4159f07c": true, + "5e32f56fcb6d5863cc5e5ee4": true, + "5e340dcdcb6d5863cc5e5efb": true, + "5e4abb5086f77406975c9342": true, + "5e4abc1f86f774069619fbaa": true, + "5e4abc6786f77406812bd572": true, + "5e4abfed86f77406a2713cf7": true, + "5e4ac41886f77406a511c9a8": true, + "5e4bfc1586f774264f7582d3": true, + "5e4d34ca86f774264f758330": true, + "5e54f76986f7740366043752": true, + "5e54f79686f7744022011103": true, + "5e56991336989c75ab4f03f6": true, + "5e5699df2161e06ac158df6f": true, + "5e569a0156edd02abe09f27d": true, + "5e569a132642e66b0b68015c": true, + "5e569a2e56edd02abe09f280": true, + "5e71f6be86f77429f2683c44": true, + "5e71f70186f77429ee09f183": true, + "5e71fad086f77422443d4604": true, + "5e81c3cbac2bb513793cdc75": true, + "5e81c4ca763d9f754677befa": true, + "5e81c519cb2b95385c177551": true, + "5e81c539cb2b95385c177553": true, + "5e81c550763d9f754677befd": true, + "5e81c6a2ac2bb513793cdc7f": true, + "5e81c6bf763d9f754677beff": true, + "5e81ebcd8e146c7080625e15": true, + "5e81edc13397a21db957f6a1": true, + "5e81ee213397a21db957f6a6": true, + "5e81ee4dcb2b95385c177582": true, + "5e81f423763d9f754677bf2e": true, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": true, + "5e848cc2988a8701445df1e8": true, + "5e848d1c264f7c180b5e35a9": true, + "5e848d2eea0a7c419c2f9bfd": true, + "5e848d51e4dbc5266a4ec63b": true, + "5e848d99865c0f329958c83b": true, + "5e848db4681bea2ada00daa9": true, + "5e848dc4e4dbc5266a4ec63d": true, + "5e85a9f4add9fe03027d9bf1": true, + "5e85aa1a988a8701445df1f5": true, + "5e870397991fd70db46995c8": true, + "5e87071478f43e51ca2de5e1": true, + "5e87076ce2db31558c75a11d": true, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": true, + "5e87114fe2db31558c75a120": true, + "5e87116b81c4ed43e83cefdd": true, + "5e8f3423fd7471236e6e3b64": true, + "5e997f0b86f7741ac73993e2": true, + "5e9dacf986f774054d6b89f4": true, + "5e9db13186f7742f845ee9d3": true, + "5e9dcf5986f7746c417435b3": true, + "5ea02bb600685063ec28bfa1": true, + "5ea034eb5aad6446a939737b": true, + "5ea034f65aad6446a939737e": true, + "5ea03e5009aa976f2e7a514b": true, + "5ea03e9400685063ec28bfa4": true, + "5ea03f7400685063ec28bfa8": true, + "5ea058e01dbce517f324b3e2": true, + "5ea05cf85ad9772e6624305d": true, + "5ea16acdfadf1d18c87b0784": true, + "5ea16ada09aa976f2e7a51be": true, + "5ea16d4d5aad6446a939753d": true, + "5ea172e498dacb342978818e": true, + "5ea17bbc09aa976f2e7a51cd": true, + "5ea17ca01412a1425304d1c0": true, + "5ea18c84ecf1982c7712d9a2": true, + "5ea2a8e200685063ec28c05a": true, + "5ed515c8d380ab312177c0fa": true, + "5ed515e03a40a50460332579": true, + "5ed515ece452db0eb56fc028": true, + "5ed515f6915ec335206e4152": true, + "5ed5160a87bb8443d10680b5": true, + "5ed51652f6c34d2cc26336a1": true, + "5ed5166ad380ab312177c100": true, + "5ede4739e0350d05467f73e8": true, + "5ede47405b097655935d7d16": true, + "5ede474b0c226a66f5402622": true, + "5ede475339ee016e8c534742": true, + "5ede475b549eed7c6d5c18fb": true, + "5eea21647547d6330471b3c9": true, + "5eea217fc64c5d0dfc05712a": true, + "5eeb2ff5ea4f8b73c827350b": true, + "5ef1b9f0c64c5d0dfc0571a1": true, + "5ef1ba28c64c5d0dfc0571a5": true, + "5ef32e4d1c1fd62aea6a150d": true, + "5ef3448ab37dfd6af863525c": true, + "5ef3553c43cb350a955a7ccb": true, + "5ef35bc243cb350a955a7ccd": true, + "5ef35d2ac64c5d0dfc0571b0": true, + "5ef35f46382a846010715a96": true, + "5ef366938cef260c0642acad": true, + "5ef369b08cef260c0642acaf": true, + "5ef5d994dfbc9f3c660ded95": true, + "5ef61964ec7f42238c31e0c1": true, + "5efaf417aeb21837e749c7f2": true, + "5efb0c1bd79ff02a1f5e68d9": true, + "5efb0cabfb3e451d70735af5": true, + "5efb0d4f4bc50b58e81710f3": true, + "5efb0da7a29a85116f6ea05f": true, + "5efb0e16aeb21837e749c7ff": true, + "5efb0fc6aeb21837e749c801": true, + "5f0596629e22f464da6bbdd9": true, + "5f0c892565703e5c461894e9": true, + "5f2a9575926fd9352339381f": true, + "5f2aa43ba9b91d26f20ae6d2": true, + "5f2aa4464b50c14bcf07acdb": true, + "5f2aa4559b44de6b1b4e68d1": true, + "5f2aa46b878ef416f538b567": true, + "5f2aa47a200e2c0ee46efa71": true, + "5f2aa493cd375f14e15eea72": true, + "5f2aa49f9b44de6b1b4e68d4": true, + "5f36a0e5fbf956000b716b65": true, + "5f3e76d86cda304dcc634054": true, + "5f3e772a670e2a7b01739a52": true, + "5f3e777688ca2d00ad199d25": true, + "5f3e778efcd9b651187d7201": true, + "5f3e77b26cda304dcc634057": true, + "5f3e77f59103d430b93f94c1": true, + "5f3e7801153b8571434a924c": true, + "5f3e7823ddc4f03b010e2045": true, + "5f3e7897ddc4f03b010e204a": true, + "5f3e78a7fbf956000b716b8e": true, + "5f4f9eb969cdc30ff33f09db": false, + "5f5e45cc5021ce62144be7aa": true, + "5f5e467b0bc58666c37e7821": true, + "5f5e46b96bdad616ad46d613": true, + "5f5f41476bdad616ad46d631": true, + "5f5f41f56760b4138443b352": true, + "5f60b34a41e30a4ab12a6947": true, + "5f60b85bbdb8e27dee3dc985": true, + "5f60bf4558eff926626a60f2": true, + "5f60c076f2bcbb675b00dac2": true, + "5f60c74e3b85f6263c145586": true, + "5f60c85b58eff926626a60f7": true, + "5f60cd6cf2bcbb675b00dac6": true, + "5f60e6403b85f6263c14558c": true, + "5f60e7788adaa7100c3adb49": true, + "5f60e784f2bcbb675b00dac7": true, + "5f6331e097199b7db2128dc2": true, + "5f6336bbda967c74a42e9932": true, + "5f6339d53ada5942720e2dc3": true, + "5f633f68f5750b524b45f112": true, + "5f633f791b231926f2329f13": true, + "5f633ff5c444ce7e3c30a006": true, + "5f63405df5750b524b45f114": true, + "5f63407e1b231926f2329f15": true, + "5f6340d3ca442212f4047eb2": true, + "5f6341043ada5942720e2dc5": true, + "5f63418ef5750b524b45f116": true, + "5f6372e2865db925d54f3869": true, + "5f647f31b6238e5dd066e196": true, + "5f99418230835532b445e954": true, + "5f994730c91ed922dd355de3": true, + "5f9949d869e2777a0e779ba5": true, + "5fb64bc92b1b027b1f50bcf2": true, + "5fb651b52b1b027b1f50bcff": true, + "5fb651dc85f90547f674b6f4": true, + "5fb65363d1409e5ca04b54f5": true, + "5fb653962b1b027b1f50bd03": true, + "5fb65424956329274326f316": true, + "5fb6548dd1409e5ca04b54f9": true, + "5fb6558ad6f0b2136f2d7eb7": true, + "5fb655a72b1b027b1f50bd06": true, + "5fb655b748c711690e3a8d5a": true, + "5fb6564947ce63734e3fa1da": true, + "5fb6567747ce63734e3fa1dc": true, + "5fbb976df9986c4cff3fe5f2": true, + "5fbb978207e8a97d1f0902d3": true, + "5fbbaa86f9986c4cff3fe5f6": true, + "5fbbc3324e8a554c40648348": true, + "5fbbc34106bde7524f03cbe9": true, + "5fbbc366ca32ed67276c1557": true, + "5fbbc383d5cb881a7363194a": true, + "5fbbfabed5cb881a7363194e": true, + "5fbbfacda56d053a3543f799": true, + "5fbc210bf24b94483f726481": true, + "5fbc226eca32ed67276c155d": true, + "5fbc227aa56d053a3543f79e": true, + "5fbc22ccf24b94483f726483": true, + "5fbcbcf593164a5b6278efb2": true, + "5fbcbd02900b1d5091531dd3": true, + "5fbcbd10ab884124df0cd563": true, + "5fbcbd6c187fea44d52eda14": true, + "5fbcc1d9016cce60e8341ab3": true, + "5fbcc3e4d6fa9c00c571bb58": true, + "5fbcc429900b1d5091531dd7": true, + "5fbcc437d724d907e2077d5c": true, + "5fbcc640016cce60e8341acc": true, + "5fbe3ffdf8b6a877a729ea82": true, + "5fbe760793164a5b6278efc8": true, + "5fbe7618d6fa9c00c571bb6c": true, + "5fc0f9b5d724d907e2077d82": true, + "5fc0f9cbd6fa9c00c571bb90": true, + "5fc0fa362770a0045c59c677": true, + "5fc0fa957283c4046c58147e": true, + "5fc22d7c187fea44d52eda44": true, + "5fc23426900b1d5091531e15": true, + "5fc235db2770a0045c59c683": true, + "5fc2360f900b1d5091531e19": true, + "5fc23636016cce60e8341b05": true, + "5fc23678ab884124df0cd590": true, + "5fc2369685fd526b824a5713": true, + "5fc275cf85fd526b824a571a": true, + "5fc278107283c4046c581489": true, + "5fc382a9d724d907e2077dab": true, + "5fc382b6d6fa9c00c571bbc3": true, + "5fc382c1016cce60e8341b20": true, + "5fc3e272f8b6a877a729eac5": true, + "5fc3e466187fea44d52eda90": true, + "5fc3e4a27283c4046c5814ab": true, + "5fc3e4ee7283c4046c5814af": true, + "5fc3f2d5900b1d5091531e57": true, + "5fc4b97bab884124df0cd5e3": true, + "5fc4b992187fea44d52edaa9": true, + "5fc4b9b17283c4046c5814d7": true, + "5fc53954f8b6a877a729eaeb": true, + "5fc5396e900b1d5091531e72": true, + "5fc64ea372b0dd78d51159dc": true, + "5fca138c2a7b221b2852a5c6": true, + "5fca13ca637ee0341a484f46": true, + "5fce0cf655375d18a253eff0": true, + "5fce0f9b55375d18a253eff2": true, + "5fce16961f152d4312622bc9": true, + "5fd20ff893a8961fc660a954": true, + "5fd4c474dd870108a754b241": true, + "5fd4c4fa16cac650092f6771": true, + "5fd4c5477a8d854fa0105061": true, + "5fd4c60f875c30179f5d04c2": true, + "5fd8d28367cb5e077335170f": true, + "60098ad7c2240c0fe85c570a": true, + "60098af40accd37ef2175f27": true, + "60098b1705871270cd5352a1": true, + "601948682627df266209af05": true, + "60194943740c5d77f6705eea": true, + "601949593ae8f707c4608daa": true, + "601aa3d2b2bcb34913271e6d": true, + "602286df23506e50807090c6": true, + "60228924961b8d75ee233c32": true, + "60228a76d62c9b14ed777a66": true, + "60228a850ddce744014caf69": true, + "602293f023506e50807090cb": true, + "60229948cacb6b0506369e27": true, + "602a95edda11d6478d5a06da": true, + "602a95fe4e02ce1eaa358729": true, + "602a97060ddce744014caf6f": true, + "602a9740da11d6478d5a06dc": true, + "602e3f1254072b51b239f713": true, + "602e620f9b513876d4338d9a": true, + "602e63fb6335467b0c5ac94d": true, + "602e71bd53a60014f9705bfa": true, + "602f85fd9b513876d4338d9c": true, + "603372b4da11d6478d5a07ff": true, + "603372d154072b51b239f9e1": true, + "603372f153a60014f970616d": true, + "603373004e02ce1eaa358814": true, + "6033749e88382f4fab3fd2c5": true, + "60337f5dce399e10262255d1": true, + "60338ff388382f4fab3fd2c8": true, + "60339954d62c9b14ed777c06": true, + "6033fa48ffd42c541047f728": true, + "603409c80ca681766b6a0fb2": true, + "6034cf5fffd42c541047f72e": true, + "6034d0230ca681766b6a0fb5": true, + "6034d103ca006d2dca39b3f0": true, + "6034d2d697633951dc245ea6": true, + "6034e3cb0ddce744014cb870": true, + "6034e3d953a60014f970617b": true, + "6034e3e20ddce744014cb878": true, + "603618feffd42c541047f771": true, + "603619720ca681766b6a0fc4": true, + "60361a7497633951dc245eb4": true, + "60361b0b5a45383c122086a1": true, + "60361b5a9a15b10d96792291": true, + "60363c0c92ec1c31037959f5": true, + "603648ff5a45383c122086ac": true, + "6038b4b292ec1c3103795a0b": true, + "6038b4ca92ec1c3103795a0d": true, + "6038d614d10cbf667352dd44": true, + "6040dd4ddcf9592f401632d2": true, + "6040de02647ad86262233012": true, + "606587252535c57a13424cfd": true, + "60658776f2cb2e02a42ace2b": true, + "6065878ac9cf8012264142fd": true, + "606587a88900dc2d9a55b659": true, + "606587bd6d0bd7580617bacc": true, + "606587d11246154cad35d635": true, + "606587e18900dc2d9a55b65f": true, + "6065880c132d4d12c81fd8da": true, + "6065881d1246154cad35d637": true, + "6065c6e7132d4d12c81fd8e1": true, + "6065dc8a132d4d12c81fd8e3": true, + "606dae0ab0e443224b421bb7": true, + "606ee5c81246154cad35d65e": true, + "606eef46232e5a31c233d500": true, + "606eef756d0bd7580617baf8": true, + "606ef0812535c57a13424d20": true, + "606f262c6d0bd7580617bafa": true, + "606f263a8900dc2d9a55b68d": true, + "606f26752535c57a13424d22": true, + "606f2696f2cb2e02a42aceb1": true, + "6076c1b9f2cb2e02a42acedc": true, + "60785c0d232e5a31c233d51c": true, + "60785ce5132d4d12c81fd918": true, + "607d5aa50494a626335e12ed": true, + "607ea812232e5a31c233d53c": true, + "607f201b3c672b3b3a24a800": true, + "607f20859ee58b18e41ecd90": true, + "607ffb988900dc2d9a55b6e4": true, + "6086b5392535c57a13424d70": true, + "6086b5731246154cad35d6c7": true, + "6087e0336d0bd7580617bb7a": true, + "6087e2a5232e5a31c233d552": true, + "6087e663132d4d12c81fd96b": true, + "609269c3b0e443224b421cc1": true, + "60926df0132d4d12c81fd9df": true, + "609a4b4fe2ff132951242d04": true, + "609a63b6e2ff132951242d09": true, + "609b9e31506cf869cf3eaf41": true, + "609bab8b455afd752b2e6138": true, + "609e8540d5c319764c2bc2e9": true, + "609e860ebd219504d8507525": true, + "60a23797a37c940de7062d02": true, + "60a272cc93ef783291411d8e": true, + "60a2828e8689911a226117f9": true, + "60a283193cb70855c43a381d": true, + "60a3c68c37ea821725773ef5": true, + "60a3c70cde5f453f634816a3": true, + "60a621c49c197e4e8c4455e6": true, + "60a6220e953894617404b00a": true, + "60a7acf20c5cb24b01346648": true, + "60a7ad2a2198820d95707a2e": true, + "60a7ad3a0c5cb24b0134664a": true, + "60b0f988c4449e4cb624c1da": true, + "60b52e5bc7d8103275739d67": true, + "60bf74184a63fc79b60c57f6": true, + "60db29ce99594040e04c4a27": true, + "6113c3586c780c1e710c90bc": true, + "6113cc78d3a39d50044c065a": true, + "6113cce3d92c473c770200c7": true, + "6113d6c3290d254f5e6b27db": true, + "611a30addbdd8440277441dc": true, + "611a31ce5b7ffe001b4649d1": true, + "6123649463849f3d843da7c4": true, + "612368f58b401f4f51239b33": true, + "612781056f3d944a17348d60": true, + "612e0cfc8004cc50514c2d9e": true, + "612e0d3767085e45ef14057f": true, + "612e0d81290d254f5e6b291a": true, + "612e0e04568c120fdd294258": true, + "612e0e3c290d254f5e6b291d": true, + "612e0e55a112697a4b3a66e7": true, + "6130c3dffaa1272e43151c7d": true, + "6130c43c67085e45ef1405a1": true, + "6130c4d51cb55961fa0fd49f": true, + "6130ca3fd92c473c77020dbd": true, + "614451b71e5874611e2c7ae5": true, + "615d8d878004cc50514c3233": true, + "615d8da4d3a39d50044c10e8": true, + "615d8dbd290d254f5e6b2ed6": true, + "615d8df08004cc50514c3236": true, + "615d8e2f1cb55961fa0fd9a4": true, + "615d8e9867085e45ef1409c6": true, + "615d8eb350224f204c1da1cf": true, + "615d8f5dd92c473c770212ef": true, + "615d8f8567085e45ef1409ca": true, + "615d8faecabb9b7ad90f4d5d": true, + "615d8fd3290d254f5e6b2edc": true, + "61605d88ffa6e502ac5e7eeb": true, + "616442e4faa1272e43152193": true, + "616554fe50224f204c1da2aa": true, + "61657230d92c473c770213d7": true, + "616584766ef05c2ce828ef57": true, + "61659f79d92c473c770213ee": true, + "6165ac306ef05c2ce828ef74": true, + "6165ac8c290d254f5e6b2f6c": true, + "6165adcdd3a39d50044c120f": true, + "6165aeedfaa1272e431521e3": true, + "61695095d92c473c7702147a": true, + "61702be9faa1272e431522c3": true, + "61702d8a67085e45ef140b24": true, + "61702f1b67085e45ef140b26": true, + "61703001d92c473c77021497": true, + "61712eae6c780c1e710c9a1d": true, + "617130016c780c1e710c9a24": true, + "617131a4568c120fdd29482d": true, + "61713308d92c473c770214a0": true, + "6171367e1cb55961fa0fdb36": true, + "61713a8fd92c473c770214a4": true, + "61713cc4d8e3106d9806c109": true, + "6171407e50224f204c1da3c5": true, + "61714b2467085e45ef140b2c": true, + "61714eec290d254f5e6b2ffc": true, + "617151c1d92c473c770214ab": true, + "617153016c780c1e710c9a2f": true, + "617154aa1cb55961fa0fdb3b": true, + "617155ee50224f204c1da3cd": true, + "61715e7e67085e45ef140b33": true, + "6176a40f0b8c0312ac75a3d3": true, + "6176a48d732a664031271438": true, + "6176aca650224f204c1da3fb": true, + "617aa4dd8166f034d57de9c5": true, + "617fd91e5539a84ec44ce155": true, + "61816734d8e3106d9806c1f3": true, + "618167441cb55961fa0fdc71": true, + "618167528004cc50514c34f9": true, + "618167616ef05c2ce828f1a8": true, + "6181688c6c780c1e710c9b04": true, + "618168b350224f204c1da4d8": true, + "618168dc8004cc50514c34fc": true, + "61816df1d3a39d50044c139e": true, + "61816dfa6ef05c2ce828f1ad": true, + "61816fcad92c473c770215cc": true, + "61817865d3a39d50044c13a4": true, + "618178aa1cb55961fa0fdc80": true, + "61825d06d92c473c770215de": true, + "61825d136ef05c2ce828f1cc": true, + "61825d24d3a39d50044c13af": true, + "6183afd850224f204c1da514": true, + "6183b0711cb55961fa0fdcad": true, + "6183b084a112697a4b3a6e6c": true, + "6183d53f1cb55961fa0fdcda": true, + "6183fc15d3a39d50044c13e9": true, + "6183fd911cb55961fa0fdce9": true, + "6183fd9e8004cc50514c358f": true, + "618405198004cc50514c3594": true, + "6184055050224f204c1da540": true, + "618407a850224f204c1da549": true, + "61840bedd92c473c77021635": true, + "61840d85568c120fdd2962a5": true, + "618426d96c780c1e710c9b9f": true, + "618428466ef05c2ce828f218": true, + "618a431df1eb8e24b8741deb": true, + "618a5d5852ecee1505530b2a": true, + "618a75c9a3884f56c957ca1b": true, + "618a75f0bd321d49084cd399": true, + "618a760e526131765025aae3": true, + "618aef6d0a5a59657e5f55ee": true, + "618b9643526131765025ab35": true, + "618b9671d14d6d5ab879c5ea": true, + "618b9682a3884f56c957ca78": true, + "618ba27d9008e4636a67f61d": true, + "618ba91477b82356f91ae0e8": true, + "618ba92152ecee1505530bd3": true, + "618bab21526131765025ab3f": true, + "618bb76513f5097c8d5aa2d5": true, + "618cfae774bb2d036a049e7c": true, + "619256e5f8af2c1a4e1f5d92": true, + "619386379fb0c665d5490dbe": true, + "6193a720f8ee7e52e42109ed": true, + "6193d3149fb0c665d5490e32": true, + "6193d338de3cdf1d2614a6fc": true, + "6193d382ed0429009f543e65": true, + "6193d3be7c6c7b169525f0da": true, + "6193d3cded0429009f543e6a": true, + "6193d5d4f8ee7e52e4210a1b": true, + "6193dcd0f8ee7e52e4210a28": true, + "6194ef39de3cdf1d2614a768": true, + "6194efe07c6c7b169525f11b": true, + "6194eff92d2c397d6600348b": true, + "6194f017ed0429009f543eaa": true, + "6194f02d9bb3d20b0946d2f0": true, + "6194f1f918a3974e5e7421e4": true, + "6194f2912d2c397d6600348d": true, + "6194f2df645b5d229654ad77": true, + "6194f3286db0f2477964e67d": true, + "6194f35c18a3974e5e7421e6": true, + "6194f41f9fb0c665d5490e75": true, + "6194f5722d2c397d6600348f": true, + "6194f5a318a3974e5e7421eb": true, + "6194f5d418a3974e5e7421ef": true, + "619621a4de3cdf1d2614a7a7": true, + "619624b26db0f2477964e6b0": true, + "6196255558ef8c428c287d1c": true, + "61962b617c6c7b169525f168": true, + "61962d879bb3d20b0946d385": true, + "6196364158ef8c428c287d9f": true, + "6196365d58ef8c428c287da1": true, + "619636be6db0f2477964e710": true, + "61963a852d2c397d660036ad": true, + "61965d9058ef8c428c287e0d": true, + "619666f4af1f5202c57a952d": true, + "6197b229af1f5202c57a9bea": true, + "619b5db699fb192e7430664f": true, + "619b69037b9de8162902673e": true, + "619bc61e86e01e16f839a999": true, + "619bdd8886e01e16f839a99c": true, + "619bddc6c9546643a67df6ee": true, + "619bddffc9546643a67df6f0": true, + "619bde3dc9546643a67df6f2": true, + "619bde7fc9546643a67df6f4": true, + "619bdeb986e01e16f839a99e": true, + "619bdef8c9546643a67df6f6": true, + "619bdf9cc9546643a67df6f8": true, + "619bdfd4c9546643a67df6fa": true, + "619cbf7d23893217ec30b689": true, + "619cbf9e0a7c3a1a2731940a": true, + "619cf0335771dd3c390269ae": true, + "619d36da53b4d42ee724fae4": true, + "619f4ab2d25cbd424731fb95": true, + "619f4bffd25cbd424731fb97": true, + "619f4cee4c58466fe1228435": true, + "619f4d304c58466fe1228437": true, + "619f4f8c4c58466fe1228439": true, + "619f52454c58466fe122843b": true, + "61a4c8884f95bc3b2c5dc96f": true, + "61b9e1aaef9a1b5d6a79899a": true, + "61bc85697113f767765c7fe7": true, + "61bca7cda0eae612383adf57": true, + "61bcc89aef0f505f0c6cd0fc": true, + "61c18d83b00456371a66814b": true, + "61c18db6dfd64163ea78fbb4": true, + "61f4012adfc9f01a816adda1": true, + "61f7b234ea4ab34f2f59c3ec": true, + "61f7b85367ddd414173fdb36": true, + "61f7c9e189e6fb1a5e3ea78d": true, + "61f8024263dc1250e26eb029": true, + "61f803b8ced75b2e852e35f8": true, + "61faa91878830f069b6b7967": true, + "620109578d82e67e7911abf2": true, + "6217726288ed9f0845317459": true, + "62178be9d0050232da3485d9": true, + "62178c4d4ecf221597654e3d": true, + "622b327b267a1b13a44abea3": true, + "622b379bf9cfc87d675d2de5": true, + "622b3858034a3e17ad0b81f5": true, + "622b38c56762c718e457e246": true, + "622b397c9a3d4327e41843b6": true, + "622b3c081b89c677a33bcda6": true, + "622b3d5cf9cfc87d675d2de9": true, + "622b4d7df9cfc87d675d2ded": true, + "622b4f54dc8dcc0ba8742f85": true, + "622efbcb99f4ea1a4d6c9a15": true, + "622efdf8ec80d870d349b4e5": true, + "622f02437762f55aaa68ac85": true, + "622f039199f4ea1a4d6c9a17": true, + "622f07cfae33bc505b2c4dd5": true, + "622f0ee47762f55aaa68ac87": true, + "622f128cec80d870d349b4e8": true, + "622f140da5958f63c67f1735": true, + "622f14e899892a7f9e08f6c5": true, + "622f16a1a5958f63c67f1737": true, + "623063e994fc3f7b302a9696": true, + "62307b7b10d2321fa8741921": true, + "6231654c71b5bc3baa1078e5": true, + "623166e08c43374ca1567195": true, + "6231670f0b8aa5472d060095": true, + "62330b3ed4dc74626d570b95": true, + "62330bfadc5883093563729b": true, + "62330c18744e5e31df12f516": true, + "62330c40bdd19b369e1e53d1": true, + "62386b2adf47d66e835094b2": true, + "62386b7153757417e93a4e9f": true, + "62389aaba63f32501b1b444f": true, + "62389ba9a63f32501b1b4451": true, + "62389bc9423ed1685422dc57": true, + "62389be94d5d474bf712e709": true, + "623b2e9d11c3296b440d1638": true, + "623c2f4242aee3103f1c44b7": true, + "623c2f652febb22c2777d8d7": true, + "623c3be0484b5003161840dc": true, + "623c3c1f37b4b31470357737": true, + "6241c2c2117ad530666a5108": true, + "6241c316234b593b5676b637": true, + "62444cb99f47004c781903eb": true, + "62444cd3674028188b052799": true, + "624c0570c9b794431568f5d5": true, + "624c09cfbc2e27219346d955": true, + "624c09da2cec124eb67c1046": true, + "624c09e49b98e019a3315b66": true, + "624c0b3340357b5f566e8766": true, + "624c29ce09cd027dff2f8cd7": true, + "624c2e8614da335f1e034d8c": true, + "6259b864ebedf17603599e88": true, + "6259c2c1d714855d182bad85": true, + "6259c3387d6aab70bc23a18d": true, + "6259c3d8012d6678ec38eeb8": true, + "6259c4347d6aab70bc23a190": true, + "625eb0faa6e3a82193267ad9": true, + "625ebcef6f53af4aa66b44dc": true, + "625ec45bb14d7326ac20f572": true, + "625ed7c64d9b6612df732146": true, + "626667e87379c44d557b7550": true, + "626673016f1edc06f30cf6d5": true, + "62669bccdb9ebb4daa44cd14": true, + "6267c6396b642f77f56f5c1c": true, + "6269220d70b6c02e665f2635": true, + "6269545d0e57f218e4548ca2": true, + "626a74340be03179a165e30c": true, + "626a8ae89e664a2e2a75f409": true, + "626a9cb151cb5849f6002890": true, + "626bb8532c923541184624b4": true, + "626becf9582c3e319310b837": true, + "6272370ee4013c5d7e31f418": true, + "6272379924e29f06af4d5ecb": true, + "627254cc9c563e6e442c398f": true, + "6272874a6c47bd74f92e2087": true, + "6275303a9f372d6ea97f9ec7": true, + "627e14b21713922ded6f2c15": true, + "62811cd7308cb521f87a8f99": true, + "62811e2510e26c1f344e6554": true, + "62811e335631d45211793c95": true, + "62811f461d5df4475f46a332": true, + "62811f828193841aca4a45c3": true, + "62811fa609427b40ab14e765": true, + "62811fbf09427b40ab14e767": true, + "6281204f308cb521f87a8f9b": true, + "628120621d5df4475f46a335": true, + "62812081d23f207deb0ab216": true, + "6281209662cba23f6c4d7a19": true, + "628120c21d5df4475f46a337": true, + "628120d309427b40ab14e76d": true, + "628120dd308cb521f87a8fa1": true, + "628120fd5631d45211793c9f": true, + "6281212a09427b40ab14e770": true, + "628121434fa03b6b6c35dc6a": true, + "6284bd5f95250a29bc628a30": true, + "62850c28da09541f43158cca": true, + "628a60ae6b1d481ff772e9c8": true, + "628a664bccaab13006640e47": true, + "628a665a86cbd9750d2ff5e5": true, + "628a6678ccaab13006640e49": true, + "628a66b41d5e41750e314f34": true, + "628a7b23b0f75035732dd565": true, + "628a83c29179c324ed269508": true, + "628a85ee6b1d481ff772e9d5": true, + "628b5638ad252a16da6dd245": true, + "628b8d83717774443b15e248": true, + "628b916469015a4e1711ed8d": true, + "628b9471078f94059a4b9bfb": true, + "628b9784bcf6e2659e09b8a2": true, + "628b9a40717774443b15e9f2": true, + "628b9be6cff66b70c002b14c": true, + "628b9c37a733087d0d7fe84b": true, + "628b9c7d45122232a872358f": true, + "628baf0b967de16aab5a4f36": true, + "628bc7fb408e2b2e9c0801b1": true, + "628c9ab845c59e5b80768a81": true, + "628cd624459354321c4b7fa2": true, + "628d0618d1ba6e4fa07ce5a4": true, + "628dc750b910320f4c27a732": true, + "628e1ffc83ec92260c0f437f": true, + "628e4dd1f477aa12234918aa": true, + "628e4e576d783146b124c64d": true, + "62963c18dbc8ab5f0d382d0b": true, + "62a09d3bcf4a99369e262447": true, + "62a09d79de7ac81993580530": true, + "62a09dd4621468534a797ac7": true, + "62a09e08de7ac81993580532": true, + "62a09e410b9d3c46de5b6e78": true, + "62a09f32621468534a797acb": true, + "62a1b7fbc30cfa1d366af586": true, + "62a5c2c98ec41a51b34739c0": true, + "62a5c333ec21e50cad3b5dc6": true, + "62a5c41e8ec41a51b34739c3": true, + "62a61bbf8ec41a51b34758d2": true, + "62a61c988ec41a51b34758d5": true + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608815684 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 4, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 6, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 17206066, + "GameVersion": "edge_of_darkness", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 69, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 2, + "NeedWipeOptions": [], + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Bear", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49444ae6628187a2e77b8", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49444ae6628187a2e77b8", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "f5e6bdac05e699d687993249", + "_tpl": "5857a8bc2459772bad15db29", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "SecuredContainer" + }, { + "_id": "01e9d751f10e4e9aebdd94d5", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Pockets" + }, { + "_id": "5fe49444ae6628187a2e78b8", + "_tpl": "5811ce772459770e9e5f9532" + }, { + "_id": "5fe49444ae6628187a2e78ba", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49444ae6628187a2e78b9", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + }, { + "_id": "f55404fc9c2a0063bc1b9293", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "c1408429a85d87168d75e04c", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "6275a53292b3e1de7c0f94fc", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "72ec3ef07bf2ddf6c0dab838", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000 + } + }, { + "_id": "14bdc77de1a13722eb416218", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "cadad72d72caf8c9784524d4", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "987b8edc24c5e2a9ccb9ee1d", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "e7d08b2dd0f631136f424917", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "a913602b85dcd145970c2688", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 5, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "68bdc987f801ecd7efbaaabe", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 6, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "68ffe73296918e3a751ff27d", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 7, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "7ae138bc2cbc56640fdf2506", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 8, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "57a6c6de5aa471e473c7f5c5", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "7ef87fb9eaa6c25950c09a7d", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "76f687b8388d97cd13aa18a5", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "249a3bbee6e1ba29712e6065", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "5516338b341dad987bcfb18a", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "f5028bfe9f5550d5c547c9b2", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 5, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "efa4b58a3741068b3957dc25", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 7, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "08624351a590bbe7269ec79e", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "de4be08a2ffd9e880455777a", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 6, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "a47caded1ede79b972fe7ad5", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "07292f5d4592fb72775941e6", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 8, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "748e89ddd9102eab4bcf47c8", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 5, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "d88551febbfbe3757852a8d8", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "a7a5854fe4649f57bb9b2bee", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 6, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "cc8ff42be98f9f513fea9b5b", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 8, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "33a09dbb0fc6f1f1da32856b", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "fbe3dabfda80655871d2ff35", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "3cc9938ad572a73e1f26877f", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "969b3e5c1134f1538183add6", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 7, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + } + ], + "questRaidItems": "5fe49444ae6628187a2e78b9", + "questStashItems": "5fe49444ae6628187a2e78ba", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49444ae6628187a2e78b8" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 2000 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 2000 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cd946231388ce000d572fe3", + "5cd945d71388ce000a659dfb" + ], + "trader": { + "initialLoyaltyLevel": 4, + "initialSalesSum": 2600000, + "initialStanding": 1, + "jaegerUnlocked": true, + "setQuestsAvailableForStart": false + }, + "weaponbuilds": {} }, - "Customization": { - "Body": "5cde95d97d6c8b647a3769b0", - "Feet": "5cde95ef7d6c8b04713c4f2d", - "Hands": "5cde95fa7d6c8b04737c2d13", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447ac644bdc2d6c208b4567": true, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448c1d04bdc2dff2f8b4569": true, - "5448fee04bdc2dbc018b4567": false, - "5448ff904bdc2d6f028b456e": true, - "5449016a4bdc2d6f028b456f": false, - "544909bb4bdc2d6f028b4577": true, - "544a11ac4bdc2d470e8b456a": false, - "544a378f4bdc2d30388b4567": true, - "544a37c44bdc2d25388b4567": true, - "544a38634bdc2d58388b4568": true, - "544a3a774bdc2d3a388b4567": true, - "544a5caa4bdc2d1a388b4568": true, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": true, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "544fb62a4bdc2dfb738b4568": true, - "544fb6cc4bdc2d34748b456e": true, - "54527a984bdc2d4e668b4567": true, - "54527ac44bdc2d36668b4567": true, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "5580169d4bdc2d9d138b4585": true, - "55801eed4bdc2d89578b4588": true, - "5580223e4bdc2d1c128b457f": true, - "558022b54bdc2dac148b458d": true, - "55802d5f4bdc2dac148b458e": true, - "55802f5d4bdc2dac148b458f": true, - "558032614bdc2de7118b4585": true, - "559ba5b34bdc2d1f1a8b4582": true, - "55d355e64bdc2d962f8b4569": true, - "55d35ee94bdc2d61338b4568": true, - "55d3632e4bdc2d972f8b4569": true, - "55d447bb4bdc2d892f8b456f": true, - "55d448594bdc2d8c2f8b4569": true, - "55d449444bdc2d962f8b456d": true, - "55d44fd14bdc2d962f8b456e": true, - "55d459824bdc2d892f8b4573": true, - "55d45d3f4bdc2d972f8b456c": true, - "55d45f484bdc2d972f8b456d": true, - "55d480c04bdc2d1d4e8b456a": false, - "55d481904bdc2d8c2f8b456a": true, - "55d482194bdc2d1d4e8b456b": true, - "55d4837c4bdc2d1d4e8b456c": true, - "55d485be4bdc2d962f8b456f": true, - "55d4887d4bdc2d962f8b4570": true, - "55d48a634bdc2d8b2f8b456a": true, - "55d48ebc4bdc2d8c2f8b456c": true, - "55d4ae6c4bdc2d8b2f8b456e": true, - "55d4af3a4bdc2d972f8b456f": true, - "55d4b9964bdc2d1d4e8b456e": true, - "55d5f46a4bdc2d1b198b4567": true, - "55d614004bdc2d86028b4568": true, - "55d6190f4bdc2d87028b4567": true, - "55d7217a4bdc2d86028b456d": false, - "55f84c3c4bdc2d5f408b4576": true, - "560835c74bdc2dc8488b456f": true, - "560836484bdc2d20478b456e": true, - "560836b64bdc2d57468b4567": true, - "560836fb4bdc2d773f8b4569": true, - "560837154bdc2da74d8b4568": true, - "5608373c4bdc2dc8488b4570": true, - "560837544bdc2de22e8b456e": true, - "560837824bdc2d57468b4568": true, - "5608379a4bdc2d26448b4569": true, - "560838c94bdc2d77798b4569": true, - "56083a334bdc2dc8488b4571": true, - "56083be64bdc2d20478b456f": true, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560d61e84bdc2da74d8b4571": true, - "560d657b4bdc2da74d8b4572": true, - "560d75f54bdc2da74d8b4573": true, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a69d4bdc2ded0b8b457b": true, - "5648a7494bdc2d9d488b4583": false, - "5648ac824bdc2ded0b8b457d": true, - "5648ae314bdc2d3d1c8b457f": true, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": true, - "5648b4534bdc2d3d1c8b4580": true, - "5649a2464bdc2d91118b45a8": true, - "5649aa744bdc2ded0b8b457e": false, - "5649ab884bdc2ded0b8b457f": true, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649ae4a4bdc2d1b2b8b4588": true, - "5649af094bdc2df8348b4586": false, - "5649af884bdc2d1b2b8b4589": true, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "5649b2314bdc2d79388b4576": true, - "5649be884bdc2d79388b4577": true, - "5649d9a14bdc2d79388b4580": true, - "5649ed104bdc2d3d1c8b458b": true, - "564ca99c4bdc2d16268b4589": false, - "564ca9df4bdc2d35148b4569": true, - "564caa3d4bdc2d17108b458e": true, - "5656d7c34bdc2d9d198b4587": true, - "5656eb674bdc2d35148b457c": true, - "567143bf4bdc2d1a0f8b4567": true, - "5673de654bdc2d180f8b456d": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59856d2720bd8418b456a": true, - "56d59d3ad2720bdb418b4577": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56dee2bdd2720bc8328b4567": true, - "56deec93d2720bec348b4568": true, - "56deed6ed2720b4c698b4583": true, - "56def37dd2720bec348b456a": true, - "56dfef82d2720bbd668b4567": true, - "56dff026d2720bb8668b4567": true, - "56dff061d2720bb5668b4567": true, - "56dff0bed2720bb0668b4567": true, - "56dff216d2720bbd668b4568": true, - "56dff2ced2720bb4668b4567": true, - "56dff3afd2720bba668b4567": true, - "56dff421d2720b5f5a8b4567": true, - "56dff4a2d2720bbd668b456a": true, - "56dff4ecd2720b5f5a8b4568": true, - "56e0598dd2720bb5668b45a6": true, - "56e05a6ed2720bd0748b4567": true, - "56e05b06d2720bb2668b4586": true, - "56e294cdd2720b603a8b4575": false, - "56e335e4d2720b6c058b456d": true, - "56e33634d2720bd8058b456b": true, - "56e33680d2720be2748b4576": true, - "56ea6fafd2720b844b8b4593": true, - "56ea70acd2720b844b8b4594": true, - "56ea7165d2720b6e518b4583": true, - "56ea7293d2720b8d4b8b45ba": true, - "56ea8180d2720bf2698b456a": true, - "56ea8222d2720b69698b4567": true, - "56ea8d2fd2720b7c698b4570": true, - "56eabcd4d2720b66698b4574": true, - "56eabf3bd2720b75698b4569": true, - "570fd6c2d2720bc6458b457f": true, - "570fd721d2720bc5458b4596": true, - "570fd79bd2720bc7458b4583": true, - "5710c24ad2720bc3458b45a3": false, - "571659bb2459771fb2755a12": true, - "571a26d524597720680fbe8a": true, - "571a279b24597720b4066566": true, - "571a282c2459771fb2755a69": true, - "571a28e524597720b4066567": true, - "571a29dc2459771fb2755a6a": true, - "57235b6f24597759bf5a30f1": true, - "572b7adb24597762ae139821": true, - "572b7fa524597762b747ce82": true, - "5732ee6a24597719ae0c0281": true, - "5734773724597737fd047c14": true, - "57347d3d245977448f7b7f61": true, - "57347d5f245977448b40fa81": true, - "57347d692459774491567cf1": true, - "57347d7224597744596b4e72": false, - "57347d8724597744596b4e76": true, - "57347d90245977448f7b7f65": true, - "57347d9c245977448b40fa85": true, - "57347da92459774491567cf5": true, - "5735fdcd2459776445391d61": true, - "5735ff5c245977640e39ba7e": true, - "573601b42459776410737435": true, - "573602322459776445391df1": true, - "5736026a245977644601dc61": true, - "573603562459776430731618": true, - "573603c924597764442bd9cb": true, - "573718ba2459775a75491131": false, - "573719762459775a626ccbc1": true, - "573719df2459775a626ccbc2": true, - "57371aab2459775a77142f22": true, - "57371b192459775a9f58a5e0": true, - "57371e4124597760ff7b25f1": true, - "57371eb62459776125652ac1": true, - "57371f2b24597761224311f1": true, - "57371f8d24597761006c6a81": true, - "5737201124597760fc4431f1": true, - "5737207f24597760ff7b25f2": true, - "573720e02459776143012541": true, - "57372140245977611f70ee91": true, - "5737218f245977612125ba51": true, - "573722e82459776104581c21": true, - "573724b42459776125652ac2": true, - "5737250c2459776125652acc": true, - "5737256c2459776125652acd": true, - "573725b0245977612125bae2": true, - "5737260b24597761224311f2": true, - "5737266524597761006c6a8c": true, - "573726d824597765d96be361": true, - "5737273924597765dd374461": true, - "573727c624597765cc785b5b": true, - "5737280e24597765cc785b5c": true, - "5737287724597765e1625ae2": true, - "573728cc24597765cc785b5d": true, - "573728f324597765e5728561": true, - "5737292724597765e5728562": true, - "57372a7f24597766fe0de0c1": true, - "57372ac324597767001bc261": true, - "57372b832459776701014e41": true, - "57372bad245977670b7cd242": true, - "57372bd3245977670b7cd243": true, - "57372c21245977670937c6c2": true, - "57372c56245977685e584582": true, - "57372c89245977685d4159b1": true, - "57372d1b2459776862260581": true, - "57372d4c245977685a3da2a1": true, - "57372db0245977685d4159b2": true, - "57372deb245977685d4159b3": true, - "57372e1924597768553071c1": true, - "57372e4a24597768553071c2": true, - "57372e73245977685d4159b4": true, - "57372e94245977685648d3e1": true, - "57372ebf2459776862260582": true, - "57372ee1245977685d4159b5": true, - "57372f2824597769a270a191": true, - "57372f5c24597769917c0131": true, - "57372f7d245977699b53e301": true, - "57372fc52459776998772ca1": true, - "5737300424597769942d5a01": true, - "5737330a2459776af32363a1": true, - "5737339e2459776af261abeb": true, - "573733c72459776b0b7b51b0": true, - "5739d41224597779c3645501": true, - "57486e672459770abd687134": true, - "574d967124597745970e7c94": true, - "574dad8024597745964bf05c": true, - "574db213245977459a2f3f5d": true, - "574eb85c245977648157eec3": true, - "575062b524597720a31c09a1": true, - "57513f07245977207e26a311": true, - "57513f9324597720a7128161": true, - "57513fcc24597720a31c09a6": true, - "5751435d24597720a27126d1": true, - "57514643245977207f2c2d09": true, - "575146b724597720a27126d5": true, - "5751487e245977207e26a315": true, - "5751496424597720a27126da": true, - "5751a25924597722c463c472": true, - "5751a89d24597722aa0e8db0": true, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": true, - "576165642459773c7a400233": true, - "576167ab2459773cad038c43": true, - "57616a9e2459773c7a400234": true, - "57616ca52459773c69055192": true, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "576fd4ec2459777f0b518431": true, - "577d128124597739d65d0e56": true, - "577d141e24597739c5255e01": true, - "57838ad32459774a17445cd2": true, - "57838c962459774a1651ec63": true, - "57838e1b2459774a256959b1": true, - "57838f0b2459774a256959b2": true, - "57838f9f2459774a150289a0": true, - "578395402459774a256959b5": true, - "578395e82459774a0e553c7b": true, - "579204f224597773d619e051": true, - "5798a2832459774b53341029": true, - "57a0dfb82459774d3078b56c": true, - "57a0e5022459774d1673f889": true, - "57a3459f245977764a01f703": true, - "57a9b9ce2459770ee926038d": true, - "57ac965c24597706be5f975c": true, - "57aca93d2459771f2c7e26db": true, - "57acb6222459771ec34b5cb0": true, - "57ade1442459771557167e15": true, - "57adff4f24597737f373b6e6": true, - "57ae0171245977343c27bfcf": true, - "57af48872459771f0b2ebf11": true, - "57c44b372459772d2b39b8ce": true, - "57c44dd02459772d2e0ae249": true, - "57c44e7b2459772d28133248": true, - "57c44f4f2459772d2c627113": true, - "57c44fa82459772d2d75e415": true, - "57c450252459772d28133253": true, - "57c55efc2459772d2c6271e7": true, - "57c55f092459772d291a8463": true, - "57c55f112459772d28133310": true, - "57c55f172459772d27602381": true, - "57c5ac0824597754771e88a9": true, - "57c69dd424597774c03b7bbc": true, - "57c9a89124597704ee6faec1": true, - "57cd379a24597778e7682ecf": false, - "57cff947245977638e6f2a19": true, - "57cffb66245977632f391a99": true, - "57cffcd624597763133760c5": true, - "57cffcdd24597763f5110006": true, - "57cffce524597763b31685d8": true, - "57cffd8224597763b03fc609": true, - "57cffddc24597763133760c6": true, - "57cffe0024597763b03fc60b": true, - "57cffe20245977632f391a9d": true, - "57d14d2524597714373db789": true, - "57d14e1724597714010c3f4b": true, - "57d1519e24597714373db79d": true, - "57d152ec245977144076ccdf": true, - "57d17c5e2459775a5c57d17d": true, - "57d17e212459775a1179a0f5": true, - "57da93632459771cb65bf83f": true, - "57dbb57e2459774673234890": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "57e26ea924597715ca604a09": true, - "57e26fc7245977162a14b800": true, - "57ee59b42459771c7b045da5": true, - "57f3a5ae2459772b0e0bf19e": true, - "57f3c6bd24597738e730fa2f": true, - "57f3c7e024597738ea4ba286": true, - "57f3c8cc2459773ec4480328": true, - "57f4c844245977379d5c14d1": true, - "57fd23e32459772d0805bcf1": true, - "57ffa9f4245977728561e844": true, - "57ffaea724597779f52b3a4d": true, - "57ffb0062459777a045af529": true, - "57ffb0e42459777d047111c5": true, - "5811ce772459770e9e5f9532": false, - "5827272a24597748c74bdeea": true, - "58272b392459774b4c7b3ccd": true, - "58272b842459774abc128d50": true, - "58272d7f2459774f6311ddfd": true, - "583990e32459771419544dd2": true, - "5839a40f24597726f856b511": true, - "5839a7742459773cf9693481": true, - "58491f3324597764bc48fa02": true, - "584924ec24597768f12ae244": true, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "587de4282459771bca0ec90b": true, - "587de5ba2459771c0f1e8a58": true, - "587df583245977373c4f1129": true, - "587e02ff24597743df3deaeb": true, - "587e0531245977466077a0f7": true, - "587e08ee245977446b4410cf": true, - "588200af24597742fa221dfb": true, - "588200c224597743990da9ed": true, - "588200cf2459774414733d55": true, - "588226d124597767ad33f787": true, - "588226dd24597767ad33f789": true, - "588226e62459776e3e094af7": true, - "588226ef24597767af46e39c": true, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "588892092459774ac91d4b11": true, - "5888945a2459774bf43ba385": true, - "5888956924597752983e182d": true, - "5888961624597754281f93f3": true, - "5888976c24597754281f93f5": true, - "5888988e24597752fe43a6fa": true, - "5888996c24597754281f9419": true, - "58889c7324597754281f9439": true, - "58889d0c2459775bc215d981": true, - "588b56d02459771481110ae2": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "58949fac86f77409483e16aa": true, - "5894a05586f774094708ef75": true, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "58a56f8d86f774651579314c": true, - "58a5c12e86f7745d585a2b9e": true, - "58ac1bf086f77420ed183f9f": true, - "58ac60eb86f77401897560ff": true, - "58aeaaa886f7744fc1560f81": true, - "58aeac1b86f77457c419f475": true, - "58c157be86f77403c74b2bb6": true, - "58c157c886f774032749fb06": true, - "58d2664f86f7747fec5834f6": true, - "58d268fc86f774111273f8c2": true, - "58d2912286f7744e27117493": true, - "58d2946386f774496974c37e": true, - "58d2946c86f7744e271174b5": true, - "58d2947686f774485c6a1ee5": true, - "58d2947e86f77447aa070d53": true, - "58d399e486f77442e0016fe7": true, - "58d39b0386f77443380bf13c": true, - "58d39d3d86f77445bb794ae7": true, - "58dd3ad986f77403051cba8f": true, - "5900b89686f7744e704a8747": true, - "590c5d4b86f774784e1b9c45": false, - "590c60fc86f77412b13fddcf": true, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": true, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": true, - "591aef7986f774139d495f03": true, - "591af10186f774139d495f0e": true, - "591af28e86f77414a27a9e1d": true, - "591c4e1186f77410354b316e": true, - "591c4efa86f7741030027726": true, - "591ee00d86f774592f7b841e": true, - "5926bb2186f7744b1c6c6e60": true, - "5926c0df86f77462f647f764": true, - "5926c32286f774616e42de99": true, - "5926c36d86f77467a92a8629": true, - "5926c3b286f774640d189b6b": true, - "5926d2be86f774134d668e4e": true, - "5926d33d86f77410de68ebc0": true, - "5926d3c686f77410de68ebc8": true, - "5926d40686f7740f152b6b7e": true, - "5926dad986f7741f82604363": true, - "5926e16e86f7742f5a0f7ecb": true, - "5926f2e086f7745aae644231": true, - "5926f34786f77469195bfe92": true, - "5929a2a086f7744f4b234d43": true, - "592c2d1a86f7746dbe2af32a": true, - "593d1fa786f7746da62d61ac": true, - "593d489686f7745c6255d58a": true, - "593d490386f7745ee97a1555": true, - "593d493f86f7745e6b2ceb22": true, - "5943d9c186f7745a13413ac9": true, - "5943ee5a86f77413872d25ec": true, - "5943eeeb86f77412d6384f6b": true, - "5947c73886f7747701588af5": true, - "5947db3f86f77447880cf76f": true, - "5947e98b86f774778f1448bc": true, - "5947eab886f77475961d96c5": true, - "5947f92f86f77427344a76b1": true, - "5947fa2486f77425b47c1a9b": true, - "595cf16b86f77427440c32e2": true, - "595cfa8b86f77427437e845b": true, - "5996f6cb86f774678763a6ca": true, - "5996f6d686f77467977ba6cc": true, - "5996f6fc86f7745e585b4de3": true, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a6c86f77414ec448d17": true, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59bfc5c886f7743bf6794e62": true, - "59bfe68886f7746004266202": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c0ec5b86f77435b128bfca": true, - "59c1383d86f774290a37e0ca": true, - "59c63b4486f7747afb151c1c": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "59d6272486f77466146386ff": true, - "59d64ec286f774171d1e0a42": true, - "59d650cf86f7741b846413a4": true, - "59d790f486f77403cb06aec6": true, - "59db3a1d86f77429e05b4e92": true, - "59db3acc86f7742a2c4ab912": true, - "59db3b0886f77429d72fb895": true, - "59db7e1086f77448be30ddf3": true, - "59db7eed86f77461f8380365": true, - "59e0bdb186f774156f04ce82": true, - "59e0be5d86f7742d48765bd2": true, - "59e0bed186f774156f04ce84": true, - "59e0d99486f7744a32234762": true, - "59e3577886f774176a362503": true, - "59e4cf5286f7741778269d8a": true, - "59e4d24686f7741776641ac7": true, - "59e4d3d286f774176a36250a": true, - "59e5f5a486f7746c530b3ce2": true, - "59e6152586f77473dc057aa1": true, - "59e649f986f77411d949b246": true, - "59e6542b86f77411dc52a77a": true, - "59e655cb86f77411dc52a77b": true, - "59e6658b86f77411d949b250": true, - "59e6687d86f77411d949b251": true, - "59e68f6f86f7746c9f75e846": true, - "59e6906286f7746c9f75e847": true, - "59e690b686f7746c9f75e848": true, - "59e6918f86f7746c9f75e849": true, - "59e6920f86f77411d82aa167": true, - "59e6927d86f77411da468256": true, - "59e7635f86f7742cbf2c1095": true, - "59e763f286f7742ee57895da": true, - "59e7643b86f7742cbf2c109a": true, - "59e7708286f7742cbd762753": true, - "59e770b986f7742cbd762754": true, - "59e770f986f7742cbe3164ef": true, - "59e7711e86f7746cae05fbe1": true, - "59e7715586f7742ee5789605": true, - "59e77a2386f7742ee578960a": true, - "59e8977386f77415a553c453": true, - "59eb7ebe86f7740b373438ce": true, - "59ecc28286f7746d7a68aa8c": true, - "59ecc3dd86f7746dc827481c": true, - "59ef13ca86f77445fd0e2483": true, - "59f8a37386f7747af3328f06": true, - "59f98b4986f7746f546d2cef": true, - "59f99a7d86f7745b134aa97b": true, - "59f9cabd86f7743a10721f46": true, - "59f9d81586f7744c7506ee62": true, - "59fafc5086f7740dbe19f6c3": true, - "59fafc9386f774067d462453": true, - "59fafd4b86f7745ca07e1232": true, - "59fb042886f7746c5005a7b2": true, - "59fb137a86f7740adb646af1": true, - "59fb257e86f7742981561852": true, - "59fb375986f7741b681b81a6": true, - "59fc48e086f77463b1118392": true, - "59ff346386f77477562ff5e2": true, - "5a0060fc86f7745793204432": true, - "5a01ad4786f77450561fda02": true, - "5a0abb6e1526d8000a025282": true, - "5a0c27731526d80618476ac4": true, - "5a0c59791526d8dba737bba7": true, - "5a0d63621526d8dba31fe3bf": true, - "5a0d716f1526d8000d26b1e2": true, - "5a0eb980fcdbcb001a3b00a6": true, - "5a0ec13bfcdbcb00165aa685": true, - "5a0ed824fcdbcb0176308b0d": true, - "5a0f096dfcdbcb0176308b15": true, - "5a154d5cfcdbcb001a3b00da": true, - "5a16b672fcdbcb001912fa83": true, - "5a16b7e1fcdbcb00165aa6c9": true, - "5a16b8a9fcdbcb00165aa6ca": true, - "5a16b93dfcdbcbcae6687261": true, - "5a16b9fffcdbcb0176308b34": true, - "5a16ba61fcdbcb098008728a": true, - "5a16badafcdbcb001865f72d": true, - "5a16bb52fcdbcb001a3b00dc": true, - "5a17f98cfcdbcb0980087290": true, - "5a17fb9dfcdbcbcae6687291": true, - "5a17fc70fcdbcb0176308b3d": true, - "5a1eaa87fcdbcb001865f75e": true, - "5a1eacb3fcdbcb09800872be": true, - "5a1ead28fcdbcb001912fa9f": true, - "5a269f97c4a282000b151807": true, - "5a26abfac4a28232980eabff": true, - "5a26ac06c4a282000c5a90a8": true, - "5a26ac0ec4a28200741e1e18": true, - "5a27b281c4a28200741e1e52": true, - "5a27b3d0c4a282000d721ec1": true, - "5a27b6bec4a282000e496f78": true, - "5a27bad7c4a282000b15184b": true, - "5a2a57cfc4a2826c6e06d44a": true, - "5a329052c4a28200741e22d3": true, - "5a32a064c4a28200741e22de": true, - "5a32aa0cc4a28232996e405f": true, - "5a32aa8bc4a2826c6e06d737": true, - "5a339805c4a2826c6e06d73d": true, - "5a33a8ebc4a282000c5a950d": true, - "5a33b2c9c4a282000c5a9511": true, - "5a33b652c4a28232996e407c": true, - "5a33bab6c4a28200741e22f8": true, - "5a33ca0fc4a282000d72292f": true, - "5a33cae9c4a28232980eb086": true, - "5a33e75ac4a2826c6e06d759": true, - "5a34f7f1c4a2826c6e06d75d": true, - "5a34fae7c4a2826c6e06d760": true, - "5a34fbadc4a28200741e230a": true, - "5a34fd2bc4a282329a73b4c5": true, - "5a34fe59c4a282000b1521a2": true, - "5a3501acc4a282000d72293a": true, - "5a351711c4a282000b1521a4": true, - "5a367e5dc4a282000e49738f": true, - "5a37ca54c4a282000d72296a": true, - "5a37cb10c4a282329a73b4e7": true, - "5a38e6bac4a2826c6e06d79b": true, - "5a38ed75c4a28232996e40c6": true, - "5a38ee51c4a282000c5a955c": true, - "5a398ab9c4a282000c5a9842": true, - "5a398b75c4a282000a51a266": true, - "5a3c16fe86f77452b62de32a": true, - "5a43943586f77416ad2f06e2": true, - "5a43957686f7742a2c2f11b0": true, - "5a5f1ce64f39f90b401987bc": true, - "5a6086ea4f39f99cd479502f": true, - "5a608bf24f39f98ffc77720e": true, - "5a69a2ed8dc32e000d46d1f1": true, - "5a6b585a8dc32e5a9c28b4f1": true, - "5a6b592c8dc32e00094b97bf": true, - "5a6b59a08dc32e000b452fb7": true, - "5a6b5b8a8dc32e001207faf3": true, - "5a6b5e468dc32e001207faf5": true, - "5a6b5ed88dc32e000c52ec86": true, - "5a6b5f868dc32e000a311389": true, - "5a6b60158dc32e000a31138b": true, - "5a6f58f68dc32e000a311390": true, - "5a6f5d528dc32e00094b97d9": true, - "5a6f5e048dc32e00094b97da": true, - "5a6f5f078dc32e00094b97dd": true, - "5a702d198dc32e000b452fc3": true, - "5a7033908dc32e000a311392": true, - "5a70366c8dc32e001207fb06": true, - "5a7037338dc32e000d46d257": true, - "5a705e128dc32e000d46d258": true, - "5a718b548dc32e000d46d262": true, - "5a718da68dc32e000d46d264": true, - "5a718f958dc32e00094b97e7": true, - "5a71e0048dc32e000c52ecc8": true, - "5a71e0fb8dc32e00094b97f2": true, - "5a71e1868dc32e00094b97f3": true, - "5a71e22f8dc32e00094b97f4": true, - "5a71e4f48dc32e001207fb26": true, - "5a787ebcc5856700142fdd98": true, - "5a787f25c5856700186c4ab9": true, - "5a787f7ac5856700177af660": true, - "5a787fadc5856700155a6ca1": true, - "5a787fdfc5856700142fdd9a": true, - "5a788031c585673f2b5c1c79": true, - "5a788068c5856700137e4c8f": true, - "5a788089c5856700142fdd9c": true, - "5a7880d0c5856700142fdd9d": true, - "5a78813bc5856700186c4abe": true, - "5a788169c5856700142fdd9e": true, - "5a789261c5856700186c65d3": true, - "5a7893c1c585673f2b5c374d": true, - "5a78948ec5856700177b1124": true, - "5a7ad0c451dfba0013379712": true, - "5a7ad1fb51dfba0013379715": true, - "5a7ad2e851dfba0016153692": true, - "5a7ad4af51dfba0013379717": true, - "5a7ad55551dfba0015068f42": true, - "5a7ad74e51dfba0015068f45": true, - "5a7ae0c351dfba0017554310": true, - "5a7afa25e899ef00135e31b0": true, - "5a7b32a2e899ef00135e345a": true, - "5a7b483fe899ef0016170d15": true, - "5a7b4900e899ef197b331a2a": true, - "5a7b4960e899ef197b331a2d": true, - "5a7c147ce899ef00150bd8b8": true, - "5a7c4850e899ef00150be885": true, - "5a7c74b3e899ef0014332c29": true, - "5a7d90eb159bd400165484f1": true, - "5a7d9104159bd400134c8c21": true, - "5a7d9122159bd4001438dbf4": true, - "5a7d912f159bd400165484f3": true, - "5a7dbfc1159bd40016548fde": true, - "5a800961159bd4315e3a1657": true, - "5a8036fb86f77407252ddc02": true, - "5a80a29286f7742b25692012": true, - "5a9548c9159bd400133e97b3": true, - "5a957c3fa2750c00137fa5f7": true, - "5a966ec8a2750c00171b3f36": true, - "5a966f51a2750c00156aacf6": true, - "5a9685b1a2750c0032157104": true, - "5a9d56c8a2750c0032157146": true, - "5a9d6d00a2750c5c985b5305": true, - "5a9d6d13a2750c00164f6b03": true, - "5a9d6d21a2750c00137fa649": true, - "5a9d6d34a2750c00141e07da": true, - "5a9e81fba2750c00164f6b11": true, - "5a9ea27ca2750c00137fa672": true, - "5a9eb32da2750c00171b3f9c": true, - "5a9fb739a2750c003215717f": true, - "5a9fbacda2750c00141e080f": true, - "5a9fbb74a2750c0032157181": true, - "5a9fbb84a2750c00137fa685": true, - "5a9fc7e6a2750c0032157184": true, - "5aa2b87de5b5b00016327c25": false, - "5aa2b89be5b5b0001569311f": true, - "5aa2b8d7e5b5b00014028f4a": true, - "5aa2b923e5b5b000137b7589": true, - "5aa2b986e5b5b00014028f4c": true, - "5aa2b9aee5b5b00015693121": true, - "5aa2b9ede5b5b000137b758b": true, - "5aa2ba19e5b5b00014028f4e": true, - "5aa2ba46e5b5b000137b758d": true, - "5aa2ba71e5b5b000137b758f": true, - "5aa66a9be5b5b0214e506e89": true, - "5aa66be6e5b5b0214e506e97": true, - "5aa66c72e5b5b00016327c93": true, - "5aa7cfc0e5b5b00015693143": false, - "5aa7d193e5b5b000171d063f": true, - "5aa7e276e5b5b000171d0647": true, - "5aa7e373e5b5b000137b76f0": true, - "5aa7e3abe5b5b000171d064d": true, - "5aa7e454e5b5b0214e506fa2": true, - "5aa7e4a4e5b5b000137b76f2": true, - "5aaa4194e5b5b055d06310a5": true, - "5aaa5dfee5b5b000140293d3": true, - "5aaa5e60e5b5b000140293d6": true, - "5aaf8a0be5b5b00015693243": true, - "5aaf8e43e5b5b00015693246": true, - "5aaf9d53e5b5b00015042a52": true, - "5aafa1c2e5b5b00015042a56": true, - "5aafa49ae5b5b00015042a58": true, - "5aafa857e5b5b00018480968": true, - "5aafbde786f774389d0cbc0f": true, - "5ab24ef9e5b5b00fe93c9209": true, - "5ab372a310e891001717f0d8": true, - "5ab3afb2d8ce87001660304d": true, - "5ab8dab586f77441cd04f2a2": true, - "5ab8dced86f774646209ec87": true, - "5ab8e4ed86f7742d8e50c7fa": true, - "5ab8e79e86f7742d8b372e78": true, - "5ab8e9fcd8ce870019439434": true, - "5ab8ebf186f7742d8b372e80": true, - "5ab8f04f86f774585f4237d8": true, - "5ab8f20c86f7745cdb629fb2": true, - "5ab8f39486f7745cd93a1cca": true, - "5ab8f4ff86f77431c60d91ba": true, - "5ab8f85d86f7745cd93a1cf5": true, - "5abcbb20d8ce87001773e258": true, - "5abcbc27d8ce8700182eceeb": true, - "5abcc328d8ce8700194394f3": true, - "5abccb7dd8ce87001773e277": true, - "5ac4c50d5acfc40019262e87": true, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac66c5d5acfc4001718d314": true, - "5ac66cb05acfc40198510a10": true, - "5ac66d015acfc400180ae6e4": true, - "5ac66d2e5acfc43b321d4b53": true, - "5ac66d725acfc43b321d4b60": true, - "5ac66d9b5acfc4001633997a": true, - "5ac72e475acfc400180ae6fe": true, - "5ac733a45acfc400192630e2": true, - "5ac7655e5acfc40016339a19": false, - "5ac78eaf5acfc4001926317a": true, - "5ac8d6885acfc400180ae7b0": true, - "5addba3e5acfc4001669f0ab": true, - "5addbac75acfc400194dbc56": true, - "5addbb6e5acfc408fb1393fd": true, - "5addbb825acfc408fb139400": true, - "5addbb945acfc4001a5fc44e": true, - "5addbba15acfc400185c2854": true, - "5addbbb25acfc40015621bd9": true, - "5addbf175acfc408fb13965b": true, - "5addbfbb5acfc400194dbcf7": true, - "5addbfd15acfc40015621bde": true, - "5addbfe15acfc4001a5fc58b": true, - "5addbfef5acfc400185c2857": true, - "5addbffe5acfc4001714dfac": true, - "5addc00b5acfc4001669f144": true, - "5addc7005acfc4001669f275": true, - "5addc7ac5acfc400194dbd90": true, - "5addc7db5acfc4001669f279": true, - "5addcce35acfc4001a5fc635": true, - "5addccf45acfc400185c2989": true, - "5adf23995acfc400185c2aeb": true, - "5ae096d95acfc400185c2c81": true, - "5ae30bad5acfc400185c2dc4": true, - "5ae30c9a5acfc408fb139a03": true, - "5ae30db85acfc408fb139a05": true, - "5ae30e795acfc408fb139a0b": true, - "5ae35b315acfc4001714e8b0": true, - "5af0454c86f7746bf20992e8": true, - "5af0548586f7743a532b7e99": true, - "5afd7ded5acfc40017541f5e": true, - "5afd7e095acfc40017541f61": true, - "5afd7e445acfc4001637e35a": true, - "5b04473a5acfc40018632f70": true, - "5b057b4f5acfc4771e1bd3e9": true, - "5b07db875acfc40dc528a5f6": true, - "5b07dd285acfc4001754240d": true, - "5b0800175acfc400153aebd4": true, - "5b099a765acfc47a8607efe3": true, - "5b099a9d5acfc47a8607efe7": true, - "5b099ac65acfc400186331e1": true, - "5b099b7d5acfc400186331e4": true, - "5b099b965acfc400186331e6": true, - "5b099bb25acfc400186331e8": true, - "5b099bf25acfc4001637e683": true, - "5b0bbe4e5acfc40dc528a72d": true, - "5b0bc22d5acfc47a8607f085": true, - "5b0e794b5acfc47a877359b2": true, - "5b1fa9b25acfc40018633c01": true, - "5b1fa9ea5acfc40018633c0a": true, - "5b1faa0f5acfc40dc528aeb5": true, - "5b1fb3e15acfc4001637f068": true, - "5b1fd4e35acfc40018633c39": true, - "5b222d335acfc4771e1be099": true, - "5b222d405acfc400153af4fe": true, - "5b2240bf5acfc40dc528af69": true, - "5b237e425acfc4771e1be0b6": true, - "5b2388675acfc4771e1be0be": true, - "5b2389515acfc4771e1be0c0": true, - "5b2cfa535acfc432ff4db7a0": true, - "5b30ac585acfc433000eb79c": true, - "5b30b0dc5acfc400153b7124": true, - "5b30bc165acfc40016387293": true, - "5b30bc285acfc47a8608615d": true, - "5b31163c5acfc400153b71cb": true, - "5b3116595acfc40019476364": true, - "5b363dd25acfc4001a598fd2": true, - "5b363dea5acfc4771e1c5e7e": true, - "5b363e1b5acfc4771e1c5e80": true, - "5b39f8db5acfc40016387a1b": true, - "5b39ffbd5acfc47a8773fb06": true, - "5b3a08b25acfc4001754880c": true, - "5b3a16655acfc40016387a2a": true, - "5b3a337e5acfc4704b4a19a0": true, - "5b3b6dc75acfc47a8773fb1e": true, - "5b3b6e495acfc4330140bd88": true, - "5b3b713c5acfc4330140bd8d": true, - "5b3b99265acfc4704b4a1afb": true, - "5b3b99475acfc432ff4dcbee": true, - "5b3baf8f5acfc40dc5296692": true, - "5b3cadf35acfc400194776a0": true, - "5b3cbc235acfc4001863ac44": true, - "5b3f7bf05acfc433000ecf6b": true, - "5b3f7c005acfc4704b4a1de8": true, - "5b3f7c1c5acfc40dc5296b1d": true, - "5b40e1525acfc4771e1c6611": true, - "5b40e2bc5acfc40016388216": true, - "5b40e3f35acfc40016388218": true, - "5b40e4035acfc47a87740943": true, - "5b40e5e25acfc4001a599bea": true, - "5b40e61f5acfc4001a599bec": true, - "5b4325355acfc40019478126": true, - "5b4326435acfc433000ed01d": true, - "5b43271c5acfc432ff4dce65": true, - "5b4327aa5acfc400175496e0": true, - "5b4329075acfc400153b78ff": true, - "5b4329f05acfc47a86086aa1": true, - "5b432b2f5acfc4771e1c6622": true, - "5b432b6c5acfc4001a599bf0": true, - "5b432b965acfc47a8774094e": true, - "5b432be65acfc433000ed01f": true, - "5b432c305acfc40019478128": true, - "5b432d215acfc4771e1c6624": true, - "5b432f3d5acfc4704b4a1dfb": true, - "5b44c6ae86f7742d1627baea": true, - "5b44c8ea86f7742d1627baf1": true, - "5b44cad286f77402a54ae7e5": true, - "5b44cd8b86f774503d30cba2": true, - "5b44cf1486f77431723e3d05": true, - "5b44d0de86f774503d30cba8": true, - "5b44d22286f774172b0c9de8": true, - "5b46238386f7741a693bcf9c": true, - "5b4736a986f774040571e998": true, - "5b4736b986f77405cb415c10": true, - "5b7be1125acfc4001876c0e5": true, - "5b7be1265acfc400161d0798": true, - "5b7be1ca5acfc400170e2d2f": true, - "5b7be2345acfc400196d524a": true, - "5b7be4575acfc400161d0832": true, - "5b7be4645acfc400170e2dcc": true, - "5b7be46e5acfc400170e2dcf": true, - "5b7be47f5acfc400170e2dd2": true, - "5b7be4895acfc400170e2dd5": true, - "5b7bebc85acfc43bca706666": true, - "5b7bed205acfc400161d08cc": true, - "5b7bedd75acfc43d825283f9": true, - "5b7bee755acfc400196d5383": true, - "5b7bef1e5acfc43d82528402": true, - "5b7bef5d5acfc43bca7067a3": true, - "5b7bef9c5acfc43d102852ec": true, - "5b7c2d1d5acfc43d1028532a": true, - "5b7c710788a4506dec015957": true, - "5b7d37845acfc400170e2f87": true, - "5b7d63b75acfc400170e2f8a": true, - "5b7d63cf5acfc4001876c8df": true, - "5b7d63de5acfc400170e2f8d": true, - "5b7d64555acfc4001876c8e2": true, - "5b7d645e5acfc400170e2f90": true, - "5b7d671b5acfc43d82528ddd": true, - "5b7d678a5acfc4001a5c4022": true, - "5b7d679f5acfc4001a5c4024": true, - "5b7d68af5acfc400170e30c3": true, - "5b7d693d5acfc43bca706a3d": true, - "5b7d6c105acfc40015109a5f": true, - "5b800e9286f7747a8b04f3ff": true, - "5b800ebc86f774394e230a90": true, - "5b800ed086f7747baf6e2f9e": true, - "5b80242286f77429445e0b47": true, - "5b84038986f774774913b0c1": true, - "5b8403a086f7747ff856f4e2": true, - "5b86a0e586f7745b600ccb23": true, - "5ba26383d4351e00334c93d9": true, - "5ba264f6d4351e0034777d52": true, - "5ba2657ed4351e0035628ff2": true, - "5ba26586d4351e44f824b340": true, - "5ba2678ad4351e44f824b344": true, - "5ba26812d4351e003201fef1": true, - "5ba26835d4351e0035628ff5": true, - "5ba26844d4351e00334c9475": true, - "5ba26acdd4351e003562908e": true, - "5ba26ae8d4351e00367f9bdb": true, - "5ba26b01d4351e0085325a51": true, - "5ba26b17d4351e00367f9bdd": true, - "5ba36f85d4351e0085325c81": true, - "5bae13bad4351e00320204af": true, - "5bae13ded4351e44f824bf38": true, - "5bb20d53d4351e4502010a69": true, - "5bb20d92d4351e00853263eb": true, - "5bb20d9cd4351e00334c9d8a": true, - "5bb20da5d4351e0035629dbf": true, - "5bb20dadd4351e00367faeff": true, - "5bb20dbcd4351e44f824c04e": true, - "5bb20dcad4351e3bac1212da": true, - "5bb20de5d4351e0035629e59": true, - "5bb20df1d4351e00347787d5": true, - "5bb20dfcd4351e00334c9e24": true, - "5bb20e0ed4351e3bac1212dc": true, - "5bb20e18d4351e00320205d5": true, - "5bb20e49d4351e3bac1212de": true, - "5bb20e58d4351e00320205d7": true, - "5bb20e70d4351e0035629f8f": true, - "5bb2475ed4351e00853264e3": true, - "5bbdb811d4351e45020113c7": true, - "5bbdb83fd4351e44f824c44b": true, - "5bbdb870d4351e00367fb67d": true, - "5bbdb8bdd4351e4502011460": true, - "5bbde409d4351e003562b036": true, - "5bbde41ed4351e003562b038": true, - "5bc09a18d4351e003562b68e": true, - "5bc09a30d4351e00367fb7c8": true, - "5bc5a351d4351e003477a414": true, - "5bc5a35cd4351e450201232f": true, - "5bc5a372d4351e44f824d17f": true, - "5bc9c1e2d4351e00367fbcf0": true, - "5bc9c29cd4351e003562b8a3": true, - "5bcf0213d4351e0085327c17": true, - "5bd06f5d86f77427101ad47c": true, - "5bd0716d86f774171822ef4b": true, - "5bd071d786f7747e707b93a3": true, - "5bd073a586f7747e6f135799": true, - "5bd073c986f7747f627e796c": true, - "5bd70322209c4d00d7167b8f": true, - "5bd704e7209c4d00d7167c31": true, - "5be4038986f774527d3fae60": true, - "5bead2e00db834001c062938": true, - "5bed61680db834001d2c45ab": true, - "5bed625c0db834001c062946": true, - "5beec1bd0db834001e6006f3": true, - "5beec2820db834001b095426": true, - "5beec3420db834001b095429": true, - "5beec3e30db8340019619424": true, - "5beec8b20db834001961942a": true, - "5beec8c20db834001d2c465c": true, - "5beec8ea0db834001a6f9dbf": true, - "5beec91a0db834001961942d": true, - "5beec9450db83400970084fd": true, - "5beecbb80db834001d2c465e": true, - "5beed0f50db834001c062b12": true, - "5bf3e03b0db834001d2c4a9c": true, - "5bf3e0490db83400196199af": true, - "5bf3f59f0db834001a6fa060": true, - "5bfd297f0db834001a669119": true, - "5bfd35380db83400232fe5cc": true, - "5bfd36290db834001966869a": true, - "5bfd36ad0db834001c38ef66": true, - "5bfd37c80db834001d23e842": true, - "5bfd384c0db834001a6691d3": true, - "5bfd4c980db834001b73449d": true, - "5bfd4cbe0db834001b73449f": true, - "5bfd4cc90db834001d23e846": true, - "5bfd4cd60db834001c38f095": true, - "5bfe7fb30db8340018089fed": true, - "5bfe86a20db834001d23e8f7": true, - "5bfe86bd0db83400232fe959": true, - "5bfe86df0db834001b734685": true, - "5bfe89510db834001808a127": true, - "5bfea6e90db834001b7347f3": true, - "5bfea7ad0db834001c38f1ee": true, - "5bfeaa0f0db834001b734927": true, - "5bfeb32b0db834001a6694d9": true, - "5bfebc250db834001a6694e1": true, - "5bfebc320db8340019668d79": true, - "5bfebc530db834001d23eb65": true, - "5bfebc5e0db834001a6694e5": true, - "5bffcf7a0db83400232fea79": true, - "5bffd7ed0db834001d23ebf9": true, - "5bffdc370db834001d23eca8": false, - "5bffdd7e0db834001b734a1a": true, - "5bffe7930db834001b734a39": true, - "5bffe7c50db834001d23ece1": true, - "5bffec120db834001c38f5fa": true, - "5bffef760db8340019668fe4": true, - "5c0000c00db834001a6697fc": true, - "5c0006470db834001a6697fe": true, - "5c00076d0db834001d23ee1f": true, - "5c0009510db834001966907f": true, - "5c0102aa0db834001b734ba1": true, - "5c0102b20db834001d23eebc": true, - "5c010a700db834001d23ef5d": true, - "5c010e350db83400232feec7": true, - "5c0111ab0db834001966914d": true, - "5c0125fc0db834001a669aa3": true, - "5c0126f40db834002a125382": true, - "5c012ffc0db834001d23f03f": true, - "5c0505e00db834001b735073": true, - "5c0517910db83400232ffee5": true, - "5c05293e0db83400232fff80": true, - "5c05295e0db834001a66acbb": true, - "5c052a900db834001a66acbd": true, - "5c05413a0db834001c390617": true, - "5c0548ae0db834001966a3c2": true, - "5c0558060db834001b735271": true, - "5c064c400db834001d23f468": true, - "5c06595c0db834001a66af6c": true, - "5c066e3a0db834001b7353f0": true, - "5c066ef40db834001966a595": true, - "5c0672ed0db834001b7353f3": true, - "5c0673fb0db8340023300271": true, - "5c0684e50db834002a12585a": true, - "5c0695860db834001b735461": true, - "5c0696830db834001d23f5da": true, - "5c06c6a80db834001b735491": true, - "5c079ec50db834001966a706": true, - "5c079ed60db834001a66b372": true, - "5c07a8770db8340023300450": true, - "5c07b36c0db834002a1259e9": true, - "5c07b3850db834002330045b": true, - "5c07c5ed0db834001b73571c": true, - "5c07c60e0db834002330051f": true, - "5c07c9660db834001a66b588": true, - "5c07dd120db834001c39092d": true, - "5c07df7f0db834001b73588a": true, - "5c08f87c0db8340019124324": true, - "5c0919b50db834001b7ce3b9": true, - "5c091a4e0db834001d5addc8": true, - "5c093ca986f7740a1867ab12": true, - "5c093e3486f77430cb02e593": true, - "5c0a2cec0db834001b7ce47d": true, - "5c0d2727d174af02a012cf58": true, - "5c0d32fcd174af02a1659c75": true, - "5c0d56a986f774449d5de529": true, - "5c0d591486f7744c505b416f": true, - "5c0d5ae286f7741e46554302": true, - "5c0d5e4486f77478390952fe": true, - "5c0d668f86f7747ccb7f13b2": true, - "5c0d688c86f77413ae3407b2": true, - "5c0e2f26d174af02a9625114": true, - "5c0e2f5cd174af02a012cfc9": true, - "5c0e2f94d174af029f650d56": true, - "5c0e2ff6d174af02a1659d4a": true, - "5c0e3eb886f7742015526062": true, - "5c0e446786f7742013381639": true, - "5c0e51be86f774598e797894": true, - "5c0e530286f7747fa1419862": true, - "5c0e531286f7747fa54205c2": true, - "5c0e531d86f7747fa23f4d42": true, - "5c0e533786f7747fa23f4d47": true, - "5c0e534186f7747fa1419867": true, - "5c0e53c886f7747fa54205c7": true, - "5c0e541586f7747fa54205c9": true, - "5c0e57ba86f7747fa141986d": true, - "5c0e5bab86f77461f55ed1f3": true, - "5c0e5edb86f77461f55ed1f7": true, - "5c0e625a86f7742d77340f62": true, - "5c0e655586f774045612eeb2": true, - "5c0e66e2d174af02a96252f4": true, - "5c0e6a1586f77404597b4965": true, - "5c0e722886f7740458316a57": true, - "5c0e746986f7741453628fe5": true, - "5c0e774286f77468413cc5b2": true, - "5c0e805e86f774683f3dd637": true, - "5c0e842486f77443a74d2976": true, - "5c0e874186f7745dc7616606": true, - "5c0fa877d174af02a012e1cf": true, - "5c0faeddd174af02a962601f": true, - "5c0faf68d174af02a96260b8": true, - "5c0fafb6d174af02a96260ba": true, - "5c10c8fd86f7743d7d706df3": true, - "5c11046cd174af02a012e42b": true, - "5c110624d174af029e69734c": true, - "5c11279ad174af029d64592b": true, - "5c1127bdd174af44217ab8b9": true, - "5c1127d0d174af29be75cf68": true, - "5c1260dc86f7746b106e8748": true, - "5c12619186f7743f871c8a32": true, - "5c1262a286f7743f8a69aab2": true, - "5c165d832e2216398b5a7e36": true, - "5c17664f2e2216398b5a7e3c": true, - "5c1780312e221602b66cc189": true, - "5c17804b2e2216152006c02f": true, - "5c178a942e22164bef5ceca3": true, - "5c1793902e221602b21d3de2": true, - "5c17a7ed2e2216152142459c": true, - "5c18b90d2e2216152142466b": true, - "5c18b9192e2216398b5a8104": true, - "5c1a1cc52e221602b3136e3d": true, - "5c1a1e3f2e221602b66cc4c2": true, - "5c1bc4812e22164bef5cfde7": true, - "5c1bc5612e221602b5429350": true, - "5c1bc5af2e221602b412949b": true, - "5c1bc5fb2e221602b1779b32": true, - "5c1bc7432e221602b412949d": true, - "5c1bc7752e221602b1779b34": true, - "5c1cd46f2e22164bef5cfedb": true, - "5c1cdd302e221602b3137250": true, - "5c1cdd512e22161b267d91ae": true, - "5c3df7d588a4501f290594e5": true, - "5c46fbd72e2216398b5a8c9c": true, - "5c471b5d2e221602b21d4e14": true, - "5c471b7e2e2216152006e46c": true, - "5c471ba12e221602b3137d76": true, - "5c471bd12e221602b4129c3a": true, - "5c471be12e221602b66cd9ac": true, - "5c471bfc2e221602b21d4e17": true, - "5c471c2d2e22164bef5d077f": true, - "5c471c442e221602b542a6f8": true, - "5c471c6c2e221602b66cd9ae": true, - "5c471c842e221615214259b5": true, - "5c471cb32e221602b177afaa": true, - "5c488a752e221602b412af63": true, - "5c48a14f2e2216152006edd7": true, - "5c48a2852e221602b21d5923": true, - "5c48a2a42e221602b66d1e07": true, - "5c48a2c22e221602b313fb6c": true, - "5c4ee3d62e2216152006f302": true, - "5c4eec9b2e2216398b5aaba2": true, - "5c4eecc32e221602b412b440": true, - "5c4eecde2e221602b3140418": true, - "5c501a4d2e221602b412b540": true, - "5c5039be2e221602b177c9ff": true, - "5c503ac82e221602b21d6e9a": true, - "5c503ad32e2216398b5aada2": true, - "5c503af12e221602b177ca02": true, - "5c503b1c2e221602b21d6e9d": true, - "5c503d0a2e221602b542b7ef": true, - "5c5952732e2216398b5abda2": true, - "5c59529a2e221602b177d160": true, - "5c5970672e221602b21d7855": true, - "5c5db5852e2216003a0fe71a": true, - "5c5db5962e2216000e5e46eb": true, - "5c5db5b82e2216003a0fe71d": true, - "5c5db5c62e22160012542255": true, - "5c5db5f22e2216000e5e47e8": true, - "5c5db5fc2e2216000f1b2842": true, - "5c5db6302e2216000e5e47f0": true, - "5c5db63a2e2216000f1b284a": true, - "5c5db6552e2216001026119d": true, - "5c5db6652e221600113fba51": true, - "5c5db6742e2216000f1b2852": true, - "5c5db6b32e221600102611a0": true, - "5c5db6ee2e221600113fba54": true, - "5c5db6f82e2216003a0fe914": true, - "5c6161fb2e221600113fbde5": true, - "5c6162682e22160010261a2b": true, - "5c61627a2e22160012542c55": true, - "5c6165902e22160010261b28": true, - "5c6175362e221600133e3b94": true, - "5c617a5f2e2216000f1e81b3": true, - "5c61a40d2e2216001403158d": true, - "5c6592372e221600133e47d7": true, - "5c6beec32e221601da3578f2": true, - "5c6bf4aa2e2216001219b0ae": true, - "5c6c2c9c2e2216000f2002e4": true, - "5c6d10e82e221601da357b07": true, - "5c6d10fa2e221600106f3f23": true, - "5c6d11072e2216000e69d2e4": true, - "5c6d11152e2216000f2003e7": true, - "5c6d42cb2e2216000e69d7d1": true, - "5c6d450c2e221600114c997d": true, - "5c6d46132e221601da357d56": true, - "5c6d5d8b2e221644fc630b39": true, - "5c6d710d2e22165df16b81e7": true, - "5c6d7b3d2e221600114c9b7d": true, - "5c6d85e02e22165df16b81f4": true, - "5c78f2492e221600114c9f04": true, - "5c78f2612e221600114c9f0d": true, - "5c78f26f2e221601da3581d1": true, - "5c78f2792e221600106f4683": true, - "5c78f2882e22165df16b832e": true, - "5c791e872e2216001219c40a": true, - "5c793fb92e221644f31bfb64": true, - "5c793fc42e221600114ca25d": true, - "5c793fde2e221601da358614": true, - "5c7951452e221644f31bfd5c": true, - "5c7954d52e221600106f4cc7": true, - "5c7955c22e221644f31bfd5e": true, - "5c7d55de2e221644f31bff68": true, - "5c7d55f52e221644f31bff6a": true, - "5c7d560b2e22160bc12c6139": true, - "5c7e5f112e221600106f4ede": true, - "5c7e8fab2e22165df16b889b": true, - "5c7fb51d2e2216001219ce11": true, - "5c7fc87d2e221644f31c0298": true, - "5c82342f2e221644f31c060e": true, - "5c82343a2e221644f31c0611": true, - "5c86592b2e2216000e69e77c": true, - "5c878e9d2e2216000f201903": true, - "5c878ebb2e2216001219d48a": true, - "5c87a07c2e2216001219d4a2": true, - "5c87ca002e221600114cb150": true, - "5c88f24b2e22160bc12c69a6": true, - "5c90c3622e221601da359851": true, - "5c920e902e221644f31c3c99": true, - "5c925fa22e221601da359b7b": true, - "5c99f3592e221644fc633070": true, - "5c9a07572e221644f31c4b32": true, - "5c9a1c3a2e2216000e69fb6a": true, - "5c9a1c422e221600106f69f0": true, - "5c9a25172e2216000f20314e": true, - "5c9a26332e2216001219ea70": true, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": true, - "5ca20ee186f774799474abc2": true, - "5ca2113f86f7740b2547e1d2": true, - "5ca21c6986f77479963115a7": true, - "5cadc1c6ae9215000f2775a4": true, - "5cadc2e0ae9215051e1c21e7": true, - "5cadc390ae921500126a77f1": true, - "5cadc431ae921500113bb8d5": true, - "5cadc55cae921500103bb3be": true, - "5cadd919ae921500126a77f3": true, - "5cadd940ae9215051e1c2316": true, - "5cadd954ae921500103bb3c2": true, - "5cadf6ddae9215051e1c23b2": true, - "5cadf6e5ae921500113bb973": true, - "5cadf6eeae921500134b2799": true, - "5cadfbf7ae92152ac412eeef": true, - "5caf1041ae92157c28402e3f": true, - "5caf1109ae9215753c44119f": true, - "5caf1691ae92152ac412efb9": true, - "5caf16a2ae92152ac412efbc": true, - "5caf17c9ae92150b30006be1": true, - "5caf187cae92157c28402e43": true, - "5cbda392ae92155f3c17c39f": true, - "5cbda9f4ae9215000e5b9bfc": true, - "5cbdaf89ae9215000e5b9c94": true, - "5cbdb1b0ae9215000d50e105": true, - "5cbdc23eae9215001136a407": true, - "5cc6ea78e4a949000e1ea3c1": true, - "5cc6ea85e4a949000e1ea3c3": true, - "5cc70093e4a949033c734312": true, - "5cc700b9e4a949000f0f0f25": true, - "5cc700cae4a949035e43ba72": true, - "5cc700d4e4a949000f0f0f28": true, - "5cc700ede4a949033c734315": true, - "5cc70102e4a949035e43ba74": true, - "5cc7012ae4a949001252b43e": true, - "5cc70146e4a949000d73bf6b": true, - "5cc7015ae4a949001152b4c6": true, - "5cc701aae4a949000e1ea45c": true, - "5cc701d7e4a94900100ac4e7": true, - "5cc80f38e4a949001152b560": true, - "5cc80f53e4a949000e1ea4f8": true, - "5cc80f67e4a949035e43bbba": true, - "5cc80f79e4a949033c7343b2": true, - "5cc80f8fe4a949033b0224a2": true, - "5cc82796e24e8d000f5859a8": true, - "5cc82d76e24e8d00134b4b83": true, - "5cc86832d7f00c000d3a6e6c": true, - "5cc86840d7f00c002412c56c": true, - "5cc9a96cd7f00c011c04e04a": true, - "5cc9ad73d7f00c000e2579d4": true, - "5cc9b815d7f00c000e2579d6": true, - "5cc9bcaed7f00c011c04e179": true, - "5cc9c20cd7f00c001336c65d": true, - "5cda9bcfd7f00c0c0b53e900": true, - "5cdaa99dd7f00c002412d0b2": true, - "5cdd7685d7f00c000f260ed2": true, - "5cdd7693d7f00c0010373aa5": true, - "5cde739cd7f00c0010373bd3": true, - "5cde77a9d7f00c000f261009": true, - "5cde7afdd7f00c000d36b89d": true, - "5cde7b43d7f00c000d36b93e": true, - "5cde8864d7f00c0010373be1": true, - "5cdeac22d7f00c000f26168f": true, - "5cdeac42d7f00c000d36ba73": true, - "5cdeac5cd7f00c000f261694": true, - "5cdeaca5d7f00c00b61c4b70": true, - "5ce69cbad7f00c00b61c5098": true, - "5cebec00d7f00c065c53522a": true, - "5cebec10d7f00c065703d185": true, - "5cebec38d7f00c00110a652a": true, - "5cf12a15d7f00c05464b293f": true, - "5cf13123d7f00c1085616a50": true, - "5cf4e3f3d7f00c06595bc7f0": true, - "5cf4fb76d7f00c065703d3ac": true, - "5cf50850d7f00c056e24104c": true, - "5cf508bfd7f00c056e24104e": true, - "5cf50fc5d7f00c056c53f83c": true, - "5cf518cfd7f00c065b422214": true, - "5cf54404d7f00c108840b2ef": true, - "5cf638cbd7f00c06595bc936": true, - "5cf639aad7f00c065703d455": true, - "5cf656f2d7f00c06585fb6eb": true, - "5cf67a1bd7f00c06585fb6f3": true, - "5cf67cadd7f00c065a5abab7": true, - "5cf6935bd7f00c06585fb791": true, - "5cf6937cd7f00c056c53fb39": true, - "5cf78496d7f00c065703d6ca": true, - "5cf78720d7f00c06595bc93e": true, - "5cf79389d7f00c10941a0c4d": true, - "5cf79599d7f00c10875d9212": true, - "5cf7acfcd7f00c1084477cf2": true, - "5cf8f3b0d7f00c00217872ef": true, - "5cfe8010d7ad1a59283b14c6": true, - "5cff9e5ed7ad1a09407397d4": true, - "5cff9e84d7ad1a049e54ed55": true, - "5d00e0cbd7ad1a6c6566a42d": true, - "5d00ec68d7ad1a04a067e5be": true, - "5d00ede1d7ad1a0940739a76": true, - "5d00ef6dd7ad1a0940739b16": true, - "5d00f63bd7ad1a59283b1c1e": true, - "5d010d1cd7ad1a59283b1ce7": true, - "5d0236dad7ad1a0940739d29": true, - "5d023784d7ad1a049d4aa7f2": true, - "5d024f5cd7ad1a04a067e91a": true, - "5d025cc1d7ad1a53845279ef": true, - "5d02676dd7ad1a049e54f6dc": true, - "5d02677ad7ad1a04a15c0f95": true, - "5d026791d7ad1a04a067ea63": true, - "5d02778e86f774203e7dedbe": true, - "5d02797c86f774203f38e30a": true, - "5d0a29ead7ad1a0026013f27": true, - "5d0a29fed7ad1a002769ad08": true, - "5d0a3a58d7ad1a669c15ca14": true, - "5d0a3e8cd7ad1a6f6a3d35bd": true, - "5d0b5cd3d7ad1a3fe32ad263": true, - "5d10b49bd7ad1a1a560708b0": true, - "5d120a10d7ad1a4e1026ba85": true, - "5d120a28d7ad1a1c8962e295": true, - "5d122e7bd7ad1a07102d6d7f": true, - "5d123102d7ad1a004e475fe5": true, - "5d123a3cd7ad1a004e476058": true, - "5d123b70d7ad1a0ee35e0754": true, - "5d123b7dd7ad1a004f01b262": true, - "5d124c01d7ad1a115c7d59fb": true, - "5d124c0ed7ad1a10d168dd9b": true, - "5d124c1ad7ad1a12227c53a7": true, - "5d133067d7ad1a33013f95b4": true, - "5d1340b3d7ad1a0b52682ed7": true, - "5d1340bdd7ad1a0e8d245aab": true, - "5d1340cad7ad1a0b0b249869": true, - "5d135e83d7ad1a21b83f42d8": true, - "5d135ecbd7ad1a21c176542e": true, - "5d15ce51d7ad1a1eff619092": true, - "5d15cf3bd7ad1a67e71518b2": true, - "5d19cd96d7ad1a4a992c9f52": true, - "5d1b198cd7ad1a604869ad72": true, - "5d1b33a686f7742523398398": true, - "5d1b36a186f7742523398433": true, - "5d1b371186f774253763a656": true, - "5d1b5e94d7ad1a2b865a96b0": true, - "5d1c702ad7ad1a632267f429": true, - "5d1f819086f7744b355c219b": true, - "5d2369418abbc306c62e0c80": true, - "5d25a4a98abbc30b917421a4": true, - "5d25a6538abbc306c62e630d": true, - "5d25a6a48abbc306c62e6310": true, - "5d25a7b88abbc3054f3e60bc": true, - "5d25af8f8abbc3055079fec5": true, - "5d25d0ac8abbc3054f3e61f7": true, - "5d2702e88abbc31ed91efc44": true, - "5d2703038abbc3105103d94c": true, - "5d270b3c8abbc3105335cfb8": true, - "5d270ca28abbc31ee25ee821": true, - "5d2c76ed48f03532f2136169": true, - "5d2c770c48f0354b4a07c100": true, - "5d2c772c48f0355d95672c25": true, - "5d2c829448f0353a5c7d6674": true, - "5d2da1e948f035477b1ce2ba": true, - "5d2dc3e548f035404a1a4798": true, - "5d2f0d8048f0356c925bc3b0": true, - "5d2f213448f0355009199284": true, - "5d2f259b48f0355a844acd74": true, - "5d2f25bc48f03502573e5d85": true, - "5d2f261548f03576f500e7b7": true, - "5d2f2ab648f03550091993ca": true, - "5d2f2d5748f03572ec0c0139": true, - "5d3eb3b0a4b93615055e84d2": true, - "5d3eb44aa4b93650d64e4979": true, - "5d3eb4aba4b93650d64e497d": true, - "5d3eb536a4b9363b1f22f8e2": true, - "5d3eb59ea4b9361c284bb4b2": true, - "5d3eb5b6a4b9361eab311902": true, - "5d3eb5eca4b9363b1f22f8e4": true, - "5d3ef698a4b9361182109872": true, - "5d403f9186f7743cac3f229b": true, - "5d40407c86f774318526545a": true, - "5d43021ca4b9362eab4b5e25": true, - "5d4405aaa4b9361e6a4e6bd3": true, - "5d4405f0a4b9361e6a4e6bd9": true, - "5d440625a4b9361eec4ae6c5": true, - "5d44064fa4b9361e4f6eb8b5": true, - "5d44069ca4b9361ebd26fc37": true, - "5d4406a8a4b9361e4f6eb8b7": true, - "5d440b93a4b9364276578d4b": true, - "5d440b9fa4b93601354d480c": true, - "5d44334ba4b9362b346d1948": true, - "5d443f8fa4b93678dd4a01aa": true, - "5d4aaa54a4b9365392071170": true, - "5d4aaa73a4b9365392071175": true, - "5d4aab30a4b9365435358c55": true, - "5d5d646386f7742797261fd9": true, - "5d5d85c586f774279a21cbdb": true, - "5d5d87f786f77427997cfaef": true, - "5d5d8ca986f7742798716522": true, - "5d5d940f86f7742797262046": true, - "5d5e7d28a4b936645d161203": true, - "5d5e9c74a4b9364855191c40": true, - "5d5fca1ea4b93635fd598c07": true, - "5d67abc1a4b93614ec50137f": true, - "5d6d2e22a4b9361bd5780d05": true, - "5d6d2ef3a4b93618084f58bd": true, - "5d6d3716a4b9361bc8618872": true, - "5d6d3829a4b9361bc8618943": true, - "5d6d3943a4b9360dbc46d0cc": true, - "5d6d3be5a4b9361bc73bc763": true, - "5d6e6772a4b936088465b17c": true, - "5d6e67fba4b9361bc73bc779": true, - "5d6e6806a4b936088465b17e": true, - "5d6e6869a4b9361c140bcfde": true, - "5d6e6891a4b9361bd473feea": true, - "5d6e689ca4b9361bc8618956": true, - "5d6e68a8a4b9360b6c0d54e2": true, - "5d6e68b3a4b9361bca7e50b5": true, - "5d6e68c4a4b9361b93413f79": true, - "5d6e68d1a4b93622fe60e845": true, - "5d6e68dea4b9361bcc29e659": true, - "5d6e68e6a4b9361c140bcfe0": true, - "5d6e6911a4b9361bd5780d52": true, - "5d6e695fa4b936359b35d852": true, - "5d6e69b9a4b9361bc8618958": true, - "5d6e69c7a4b9360b6c0d54e4": true, - "5d6e6a05a4b93618084f58d0": true, - "5d6e6a42a4b9364f07165f52": true, - "5d6e6a53a4b9361bd473feec": true, - "5d6e6a5fa4b93614ec501745": true, - "5d7b6bafa4b93652786f4c76": true, - "5d96141523f0ea1b7f2aacab": true, - "5dcbd56fdbd3d91b3e5468d5": true, - "5dcbd6b46ec07c0c4347a564": true, - "5dcbd6dddbd3d91b3e5468de": true, - "5dcbe9431e1f4616d354987e": true, - "5dcbe965e4ed22586443a79d": true, - "5de652c31b7e3716273428be": true, - "5de653abf76fdc1ce94a5a2a": true, - "5de65547883dde217541644b": true, - "5de6556a205ddc616a6bc4f7": true, - "5de6558e9f98ac2bc65950fc": true, - "5de655be4a9f347bc92edb88": true, - "5de7bd7bfd6b4e6e2276dc25": true, - "5de8e67c4a9f347bc92edbd7": true, - "5de8e8dafd6b4e6e2276dc32": true, - "5de8ea8ffd6b4e6e2276dc35": true, - "5de8eaadbbaf010b10528a6d": true, - "5de8eac42a78646d96665d91": true, - "5de8f237bbaf010b10528a70": true, - "5de8f2d5b74cd90030650c72": true, - "5de8fb539f98ac2bc659513a": true, - "5de8fbad2fbe23140d3ee9c4": true, - "5de8fbf2b74cd90030650c79": true, - "5de8fc0b205ddc616a6bc51b": true, - "5de910da8b6c4240ba2651b5": true, - "5de922d4b11454561e39239f": true, - "5df24cf80dee1b22f862e9bc": true, - "5df256570dee1b22f862e9c4": true, - "5df25b6c0b92095fd441e4cf": true, - "5df25d3bfd6b4e6e2276dc9a": true, - "5df35ddddfc58d14537c2036": true, - "5df35e59c41b2312ea3334d5": true, - "5df35e7f2a78646d96665dd4": true, - "5df35e970b92095fd441e4d2": true, - "5df35ea9c41b2312ea3334d8": true, - "5df35eb2b11454561e3923e2": true, - "5df36948bb49d91fb446d5ad": true, - "5df38a5fb74cd90030650cb6": true, - "5df8a2ca86f7740bfe6df777": true, - "5df8a42886f77412640e2e75": true, - "5df8a4d786f77412672a1e3b": true, - "5df8a58286f77412631087ed": true, - "5df8ce05b11454561e39243b": true, - "5df8e053bb49d91fb446d6a6": true, - "5df8e085bb49d91fb446d6a8": true, - "5df8e4080b92095fd441e594": true, - "5df8f535bb49d91fb446d6b0": true, - "5df8f541c41b2312ea3335e3": true, - "5df916dfbb49d91fb446d6b9": true, - "5df917564a9f347bc92edca3": true, - "5dfa397fb11454561e39246c": true, - "5dfa3cd1b33c0951220c079b": true, - "5dfa3d2b0dee1b22f862eade": true, - "5dfa3d45dfc58d14537c20b0": true, - "5dfa3d7ac41b2312ea33362a": true, - "5dfa3d950dee1b22f862eae0": true, - "5dfcd0e547101c39625f66f9": true, - "5dfce88fe9dc277128008b2e": true, - "5dfe14f30b92095fd441edaf": true, - "5dfe6104585a0c3e995c7b82": true, - "5dff772da3651922b360bf91": true, - "5dff77c759400025ea5150cf": true, - "5dff8db859400025ea5150d4": true, - "5e00903ae9dc277128008b87": true, - "5e0090f7e9dc277128008b93": true, - "5e00c1ad86f774747333222c": true, - "5e00cdd986f7747473332240": true, - "5e00cfa786f77469dc6e5685": true, - "5e01e9e273d8eb11426f5bc3": true, - "5e01ea19e9dc277128008c0b": true, - "5e01ef6886f77445f643baa4": true, - "5e01f31d86f77465cf261343": true, - "5e01f37686f774773c6f6c15": true, - "5e023cf8186a883be655e54f": true, - "5e023d34e8a400319a28ed44": true, - "5e023d48186a883be655e551": true, - "5e023e53d4353e3302577c4c": true, - "5e023e6e34d52a55c3304f71": true, - "5e023e88277cce2b522ff2b1": true, - "5e208b9842457a4a7a33d074": true, - "5e217ba4c1434648c13568cd": true, - "5e2192a498a36665e8337386": true, - "5e21a3c67e40bd02257a008a": true, - "5e21ca18e4d47f0da15e77dd": true, - "5e2af47786f7746d404f3aaa": true, - "5e2af4a786f7746d3f3c3400": true, - "5e2af55f86f7746d4159f07c": true, - "5e32f56fcb6d5863cc5e5ee4": true, - "5e340dcdcb6d5863cc5e5efb": true, - "5e4abb5086f77406975c9342": true, - "5e4abc1f86f774069619fbaa": true, - "5e4abc6786f77406812bd572": true, - "5e4abfed86f77406a2713cf7": true, - "5e4ac41886f77406a511c9a8": true, - "5e4bfc1586f774264f7582d3": true, - "5e4d34ca86f774264f758330": true, - "5e54f76986f7740366043752": true, - "5e54f79686f7744022011103": true, - "5e56991336989c75ab4f03f6": true, - "5e5699df2161e06ac158df6f": true, - "5e569a0156edd02abe09f27d": true, - "5e569a132642e66b0b68015c": true, - "5e569a2e56edd02abe09f280": true, - "5e71f6be86f77429f2683c44": true, - "5e71f70186f77429ee09f183": true, - "5e71fad086f77422443d4604": true, - "5e81c3cbac2bb513793cdc75": true, - "5e81c4ca763d9f754677befa": true, - "5e81c519cb2b95385c177551": true, - "5e81c539cb2b95385c177553": true, - "5e81c550763d9f754677befd": true, - "5e81c6a2ac2bb513793cdc7f": true, - "5e81c6bf763d9f754677beff": true, - "5e81ebcd8e146c7080625e15": true, - "5e81edc13397a21db957f6a1": true, - "5e81ee213397a21db957f6a6": true, - "5e81ee4dcb2b95385c177582": true, - "5e81f423763d9f754677bf2e": true, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": true, - "5e848cc2988a8701445df1e8": true, - "5e848d1c264f7c180b5e35a9": true, - "5e848d2eea0a7c419c2f9bfd": true, - "5e848d51e4dbc5266a4ec63b": true, - "5e848d99865c0f329958c83b": true, - "5e848db4681bea2ada00daa9": true, - "5e848dc4e4dbc5266a4ec63d": true, - "5e85a9f4add9fe03027d9bf1": true, - "5e85aa1a988a8701445df1f5": true, - "5e870397991fd70db46995c8": true, - "5e87071478f43e51ca2de5e1": true, - "5e87076ce2db31558c75a11d": true, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": true, - "5e87114fe2db31558c75a120": true, - "5e87116b81c4ed43e83cefdd": true, - "5e8f3423fd7471236e6e3b64": true, - "5e997f0b86f7741ac73993e2": true, - "5e9dacf986f774054d6b89f4": true, - "5e9db13186f7742f845ee9d3": true, - "5e9dcf5986f7746c417435b3": true, - "5ea02bb600685063ec28bfa1": true, - "5ea034eb5aad6446a939737b": true, - "5ea034f65aad6446a939737e": true, - "5ea03e5009aa976f2e7a514b": true, - "5ea03e9400685063ec28bfa4": true, - "5ea03f7400685063ec28bfa8": true, - "5ea058e01dbce517f324b3e2": true, - "5ea05cf85ad9772e6624305d": true, - "5ea16acdfadf1d18c87b0784": true, - "5ea16ada09aa976f2e7a51be": true, - "5ea16d4d5aad6446a939753d": true, - "5ea172e498dacb342978818e": true, - "5ea17bbc09aa976f2e7a51cd": true, - "5ea17ca01412a1425304d1c0": true, - "5ea18c84ecf1982c7712d9a2": true, - "5ea2a8e200685063ec28c05a": true, - "5ed515c8d380ab312177c0fa": true, - "5ed515e03a40a50460332579": true, - "5ed515ece452db0eb56fc028": true, - "5ed515f6915ec335206e4152": true, - "5ed5160a87bb8443d10680b5": true, - "5ed51652f6c34d2cc26336a1": true, - "5ed5166ad380ab312177c100": true, - "5ede4739e0350d05467f73e8": true, - "5ede47405b097655935d7d16": true, - "5ede474b0c226a66f5402622": true, - "5ede475339ee016e8c534742": true, - "5ede475b549eed7c6d5c18fb": true, - "5eea21647547d6330471b3c9": true, - "5eea217fc64c5d0dfc05712a": true, - "5eeb2ff5ea4f8b73c827350b": true, - "5ef1b9f0c64c5d0dfc0571a1": true, - "5ef1ba28c64c5d0dfc0571a5": true, - "5ef32e4d1c1fd62aea6a150d": true, - "5ef3448ab37dfd6af863525c": true, - "5ef3553c43cb350a955a7ccb": true, - "5ef35bc243cb350a955a7ccd": true, - "5ef35d2ac64c5d0dfc0571b0": true, - "5ef35f46382a846010715a96": true, - "5ef366938cef260c0642acad": true, - "5ef369b08cef260c0642acaf": true, - "5ef5d994dfbc9f3c660ded95": true, - "5ef61964ec7f42238c31e0c1": true, - "5efaf417aeb21837e749c7f2": true, - "5efb0c1bd79ff02a1f5e68d9": true, - "5efb0cabfb3e451d70735af5": true, - "5efb0d4f4bc50b58e81710f3": true, - "5efb0da7a29a85116f6ea05f": true, - "5efb0e16aeb21837e749c7ff": true, - "5efb0fc6aeb21837e749c801": true, - "5f0596629e22f464da6bbdd9": true, - "5f0c892565703e5c461894e9": true, - "5f2a9575926fd9352339381f": true, - "5f2aa43ba9b91d26f20ae6d2": true, - "5f2aa4464b50c14bcf07acdb": true, - "5f2aa4559b44de6b1b4e68d1": true, - "5f2aa46b878ef416f538b567": true, - "5f2aa47a200e2c0ee46efa71": true, - "5f2aa493cd375f14e15eea72": true, - "5f2aa49f9b44de6b1b4e68d4": true, - "5f36a0e5fbf956000b716b65": true, - "5f3e76d86cda304dcc634054": true, - "5f3e772a670e2a7b01739a52": true, - "5f3e777688ca2d00ad199d25": true, - "5f3e778efcd9b651187d7201": true, - "5f3e77b26cda304dcc634057": true, - "5f3e77f59103d430b93f94c1": true, - "5f3e7801153b8571434a924c": true, - "5f3e7823ddc4f03b010e2045": true, - "5f3e7897ddc4f03b010e204a": true, - "5f3e78a7fbf956000b716b8e": true, - "5f4f9eb969cdc30ff33f09db": false, - "5f5e45cc5021ce62144be7aa": true, - "5f5e467b0bc58666c37e7821": true, - "5f5e46b96bdad616ad46d613": true, - "5f5f41476bdad616ad46d631": true, - "5f5f41f56760b4138443b352": true, - "5f60b34a41e30a4ab12a6947": true, - "5f60b85bbdb8e27dee3dc985": true, - "5f60bf4558eff926626a60f2": true, - "5f60c076f2bcbb675b00dac2": true, - "5f60c74e3b85f6263c145586": true, - "5f60c85b58eff926626a60f7": true, - "5f60cd6cf2bcbb675b00dac6": true, - "5f60e6403b85f6263c14558c": true, - "5f60e7788adaa7100c3adb49": true, - "5f60e784f2bcbb675b00dac7": true, - "5f6331e097199b7db2128dc2": true, - "5f6336bbda967c74a42e9932": true, - "5f6339d53ada5942720e2dc3": true, - "5f633f68f5750b524b45f112": true, - "5f633f791b231926f2329f13": true, - "5f633ff5c444ce7e3c30a006": true, - "5f63405df5750b524b45f114": true, - "5f63407e1b231926f2329f15": true, - "5f6340d3ca442212f4047eb2": true, - "5f6341043ada5942720e2dc5": true, - "5f63418ef5750b524b45f116": true, - "5f6372e2865db925d54f3869": true, - "5f647f31b6238e5dd066e196": true, - "5f99418230835532b445e954": true, - "5f994730c91ed922dd355de3": true, - "5f9949d869e2777a0e779ba5": true, - "5fb64bc92b1b027b1f50bcf2": true, - "5fb651b52b1b027b1f50bcff": true, - "5fb651dc85f90547f674b6f4": true, - "5fb65363d1409e5ca04b54f5": true, - "5fb653962b1b027b1f50bd03": true, - "5fb65424956329274326f316": true, - "5fb6548dd1409e5ca04b54f9": true, - "5fb6558ad6f0b2136f2d7eb7": true, - "5fb655a72b1b027b1f50bd06": true, - "5fb655b748c711690e3a8d5a": true, - "5fb6564947ce63734e3fa1da": true, - "5fb6567747ce63734e3fa1dc": true, - "5fbb976df9986c4cff3fe5f2": true, - "5fbb978207e8a97d1f0902d3": true, - "5fbbaa86f9986c4cff3fe5f6": true, - "5fbbc3324e8a554c40648348": true, - "5fbbc34106bde7524f03cbe9": true, - "5fbbc366ca32ed67276c1557": true, - "5fbbc383d5cb881a7363194a": true, - "5fbbfabed5cb881a7363194e": true, - "5fbbfacda56d053a3543f799": true, - "5fbc210bf24b94483f726481": true, - "5fbc226eca32ed67276c155d": true, - "5fbc227aa56d053a3543f79e": true, - "5fbc22ccf24b94483f726483": true, - "5fbcbcf593164a5b6278efb2": true, - "5fbcbd02900b1d5091531dd3": true, - "5fbcbd10ab884124df0cd563": true, - "5fbcbd6c187fea44d52eda14": true, - "5fbcc1d9016cce60e8341ab3": true, - "5fbcc3e4d6fa9c00c571bb58": true, - "5fbcc429900b1d5091531dd7": true, - "5fbcc437d724d907e2077d5c": true, - "5fbcc640016cce60e8341acc": true, - "5fbe3ffdf8b6a877a729ea82": true, - "5fbe760793164a5b6278efc8": true, - "5fbe7618d6fa9c00c571bb6c": true, - "5fc0f9b5d724d907e2077d82": true, - "5fc0f9cbd6fa9c00c571bb90": true, - "5fc0fa362770a0045c59c677": true, - "5fc0fa957283c4046c58147e": true, - "5fc22d7c187fea44d52eda44": true, - "5fc23426900b1d5091531e15": true, - "5fc235db2770a0045c59c683": true, - "5fc2360f900b1d5091531e19": true, - "5fc23636016cce60e8341b05": true, - "5fc23678ab884124df0cd590": true, - "5fc2369685fd526b824a5713": true, - "5fc275cf85fd526b824a571a": true, - "5fc278107283c4046c581489": true, - "5fc382a9d724d907e2077dab": true, - "5fc382b6d6fa9c00c571bbc3": true, - "5fc382c1016cce60e8341b20": true, - "5fc3e272f8b6a877a729eac5": true, - "5fc3e466187fea44d52eda90": true, - "5fc3e4a27283c4046c5814ab": true, - "5fc3e4ee7283c4046c5814af": true, - "5fc3f2d5900b1d5091531e57": true, - "5fc4b97bab884124df0cd5e3": true, - "5fc4b992187fea44d52edaa9": true, - "5fc4b9b17283c4046c5814d7": true, - "5fc53954f8b6a877a729eaeb": true, - "5fc5396e900b1d5091531e72": true, - "5fc64ea372b0dd78d51159dc": true, - "5fca138c2a7b221b2852a5c6": true, - "5fca13ca637ee0341a484f46": true, - "5fce0cf655375d18a253eff0": true, - "5fce0f9b55375d18a253eff2": true, - "5fce16961f152d4312622bc9": true, - "5fd20ff893a8961fc660a954": true, - "5fd4c474dd870108a754b241": true, - "5fd4c4fa16cac650092f6771": true, - "5fd4c5477a8d854fa0105061": true, - "5fd4c60f875c30179f5d04c2": true, - "5fd8d28367cb5e077335170f": true, - "60098ad7c2240c0fe85c570a": true, - "60098af40accd37ef2175f27": true, - "60098b1705871270cd5352a1": true, - "601948682627df266209af05": true, - "60194943740c5d77f6705eea": true, - "601949593ae8f707c4608daa": true, - "601aa3d2b2bcb34913271e6d": true, - "602286df23506e50807090c6": true, - "60228924961b8d75ee233c32": true, - "60228a76d62c9b14ed777a66": true, - "60228a850ddce744014caf69": true, - "602293f023506e50807090cb": true, - "60229948cacb6b0506369e27": true, - "602a95edda11d6478d5a06da": true, - "602a95fe4e02ce1eaa358729": true, - "602a97060ddce744014caf6f": true, - "602a9740da11d6478d5a06dc": true, - "602e3f1254072b51b239f713": true, - "602e620f9b513876d4338d9a": true, - "602e63fb6335467b0c5ac94d": true, - "602e71bd53a60014f9705bfa": true, - "602f85fd9b513876d4338d9c": true, - "603372b4da11d6478d5a07ff": true, - "603372d154072b51b239f9e1": true, - "603372f153a60014f970616d": true, - "603373004e02ce1eaa358814": true, - "6033749e88382f4fab3fd2c5": true, - "60337f5dce399e10262255d1": true, - "60338ff388382f4fab3fd2c8": true, - "60339954d62c9b14ed777c06": true, - "6033fa48ffd42c541047f728": true, - "603409c80ca681766b6a0fb2": true, - "6034cf5fffd42c541047f72e": true, - "6034d0230ca681766b6a0fb5": true, - "6034d103ca006d2dca39b3f0": true, - "6034d2d697633951dc245ea6": true, - "6034e3cb0ddce744014cb870": true, - "6034e3d953a60014f970617b": true, - "6034e3e20ddce744014cb878": true, - "603618feffd42c541047f771": true, - "603619720ca681766b6a0fc4": true, - "60361a7497633951dc245eb4": true, - "60361b0b5a45383c122086a1": true, - "60361b5a9a15b10d96792291": true, - "60363c0c92ec1c31037959f5": true, - "603648ff5a45383c122086ac": true, - "6038b4b292ec1c3103795a0b": true, - "6038b4ca92ec1c3103795a0d": true, - "6038d614d10cbf667352dd44": true, - "6040dd4ddcf9592f401632d2": true, - "6040de02647ad86262233012": true, - "606587252535c57a13424cfd": true, - "60658776f2cb2e02a42ace2b": true, - "6065878ac9cf8012264142fd": true, - "606587a88900dc2d9a55b659": true, - "606587bd6d0bd7580617bacc": true, - "606587d11246154cad35d635": true, - "606587e18900dc2d9a55b65f": true, - "6065880c132d4d12c81fd8da": true, - "6065881d1246154cad35d637": true, - "6065c6e7132d4d12c81fd8e1": true, - "6065dc8a132d4d12c81fd8e3": true, - "606dae0ab0e443224b421bb7": true, - "606ee5c81246154cad35d65e": true, - "606eef46232e5a31c233d500": true, - "606eef756d0bd7580617baf8": true, - "606ef0812535c57a13424d20": true, - "606f262c6d0bd7580617bafa": true, - "606f263a8900dc2d9a55b68d": true, - "606f26752535c57a13424d22": true, - "606f2696f2cb2e02a42aceb1": true, - "6076c1b9f2cb2e02a42acedc": true, - "60785c0d232e5a31c233d51c": true, - "60785ce5132d4d12c81fd918": true, - "607d5aa50494a626335e12ed": true, - "607ea812232e5a31c233d53c": true, - "607f201b3c672b3b3a24a800": true, - "607f20859ee58b18e41ecd90": true, - "607ffb988900dc2d9a55b6e4": true, - "6086b5392535c57a13424d70": true, - "6086b5731246154cad35d6c7": true, - "6087e0336d0bd7580617bb7a": true, - "6087e2a5232e5a31c233d552": true, - "6087e663132d4d12c81fd96b": true, - "609269c3b0e443224b421cc1": true, - "60926df0132d4d12c81fd9df": true, - "609a4b4fe2ff132951242d04": true, - "609a63b6e2ff132951242d09": true, - "609b9e31506cf869cf3eaf41": true, - "609bab8b455afd752b2e6138": true, - "609e8540d5c319764c2bc2e9": true, - "609e860ebd219504d8507525": true, - "60a23797a37c940de7062d02": true, - "60a272cc93ef783291411d8e": true, - "60a2828e8689911a226117f9": true, - "60a283193cb70855c43a381d": true, - "60a3c68c37ea821725773ef5": true, - "60a3c70cde5f453f634816a3": true, - "60a621c49c197e4e8c4455e6": true, - "60a6220e953894617404b00a": true, - "60a7acf20c5cb24b01346648": true, - "60a7ad2a2198820d95707a2e": true, - "60a7ad3a0c5cb24b0134664a": true, - "60b0f988c4449e4cb624c1da": true, - "60b52e5bc7d8103275739d67": true, - "60bf74184a63fc79b60c57f6": true, - "60db29ce99594040e04c4a27": true, - "6113c3586c780c1e710c90bc": true, - "6113cc78d3a39d50044c065a": true, - "6113cce3d92c473c770200c7": true, - "6113d6c3290d254f5e6b27db": true, - "611a30addbdd8440277441dc": true, - "611a31ce5b7ffe001b4649d1": true, - "6123649463849f3d843da7c4": true, - "612368f58b401f4f51239b33": true, - "612781056f3d944a17348d60": true, - "612e0cfc8004cc50514c2d9e": true, - "612e0d3767085e45ef14057f": true, - "612e0d81290d254f5e6b291a": true, - "612e0e04568c120fdd294258": true, - "612e0e3c290d254f5e6b291d": true, - "612e0e55a112697a4b3a66e7": true, - "6130c3dffaa1272e43151c7d": true, - "6130c43c67085e45ef1405a1": true, - "6130c4d51cb55961fa0fd49f": true, - "6130ca3fd92c473c77020dbd": true, - "614451b71e5874611e2c7ae5": true, - "615d8d878004cc50514c3233": true, - "615d8da4d3a39d50044c10e8": true, - "615d8dbd290d254f5e6b2ed6": true, - "615d8df08004cc50514c3236": true, - "615d8e2f1cb55961fa0fd9a4": true, - "615d8e9867085e45ef1409c6": true, - "615d8eb350224f204c1da1cf": true, - "615d8f5dd92c473c770212ef": true, - "615d8f8567085e45ef1409ca": true, - "615d8faecabb9b7ad90f4d5d": true, - "615d8fd3290d254f5e6b2edc": true, - "61605d88ffa6e502ac5e7eeb": true, - "616442e4faa1272e43152193": true, - "616554fe50224f204c1da2aa": true, - "61657230d92c473c770213d7": true, - "616584766ef05c2ce828ef57": true, - "61659f79d92c473c770213ee": true, - "6165ac306ef05c2ce828ef74": true, - "6165ac8c290d254f5e6b2f6c": true, - "6165adcdd3a39d50044c120f": true, - "6165aeedfaa1272e431521e3": true, - "61695095d92c473c7702147a": true, - "61702be9faa1272e431522c3": true, - "61702d8a67085e45ef140b24": true, - "61702f1b67085e45ef140b26": true, - "61703001d92c473c77021497": true, - "61712eae6c780c1e710c9a1d": true, - "617130016c780c1e710c9a24": true, - "617131a4568c120fdd29482d": true, - "61713308d92c473c770214a0": true, - "6171367e1cb55961fa0fdb36": true, - "61713a8fd92c473c770214a4": true, - "61713cc4d8e3106d9806c109": true, - "6171407e50224f204c1da3c5": true, - "61714b2467085e45ef140b2c": true, - "61714eec290d254f5e6b2ffc": true, - "617151c1d92c473c770214ab": true, - "617153016c780c1e710c9a2f": true, - "617154aa1cb55961fa0fdb3b": true, - "617155ee50224f204c1da3cd": true, - "61715e7e67085e45ef140b33": true, - "6176a40f0b8c0312ac75a3d3": true, - "6176a48d732a664031271438": true, - "6176aca650224f204c1da3fb": true, - "617aa4dd8166f034d57de9c5": true, - "617fd91e5539a84ec44ce155": true, - "61816734d8e3106d9806c1f3": true, - "618167441cb55961fa0fdc71": true, - "618167528004cc50514c34f9": true, - "618167616ef05c2ce828f1a8": true, - "6181688c6c780c1e710c9b04": true, - "618168b350224f204c1da4d8": true, - "618168dc8004cc50514c34fc": true, - "61816df1d3a39d50044c139e": true, - "61816dfa6ef05c2ce828f1ad": true, - "61816fcad92c473c770215cc": true, - "61817865d3a39d50044c13a4": true, - "618178aa1cb55961fa0fdc80": true, - "61825d06d92c473c770215de": true, - "61825d136ef05c2ce828f1cc": true, - "61825d24d3a39d50044c13af": true, - "6183afd850224f204c1da514": true, - "6183b0711cb55961fa0fdcad": true, - "6183b084a112697a4b3a6e6c": true, - "6183d53f1cb55961fa0fdcda": true, - "6183fc15d3a39d50044c13e9": true, - "6183fd911cb55961fa0fdce9": true, - "6183fd9e8004cc50514c358f": true, - "618405198004cc50514c3594": true, - "6184055050224f204c1da540": true, - "618407a850224f204c1da549": true, - "61840bedd92c473c77021635": true, - "61840d85568c120fdd2962a5": true, - "618426d96c780c1e710c9b9f": true, - "618428466ef05c2ce828f218": true, - "618a431df1eb8e24b8741deb": true, - "618a5d5852ecee1505530b2a": true, - "618a75c9a3884f56c957ca1b": true, - "618a75f0bd321d49084cd399": true, - "618a760e526131765025aae3": true, - "618aef6d0a5a59657e5f55ee": true, - "618b9643526131765025ab35": true, - "618b9671d14d6d5ab879c5ea": true, - "618b9682a3884f56c957ca78": true, - "618ba27d9008e4636a67f61d": true, - "618ba91477b82356f91ae0e8": true, - "618ba92152ecee1505530bd3": true, - "618bab21526131765025ab3f": true, - "618bb76513f5097c8d5aa2d5": true, - "618cfae774bb2d036a049e7c": true, - "619256e5f8af2c1a4e1f5d92": true, - "619386379fb0c665d5490dbe": true, - "6193a720f8ee7e52e42109ed": true, - "6193d3149fb0c665d5490e32": true, - "6193d338de3cdf1d2614a6fc": true, - "6193d382ed0429009f543e65": true, - "6193d3be7c6c7b169525f0da": true, - "6193d3cded0429009f543e6a": true, - "6193d5d4f8ee7e52e4210a1b": true, - "6193dcd0f8ee7e52e4210a28": true, - "6194ef39de3cdf1d2614a768": true, - "6194efe07c6c7b169525f11b": true, - "6194eff92d2c397d6600348b": true, - "6194f017ed0429009f543eaa": true, - "6194f02d9bb3d20b0946d2f0": true, - "6194f1f918a3974e5e7421e4": true, - "6194f2912d2c397d6600348d": true, - "6194f2df645b5d229654ad77": true, - "6194f3286db0f2477964e67d": true, - "6194f35c18a3974e5e7421e6": true, - "6194f41f9fb0c665d5490e75": true, - "6194f5722d2c397d6600348f": true, - "6194f5a318a3974e5e7421eb": true, - "6194f5d418a3974e5e7421ef": true, - "619621a4de3cdf1d2614a7a7": true, - "619624b26db0f2477964e6b0": true, - "6196255558ef8c428c287d1c": true, - "61962b617c6c7b169525f168": true, - "61962d879bb3d20b0946d385": true, - "6196364158ef8c428c287d9f": true, - "6196365d58ef8c428c287da1": true, - "619636be6db0f2477964e710": true, - "61963a852d2c397d660036ad": true, - "61965d9058ef8c428c287e0d": true, - "619666f4af1f5202c57a952d": true, - "6197b229af1f5202c57a9bea": true, - "619b5db699fb192e7430664f": true, - "619b69037b9de8162902673e": true, - "619bc61e86e01e16f839a999": true, - "619bdd8886e01e16f839a99c": true, - "619bddc6c9546643a67df6ee": true, - "619bddffc9546643a67df6f0": true, - "619bde3dc9546643a67df6f2": true, - "619bde7fc9546643a67df6f4": true, - "619bdeb986e01e16f839a99e": true, - "619bdef8c9546643a67df6f6": true, - "619bdf9cc9546643a67df6f8": true, - "619bdfd4c9546643a67df6fa": true, - "619cbf7d23893217ec30b689": true, - "619cbf9e0a7c3a1a2731940a": true, - "619cf0335771dd3c390269ae": true, - "619d36da53b4d42ee724fae4": true, - "619f4ab2d25cbd424731fb95": true, - "619f4bffd25cbd424731fb97": true, - "619f4cee4c58466fe1228435": true, - "619f4d304c58466fe1228437": true, - "619f4f8c4c58466fe1228439": true, - "619f52454c58466fe122843b": true, - "61a4c8884f95bc3b2c5dc96f": true, - "61b9e1aaef9a1b5d6a79899a": true, - "61bc85697113f767765c7fe7": true, - "61bca7cda0eae612383adf57": true, - "61bcc89aef0f505f0c6cd0fc": true, - "61c18d83b00456371a66814b": true, - "61c18db6dfd64163ea78fbb4": true, - "61f4012adfc9f01a816adda1": true, - "61f7b234ea4ab34f2f59c3ec": true, - "61f7b85367ddd414173fdb36": true, - "61f7c9e189e6fb1a5e3ea78d": true, - "61f8024263dc1250e26eb029": true, - "61f803b8ced75b2e852e35f8": true, - "61faa91878830f069b6b7967": true, - "620109578d82e67e7911abf2": true, - "6217726288ed9f0845317459": true, - "62178be9d0050232da3485d9": true, - "62178c4d4ecf221597654e3d": true, - "622b327b267a1b13a44abea3": true, - "622b379bf9cfc87d675d2de5": true, - "622b3858034a3e17ad0b81f5": true, - "622b38c56762c718e457e246": true, - "622b397c9a3d4327e41843b6": true, - "622b3c081b89c677a33bcda6": true, - "622b3d5cf9cfc87d675d2de9": true, - "622b4d7df9cfc87d675d2ded": true, - "622b4f54dc8dcc0ba8742f85": true, - "622efbcb99f4ea1a4d6c9a15": true, - "622efdf8ec80d870d349b4e5": true, - "622f02437762f55aaa68ac85": true, - "622f039199f4ea1a4d6c9a17": true, - "622f07cfae33bc505b2c4dd5": true, - "622f0ee47762f55aaa68ac87": true, - "622f128cec80d870d349b4e8": true, - "622f140da5958f63c67f1735": true, - "622f14e899892a7f9e08f6c5": true, - "622f16a1a5958f63c67f1737": true, - "623063e994fc3f7b302a9696": true, - "62307b7b10d2321fa8741921": true, - "6231654c71b5bc3baa1078e5": true, - "623166e08c43374ca1567195": true, - "6231670f0b8aa5472d060095": true, - "62330b3ed4dc74626d570b95": true, - "62330bfadc5883093563729b": true, - "62330c18744e5e31df12f516": true, - "62330c40bdd19b369e1e53d1": true, - "62386b2adf47d66e835094b2": true, - "62386b7153757417e93a4e9f": true, - "62389aaba63f32501b1b444f": true, - "62389ba9a63f32501b1b4451": true, - "62389bc9423ed1685422dc57": true, - "62389be94d5d474bf712e709": true, - "623b2e9d11c3296b440d1638": true, - "623c2f4242aee3103f1c44b7": true, - "623c2f652febb22c2777d8d7": true, - "623c3be0484b5003161840dc": true, - "623c3c1f37b4b31470357737": true, - "6241c2c2117ad530666a5108": true, - "6241c316234b593b5676b637": true, - "62444cb99f47004c781903eb": true, - "62444cd3674028188b052799": true, - "624c0570c9b794431568f5d5": true, - "624c09cfbc2e27219346d955": true, - "624c09da2cec124eb67c1046": true, - "624c09e49b98e019a3315b66": true, - "624c0b3340357b5f566e8766": true, - "624c29ce09cd027dff2f8cd7": true, - "624c2e8614da335f1e034d8c": true, - "6259b864ebedf17603599e88": true, - "6259c2c1d714855d182bad85": true, - "6259c3387d6aab70bc23a18d": true, - "6259c3d8012d6678ec38eeb8": true, - "6259c4347d6aab70bc23a190": true, - "625eb0faa6e3a82193267ad9": true, - "625ebcef6f53af4aa66b44dc": true, - "625ec45bb14d7326ac20f572": true, - "625ed7c64d9b6612df732146": true, - "626667e87379c44d557b7550": true, - "626673016f1edc06f30cf6d5": true, - "62669bccdb9ebb4daa44cd14": true, - "6267c6396b642f77f56f5c1c": true, - "6269220d70b6c02e665f2635": true, - "6269545d0e57f218e4548ca2": true, - "626a74340be03179a165e30c": true, - "626a8ae89e664a2e2a75f409": true, - "626a9cb151cb5849f6002890": true, - "626bb8532c923541184624b4": true, - "626becf9582c3e319310b837": true, - "6272370ee4013c5d7e31f418": true, - "6272379924e29f06af4d5ecb": true, - "627254cc9c563e6e442c398f": true, - "6272874a6c47bd74f92e2087": true, - "6275303a9f372d6ea97f9ec7": true, - "627e14b21713922ded6f2c15": true, - "62811cd7308cb521f87a8f99": true, - "62811e2510e26c1f344e6554": true, - "62811e335631d45211793c95": true, - "62811f461d5df4475f46a332": true, - "62811f828193841aca4a45c3": true, - "62811fa609427b40ab14e765": true, - "62811fbf09427b40ab14e767": true, - "6281204f308cb521f87a8f9b": true, - "628120621d5df4475f46a335": true, - "62812081d23f207deb0ab216": true, - "6281209662cba23f6c4d7a19": true, - "628120c21d5df4475f46a337": true, - "628120d309427b40ab14e76d": true, - "628120dd308cb521f87a8fa1": true, - "628120fd5631d45211793c9f": true, - "6281212a09427b40ab14e770": true, - "628121434fa03b6b6c35dc6a": true, - "6284bd5f95250a29bc628a30": true, - "62850c28da09541f43158cca": true, - "628a60ae6b1d481ff772e9c8": true, - "628a664bccaab13006640e47": true, - "628a665a86cbd9750d2ff5e5": true, - "628a6678ccaab13006640e49": true, - "628a66b41d5e41750e314f34": true, - "628a7b23b0f75035732dd565": true, - "628a83c29179c324ed269508": true, - "628a85ee6b1d481ff772e9d5": true, - "628b5638ad252a16da6dd245": true, - "628b8d83717774443b15e248": true, - "628b916469015a4e1711ed8d": true, - "628b9471078f94059a4b9bfb": true, - "628b9784bcf6e2659e09b8a2": true, - "628b9a40717774443b15e9f2": true, - "628b9be6cff66b70c002b14c": true, - "628b9c37a733087d0d7fe84b": true, - "628b9c7d45122232a872358f": true, - "628baf0b967de16aab5a4f36": true, - "628bc7fb408e2b2e9c0801b1": true, - "628c9ab845c59e5b80768a81": true, - "628cd624459354321c4b7fa2": true, - "628d0618d1ba6e4fa07ce5a4": true, - "628dc750b910320f4c27a732": true, - "628e1ffc83ec92260c0f437f": true, - "628e4dd1f477aa12234918aa": true, - "628e4e576d783146b124c64d": true, - "62963c18dbc8ab5f0d382d0b": true, - "62a09d3bcf4a99369e262447": true, - "62a09d79de7ac81993580530": true, - "62a09dd4621468534a797ac7": true, - "62a09e08de7ac81993580532": true, - "62a09e410b9d3c46de5b6e78": true, - "62a09f32621468534a797acb": true, - "62a1b7fbc30cfa1d366af586": true, - "62a5c2c98ec41a51b34739c0": true, - "62a5c333ec21e50cad3b5dc6": true, - "62a5c41e8ec41a51b34739c3": true, - "62a61bbf8ec41a51b34758d2": true, - "62a61c988ec41a51b34758d5": true - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608815684 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 4, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 6, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 24 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 25 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 17206066, - "GameVersion": "edge_of_darkness", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 69, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 2, - "NeedWipeOptions": [], - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Usec", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49444ae6628187a2e77b8", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49444ae6628187a2e77b8", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "f5e6bdac05e699d687993249", - "_tpl": "5857a8bc2459772bad15db29", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "SecuredContainer" - }, - { - "_id": "01e9d751f10e4e9aebdd94d5", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Pockets" - }, - { - "_id": "5fe49444ae6628187a2e78b8", - "_tpl": "5811ce772459770e9e5f9532" - }, - { - "_id": "5fe49444ae6628187a2e78ba", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49444ae6628187a2e78b9", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - }, - { - "_id": "6275a53292b3e1de7c0f94fc", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "f55404fc9c2a0063bc1b9293", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000000 - } - }, - { - "_id": "c1408429a85d87168d75e04c", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000000 - } - }, - { - "_id": "72ec3ef07bf2ddf6c0dab838", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000000 - } - }, - { - "_id": "72ec3ef08bf2fdf6c0dab835", - "_tpl": "58ac60eb86f77401897560ff", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 1 - } - } - ], - "questRaidItems": "5fe49444ae6628187a2e78b9", - "questStashItems": "5fe49444ae6628187a2e78ba", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49444ae6628187a2e78b8" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 4000 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cde9ec17d6c8b04723cf479", - "5cde9e957d6c8b0474535da7" - ], - "trader": { - "initialLoyaltyLevel": 4, - "initialSalesSum": 2600000, - "initialStanding": 6, - "jaegerUnlocked": true, - "setQuestsAvailableForStart": true - }, - "weaponbuilds": {} - } - }, - "SPT Easy start": { - "bear": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c6", - "templateId": "5811ce772459770e9e5f9532", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cc0858d14c02e000c6bea66", - "Feet": "5cc085bb14c02e000e67a5c5", - "Hands": "5cc0876314c02e000c6bea6b", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447ac644bdc2d6c208b4567": true, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448c1d04bdc2dff2f8b4569": true, - "5448fee04bdc2dbc018b4567": false, - "5448ff904bdc2d6f028b456e": true, - "5449016a4bdc2d6f028b456f": false, - "544909bb4bdc2d6f028b4577": true, - "544a11ac4bdc2d470e8b456a": false, - "544a378f4bdc2d30388b4567": true, - "544a37c44bdc2d25388b4567": true, - "544a38634bdc2d58388b4568": true, - "544a3a774bdc2d3a388b4567": true, - "544a5caa4bdc2d1a388b4568": true, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": true, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "544fb62a4bdc2dfb738b4568": true, - "544fb6cc4bdc2d34748b456e": true, - "54527a984bdc2d4e668b4567": true, - "54527ac44bdc2d36668b4567": true, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "5580169d4bdc2d9d138b4585": true, - "55801eed4bdc2d89578b4588": true, - "5580223e4bdc2d1c128b457f": true, - "558022b54bdc2dac148b458d": true, - "55802d5f4bdc2dac148b458e": true, - "55802f5d4bdc2dac148b458f": true, - "558032614bdc2de7118b4585": true, - "559ba5b34bdc2d1f1a8b4582": true, - "55d355e64bdc2d962f8b4569": true, - "55d35ee94bdc2d61338b4568": true, - "55d3632e4bdc2d972f8b4569": true, - "55d447bb4bdc2d892f8b456f": true, - "55d448594bdc2d8c2f8b4569": true, - "55d449444bdc2d962f8b456d": true, - "55d44fd14bdc2d962f8b456e": true, - "55d459824bdc2d892f8b4573": true, - "55d45d3f4bdc2d972f8b456c": true, - "55d45f484bdc2d972f8b456d": true, - "55d480c04bdc2d1d4e8b456a": false, - "55d481904bdc2d8c2f8b456a": true, - "55d482194bdc2d1d4e8b456b": true, - "55d4837c4bdc2d1d4e8b456c": true, - "55d485be4bdc2d962f8b456f": true, - "55d4887d4bdc2d962f8b4570": true, - "55d48a634bdc2d8b2f8b456a": true, - "55d48ebc4bdc2d8c2f8b456c": true, - "55d4ae6c4bdc2d8b2f8b456e": true, - "55d4af3a4bdc2d972f8b456f": true, - "55d4b9964bdc2d1d4e8b456e": true, - "55d5f46a4bdc2d1b198b4567": true, - "55d614004bdc2d86028b4568": true, - "55d6190f4bdc2d87028b4567": true, - "55d7217a4bdc2d86028b456d": false, - "55f84c3c4bdc2d5f408b4576": true, - "560835c74bdc2dc8488b456f": true, - "560836484bdc2d20478b456e": true, - "560836b64bdc2d57468b4567": true, - "560836fb4bdc2d773f8b4569": true, - "560837154bdc2da74d8b4568": true, - "5608373c4bdc2dc8488b4570": true, - "560837544bdc2de22e8b456e": true, - "560837824bdc2d57468b4568": true, - "5608379a4bdc2d26448b4569": true, - "560838c94bdc2d77798b4569": true, - "56083a334bdc2dc8488b4571": true, - "56083be64bdc2d20478b456f": true, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560d61e84bdc2da74d8b4571": true, - "560d657b4bdc2da74d8b4572": true, - "560d75f54bdc2da74d8b4573": true, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a69d4bdc2ded0b8b457b": true, - "5648a7494bdc2d9d488b4583": false, - "5648ac824bdc2ded0b8b457d": true, - "5648ae314bdc2d3d1c8b457f": true, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": true, - "5648b4534bdc2d3d1c8b4580": true, - "5649a2464bdc2d91118b45a8": true, - "5649aa744bdc2ded0b8b457e": false, - "5649ab884bdc2ded0b8b457f": true, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649ae4a4bdc2d1b2b8b4588": true, - "5649af094bdc2df8348b4586": false, - "5649af884bdc2d1b2b8b4589": true, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "5649b2314bdc2d79388b4576": true, - "5649be884bdc2d79388b4577": true, - "5649d9a14bdc2d79388b4580": true, - "5649ed104bdc2d3d1c8b458b": true, - "564ca99c4bdc2d16268b4589": false, - "564ca9df4bdc2d35148b4569": true, - "564caa3d4bdc2d17108b458e": true, - "5656d7c34bdc2d9d198b4587": true, - "5656eb674bdc2d35148b457c": true, - "567143bf4bdc2d1a0f8b4567": true, - "5673de654bdc2d180f8b456d": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59856d2720bd8418b456a": true, - "56d59d3ad2720bdb418b4577": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56dee2bdd2720bc8328b4567": true, - "56deec93d2720bec348b4568": true, - "56deed6ed2720b4c698b4583": true, - "56def37dd2720bec348b456a": true, - "56dfef82d2720bbd668b4567": true, - "56dff026d2720bb8668b4567": true, - "56dff061d2720bb5668b4567": true, - "56dff0bed2720bb0668b4567": true, - "56dff216d2720bbd668b4568": true, - "56dff2ced2720bb4668b4567": true, - "56dff3afd2720bba668b4567": true, - "56dff421d2720b5f5a8b4567": true, - "56dff4a2d2720bbd668b456a": true, - "56dff4ecd2720b5f5a8b4568": true, - "56e0598dd2720bb5668b45a6": true, - "56e05a6ed2720bd0748b4567": true, - "56e05b06d2720bb2668b4586": true, - "56e294cdd2720b603a8b4575": false, - "56e335e4d2720b6c058b456d": true, - "56e33634d2720bd8058b456b": true, - "56e33680d2720be2748b4576": true, - "56ea6fafd2720b844b8b4593": true, - "56ea70acd2720b844b8b4594": true, - "56ea7165d2720b6e518b4583": true, - "56ea7293d2720b8d4b8b45ba": true, - "56ea8180d2720bf2698b456a": true, - "56ea8222d2720b69698b4567": true, - "56ea8d2fd2720b7c698b4570": true, - "56eabcd4d2720b66698b4574": true, - "56eabf3bd2720b75698b4569": true, - "570fd6c2d2720bc6458b457f": true, - "570fd721d2720bc5458b4596": true, - "570fd79bd2720bc7458b4583": true, - "5710c24ad2720bc3458b45a3": false, - "571659bb2459771fb2755a12": true, - "571a26d524597720680fbe8a": true, - "571a279b24597720b4066566": true, - "571a282c2459771fb2755a69": true, - "571a28e524597720b4066567": true, - "571a29dc2459771fb2755a6a": true, - "57235b6f24597759bf5a30f1": true, - "572b7adb24597762ae139821": true, - "572b7fa524597762b747ce82": true, - "5732ee6a24597719ae0c0281": true, - "5734773724597737fd047c14": true, - "57347d3d245977448f7b7f61": true, - "57347d5f245977448b40fa81": true, - "57347d692459774491567cf1": true, - "57347d7224597744596b4e72": false, - "57347d8724597744596b4e76": true, - "57347d90245977448f7b7f65": true, - "57347d9c245977448b40fa85": true, - "57347da92459774491567cf5": true, - "5735fdcd2459776445391d61": true, - "5735ff5c245977640e39ba7e": true, - "573601b42459776410737435": true, - "573602322459776445391df1": true, - "5736026a245977644601dc61": true, - "573603562459776430731618": true, - "573603c924597764442bd9cb": true, - "573718ba2459775a75491131": false, - "573719762459775a626ccbc1": true, - "573719df2459775a626ccbc2": true, - "57371aab2459775a77142f22": true, - "57371b192459775a9f58a5e0": true, - "57371e4124597760ff7b25f1": true, - "57371eb62459776125652ac1": true, - "57371f2b24597761224311f1": true, - "57371f8d24597761006c6a81": true, - "5737201124597760fc4431f1": true, - "5737207f24597760ff7b25f2": true, - "573720e02459776143012541": true, - "57372140245977611f70ee91": true, - "5737218f245977612125ba51": true, - "573722e82459776104581c21": true, - "573724b42459776125652ac2": true, - "5737250c2459776125652acc": true, - "5737256c2459776125652acd": true, - "573725b0245977612125bae2": true, - "5737260b24597761224311f2": true, - "5737266524597761006c6a8c": true, - "573726d824597765d96be361": true, - "5737273924597765dd374461": true, - "573727c624597765cc785b5b": true, - "5737280e24597765cc785b5c": true, - "5737287724597765e1625ae2": true, - "573728cc24597765cc785b5d": true, - "573728f324597765e5728561": true, - "5737292724597765e5728562": true, - "57372a7f24597766fe0de0c1": true, - "57372ac324597767001bc261": true, - "57372b832459776701014e41": true, - "57372bad245977670b7cd242": true, - "57372bd3245977670b7cd243": true, - "57372c21245977670937c6c2": true, - "57372c56245977685e584582": true, - "57372c89245977685d4159b1": true, - "57372d1b2459776862260581": true, - "57372d4c245977685a3da2a1": true, - "57372db0245977685d4159b2": true, - "57372deb245977685d4159b3": true, - "57372e1924597768553071c1": true, - "57372e4a24597768553071c2": true, - "57372e73245977685d4159b4": true, - "57372e94245977685648d3e1": true, - "57372ebf2459776862260582": true, - "57372ee1245977685d4159b5": true, - "57372f2824597769a270a191": true, - "57372f5c24597769917c0131": true, - "57372f7d245977699b53e301": true, - "57372fc52459776998772ca1": true, - "5737300424597769942d5a01": true, - "5737330a2459776af32363a1": true, - "5737339e2459776af261abeb": true, - "573733c72459776b0b7b51b0": true, - "5739d41224597779c3645501": true, - "57486e672459770abd687134": true, - "574d967124597745970e7c94": true, - "574dad8024597745964bf05c": true, - "574db213245977459a2f3f5d": true, - "574eb85c245977648157eec3": true, - "575062b524597720a31c09a1": true, - "57513f07245977207e26a311": true, - "57513f9324597720a7128161": true, - "57513fcc24597720a31c09a6": true, - "5751435d24597720a27126d1": true, - "57514643245977207f2c2d09": true, - "575146b724597720a27126d5": true, - "5751487e245977207e26a315": true, - "5751496424597720a27126da": true, - "5751a25924597722c463c472": true, - "5751a89d24597722aa0e8db0": true, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": true, - "576165642459773c7a400233": true, - "576167ab2459773cad038c43": true, - "57616a9e2459773c7a400234": true, - "57616ca52459773c69055192": true, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "576fd4ec2459777f0b518431": true, - "577d128124597739d65d0e56": true, - "577d141e24597739c5255e01": true, - "57838ad32459774a17445cd2": true, - "57838c962459774a1651ec63": true, - "57838e1b2459774a256959b1": true, - "57838f0b2459774a256959b2": true, - "57838f9f2459774a150289a0": true, - "578395402459774a256959b5": true, - "578395e82459774a0e553c7b": true, - "579204f224597773d619e051": true, - "5798a2832459774b53341029": true, - "57a0dfb82459774d3078b56c": true, - "57a0e5022459774d1673f889": true, - "57a3459f245977764a01f703": true, - "57a9b9ce2459770ee926038d": true, - "57ac965c24597706be5f975c": true, - "57aca93d2459771f2c7e26db": true, - "57acb6222459771ec34b5cb0": true, - "57ade1442459771557167e15": true, - "57adff4f24597737f373b6e6": true, - "57ae0171245977343c27bfcf": true, - "57af48872459771f0b2ebf11": true, - "57c44b372459772d2b39b8ce": true, - "57c44dd02459772d2e0ae249": true, - "57c44e7b2459772d28133248": true, - "57c44f4f2459772d2c627113": true, - "57c44fa82459772d2d75e415": true, - "57c450252459772d28133253": true, - "57c55efc2459772d2c6271e7": true, - "57c55f092459772d291a8463": true, - "57c55f112459772d28133310": true, - "57c55f172459772d27602381": true, - "57c5ac0824597754771e88a9": true, - "57c69dd424597774c03b7bbc": true, - "57c9a89124597704ee6faec1": true, - "57cd379a24597778e7682ecf": false, - "57cff947245977638e6f2a19": true, - "57cffb66245977632f391a99": true, - "57cffcd624597763133760c5": true, - "57cffcdd24597763f5110006": true, - "57cffce524597763b31685d8": true, - "57cffd8224597763b03fc609": true, - "57cffddc24597763133760c6": true, - "57cffe0024597763b03fc60b": true, - "57cffe20245977632f391a9d": true, - "57d14d2524597714373db789": true, - "57d14e1724597714010c3f4b": true, - "57d1519e24597714373db79d": true, - "57d152ec245977144076ccdf": true, - "57d17c5e2459775a5c57d17d": true, - "57d17e212459775a1179a0f5": true, - "57da93632459771cb65bf83f": true, - "57dbb57e2459774673234890": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "57e26ea924597715ca604a09": true, - "57e26fc7245977162a14b800": true, - "57ee59b42459771c7b045da5": true, - "57f3a5ae2459772b0e0bf19e": true, - "57f3c6bd24597738e730fa2f": true, - "57f3c7e024597738ea4ba286": true, - "57f3c8cc2459773ec4480328": true, - "57f4c844245977379d5c14d1": true, - "57fd23e32459772d0805bcf1": true, - "57ffa9f4245977728561e844": true, - "57ffaea724597779f52b3a4d": true, - "57ffb0062459777a045af529": true, - "57ffb0e42459777d047111c5": true, - "5811ce772459770e9e5f9532": false, - "5827272a24597748c74bdeea": true, - "58272b392459774b4c7b3ccd": true, - "58272b842459774abc128d50": true, - "58272d7f2459774f6311ddfd": true, - "583990e32459771419544dd2": true, - "5839a40f24597726f856b511": true, - "5839a7742459773cf9693481": true, - "58491f3324597764bc48fa02": true, - "584924ec24597768f12ae244": true, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "587de4282459771bca0ec90b": true, - "587de5ba2459771c0f1e8a58": true, - "587df583245977373c4f1129": true, - "587e02ff24597743df3deaeb": true, - "587e0531245977466077a0f7": true, - "587e08ee245977446b4410cf": true, - "588200af24597742fa221dfb": true, - "588200c224597743990da9ed": true, - "588200cf2459774414733d55": true, - "588226d124597767ad33f787": true, - "588226dd24597767ad33f789": true, - "588226e62459776e3e094af7": true, - "588226ef24597767af46e39c": true, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "588892092459774ac91d4b11": true, - "5888945a2459774bf43ba385": true, - "5888956924597752983e182d": true, - "5888961624597754281f93f3": true, - "5888976c24597754281f93f5": true, - "5888988e24597752fe43a6fa": true, - "5888996c24597754281f9419": true, - "58889c7324597754281f9439": true, - "58889d0c2459775bc215d981": true, - "588b56d02459771481110ae2": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "58949fac86f77409483e16aa": true, - "5894a05586f774094708ef75": true, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "58a56f8d86f774651579314c": true, - "58a5c12e86f7745d585a2b9e": true, - "58ac1bf086f77420ed183f9f": true, - "58ac60eb86f77401897560ff": true, - "58aeaaa886f7744fc1560f81": true, - "58aeac1b86f77457c419f475": true, - "58c157be86f77403c74b2bb6": true, - "58c157c886f774032749fb06": true, - "58d2664f86f7747fec5834f6": true, - "58d268fc86f774111273f8c2": true, - "58d2912286f7744e27117493": true, - "58d2946386f774496974c37e": true, - "58d2946c86f7744e271174b5": true, - "58d2947686f774485c6a1ee5": true, - "58d2947e86f77447aa070d53": true, - "58d399e486f77442e0016fe7": true, - "58d39b0386f77443380bf13c": true, - "58d39d3d86f77445bb794ae7": true, - "58dd3ad986f77403051cba8f": true, - "5900b89686f7744e704a8747": true, - "590c5d4b86f774784e1b9c45": false, - "590c60fc86f77412b13fddcf": true, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": true, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": true, - "591aef7986f774139d495f03": true, - "591af10186f774139d495f0e": true, - "591af28e86f77414a27a9e1d": true, - "591c4e1186f77410354b316e": true, - "591c4efa86f7741030027726": true, - "591ee00d86f774592f7b841e": true, - "5926bb2186f7744b1c6c6e60": true, - "5926c0df86f77462f647f764": true, - "5926c32286f774616e42de99": true, - "5926c36d86f77467a92a8629": true, - "5926c3b286f774640d189b6b": true, - "5926d2be86f774134d668e4e": true, - "5926d33d86f77410de68ebc0": true, - "5926d3c686f77410de68ebc8": true, - "5926d40686f7740f152b6b7e": true, - "5926dad986f7741f82604363": true, - "5926e16e86f7742f5a0f7ecb": true, - "5926f2e086f7745aae644231": true, - "5926f34786f77469195bfe92": true, - "5929a2a086f7744f4b234d43": true, - "592c2d1a86f7746dbe2af32a": true, - "593d1fa786f7746da62d61ac": true, - "593d489686f7745c6255d58a": true, - "593d490386f7745ee97a1555": true, - "593d493f86f7745e6b2ceb22": true, - "5943d9c186f7745a13413ac9": true, - "5943ee5a86f77413872d25ec": true, - "5943eeeb86f77412d6384f6b": true, - "5947c73886f7747701588af5": true, - "5947db3f86f77447880cf76f": true, - "5947e98b86f774778f1448bc": true, - "5947eab886f77475961d96c5": true, - "5947f92f86f77427344a76b1": true, - "5947fa2486f77425b47c1a9b": true, - "595cf16b86f77427440c32e2": true, - "595cfa8b86f77427437e845b": true, - "5996f6cb86f774678763a6ca": true, - "5996f6d686f77467977ba6cc": true, - "5996f6fc86f7745e585b4de3": true, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a6c86f77414ec448d17": true, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59bfc5c886f7743bf6794e62": true, - "59bfe68886f7746004266202": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c0ec5b86f77435b128bfca": true, - "59c1383d86f774290a37e0ca": true, - "59c63b4486f7747afb151c1c": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "59d6272486f77466146386ff": true, - "59d64ec286f774171d1e0a42": true, - "59d650cf86f7741b846413a4": true, - "59d790f486f77403cb06aec6": true, - "59db3a1d86f77429e05b4e92": true, - "59db3acc86f7742a2c4ab912": true, - "59db3b0886f77429d72fb895": true, - "59db7e1086f77448be30ddf3": true, - "59db7eed86f77461f8380365": true, - "59e0bdb186f774156f04ce82": true, - "59e0be5d86f7742d48765bd2": true, - "59e0bed186f774156f04ce84": true, - "59e0d99486f7744a32234762": true, - "59e3577886f774176a362503": true, - "59e4cf5286f7741778269d8a": true, - "59e4d24686f7741776641ac7": true, - "59e4d3d286f774176a36250a": true, - "59e5f5a486f7746c530b3ce2": true, - "59e6152586f77473dc057aa1": true, - "59e649f986f77411d949b246": true, - "59e6542b86f77411dc52a77a": true, - "59e655cb86f77411dc52a77b": true, - "59e6658b86f77411d949b250": true, - "59e6687d86f77411d949b251": true, - "59e68f6f86f7746c9f75e846": true, - "59e6906286f7746c9f75e847": true, - "59e690b686f7746c9f75e848": true, - "59e6918f86f7746c9f75e849": true, - "59e6920f86f77411d82aa167": true, - "59e6927d86f77411da468256": true, - "59e7635f86f7742cbf2c1095": true, - "59e763f286f7742ee57895da": true, - "59e7643b86f7742cbf2c109a": true, - "59e7708286f7742cbd762753": true, - "59e770b986f7742cbd762754": true, - "59e770f986f7742cbe3164ef": true, - "59e7711e86f7746cae05fbe1": true, - "59e7715586f7742ee5789605": true, - "59e77a2386f7742ee578960a": true, - "59e8977386f77415a553c453": true, - "59eb7ebe86f7740b373438ce": true, - "59ecc28286f7746d7a68aa8c": true, - "59ecc3dd86f7746dc827481c": true, - "59ef13ca86f77445fd0e2483": true, - "59f8a37386f7747af3328f06": true, - "59f98b4986f7746f546d2cef": true, - "59f99a7d86f7745b134aa97b": true, - "59f9cabd86f7743a10721f46": true, - "59f9d81586f7744c7506ee62": true, - "59fafc5086f7740dbe19f6c3": true, - "59fafc9386f774067d462453": true, - "59fafd4b86f7745ca07e1232": true, - "59fb042886f7746c5005a7b2": true, - "59fb137a86f7740adb646af1": true, - "59fb257e86f7742981561852": true, - "59fb375986f7741b681b81a6": true, - "59fc48e086f77463b1118392": true, - "59ff346386f77477562ff5e2": true, - "5a0060fc86f7745793204432": true, - "5a01ad4786f77450561fda02": true, - "5a0abb6e1526d8000a025282": true, - "5a0c27731526d80618476ac4": true, - "5a0c59791526d8dba737bba7": true, - "5a0d63621526d8dba31fe3bf": true, - "5a0d716f1526d8000d26b1e2": true, - "5a0eb980fcdbcb001a3b00a6": true, - "5a0ec13bfcdbcb00165aa685": true, - "5a0ed824fcdbcb0176308b0d": true, - "5a0f096dfcdbcb0176308b15": true, - "5a154d5cfcdbcb001a3b00da": true, - "5a16b672fcdbcb001912fa83": true, - "5a16b7e1fcdbcb00165aa6c9": true, - "5a16b8a9fcdbcb00165aa6ca": true, - "5a16b93dfcdbcbcae6687261": true, - "5a16b9fffcdbcb0176308b34": true, - "5a16ba61fcdbcb098008728a": true, - "5a16badafcdbcb001865f72d": true, - "5a16bb52fcdbcb001a3b00dc": true, - "5a17f98cfcdbcb0980087290": true, - "5a17fb9dfcdbcbcae6687291": true, - "5a17fc70fcdbcb0176308b3d": true, - "5a1eaa87fcdbcb001865f75e": true, - "5a1eacb3fcdbcb09800872be": true, - "5a1ead28fcdbcb001912fa9f": true, - "5a269f97c4a282000b151807": true, - "5a26abfac4a28232980eabff": true, - "5a26ac06c4a282000c5a90a8": true, - "5a26ac0ec4a28200741e1e18": true, - "5a27b281c4a28200741e1e52": true, - "5a27b3d0c4a282000d721ec1": true, - "5a27b6bec4a282000e496f78": true, - "5a27bad7c4a282000b15184b": true, - "5a2a57cfc4a2826c6e06d44a": true, - "5a329052c4a28200741e22d3": true, - "5a32a064c4a28200741e22de": true, - "5a32aa0cc4a28232996e405f": true, - "5a32aa8bc4a2826c6e06d737": true, - "5a339805c4a2826c6e06d73d": true, - "5a33a8ebc4a282000c5a950d": true, - "5a33b2c9c4a282000c5a9511": true, - "5a33b652c4a28232996e407c": true, - "5a33bab6c4a28200741e22f8": true, - "5a33ca0fc4a282000d72292f": true, - "5a33cae9c4a28232980eb086": true, - "5a33e75ac4a2826c6e06d759": true, - "5a34f7f1c4a2826c6e06d75d": true, - "5a34fae7c4a2826c6e06d760": true, - "5a34fbadc4a28200741e230a": true, - "5a34fd2bc4a282329a73b4c5": true, - "5a34fe59c4a282000b1521a2": true, - "5a3501acc4a282000d72293a": true, - "5a351711c4a282000b1521a4": true, - "5a367e5dc4a282000e49738f": true, - "5a37ca54c4a282000d72296a": true, - "5a37cb10c4a282329a73b4e7": true, - "5a38e6bac4a2826c6e06d79b": true, - "5a38ed75c4a28232996e40c6": true, - "5a38ee51c4a282000c5a955c": true, - "5a398ab9c4a282000c5a9842": true, - "5a398b75c4a282000a51a266": true, - "5a3c16fe86f77452b62de32a": true, - "5a43943586f77416ad2f06e2": true, - "5a43957686f7742a2c2f11b0": true, - "5a5f1ce64f39f90b401987bc": true, - "5a6086ea4f39f99cd479502f": true, - "5a608bf24f39f98ffc77720e": true, - "5a69a2ed8dc32e000d46d1f1": true, - "5a6b585a8dc32e5a9c28b4f1": true, - "5a6b592c8dc32e00094b97bf": true, - "5a6b59a08dc32e000b452fb7": true, - "5a6b5b8a8dc32e001207faf3": true, - "5a6b5e468dc32e001207faf5": true, - "5a6b5ed88dc32e000c52ec86": true, - "5a6b5f868dc32e000a311389": true, - "5a6b60158dc32e000a31138b": true, - "5a6f58f68dc32e000a311390": true, - "5a6f5d528dc32e00094b97d9": true, - "5a6f5e048dc32e00094b97da": true, - "5a6f5f078dc32e00094b97dd": true, - "5a702d198dc32e000b452fc3": true, - "5a7033908dc32e000a311392": true, - "5a70366c8dc32e001207fb06": true, - "5a7037338dc32e000d46d257": true, - "5a705e128dc32e000d46d258": true, - "5a718b548dc32e000d46d262": true, - "5a718da68dc32e000d46d264": true, - "5a718f958dc32e00094b97e7": true, - "5a71e0048dc32e000c52ecc8": true, - "5a71e0fb8dc32e00094b97f2": true, - "5a71e1868dc32e00094b97f3": true, - "5a71e22f8dc32e00094b97f4": true, - "5a71e4f48dc32e001207fb26": true, - "5a787ebcc5856700142fdd98": true, - "5a787f25c5856700186c4ab9": true, - "5a787f7ac5856700177af660": true, - "5a787fadc5856700155a6ca1": true, - "5a787fdfc5856700142fdd9a": true, - "5a788031c585673f2b5c1c79": true, - "5a788068c5856700137e4c8f": true, - "5a788089c5856700142fdd9c": true, - "5a7880d0c5856700142fdd9d": true, - "5a78813bc5856700186c4abe": true, - "5a788169c5856700142fdd9e": true, - "5a789261c5856700186c65d3": true, - "5a7893c1c585673f2b5c374d": true, - "5a78948ec5856700177b1124": true, - "5a7ad0c451dfba0013379712": true, - "5a7ad1fb51dfba0013379715": true, - "5a7ad2e851dfba0016153692": true, - "5a7ad4af51dfba0013379717": true, - "5a7ad55551dfba0015068f42": true, - "5a7ad74e51dfba0015068f45": true, - "5a7ae0c351dfba0017554310": true, - "5a7afa25e899ef00135e31b0": true, - "5a7b32a2e899ef00135e345a": true, - "5a7b483fe899ef0016170d15": true, - "5a7b4900e899ef197b331a2a": true, - "5a7b4960e899ef197b331a2d": true, - "5a7c147ce899ef00150bd8b8": true, - "5a7c4850e899ef00150be885": true, - "5a7c74b3e899ef0014332c29": true, - "5a7d90eb159bd400165484f1": true, - "5a7d9104159bd400134c8c21": true, - "5a7d9122159bd4001438dbf4": true, - "5a7d912f159bd400165484f3": true, - "5a7dbfc1159bd40016548fde": true, - "5a800961159bd4315e3a1657": true, - "5a8036fb86f77407252ddc02": true, - "5a80a29286f7742b25692012": true, - "5a9548c9159bd400133e97b3": true, - "5a957c3fa2750c00137fa5f7": true, - "5a966ec8a2750c00171b3f36": true, - "5a966f51a2750c00156aacf6": true, - "5a9685b1a2750c0032157104": true, - "5a9d56c8a2750c0032157146": true, - "5a9d6d00a2750c5c985b5305": true, - "5a9d6d13a2750c00164f6b03": true, - "5a9d6d21a2750c00137fa649": true, - "5a9d6d34a2750c00141e07da": true, - "5a9e81fba2750c00164f6b11": true, - "5a9ea27ca2750c00137fa672": true, - "5a9eb32da2750c00171b3f9c": true, - "5a9fb739a2750c003215717f": true, - "5a9fbacda2750c00141e080f": true, - "5a9fbb74a2750c0032157181": true, - "5a9fbb84a2750c00137fa685": true, - "5a9fc7e6a2750c0032157184": true, - "5aa2b87de5b5b00016327c25": false, - "5aa2b89be5b5b0001569311f": true, - "5aa2b8d7e5b5b00014028f4a": true, - "5aa2b923e5b5b000137b7589": true, - "5aa2b986e5b5b00014028f4c": true, - "5aa2b9aee5b5b00015693121": true, - "5aa2b9ede5b5b000137b758b": true, - "5aa2ba19e5b5b00014028f4e": true, - "5aa2ba46e5b5b000137b758d": true, - "5aa2ba71e5b5b000137b758f": true, - "5aa66a9be5b5b0214e506e89": true, - "5aa66be6e5b5b0214e506e97": true, - "5aa66c72e5b5b00016327c93": true, - "5aa7cfc0e5b5b00015693143": false, - "5aa7d193e5b5b000171d063f": true, - "5aa7e276e5b5b000171d0647": true, - "5aa7e373e5b5b000137b76f0": true, - "5aa7e3abe5b5b000171d064d": true, - "5aa7e454e5b5b0214e506fa2": true, - "5aa7e4a4e5b5b000137b76f2": true, - "5aaa4194e5b5b055d06310a5": true, - "5aaa5dfee5b5b000140293d3": true, - "5aaa5e60e5b5b000140293d6": true, - "5aaf8a0be5b5b00015693243": true, - "5aaf8e43e5b5b00015693246": true, - "5aaf9d53e5b5b00015042a52": true, - "5aafa1c2e5b5b00015042a56": true, - "5aafa49ae5b5b00015042a58": true, - "5aafa857e5b5b00018480968": true, - "5aafbde786f774389d0cbc0f": true, - "5ab24ef9e5b5b00fe93c9209": true, - "5ab372a310e891001717f0d8": true, - "5ab3afb2d8ce87001660304d": true, - "5ab8dab586f77441cd04f2a2": true, - "5ab8dced86f774646209ec87": true, - "5ab8e4ed86f7742d8e50c7fa": true, - "5ab8e79e86f7742d8b372e78": true, - "5ab8e9fcd8ce870019439434": true, - "5ab8ebf186f7742d8b372e80": true, - "5ab8f04f86f774585f4237d8": true, - "5ab8f20c86f7745cdb629fb2": true, - "5ab8f39486f7745cd93a1cca": true, - "5ab8f4ff86f77431c60d91ba": true, - "5ab8f85d86f7745cd93a1cf5": true, - "5abcbb20d8ce87001773e258": true, - "5abcbc27d8ce8700182eceeb": true, - "5abcc328d8ce8700194394f3": true, - "5abccb7dd8ce87001773e277": true, - "5ac4c50d5acfc40019262e87": true, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac66c5d5acfc4001718d314": true, - "5ac66cb05acfc40198510a10": true, - "5ac66d015acfc400180ae6e4": true, - "5ac66d2e5acfc43b321d4b53": true, - "5ac66d725acfc43b321d4b60": true, - "5ac66d9b5acfc4001633997a": true, - "5ac72e475acfc400180ae6fe": true, - "5ac733a45acfc400192630e2": true, - "5ac7655e5acfc40016339a19": false, - "5ac78eaf5acfc4001926317a": true, - "5ac8d6885acfc400180ae7b0": true, - "5addba3e5acfc4001669f0ab": true, - "5addbac75acfc400194dbc56": true, - "5addbb6e5acfc408fb1393fd": true, - "5addbb825acfc408fb139400": true, - "5addbb945acfc4001a5fc44e": true, - "5addbba15acfc400185c2854": true, - "5addbbb25acfc40015621bd9": true, - "5addbf175acfc408fb13965b": true, - "5addbfbb5acfc400194dbcf7": true, - "5addbfd15acfc40015621bde": true, - "5addbfe15acfc4001a5fc58b": true, - "5addbfef5acfc400185c2857": true, - "5addbffe5acfc4001714dfac": true, - "5addc00b5acfc4001669f144": true, - "5addc7005acfc4001669f275": true, - "5addc7ac5acfc400194dbd90": true, - "5addc7db5acfc4001669f279": true, - "5addcce35acfc4001a5fc635": true, - "5addccf45acfc400185c2989": true, - "5adf23995acfc400185c2aeb": true, - "5ae096d95acfc400185c2c81": true, - "5ae30bad5acfc400185c2dc4": true, - "5ae30c9a5acfc408fb139a03": true, - "5ae30db85acfc408fb139a05": true, - "5ae30e795acfc408fb139a0b": true, - "5ae35b315acfc4001714e8b0": true, - "5af0454c86f7746bf20992e8": true, - "5af0548586f7743a532b7e99": true, - "5afd7ded5acfc40017541f5e": true, - "5afd7e095acfc40017541f61": true, - "5afd7e445acfc4001637e35a": true, - "5b04473a5acfc40018632f70": true, - "5b057b4f5acfc4771e1bd3e9": true, - "5b07db875acfc40dc528a5f6": true, - "5b07dd285acfc4001754240d": true, - "5b0800175acfc400153aebd4": true, - "5b099a765acfc47a8607efe3": true, - "5b099a9d5acfc47a8607efe7": true, - "5b099ac65acfc400186331e1": true, - "5b099b7d5acfc400186331e4": true, - "5b099b965acfc400186331e6": true, - "5b099bb25acfc400186331e8": true, - "5b099bf25acfc4001637e683": true, - "5b0bbe4e5acfc40dc528a72d": true, - "5b0bc22d5acfc47a8607f085": true, - "5b0e794b5acfc47a877359b2": true, - "5b1fa9b25acfc40018633c01": true, - "5b1fa9ea5acfc40018633c0a": true, - "5b1faa0f5acfc40dc528aeb5": true, - "5b1fb3e15acfc4001637f068": true, - "5b1fd4e35acfc40018633c39": true, - "5b222d335acfc4771e1be099": true, - "5b222d405acfc400153af4fe": true, - "5b2240bf5acfc40dc528af69": true, - "5b237e425acfc4771e1be0b6": true, - "5b2388675acfc4771e1be0be": true, - "5b2389515acfc4771e1be0c0": true, - "5b2cfa535acfc432ff4db7a0": true, - "5b30ac585acfc433000eb79c": true, - "5b30b0dc5acfc400153b7124": true, - "5b30bc165acfc40016387293": true, - "5b30bc285acfc47a8608615d": true, - "5b31163c5acfc400153b71cb": true, - "5b3116595acfc40019476364": true, - "5b363dd25acfc4001a598fd2": true, - "5b363dea5acfc4771e1c5e7e": true, - "5b363e1b5acfc4771e1c5e80": true, - "5b39f8db5acfc40016387a1b": true, - "5b39ffbd5acfc47a8773fb06": true, - "5b3a08b25acfc4001754880c": true, - "5b3a16655acfc40016387a2a": true, - "5b3a337e5acfc4704b4a19a0": true, - "5b3b6dc75acfc47a8773fb1e": true, - "5b3b6e495acfc4330140bd88": true, - "5b3b713c5acfc4330140bd8d": true, - "5b3b99265acfc4704b4a1afb": true, - "5b3b99475acfc432ff4dcbee": true, - "5b3baf8f5acfc40dc5296692": true, - "5b3cadf35acfc400194776a0": true, - "5b3cbc235acfc4001863ac44": true, - "5b3f7bf05acfc433000ecf6b": true, - "5b3f7c005acfc4704b4a1de8": true, - "5b3f7c1c5acfc40dc5296b1d": true, - "5b40e1525acfc4771e1c6611": true, - "5b40e2bc5acfc40016388216": true, - "5b40e3f35acfc40016388218": true, - "5b40e4035acfc47a87740943": true, - "5b40e5e25acfc4001a599bea": true, - "5b40e61f5acfc4001a599bec": true, - "5b4325355acfc40019478126": true, - "5b4326435acfc433000ed01d": true, - "5b43271c5acfc432ff4dce65": true, - "5b4327aa5acfc400175496e0": true, - "5b4329075acfc400153b78ff": true, - "5b4329f05acfc47a86086aa1": true, - "5b432b2f5acfc4771e1c6622": true, - "5b432b6c5acfc4001a599bf0": true, - "5b432b965acfc47a8774094e": true, - "5b432be65acfc433000ed01f": true, - "5b432c305acfc40019478128": true, - "5b432d215acfc4771e1c6624": true, - "5b432f3d5acfc4704b4a1dfb": true, - "5b44c6ae86f7742d1627baea": true, - "5b44c8ea86f7742d1627baf1": true, - "5b44cad286f77402a54ae7e5": true, - "5b44cd8b86f774503d30cba2": true, - "5b44cf1486f77431723e3d05": true, - "5b44d0de86f774503d30cba8": true, - "5b44d22286f774172b0c9de8": true, - "5b46238386f7741a693bcf9c": true, - "5b4736a986f774040571e998": true, - "5b4736b986f77405cb415c10": true, - "5b7be1125acfc4001876c0e5": true, - "5b7be1265acfc400161d0798": true, - "5b7be1ca5acfc400170e2d2f": true, - "5b7be2345acfc400196d524a": true, - "5b7be4575acfc400161d0832": true, - "5b7be4645acfc400170e2dcc": true, - "5b7be46e5acfc400170e2dcf": true, - "5b7be47f5acfc400170e2dd2": true, - "5b7be4895acfc400170e2dd5": true, - "5b7bebc85acfc43bca706666": true, - "5b7bed205acfc400161d08cc": true, - "5b7bedd75acfc43d825283f9": true, - "5b7bee755acfc400196d5383": true, - "5b7bef1e5acfc43d82528402": true, - "5b7bef5d5acfc43bca7067a3": true, - "5b7bef9c5acfc43d102852ec": true, - "5b7c2d1d5acfc43d1028532a": true, - "5b7c710788a4506dec015957": true, - "5b7d37845acfc400170e2f87": true, - "5b7d63b75acfc400170e2f8a": true, - "5b7d63cf5acfc4001876c8df": true, - "5b7d63de5acfc400170e2f8d": true, - "5b7d64555acfc4001876c8e2": true, - "5b7d645e5acfc400170e2f90": true, - "5b7d671b5acfc43d82528ddd": true, - "5b7d678a5acfc4001a5c4022": true, - "5b7d679f5acfc4001a5c4024": true, - "5b7d68af5acfc400170e30c3": true, - "5b7d693d5acfc43bca706a3d": true, - "5b7d6c105acfc40015109a5f": true, - "5b800e9286f7747a8b04f3ff": true, - "5b800ebc86f774394e230a90": true, - "5b800ed086f7747baf6e2f9e": true, - "5b80242286f77429445e0b47": true, - "5b84038986f774774913b0c1": true, - "5b8403a086f7747ff856f4e2": true, - "5b86a0e586f7745b600ccb23": true, - "5ba26383d4351e00334c93d9": true, - "5ba264f6d4351e0034777d52": true, - "5ba2657ed4351e0035628ff2": true, - "5ba26586d4351e44f824b340": true, - "5ba2678ad4351e44f824b344": true, - "5ba26812d4351e003201fef1": true, - "5ba26835d4351e0035628ff5": true, - "5ba26844d4351e00334c9475": true, - "5ba26acdd4351e003562908e": true, - "5ba26ae8d4351e00367f9bdb": true, - "5ba26b01d4351e0085325a51": true, - "5ba26b17d4351e00367f9bdd": true, - "5ba36f85d4351e0085325c81": true, - "5bae13bad4351e00320204af": true, - "5bae13ded4351e44f824bf38": true, - "5bb20d53d4351e4502010a69": true, - "5bb20d92d4351e00853263eb": true, - "5bb20d9cd4351e00334c9d8a": true, - "5bb20da5d4351e0035629dbf": true, - "5bb20dadd4351e00367faeff": true, - "5bb20dbcd4351e44f824c04e": true, - "5bb20dcad4351e3bac1212da": true, - "5bb20de5d4351e0035629e59": true, - "5bb20df1d4351e00347787d5": true, - "5bb20dfcd4351e00334c9e24": true, - "5bb20e0ed4351e3bac1212dc": true, - "5bb20e18d4351e00320205d5": true, - "5bb20e49d4351e3bac1212de": true, - "5bb20e58d4351e00320205d7": true, - "5bb20e70d4351e0035629f8f": true, - "5bb2475ed4351e00853264e3": true, - "5bbdb811d4351e45020113c7": true, - "5bbdb83fd4351e44f824c44b": true, - "5bbdb870d4351e00367fb67d": true, - "5bbdb8bdd4351e4502011460": true, - "5bbde409d4351e003562b036": true, - "5bbde41ed4351e003562b038": true, - "5bc09a18d4351e003562b68e": true, - "5bc09a30d4351e00367fb7c8": true, - "5bc5a351d4351e003477a414": true, - "5bc5a35cd4351e450201232f": true, - "5bc5a372d4351e44f824d17f": true, - "5bc9c1e2d4351e00367fbcf0": true, - "5bc9c29cd4351e003562b8a3": true, - "5bcf0213d4351e0085327c17": true, - "5bd06f5d86f77427101ad47c": true, - "5bd0716d86f774171822ef4b": true, - "5bd071d786f7747e707b93a3": true, - "5bd073a586f7747e6f135799": true, - "5bd073c986f7747f627e796c": true, - "5bd70322209c4d00d7167b8f": true, - "5bd704e7209c4d00d7167c31": true, - "5be4038986f774527d3fae60": true, - "5bead2e00db834001c062938": true, - "5bed61680db834001d2c45ab": true, - "5bed625c0db834001c062946": true, - "5beec1bd0db834001e6006f3": true, - "5beec2820db834001b095426": true, - "5beec3420db834001b095429": true, - "5beec3e30db8340019619424": true, - "5beec8b20db834001961942a": true, - "5beec8c20db834001d2c465c": true, - "5beec8ea0db834001a6f9dbf": true, - "5beec91a0db834001961942d": true, - "5beec9450db83400970084fd": true, - "5beecbb80db834001d2c465e": true, - "5beed0f50db834001c062b12": true, - "5bf3e03b0db834001d2c4a9c": true, - "5bf3e0490db83400196199af": true, - "5bf3f59f0db834001a6fa060": true, - "5bfd297f0db834001a669119": true, - "5bfd35380db83400232fe5cc": true, - "5bfd36290db834001966869a": true, - "5bfd36ad0db834001c38ef66": true, - "5bfd37c80db834001d23e842": true, - "5bfd384c0db834001a6691d3": true, - "5bfd4c980db834001b73449d": true, - "5bfd4cbe0db834001b73449f": true, - "5bfd4cc90db834001d23e846": true, - "5bfd4cd60db834001c38f095": true, - "5bfe7fb30db8340018089fed": true, - "5bfe86a20db834001d23e8f7": true, - "5bfe86bd0db83400232fe959": true, - "5bfe86df0db834001b734685": true, - "5bfe89510db834001808a127": true, - "5bfea6e90db834001b7347f3": true, - "5bfea7ad0db834001c38f1ee": true, - "5bfeaa0f0db834001b734927": true, - "5bfeb32b0db834001a6694d9": true, - "5bfebc250db834001a6694e1": true, - "5bfebc320db8340019668d79": true, - "5bfebc530db834001d23eb65": true, - "5bfebc5e0db834001a6694e5": true, - "5bffcf7a0db83400232fea79": true, - "5bffd7ed0db834001d23ebf9": true, - "5bffdc370db834001d23eca8": false, - "5bffdd7e0db834001b734a1a": true, - "5bffe7930db834001b734a39": true, - "5bffe7c50db834001d23ece1": true, - "5bffec120db834001c38f5fa": true, - "5bffef760db8340019668fe4": true, - "5c0000c00db834001a6697fc": true, - "5c0006470db834001a6697fe": true, - "5c00076d0db834001d23ee1f": true, - "5c0009510db834001966907f": true, - "5c0102aa0db834001b734ba1": true, - "5c0102b20db834001d23eebc": true, - "5c010a700db834001d23ef5d": true, - "5c010e350db83400232feec7": true, - "5c0111ab0db834001966914d": true, - "5c0125fc0db834001a669aa3": true, - "5c0126f40db834002a125382": true, - "5c012ffc0db834001d23f03f": true, - "5c0505e00db834001b735073": true, - "5c0517910db83400232ffee5": true, - "5c05293e0db83400232fff80": true, - "5c05295e0db834001a66acbb": true, - "5c052a900db834001a66acbd": true, - "5c05413a0db834001c390617": true, - "5c0548ae0db834001966a3c2": true, - "5c0558060db834001b735271": true, - "5c064c400db834001d23f468": true, - "5c06595c0db834001a66af6c": true, - "5c066e3a0db834001b7353f0": true, - "5c066ef40db834001966a595": true, - "5c0672ed0db834001b7353f3": true, - "5c0673fb0db8340023300271": true, - "5c0684e50db834002a12585a": true, - "5c0695860db834001b735461": true, - "5c0696830db834001d23f5da": true, - "5c06c6a80db834001b735491": true, - "5c079ec50db834001966a706": true, - "5c079ed60db834001a66b372": true, - "5c07a8770db8340023300450": true, - "5c07b36c0db834002a1259e9": true, - "5c07b3850db834002330045b": true, - "5c07c5ed0db834001b73571c": true, - "5c07c60e0db834002330051f": true, - "5c07c9660db834001a66b588": true, - "5c07dd120db834001c39092d": true, - "5c07df7f0db834001b73588a": true, - "5c08f87c0db8340019124324": true, - "5c0919b50db834001b7ce3b9": true, - "5c091a4e0db834001d5addc8": true, - "5c093ca986f7740a1867ab12": true, - "5c093e3486f77430cb02e593": true, - "5c0a2cec0db834001b7ce47d": true, - "5c0d2727d174af02a012cf58": true, - "5c0d32fcd174af02a1659c75": true, - "5c0d56a986f774449d5de529": true, - "5c0d591486f7744c505b416f": true, - "5c0d5ae286f7741e46554302": true, - "5c0d5e4486f77478390952fe": true, - "5c0d668f86f7747ccb7f13b2": true, - "5c0d688c86f77413ae3407b2": true, - "5c0e2f26d174af02a9625114": true, - "5c0e2f5cd174af02a012cfc9": true, - "5c0e2f94d174af029f650d56": true, - "5c0e2ff6d174af02a1659d4a": true, - "5c0e3eb886f7742015526062": true, - "5c0e446786f7742013381639": true, - "5c0e51be86f774598e797894": true, - "5c0e530286f7747fa1419862": true, - "5c0e531286f7747fa54205c2": true, - "5c0e531d86f7747fa23f4d42": true, - "5c0e533786f7747fa23f4d47": true, - "5c0e534186f7747fa1419867": true, - "5c0e53c886f7747fa54205c7": true, - "5c0e541586f7747fa54205c9": true, - "5c0e57ba86f7747fa141986d": true, - "5c0e5bab86f77461f55ed1f3": true, - "5c0e5edb86f77461f55ed1f7": true, - "5c0e625a86f7742d77340f62": true, - "5c0e655586f774045612eeb2": true, - "5c0e66e2d174af02a96252f4": true, - "5c0e6a1586f77404597b4965": true, - "5c0e722886f7740458316a57": true, - "5c0e746986f7741453628fe5": true, - "5c0e774286f77468413cc5b2": true, - "5c0e805e86f774683f3dd637": true, - "5c0e842486f77443a74d2976": true, - "5c0e874186f7745dc7616606": true, - "5c0fa877d174af02a012e1cf": true, - "5c0faeddd174af02a962601f": true, - "5c0faf68d174af02a96260b8": true, - "5c0fafb6d174af02a96260ba": true, - "5c10c8fd86f7743d7d706df3": true, - "5c11046cd174af02a012e42b": true, - "5c110624d174af029e69734c": true, - "5c11279ad174af029d64592b": true, - "5c1127bdd174af44217ab8b9": true, - "5c1127d0d174af29be75cf68": true, - "5c1260dc86f7746b106e8748": true, - "5c12619186f7743f871c8a32": true, - "5c1262a286f7743f8a69aab2": true, - "5c165d832e2216398b5a7e36": true, - "5c17664f2e2216398b5a7e3c": true, - "5c1780312e221602b66cc189": true, - "5c17804b2e2216152006c02f": true, - "5c178a942e22164bef5ceca3": true, - "5c1793902e221602b21d3de2": true, - "5c17a7ed2e2216152142459c": true, - "5c18b90d2e2216152142466b": true, - "5c18b9192e2216398b5a8104": true, - "5c1a1cc52e221602b3136e3d": true, - "5c1a1e3f2e221602b66cc4c2": true, - "5c1bc4812e22164bef5cfde7": true, - "5c1bc5612e221602b5429350": true, - "5c1bc5af2e221602b412949b": true, - "5c1bc5fb2e221602b1779b32": true, - "5c1bc7432e221602b412949d": true, - "5c1bc7752e221602b1779b34": true, - "5c1cd46f2e22164bef5cfedb": true, - "5c1cdd302e221602b3137250": true, - "5c1cdd512e22161b267d91ae": true, - "5c3df7d588a4501f290594e5": true, - "5c46fbd72e2216398b5a8c9c": true, - "5c471b5d2e221602b21d4e14": true, - "5c471b7e2e2216152006e46c": true, - "5c471ba12e221602b3137d76": true, - "5c471bd12e221602b4129c3a": true, - "5c471be12e221602b66cd9ac": true, - "5c471bfc2e221602b21d4e17": true, - "5c471c2d2e22164bef5d077f": true, - "5c471c442e221602b542a6f8": true, - "5c471c6c2e221602b66cd9ae": true, - "5c471c842e221615214259b5": true, - "5c471cb32e221602b177afaa": true, - "5c488a752e221602b412af63": true, - "5c48a14f2e2216152006edd7": true, - "5c48a2852e221602b21d5923": true, - "5c48a2a42e221602b66d1e07": true, - "5c48a2c22e221602b313fb6c": true, - "5c4ee3d62e2216152006f302": true, - "5c4eec9b2e2216398b5aaba2": true, - "5c4eecc32e221602b412b440": true, - "5c4eecde2e221602b3140418": true, - "5c501a4d2e221602b412b540": true, - "5c5039be2e221602b177c9ff": true, - "5c503ac82e221602b21d6e9a": true, - "5c503ad32e2216398b5aada2": true, - "5c503af12e221602b177ca02": true, - "5c503b1c2e221602b21d6e9d": true, - "5c503d0a2e221602b542b7ef": true, - "5c5952732e2216398b5abda2": true, - "5c59529a2e221602b177d160": true, - "5c5970672e221602b21d7855": true, - "5c5db5852e2216003a0fe71a": true, - "5c5db5962e2216000e5e46eb": true, - "5c5db5b82e2216003a0fe71d": true, - "5c5db5c62e22160012542255": true, - "5c5db5f22e2216000e5e47e8": true, - "5c5db5fc2e2216000f1b2842": true, - "5c5db6302e2216000e5e47f0": true, - "5c5db63a2e2216000f1b284a": true, - "5c5db6552e2216001026119d": true, - "5c5db6652e221600113fba51": true, - "5c5db6742e2216000f1b2852": true, - "5c5db6b32e221600102611a0": true, - "5c5db6ee2e221600113fba54": true, - "5c5db6f82e2216003a0fe914": true, - "5c6161fb2e221600113fbde5": true, - "5c6162682e22160010261a2b": true, - "5c61627a2e22160012542c55": true, - "5c6165902e22160010261b28": true, - "5c6175362e221600133e3b94": true, - "5c617a5f2e2216000f1e81b3": true, - "5c61a40d2e2216001403158d": true, - "5c6592372e221600133e47d7": true, - "5c6beec32e221601da3578f2": true, - "5c6bf4aa2e2216001219b0ae": true, - "5c6c2c9c2e2216000f2002e4": true, - "5c6d10e82e221601da357b07": true, - "5c6d10fa2e221600106f3f23": true, - "5c6d11072e2216000e69d2e4": true, - "5c6d11152e2216000f2003e7": true, - "5c6d42cb2e2216000e69d7d1": true, - "5c6d450c2e221600114c997d": true, - "5c6d46132e221601da357d56": true, - "5c6d5d8b2e221644fc630b39": true, - "5c6d710d2e22165df16b81e7": true, - "5c6d7b3d2e221600114c9b7d": true, - "5c6d85e02e22165df16b81f4": true, - "5c78f2492e221600114c9f04": true, - "5c78f2612e221600114c9f0d": true, - "5c78f26f2e221601da3581d1": true, - "5c78f2792e221600106f4683": true, - "5c78f2882e22165df16b832e": true, - "5c791e872e2216001219c40a": true, - "5c793fb92e221644f31bfb64": true, - "5c793fc42e221600114ca25d": true, - "5c793fde2e221601da358614": true, - "5c7951452e221644f31bfd5c": true, - "5c7954d52e221600106f4cc7": true, - "5c7955c22e221644f31bfd5e": true, - "5c7d55de2e221644f31bff68": true, - "5c7d55f52e221644f31bff6a": true, - "5c7d560b2e22160bc12c6139": true, - "5c7e5f112e221600106f4ede": true, - "5c7e8fab2e22165df16b889b": true, - "5c7fb51d2e2216001219ce11": true, - "5c7fc87d2e221644f31c0298": true, - "5c82342f2e221644f31c060e": true, - "5c82343a2e221644f31c0611": true, - "5c86592b2e2216000e69e77c": true, - "5c878e9d2e2216000f201903": true, - "5c878ebb2e2216001219d48a": true, - "5c87a07c2e2216001219d4a2": true, - "5c87ca002e221600114cb150": true, - "5c88f24b2e22160bc12c69a6": true, - "5c90c3622e221601da359851": true, - "5c920e902e221644f31c3c99": true, - "5c925fa22e221601da359b7b": true, - "5c99f3592e221644fc633070": true, - "5c9a07572e221644f31c4b32": true, - "5c9a1c3a2e2216000e69fb6a": true, - "5c9a1c422e221600106f69f0": true, - "5c9a25172e2216000f20314e": true, - "5c9a26332e2216001219ea70": true, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": true, - "5ca20ee186f774799474abc2": true, - "5ca2113f86f7740b2547e1d2": true, - "5ca21c6986f77479963115a7": true, - "5cadc1c6ae9215000f2775a4": true, - "5cadc2e0ae9215051e1c21e7": true, - "5cadc390ae921500126a77f1": true, - "5cadc431ae921500113bb8d5": true, - "5cadc55cae921500103bb3be": true, - "5cadd919ae921500126a77f3": true, - "5cadd940ae9215051e1c2316": true, - "5cadd954ae921500103bb3c2": true, - "5cadf6ddae9215051e1c23b2": true, - "5cadf6e5ae921500113bb973": true, - "5cadf6eeae921500134b2799": true, - "5cadfbf7ae92152ac412eeef": true, - "5caf1041ae92157c28402e3f": true, - "5caf1109ae9215753c44119f": true, - "5caf1691ae92152ac412efb9": true, - "5caf16a2ae92152ac412efbc": true, - "5caf17c9ae92150b30006be1": true, - "5caf187cae92157c28402e43": true, - "5cbda392ae92155f3c17c39f": true, - "5cbda9f4ae9215000e5b9bfc": true, - "5cbdaf89ae9215000e5b9c94": true, - "5cbdb1b0ae9215000d50e105": true, - "5cbdc23eae9215001136a407": true, - "5cc6ea78e4a949000e1ea3c1": true, - "5cc6ea85e4a949000e1ea3c3": true, - "5cc70093e4a949033c734312": true, - "5cc700b9e4a949000f0f0f25": true, - "5cc700cae4a949035e43ba72": true, - "5cc700d4e4a949000f0f0f28": true, - "5cc700ede4a949033c734315": true, - "5cc70102e4a949035e43ba74": true, - "5cc7012ae4a949001252b43e": true, - "5cc70146e4a949000d73bf6b": true, - "5cc7015ae4a949001152b4c6": true, - "5cc701aae4a949000e1ea45c": true, - "5cc701d7e4a94900100ac4e7": true, - "5cc80f38e4a949001152b560": true, - "5cc80f53e4a949000e1ea4f8": true, - "5cc80f67e4a949035e43bbba": true, - "5cc80f79e4a949033c7343b2": true, - "5cc80f8fe4a949033b0224a2": true, - "5cc82796e24e8d000f5859a8": true, - "5cc82d76e24e8d00134b4b83": true, - "5cc86832d7f00c000d3a6e6c": true, - "5cc86840d7f00c002412c56c": true, - "5cc9a96cd7f00c011c04e04a": true, - "5cc9ad73d7f00c000e2579d4": true, - "5cc9b815d7f00c000e2579d6": true, - "5cc9bcaed7f00c011c04e179": true, - "5cc9c20cd7f00c001336c65d": true, - "5cda9bcfd7f00c0c0b53e900": true, - "5cdaa99dd7f00c002412d0b2": true, - "5cdd7685d7f00c000f260ed2": true, - "5cdd7693d7f00c0010373aa5": true, - "5cde739cd7f00c0010373bd3": true, - "5cde77a9d7f00c000f261009": true, - "5cde7afdd7f00c000d36b89d": true, - "5cde7b43d7f00c000d36b93e": true, - "5cde8864d7f00c0010373be1": true, - "5cdeac22d7f00c000f26168f": true, - "5cdeac42d7f00c000d36ba73": true, - "5cdeac5cd7f00c000f261694": true, - "5cdeaca5d7f00c00b61c4b70": true, - "5ce69cbad7f00c00b61c5098": true, - "5cebec00d7f00c065c53522a": true, - "5cebec10d7f00c065703d185": true, - "5cebec38d7f00c00110a652a": true, - "5cf12a15d7f00c05464b293f": true, - "5cf13123d7f00c1085616a50": true, - "5cf4e3f3d7f00c06595bc7f0": true, - "5cf4fb76d7f00c065703d3ac": true, - "5cf50850d7f00c056e24104c": true, - "5cf508bfd7f00c056e24104e": true, - "5cf50fc5d7f00c056c53f83c": true, - "5cf518cfd7f00c065b422214": true, - "5cf54404d7f00c108840b2ef": true, - "5cf638cbd7f00c06595bc936": true, - "5cf639aad7f00c065703d455": true, - "5cf656f2d7f00c06585fb6eb": true, - "5cf67a1bd7f00c06585fb6f3": true, - "5cf67cadd7f00c065a5abab7": true, - "5cf6935bd7f00c06585fb791": true, - "5cf6937cd7f00c056c53fb39": true, - "5cf78496d7f00c065703d6ca": true, - "5cf78720d7f00c06595bc93e": true, - "5cf79389d7f00c10941a0c4d": true, - "5cf79599d7f00c10875d9212": true, - "5cf7acfcd7f00c1084477cf2": true, - "5cf8f3b0d7f00c00217872ef": true, - "5cfe8010d7ad1a59283b14c6": true, - "5cff9e5ed7ad1a09407397d4": true, - "5cff9e84d7ad1a049e54ed55": true, - "5d00e0cbd7ad1a6c6566a42d": true, - "5d00ec68d7ad1a04a067e5be": true, - "5d00ede1d7ad1a0940739a76": true, - "5d00ef6dd7ad1a0940739b16": true, - "5d00f63bd7ad1a59283b1c1e": true, - "5d010d1cd7ad1a59283b1ce7": true, - "5d0236dad7ad1a0940739d29": true, - "5d023784d7ad1a049d4aa7f2": true, - "5d024f5cd7ad1a04a067e91a": true, - "5d025cc1d7ad1a53845279ef": true, - "5d02676dd7ad1a049e54f6dc": true, - "5d02677ad7ad1a04a15c0f95": true, - "5d026791d7ad1a04a067ea63": true, - "5d02778e86f774203e7dedbe": true, - "5d02797c86f774203f38e30a": true, - "5d0a29ead7ad1a0026013f27": true, - "5d0a29fed7ad1a002769ad08": true, - "5d0a3a58d7ad1a669c15ca14": true, - "5d0a3e8cd7ad1a6f6a3d35bd": true, - "5d0b5cd3d7ad1a3fe32ad263": true, - "5d10b49bd7ad1a1a560708b0": true, - "5d120a10d7ad1a4e1026ba85": true, - "5d120a28d7ad1a1c8962e295": true, - "5d122e7bd7ad1a07102d6d7f": true, - "5d123102d7ad1a004e475fe5": true, - "5d123a3cd7ad1a004e476058": true, - "5d123b70d7ad1a0ee35e0754": true, - "5d123b7dd7ad1a004f01b262": true, - "5d124c01d7ad1a115c7d59fb": true, - "5d124c0ed7ad1a10d168dd9b": true, - "5d124c1ad7ad1a12227c53a7": true, - "5d133067d7ad1a33013f95b4": true, - "5d1340b3d7ad1a0b52682ed7": true, - "5d1340bdd7ad1a0e8d245aab": true, - "5d1340cad7ad1a0b0b249869": true, - "5d135e83d7ad1a21b83f42d8": true, - "5d135ecbd7ad1a21c176542e": true, - "5d15ce51d7ad1a1eff619092": true, - "5d15cf3bd7ad1a67e71518b2": true, - "5d19cd96d7ad1a4a992c9f52": true, - "5d1b198cd7ad1a604869ad72": true, - "5d1b33a686f7742523398398": true, - "5d1b36a186f7742523398433": true, - "5d1b371186f774253763a656": true, - "5d1b5e94d7ad1a2b865a96b0": true, - "5d1c702ad7ad1a632267f429": true, - "5d1f819086f7744b355c219b": true, - "5d2369418abbc306c62e0c80": true, - "5d25a4a98abbc30b917421a4": true, - "5d25a6538abbc306c62e630d": true, - "5d25a6a48abbc306c62e6310": true, - "5d25a7b88abbc3054f3e60bc": true, - "5d25af8f8abbc3055079fec5": true, - "5d25d0ac8abbc3054f3e61f7": true, - "5d2702e88abbc31ed91efc44": true, - "5d2703038abbc3105103d94c": true, - "5d270b3c8abbc3105335cfb8": true, - "5d270ca28abbc31ee25ee821": true, - "5d2c76ed48f03532f2136169": true, - "5d2c770c48f0354b4a07c100": true, - "5d2c772c48f0355d95672c25": true, - "5d2c829448f0353a5c7d6674": true, - "5d2da1e948f035477b1ce2ba": true, - "5d2dc3e548f035404a1a4798": true, - "5d2f0d8048f0356c925bc3b0": true, - "5d2f213448f0355009199284": true, - "5d2f259b48f0355a844acd74": true, - "5d2f25bc48f03502573e5d85": true, - "5d2f261548f03576f500e7b7": true, - "5d2f2ab648f03550091993ca": true, - "5d2f2d5748f03572ec0c0139": true, - "5d3eb3b0a4b93615055e84d2": true, - "5d3eb44aa4b93650d64e4979": true, - "5d3eb4aba4b93650d64e497d": true, - "5d3eb536a4b9363b1f22f8e2": true, - "5d3eb59ea4b9361c284bb4b2": true, - "5d3eb5b6a4b9361eab311902": true, - "5d3eb5eca4b9363b1f22f8e4": true, - "5d3ef698a4b9361182109872": true, - "5d403f9186f7743cac3f229b": true, - "5d40407c86f774318526545a": true, - "5d43021ca4b9362eab4b5e25": true, - "5d4405aaa4b9361e6a4e6bd3": true, - "5d4405f0a4b9361e6a4e6bd9": true, - "5d440625a4b9361eec4ae6c5": true, - "5d44064fa4b9361e4f6eb8b5": true, - "5d44069ca4b9361ebd26fc37": true, - "5d4406a8a4b9361e4f6eb8b7": true, - "5d440b93a4b9364276578d4b": true, - "5d440b9fa4b93601354d480c": true, - "5d44334ba4b9362b346d1948": true, - "5d443f8fa4b93678dd4a01aa": true, - "5d4aaa54a4b9365392071170": true, - "5d4aaa73a4b9365392071175": true, - "5d4aab30a4b9365435358c55": true, - "5d5d646386f7742797261fd9": true, - "5d5d85c586f774279a21cbdb": true, - "5d5d87f786f77427997cfaef": true, - "5d5d8ca986f7742798716522": true, - "5d5d940f86f7742797262046": true, - "5d5e7d28a4b936645d161203": true, - "5d5e9c74a4b9364855191c40": true, - "5d5fca1ea4b93635fd598c07": true, - "5d67abc1a4b93614ec50137f": true, - "5d6d2e22a4b9361bd5780d05": true, - "5d6d2ef3a4b93618084f58bd": true, - "5d6d3716a4b9361bc8618872": true, - "5d6d3829a4b9361bc8618943": true, - "5d6d3943a4b9360dbc46d0cc": true, - "5d6d3be5a4b9361bc73bc763": true, - "5d6e6772a4b936088465b17c": true, - "5d6e67fba4b9361bc73bc779": true, - "5d6e6806a4b936088465b17e": true, - "5d6e6869a4b9361c140bcfde": true, - "5d6e6891a4b9361bd473feea": true, - "5d6e689ca4b9361bc8618956": true, - "5d6e68a8a4b9360b6c0d54e2": true, - "5d6e68b3a4b9361bca7e50b5": true, - "5d6e68c4a4b9361b93413f79": true, - "5d6e68d1a4b93622fe60e845": true, - "5d6e68dea4b9361bcc29e659": true, - "5d6e68e6a4b9361c140bcfe0": true, - "5d6e6911a4b9361bd5780d52": true, - "5d6e695fa4b936359b35d852": true, - "5d6e69b9a4b9361bc8618958": true, - "5d6e69c7a4b9360b6c0d54e4": true, - "5d6e6a05a4b93618084f58d0": true, - "5d6e6a42a4b9364f07165f52": true, - "5d6e6a53a4b9361bd473feec": true, - "5d6e6a5fa4b93614ec501745": true, - "5d7b6bafa4b93652786f4c76": true, - "5d96141523f0ea1b7f2aacab": true, - "5dcbd56fdbd3d91b3e5468d5": true, - "5dcbd6b46ec07c0c4347a564": true, - "5dcbd6dddbd3d91b3e5468de": true, - "5dcbe9431e1f4616d354987e": true, - "5dcbe965e4ed22586443a79d": true, - "5de652c31b7e3716273428be": true, - "5de653abf76fdc1ce94a5a2a": true, - "5de65547883dde217541644b": true, - "5de6556a205ddc616a6bc4f7": true, - "5de6558e9f98ac2bc65950fc": true, - "5de655be4a9f347bc92edb88": true, - "5de7bd7bfd6b4e6e2276dc25": true, - "5de8e67c4a9f347bc92edbd7": true, - "5de8e8dafd6b4e6e2276dc32": true, - "5de8ea8ffd6b4e6e2276dc35": true, - "5de8eaadbbaf010b10528a6d": true, - "5de8eac42a78646d96665d91": true, - "5de8f237bbaf010b10528a70": true, - "5de8f2d5b74cd90030650c72": true, - "5de8fb539f98ac2bc659513a": true, - "5de8fbad2fbe23140d3ee9c4": true, - "5de8fbf2b74cd90030650c79": true, - "5de8fc0b205ddc616a6bc51b": true, - "5de910da8b6c4240ba2651b5": true, - "5de922d4b11454561e39239f": true, - "5df24cf80dee1b22f862e9bc": true, - "5df256570dee1b22f862e9c4": true, - "5df25b6c0b92095fd441e4cf": true, - "5df25d3bfd6b4e6e2276dc9a": true, - "5df35ddddfc58d14537c2036": true, - "5df35e59c41b2312ea3334d5": true, - "5df35e7f2a78646d96665dd4": true, - "5df35e970b92095fd441e4d2": true, - "5df35ea9c41b2312ea3334d8": true, - "5df35eb2b11454561e3923e2": true, - "5df36948bb49d91fb446d5ad": true, - "5df38a5fb74cd90030650cb6": true, - "5df8a2ca86f7740bfe6df777": true, - "5df8a42886f77412640e2e75": true, - "5df8a4d786f77412672a1e3b": true, - "5df8a58286f77412631087ed": true, - "5df8ce05b11454561e39243b": true, - "5df8e053bb49d91fb446d6a6": true, - "5df8e085bb49d91fb446d6a8": true, - "5df8e4080b92095fd441e594": true, - "5df8f535bb49d91fb446d6b0": true, - "5df8f541c41b2312ea3335e3": true, - "5df916dfbb49d91fb446d6b9": true, - "5df917564a9f347bc92edca3": true, - "5dfa397fb11454561e39246c": true, - "5dfa3cd1b33c0951220c079b": true, - "5dfa3d2b0dee1b22f862eade": true, - "5dfa3d45dfc58d14537c20b0": true, - "5dfa3d7ac41b2312ea33362a": true, - "5dfa3d950dee1b22f862eae0": true, - "5dfcd0e547101c39625f66f9": true, - "5dfce88fe9dc277128008b2e": true, - "5dfe14f30b92095fd441edaf": true, - "5dfe6104585a0c3e995c7b82": true, - "5dff772da3651922b360bf91": true, - "5dff77c759400025ea5150cf": true, - "5dff8db859400025ea5150d4": true, - "5e00903ae9dc277128008b87": true, - "5e0090f7e9dc277128008b93": true, - "5e00c1ad86f774747333222c": true, - "5e00cdd986f7747473332240": true, - "5e00cfa786f77469dc6e5685": true, - "5e01e9e273d8eb11426f5bc3": true, - "5e01ea19e9dc277128008c0b": true, - "5e01ef6886f77445f643baa4": true, - "5e01f31d86f77465cf261343": true, - "5e01f37686f774773c6f6c15": true, - "5e023cf8186a883be655e54f": true, - "5e023d34e8a400319a28ed44": true, - "5e023d48186a883be655e551": true, - "5e023e53d4353e3302577c4c": true, - "5e023e6e34d52a55c3304f71": true, - "5e023e88277cce2b522ff2b1": true, - "5e208b9842457a4a7a33d074": true, - "5e217ba4c1434648c13568cd": true, - "5e2192a498a36665e8337386": true, - "5e21a3c67e40bd02257a008a": true, - "5e21ca18e4d47f0da15e77dd": true, - "5e2af47786f7746d404f3aaa": true, - "5e2af4a786f7746d3f3c3400": true, - "5e2af55f86f7746d4159f07c": true, - "5e32f56fcb6d5863cc5e5ee4": true, - "5e340dcdcb6d5863cc5e5efb": true, - "5e4abb5086f77406975c9342": true, - "5e4abc1f86f774069619fbaa": true, - "5e4abc6786f77406812bd572": true, - "5e4abfed86f77406a2713cf7": true, - "5e4ac41886f77406a511c9a8": true, - "5e4bfc1586f774264f7582d3": true, - "5e4d34ca86f774264f758330": true, - "5e54f76986f7740366043752": true, - "5e54f79686f7744022011103": true, - "5e56991336989c75ab4f03f6": true, - "5e5699df2161e06ac158df6f": true, - "5e569a0156edd02abe09f27d": true, - "5e569a132642e66b0b68015c": true, - "5e569a2e56edd02abe09f280": true, - "5e71f6be86f77429f2683c44": true, - "5e71f70186f77429ee09f183": true, - "5e71fad086f77422443d4604": true, - "5e81c3cbac2bb513793cdc75": true, - "5e81c4ca763d9f754677befa": true, - "5e81c519cb2b95385c177551": true, - "5e81c539cb2b95385c177553": true, - "5e81c550763d9f754677befd": true, - "5e81c6a2ac2bb513793cdc7f": true, - "5e81c6bf763d9f754677beff": true, - "5e81ebcd8e146c7080625e15": true, - "5e81edc13397a21db957f6a1": true, - "5e81ee213397a21db957f6a6": true, - "5e81ee4dcb2b95385c177582": true, - "5e81f423763d9f754677bf2e": true, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": true, - "5e848cc2988a8701445df1e8": true, - "5e848d1c264f7c180b5e35a9": true, - "5e848d2eea0a7c419c2f9bfd": true, - "5e848d51e4dbc5266a4ec63b": true, - "5e848d99865c0f329958c83b": true, - "5e848db4681bea2ada00daa9": true, - "5e848dc4e4dbc5266a4ec63d": true, - "5e85a9f4add9fe03027d9bf1": true, - "5e85aa1a988a8701445df1f5": true, - "5e870397991fd70db46995c8": true, - "5e87071478f43e51ca2de5e1": true, - "5e87076ce2db31558c75a11d": true, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": true, - "5e87114fe2db31558c75a120": true, - "5e87116b81c4ed43e83cefdd": true, - "5e8f3423fd7471236e6e3b64": true, - "5e997f0b86f7741ac73993e2": true, - "5e9dacf986f774054d6b89f4": true, - "5e9db13186f7742f845ee9d3": true, - "5e9dcf5986f7746c417435b3": true, - "5ea02bb600685063ec28bfa1": true, - "5ea034eb5aad6446a939737b": true, - "5ea034f65aad6446a939737e": true, - "5ea03e5009aa976f2e7a514b": true, - "5ea03e9400685063ec28bfa4": true, - "5ea03f7400685063ec28bfa8": true, - "5ea058e01dbce517f324b3e2": true, - "5ea05cf85ad9772e6624305d": true, - "5ea16acdfadf1d18c87b0784": true, - "5ea16ada09aa976f2e7a51be": true, - "5ea16d4d5aad6446a939753d": true, - "5ea172e498dacb342978818e": true, - "5ea17bbc09aa976f2e7a51cd": true, - "5ea17ca01412a1425304d1c0": true, - "5ea18c84ecf1982c7712d9a2": true, - "5ea2a8e200685063ec28c05a": true, - "5ed515c8d380ab312177c0fa": true, - "5ed515e03a40a50460332579": true, - "5ed515ece452db0eb56fc028": true, - "5ed515f6915ec335206e4152": true, - "5ed5160a87bb8443d10680b5": true, - "5ed51652f6c34d2cc26336a1": true, - "5ed5166ad380ab312177c100": true, - "5ede4739e0350d05467f73e8": true, - "5ede47405b097655935d7d16": true, - "5ede474b0c226a66f5402622": true, - "5ede475339ee016e8c534742": true, - "5ede475b549eed7c6d5c18fb": true, - "5eea21647547d6330471b3c9": true, - "5eea217fc64c5d0dfc05712a": true, - "5eeb2ff5ea4f8b73c827350b": true, - "5ef1b9f0c64c5d0dfc0571a1": true, - "5ef1ba28c64c5d0dfc0571a5": true, - "5ef32e4d1c1fd62aea6a150d": true, - "5ef3448ab37dfd6af863525c": true, - "5ef3553c43cb350a955a7ccb": true, - "5ef35bc243cb350a955a7ccd": true, - "5ef35d2ac64c5d0dfc0571b0": true, - "5ef35f46382a846010715a96": true, - "5ef366938cef260c0642acad": true, - "5ef369b08cef260c0642acaf": true, - "5ef5d994dfbc9f3c660ded95": true, - "5ef61964ec7f42238c31e0c1": true, - "5efaf417aeb21837e749c7f2": true, - "5efb0c1bd79ff02a1f5e68d9": true, - "5efb0cabfb3e451d70735af5": true, - "5efb0d4f4bc50b58e81710f3": true, - "5efb0da7a29a85116f6ea05f": true, - "5efb0e16aeb21837e749c7ff": true, - "5efb0fc6aeb21837e749c801": true, - "5f0596629e22f464da6bbdd9": true, - "5f0c892565703e5c461894e9": true, - "5f2a9575926fd9352339381f": true, - "5f2aa43ba9b91d26f20ae6d2": true, - "5f2aa4464b50c14bcf07acdb": true, - "5f2aa4559b44de6b1b4e68d1": true, - "5f2aa46b878ef416f538b567": true, - "5f2aa47a200e2c0ee46efa71": true, - "5f2aa493cd375f14e15eea72": true, - "5f2aa49f9b44de6b1b4e68d4": true, - "5f36a0e5fbf956000b716b65": true, - "5f3e76d86cda304dcc634054": true, - "5f3e772a670e2a7b01739a52": true, - "5f3e777688ca2d00ad199d25": true, - "5f3e778efcd9b651187d7201": true, - "5f3e77b26cda304dcc634057": true, - "5f3e77f59103d430b93f94c1": true, - "5f3e7801153b8571434a924c": true, - "5f3e7823ddc4f03b010e2045": true, - "5f3e7897ddc4f03b010e204a": true, - "5f3e78a7fbf956000b716b8e": true, - "5f4f9eb969cdc30ff33f09db": false, - "5f5e45cc5021ce62144be7aa": true, - "5f5e467b0bc58666c37e7821": true, - "5f5e46b96bdad616ad46d613": true, - "5f5f41476bdad616ad46d631": true, - "5f5f41f56760b4138443b352": true, - "5f60b34a41e30a4ab12a6947": true, - "5f60b85bbdb8e27dee3dc985": true, - "5f60bf4558eff926626a60f2": true, - "5f60c076f2bcbb675b00dac2": true, - "5f60c74e3b85f6263c145586": true, - "5f60c85b58eff926626a60f7": true, - "5f60cd6cf2bcbb675b00dac6": true, - "5f60e6403b85f6263c14558c": true, - "5f60e7788adaa7100c3adb49": true, - "5f60e784f2bcbb675b00dac7": true, - "5f6331e097199b7db2128dc2": true, - "5f6336bbda967c74a42e9932": true, - "5f6339d53ada5942720e2dc3": true, - "5f633f68f5750b524b45f112": true, - "5f633f791b231926f2329f13": true, - "5f633ff5c444ce7e3c30a006": true, - "5f63405df5750b524b45f114": true, - "5f63407e1b231926f2329f15": true, - "5f6340d3ca442212f4047eb2": true, - "5f6341043ada5942720e2dc5": true, - "5f63418ef5750b524b45f116": true, - "5f6372e2865db925d54f3869": true, - "5f647f31b6238e5dd066e196": true, - "5f99418230835532b445e954": true, - "5f994730c91ed922dd355de3": true, - "5f9949d869e2777a0e779ba5": true, - "5fb64bc92b1b027b1f50bcf2": true, - "5fb651b52b1b027b1f50bcff": true, - "5fb651dc85f90547f674b6f4": true, - "5fb65363d1409e5ca04b54f5": true, - "5fb653962b1b027b1f50bd03": true, - "5fb65424956329274326f316": true, - "5fb6548dd1409e5ca04b54f9": true, - "5fb6558ad6f0b2136f2d7eb7": true, - "5fb655a72b1b027b1f50bd06": true, - "5fb655b748c711690e3a8d5a": true, - "5fb6564947ce63734e3fa1da": true, - "5fb6567747ce63734e3fa1dc": true, - "5fbb976df9986c4cff3fe5f2": true, - "5fbb978207e8a97d1f0902d3": true, - "5fbbaa86f9986c4cff3fe5f6": true, - "5fbbc3324e8a554c40648348": true, - "5fbbc34106bde7524f03cbe9": true, - "5fbbc366ca32ed67276c1557": true, - "5fbbc383d5cb881a7363194a": true, - "5fbbfabed5cb881a7363194e": true, - "5fbbfacda56d053a3543f799": true, - "5fbc210bf24b94483f726481": true, - "5fbc226eca32ed67276c155d": true, - "5fbc227aa56d053a3543f79e": true, - "5fbc22ccf24b94483f726483": true, - "5fbcbcf593164a5b6278efb2": true, - "5fbcbd02900b1d5091531dd3": true, - "5fbcbd10ab884124df0cd563": true, - "5fbcbd6c187fea44d52eda14": true, - "5fbcc1d9016cce60e8341ab3": true, - "5fbcc3e4d6fa9c00c571bb58": true, - "5fbcc429900b1d5091531dd7": true, - "5fbcc437d724d907e2077d5c": true, - "5fbcc640016cce60e8341acc": true, - "5fbe3ffdf8b6a877a729ea82": true, - "5fbe760793164a5b6278efc8": true, - "5fbe7618d6fa9c00c571bb6c": true, - "5fc0f9b5d724d907e2077d82": true, - "5fc0f9cbd6fa9c00c571bb90": true, - "5fc0fa362770a0045c59c677": true, - "5fc0fa957283c4046c58147e": true, - "5fc22d7c187fea44d52eda44": true, - "5fc23426900b1d5091531e15": true, - "5fc235db2770a0045c59c683": true, - "5fc2360f900b1d5091531e19": true, - "5fc23636016cce60e8341b05": true, - "5fc23678ab884124df0cd590": true, - "5fc2369685fd526b824a5713": true, - "5fc275cf85fd526b824a571a": true, - "5fc278107283c4046c581489": true, - "5fc382a9d724d907e2077dab": true, - "5fc382b6d6fa9c00c571bbc3": true, - "5fc382c1016cce60e8341b20": true, - "5fc3e272f8b6a877a729eac5": true, - "5fc3e466187fea44d52eda90": true, - "5fc3e4a27283c4046c5814ab": true, - "5fc3e4ee7283c4046c5814af": true, - "5fc3f2d5900b1d5091531e57": true, - "5fc4b97bab884124df0cd5e3": true, - "5fc4b992187fea44d52edaa9": true, - "5fc4b9b17283c4046c5814d7": true, - "5fc53954f8b6a877a729eaeb": true, - "5fc5396e900b1d5091531e72": true, - "5fc64ea372b0dd78d51159dc": true, - "5fca138c2a7b221b2852a5c6": true, - "5fca13ca637ee0341a484f46": true, - "5fce0cf655375d18a253eff0": true, - "5fce0f9b55375d18a253eff2": true, - "5fce16961f152d4312622bc9": true, - "5fd20ff893a8961fc660a954": true, - "5fd4c474dd870108a754b241": true, - "5fd4c4fa16cac650092f6771": true, - "5fd4c5477a8d854fa0105061": true, - "5fd4c60f875c30179f5d04c2": true, - "5fd8d28367cb5e077335170f": true, - "60098ad7c2240c0fe85c570a": true, - "60098af40accd37ef2175f27": true, - "60098b1705871270cd5352a1": true, - "601948682627df266209af05": true, - "60194943740c5d77f6705eea": true, - "601949593ae8f707c4608daa": true, - "601aa3d2b2bcb34913271e6d": true, - "602286df23506e50807090c6": true, - "60228924961b8d75ee233c32": true, - "60228a76d62c9b14ed777a66": true, - "60228a850ddce744014caf69": true, - "602293f023506e50807090cb": true, - "60229948cacb6b0506369e27": true, - "602a95edda11d6478d5a06da": true, - "602a95fe4e02ce1eaa358729": true, - "602a97060ddce744014caf6f": true, - "602a9740da11d6478d5a06dc": true, - "602e3f1254072b51b239f713": true, - "602e620f9b513876d4338d9a": true, - "602e63fb6335467b0c5ac94d": true, - "602e71bd53a60014f9705bfa": true, - "602f85fd9b513876d4338d9c": true, - "603372b4da11d6478d5a07ff": true, - "603372d154072b51b239f9e1": true, - "603372f153a60014f970616d": true, - "603373004e02ce1eaa358814": true, - "6033749e88382f4fab3fd2c5": true, - "60337f5dce399e10262255d1": true, - "60338ff388382f4fab3fd2c8": true, - "60339954d62c9b14ed777c06": true, - "6033fa48ffd42c541047f728": true, - "603409c80ca681766b6a0fb2": true, - "6034cf5fffd42c541047f72e": true, - "6034d0230ca681766b6a0fb5": true, - "6034d103ca006d2dca39b3f0": true, - "6034d2d697633951dc245ea6": true, - "6034e3cb0ddce744014cb870": true, - "6034e3d953a60014f970617b": true, - "6034e3e20ddce744014cb878": true, - "603618feffd42c541047f771": true, - "603619720ca681766b6a0fc4": true, - "60361a7497633951dc245eb4": true, - "60361b0b5a45383c122086a1": true, - "60361b5a9a15b10d96792291": true, - "60363c0c92ec1c31037959f5": true, - "603648ff5a45383c122086ac": true, - "6038b4b292ec1c3103795a0b": true, - "6038b4ca92ec1c3103795a0d": true, - "6038d614d10cbf667352dd44": true, - "6040dd4ddcf9592f401632d2": true, - "6040de02647ad86262233012": true, - "606587252535c57a13424cfd": true, - "60658776f2cb2e02a42ace2b": true, - "6065878ac9cf8012264142fd": true, - "606587a88900dc2d9a55b659": true, - "606587bd6d0bd7580617bacc": true, - "606587d11246154cad35d635": true, - "606587e18900dc2d9a55b65f": true, - "6065880c132d4d12c81fd8da": true, - "6065881d1246154cad35d637": true, - "6065c6e7132d4d12c81fd8e1": true, - "6065dc8a132d4d12c81fd8e3": true, - "606dae0ab0e443224b421bb7": true, - "606ee5c81246154cad35d65e": true, - "606eef46232e5a31c233d500": true, - "606eef756d0bd7580617baf8": true, - "606ef0812535c57a13424d20": true, - "606f262c6d0bd7580617bafa": true, - "606f263a8900dc2d9a55b68d": true, - "606f26752535c57a13424d22": true, - "606f2696f2cb2e02a42aceb1": true, - "6076c1b9f2cb2e02a42acedc": true, - "60785c0d232e5a31c233d51c": true, - "60785ce5132d4d12c81fd918": true, - "607d5aa50494a626335e12ed": true, - "607ea812232e5a31c233d53c": true, - "607f201b3c672b3b3a24a800": true, - "607f20859ee58b18e41ecd90": true, - "607ffb988900dc2d9a55b6e4": true, - "6086b5392535c57a13424d70": true, - "6086b5731246154cad35d6c7": true, - "6087e0336d0bd7580617bb7a": true, - "6087e2a5232e5a31c233d552": true, - "6087e663132d4d12c81fd96b": true, - "609269c3b0e443224b421cc1": true, - "60926df0132d4d12c81fd9df": true, - "609a4b4fe2ff132951242d04": true, - "609a63b6e2ff132951242d09": true, - "609b9e31506cf869cf3eaf41": true, - "609bab8b455afd752b2e6138": true, - "609e8540d5c319764c2bc2e9": true, - "609e860ebd219504d8507525": true, - "60a23797a37c940de7062d02": true, - "60a272cc93ef783291411d8e": true, - "60a2828e8689911a226117f9": true, - "60a283193cb70855c43a381d": true, - "60a3c68c37ea821725773ef5": true, - "60a3c70cde5f453f634816a3": true, - "60a621c49c197e4e8c4455e6": true, - "60a6220e953894617404b00a": true, - "60a7acf20c5cb24b01346648": true, - "60a7ad2a2198820d95707a2e": true, - "60a7ad3a0c5cb24b0134664a": true, - "60b0f988c4449e4cb624c1da": true, - "60b52e5bc7d8103275739d67": true, - "60bf74184a63fc79b60c57f6": true, - "60db29ce99594040e04c4a27": true, - "6113c3586c780c1e710c90bc": true, - "6113cc78d3a39d50044c065a": true, - "6113cce3d92c473c770200c7": true, - "6113d6c3290d254f5e6b27db": true, - "611a30addbdd8440277441dc": true, - "611a31ce5b7ffe001b4649d1": true, - "6123649463849f3d843da7c4": true, - "612368f58b401f4f51239b33": true, - "612781056f3d944a17348d60": true, - "612e0cfc8004cc50514c2d9e": true, - "612e0d3767085e45ef14057f": true, - "612e0d81290d254f5e6b291a": true, - "612e0e04568c120fdd294258": true, - "612e0e3c290d254f5e6b291d": true, - "612e0e55a112697a4b3a66e7": true, - "6130c3dffaa1272e43151c7d": true, - "6130c43c67085e45ef1405a1": true, - "6130c4d51cb55961fa0fd49f": true, - "6130ca3fd92c473c77020dbd": true, - "614451b71e5874611e2c7ae5": true, - "615d8d878004cc50514c3233": true, - "615d8da4d3a39d50044c10e8": true, - "615d8dbd290d254f5e6b2ed6": true, - "615d8df08004cc50514c3236": true, - "615d8e2f1cb55961fa0fd9a4": true, - "615d8e9867085e45ef1409c6": true, - "615d8eb350224f204c1da1cf": true, - "615d8f5dd92c473c770212ef": true, - "615d8f8567085e45ef1409ca": true, - "615d8faecabb9b7ad90f4d5d": true, - "615d8fd3290d254f5e6b2edc": true, - "61605d88ffa6e502ac5e7eeb": true, - "616442e4faa1272e43152193": true, - "616554fe50224f204c1da2aa": true, - "61657230d92c473c770213d7": true, - "616584766ef05c2ce828ef57": true, - "61659f79d92c473c770213ee": true, - "6165ac306ef05c2ce828ef74": true, - "6165ac8c290d254f5e6b2f6c": true, - "6165adcdd3a39d50044c120f": true, - "6165aeedfaa1272e431521e3": true, - "61695095d92c473c7702147a": true, - "61702be9faa1272e431522c3": true, - "61702d8a67085e45ef140b24": true, - "61702f1b67085e45ef140b26": true, - "61703001d92c473c77021497": true, - "61712eae6c780c1e710c9a1d": true, - "617130016c780c1e710c9a24": true, - "617131a4568c120fdd29482d": true, - "61713308d92c473c770214a0": true, - "6171367e1cb55961fa0fdb36": true, - "61713a8fd92c473c770214a4": true, - "61713cc4d8e3106d9806c109": true, - "6171407e50224f204c1da3c5": true, - "61714b2467085e45ef140b2c": true, - "61714eec290d254f5e6b2ffc": true, - "617151c1d92c473c770214ab": true, - "617153016c780c1e710c9a2f": true, - "617154aa1cb55961fa0fdb3b": true, - "617155ee50224f204c1da3cd": true, - "61715e7e67085e45ef140b33": true, - "6176a40f0b8c0312ac75a3d3": true, - "6176a48d732a664031271438": true, - "6176aca650224f204c1da3fb": true, - "617aa4dd8166f034d57de9c5": true, - "617fd91e5539a84ec44ce155": true, - "61816734d8e3106d9806c1f3": true, - "618167441cb55961fa0fdc71": true, - "618167528004cc50514c34f9": true, - "618167616ef05c2ce828f1a8": true, - "6181688c6c780c1e710c9b04": true, - "618168b350224f204c1da4d8": true, - "618168dc8004cc50514c34fc": true, - "61816df1d3a39d50044c139e": true, - "61816dfa6ef05c2ce828f1ad": true, - "61816fcad92c473c770215cc": true, - "61817865d3a39d50044c13a4": true, - "618178aa1cb55961fa0fdc80": true, - "61825d06d92c473c770215de": true, - "61825d136ef05c2ce828f1cc": true, - "61825d24d3a39d50044c13af": true, - "6183afd850224f204c1da514": true, - "6183b0711cb55961fa0fdcad": true, - "6183b084a112697a4b3a6e6c": true, - "6183d53f1cb55961fa0fdcda": true, - "6183fc15d3a39d50044c13e9": true, - "6183fd911cb55961fa0fdce9": true, - "6183fd9e8004cc50514c358f": true, - "618405198004cc50514c3594": true, - "6184055050224f204c1da540": true, - "618407a850224f204c1da549": true, - "61840bedd92c473c77021635": true, - "61840d85568c120fdd2962a5": true, - "618426d96c780c1e710c9b9f": true, - "618428466ef05c2ce828f218": true, - "618a431df1eb8e24b8741deb": true, - "618a5d5852ecee1505530b2a": true, - "618a75c9a3884f56c957ca1b": true, - "618a75f0bd321d49084cd399": true, - "618a760e526131765025aae3": true, - "618aef6d0a5a59657e5f55ee": true, - "618b9643526131765025ab35": true, - "618b9671d14d6d5ab879c5ea": true, - "618b9682a3884f56c957ca78": true, - "618ba27d9008e4636a67f61d": true, - "618ba91477b82356f91ae0e8": true, - "618ba92152ecee1505530bd3": true, - "618bab21526131765025ab3f": true, - "618bb76513f5097c8d5aa2d5": true, - "618cfae774bb2d036a049e7c": true, - "619256e5f8af2c1a4e1f5d92": true, - "619386379fb0c665d5490dbe": true, - "6193a720f8ee7e52e42109ed": true, - "6193d3149fb0c665d5490e32": true, - "6193d338de3cdf1d2614a6fc": true, - "6193d382ed0429009f543e65": true, - "6193d3be7c6c7b169525f0da": true, - "6193d3cded0429009f543e6a": true, - "6193d5d4f8ee7e52e4210a1b": true, - "6193dcd0f8ee7e52e4210a28": true, - "6194ef39de3cdf1d2614a768": true, - "6194efe07c6c7b169525f11b": true, - "6194eff92d2c397d6600348b": true, - "6194f017ed0429009f543eaa": true, - "6194f02d9bb3d20b0946d2f0": true, - "6194f1f918a3974e5e7421e4": true, - "6194f2912d2c397d6600348d": true, - "6194f2df645b5d229654ad77": true, - "6194f3286db0f2477964e67d": true, - "6194f35c18a3974e5e7421e6": true, - "6194f41f9fb0c665d5490e75": true, - "6194f5722d2c397d6600348f": true, - "6194f5a318a3974e5e7421eb": true, - "6194f5d418a3974e5e7421ef": true, - "619621a4de3cdf1d2614a7a7": true, - "619624b26db0f2477964e6b0": true, - "6196255558ef8c428c287d1c": true, - "61962b617c6c7b169525f168": true, - "61962d879bb3d20b0946d385": true, - "6196364158ef8c428c287d9f": true, - "6196365d58ef8c428c287da1": true, - "619636be6db0f2477964e710": true, - "61963a852d2c397d660036ad": true, - "61965d9058ef8c428c287e0d": true, - "619666f4af1f5202c57a952d": true, - "6197b229af1f5202c57a9bea": true, - "619b5db699fb192e7430664f": true, - "619b69037b9de8162902673e": true, - "619bc61e86e01e16f839a999": true, - "619bdd8886e01e16f839a99c": true, - "619bddc6c9546643a67df6ee": true, - "619bddffc9546643a67df6f0": true, - "619bde3dc9546643a67df6f2": true, - "619bde7fc9546643a67df6f4": true, - "619bdeb986e01e16f839a99e": true, - "619bdef8c9546643a67df6f6": true, - "619bdf9cc9546643a67df6f8": true, - "619bdfd4c9546643a67df6fa": true, - "619cbf7d23893217ec30b689": true, - "619cbf9e0a7c3a1a2731940a": true, - "619cf0335771dd3c390269ae": true, - "619d36da53b4d42ee724fae4": true, - "619f4ab2d25cbd424731fb95": true, - "619f4bffd25cbd424731fb97": true, - "619f4cee4c58466fe1228435": true, - "619f4d304c58466fe1228437": true, - "619f4f8c4c58466fe1228439": true, - "619f52454c58466fe122843b": true, - "61a4c8884f95bc3b2c5dc96f": true, - "61b9e1aaef9a1b5d6a79899a": true, - "61bc85697113f767765c7fe7": true, - "61bca7cda0eae612383adf57": true, - "61bcc89aef0f505f0c6cd0fc": true, - "61c18d83b00456371a66814b": true, - "61c18db6dfd64163ea78fbb4": true, - "61f4012adfc9f01a816adda1": true, - "61f7b234ea4ab34f2f59c3ec": true, - "61f7b85367ddd414173fdb36": true, - "61f7c9e189e6fb1a5e3ea78d": true, - "61f8024263dc1250e26eb029": true, - "61f803b8ced75b2e852e35f8": true, - "61faa91878830f069b6b7967": true, - "620109578d82e67e7911abf2": true, - "6217726288ed9f0845317459": true, - "62178be9d0050232da3485d9": true, - "62178c4d4ecf221597654e3d": true, - "622b327b267a1b13a44abea3": true, - "622b379bf9cfc87d675d2de5": true, - "622b3858034a3e17ad0b81f5": true, - "622b38c56762c718e457e246": true, - "622b397c9a3d4327e41843b6": true, - "622b3c081b89c677a33bcda6": true, - "622b3d5cf9cfc87d675d2de9": true, - "622b4d7df9cfc87d675d2ded": true, - "622b4f54dc8dcc0ba8742f85": true, - "622efbcb99f4ea1a4d6c9a15": true, - "622efdf8ec80d870d349b4e5": true, - "622f02437762f55aaa68ac85": true, - "622f039199f4ea1a4d6c9a17": true, - "622f07cfae33bc505b2c4dd5": true, - "622f0ee47762f55aaa68ac87": true, - "622f128cec80d870d349b4e8": true, - "622f140da5958f63c67f1735": true, - "622f14e899892a7f9e08f6c5": true, - "622f16a1a5958f63c67f1737": true, - "623063e994fc3f7b302a9696": true, - "62307b7b10d2321fa8741921": true, - "6231654c71b5bc3baa1078e5": true, - "623166e08c43374ca1567195": true, - "6231670f0b8aa5472d060095": true, - "62330b3ed4dc74626d570b95": true, - "62330bfadc5883093563729b": true, - "62330c18744e5e31df12f516": true, - "62330c40bdd19b369e1e53d1": true, - "62386b2adf47d66e835094b2": true, - "62386b7153757417e93a4e9f": true, - "62389aaba63f32501b1b444f": true, - "62389ba9a63f32501b1b4451": true, - "62389bc9423ed1685422dc57": true, - "62389be94d5d474bf712e709": true, - "623b2e9d11c3296b440d1638": true, - "623c2f4242aee3103f1c44b7": true, - "623c2f652febb22c2777d8d7": true, - "623c3be0484b5003161840dc": true, - "623c3c1f37b4b31470357737": true, - "6241c2c2117ad530666a5108": true, - "6241c316234b593b5676b637": true, - "62444cb99f47004c781903eb": true, - "62444cd3674028188b052799": true, - "624c0570c9b794431568f5d5": true, - "624c09cfbc2e27219346d955": true, - "624c09da2cec124eb67c1046": true, - "624c09e49b98e019a3315b66": true, - "624c0b3340357b5f566e8766": true, - "624c29ce09cd027dff2f8cd7": true, - "624c2e8614da335f1e034d8c": true, - "6259b864ebedf17603599e88": true, - "6259c2c1d714855d182bad85": true, - "6259c3387d6aab70bc23a18d": true, - "6259c3d8012d6678ec38eeb8": true, - "6259c4347d6aab70bc23a190": true, - "625eb0faa6e3a82193267ad9": true, - "625ebcef6f53af4aa66b44dc": true, - "625ec45bb14d7326ac20f572": true, - "625ed7c64d9b6612df732146": true, - "626667e87379c44d557b7550": true, - "626673016f1edc06f30cf6d5": true, - "62669bccdb9ebb4daa44cd14": true, - "6267c6396b642f77f56f5c1c": true, - "6269220d70b6c02e665f2635": true, - "6269545d0e57f218e4548ca2": true, - "626a74340be03179a165e30c": true, - "626a8ae89e664a2e2a75f409": true, - "626a9cb151cb5849f6002890": true, - "626bb8532c923541184624b4": true, - "626becf9582c3e319310b837": true, - "6272370ee4013c5d7e31f418": true, - "6272379924e29f06af4d5ecb": true, - "627254cc9c563e6e442c398f": true, - "6272874a6c47bd74f92e2087": true, - "6275303a9f372d6ea97f9ec7": true, - "627e14b21713922ded6f2c15": true, - "62811cd7308cb521f87a8f99": true, - "62811e2510e26c1f344e6554": true, - "62811e335631d45211793c95": true, - "62811f461d5df4475f46a332": true, - "62811f828193841aca4a45c3": true, - "62811fa609427b40ab14e765": true, - "62811fbf09427b40ab14e767": true, - "6281204f308cb521f87a8f9b": true, - "628120621d5df4475f46a335": true, - "62812081d23f207deb0ab216": true, - "6281209662cba23f6c4d7a19": true, - "628120c21d5df4475f46a337": true, - "628120d309427b40ab14e76d": true, - "628120dd308cb521f87a8fa1": true, - "628120fd5631d45211793c9f": true, - "6281212a09427b40ab14e770": true, - "628121434fa03b6b6c35dc6a": true, - "6284bd5f95250a29bc628a30": true, - "62850c28da09541f43158cca": true, - "628a60ae6b1d481ff772e9c8": true, - "628a664bccaab13006640e47": true, - "628a665a86cbd9750d2ff5e5": true, - "628a6678ccaab13006640e49": true, - "628a66b41d5e41750e314f34": true, - "628a7b23b0f75035732dd565": true, - "628a83c29179c324ed269508": true, - "628a85ee6b1d481ff772e9d5": true, - "628b5638ad252a16da6dd245": true, - "628b8d83717774443b15e248": true, - "628b916469015a4e1711ed8d": true, - "628b9471078f94059a4b9bfb": true, - "628b9784bcf6e2659e09b8a2": true, - "628b9a40717774443b15e9f2": true, - "628b9be6cff66b70c002b14c": true, - "628b9c37a733087d0d7fe84b": true, - "628b9c7d45122232a872358f": true, - "628baf0b967de16aab5a4f36": true, - "628bc7fb408e2b2e9c0801b1": true, - "628c9ab845c59e5b80768a81": true, - "628cd624459354321c4b7fa2": true, - "628d0618d1ba6e4fa07ce5a4": true, - "628dc750b910320f4c27a732": true, - "628e1ffc83ec92260c0f437f": true, - "628e4dd1f477aa12234918aa": true, - "628e4e576d783146b124c64d": true, - "62963c18dbc8ab5f0d382d0b": true, - "62a09d3bcf4a99369e262447": true, - "62a09d79de7ac81993580530": true, - "62a09dd4621468534a797ac7": true, - "62a09e08de7ac81993580532": true, - "62a09e410b9d3c46de5b6e78": true, - "62a09f32621468534a797acb": true, - "62a1b7fbc30cfa1d366af586": true, - "62a5c2c98ec41a51b34739c0": true, - "62a5c333ec21e50cad3b5dc6": true, - "62a5c41e8ec41a51b34739c3": true, - "62a61bbf8ec41a51b34758d2": true, - "62a61c988ec41a51b34758d5": true - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608815684 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 4, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 6, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 17206066, - "GameVersion": "edge_of_darkness", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 69, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 2, - "NeedWipeOptions": [], - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Bear", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49444ae6628187a2e77b8", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49444ae6628187a2e77b8", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "f5e6bdac05e699d687993249", - "_tpl": "5857a8bc2459772bad15db29", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "SecuredContainer" - }, - { - "_id": "01e9d751f10e4e9aebdd94d5", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Pockets" - }, - { - "_id": "5fe49444ae6628187a2e78b8", - "_tpl": "5811ce772459770e9e5f9532" - }, - { - "_id": "5fe49444ae6628187a2e78ba", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49444ae6628187a2e78b9", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - }, - { - "_id": "f55404fc9c2a0063bc1b9293", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "c1408429a85d87168d75e04c", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "6275a53292b3e1de7c0f94fc", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "72ec3ef07bf2ddf6c0dab838", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000 - } - }, - { - "_id": "14bdc77de1a13722eb416218", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "cadad72d72caf8c9784524d4", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "987b8edc24c5e2a9ccb9ee1d", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "e7d08b2dd0f631136f424917", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "a913602b85dcd145970c2688", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 5, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "68bdc987f801ecd7efbaaabe", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 6, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "68ffe73296918e3a751ff27d", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 7, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "7ae138bc2cbc56640fdf2506", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 8, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "57a6c6de5aa471e473c7f5c5", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "7ef87fb9eaa6c25950c09a7d", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "76f687b8388d97cd13aa18a5", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "249a3bbee6e1ba29712e6065", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "5516338b341dad987bcfb18a", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "f5028bfe9f5550d5c547c9b2", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 5, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "efa4b58a3741068b3957dc25", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 7, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "08624351a590bbe7269ec79e", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "de4be08a2ffd9e880455777a", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 6, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "a47caded1ede79b972fe7ad5", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "07292f5d4592fb72775941e6", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 8, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "748e89ddd9102eab4bcf47c8", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 5, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "d88551febbfbe3757852a8d8", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "a7a5854fe4649f57bb9b2bee", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 6, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "cc8ff42be98f9f513fea9b5b", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 8, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "33a09dbb0fc6f1f1da32856b", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "fbe3dabfda80655871d2ff35", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "3cc9938ad572a73e1f26877f", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "969b3e5c1134f1538183add6", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 7, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - } - ], - "questRaidItems": "5fe49444ae6628187a2e78b9", - "questStashItems": "5fe49444ae6628187a2e78ba", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49444ae6628187a2e78b8" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 2000 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 2000 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cd946231388ce000d572fe3", - "5cd945d71388ce000a659dfb" - ], - "trader": { - "initialLoyaltyLevel": 4, - "initialSalesSum": 2600000, - "initialStanding": 1, - "jaegerUnlocked": true, - "setQuestsAvailableForStart": false - }, - "weaponbuilds": {} + "usec": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c2", + "templateId": "5811ce572459770cba1a34ea", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c4", + "templateId": "5811ce662459770f6f490f32", + "type": "StashSize" + }, { + "id": "64f5b9e5fa34f11b380756c6", + "templateId": "5811ce772459770e9e5f9532", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cde95d97d6c8b647a3769b0", + "Feet": "5cde95ef7d6c8b04713c4f2d", + "Hands": "5cde95fa7d6c8b04737c2d13", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5447ac644bdc2d6c208b4567": true, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448c1d04bdc2dff2f8b4569": true, + "5448fee04bdc2dbc018b4567": false, + "5448ff904bdc2d6f028b456e": true, + "5449016a4bdc2d6f028b456f": false, + "544909bb4bdc2d6f028b4577": true, + "544a11ac4bdc2d470e8b456a": false, + "544a378f4bdc2d30388b4567": true, + "544a37c44bdc2d25388b4567": true, + "544a38634bdc2d58388b4568": true, + "544a3a774bdc2d3a388b4567": true, + "544a5caa4bdc2d1a388b4568": true, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": true, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "544fb62a4bdc2dfb738b4568": true, + "544fb6cc4bdc2d34748b456e": true, + "54527a984bdc2d4e668b4567": true, + "54527ac44bdc2d36668b4567": true, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "5580169d4bdc2d9d138b4585": true, + "55801eed4bdc2d89578b4588": true, + "5580223e4bdc2d1c128b457f": true, + "558022b54bdc2dac148b458d": true, + "55802d5f4bdc2dac148b458e": true, + "55802f5d4bdc2dac148b458f": true, + "558032614bdc2de7118b4585": true, + "559ba5b34bdc2d1f1a8b4582": true, + "55d355e64bdc2d962f8b4569": true, + "55d35ee94bdc2d61338b4568": true, + "55d3632e4bdc2d972f8b4569": true, + "55d447bb4bdc2d892f8b456f": true, + "55d448594bdc2d8c2f8b4569": true, + "55d449444bdc2d962f8b456d": true, + "55d44fd14bdc2d962f8b456e": true, + "55d459824bdc2d892f8b4573": true, + "55d45d3f4bdc2d972f8b456c": true, + "55d45f484bdc2d972f8b456d": true, + "55d480c04bdc2d1d4e8b456a": false, + "55d481904bdc2d8c2f8b456a": true, + "55d482194bdc2d1d4e8b456b": true, + "55d4837c4bdc2d1d4e8b456c": true, + "55d485be4bdc2d962f8b456f": true, + "55d4887d4bdc2d962f8b4570": true, + "55d48a634bdc2d8b2f8b456a": true, + "55d48ebc4bdc2d8c2f8b456c": true, + "55d4ae6c4bdc2d8b2f8b456e": true, + "55d4af3a4bdc2d972f8b456f": true, + "55d4b9964bdc2d1d4e8b456e": true, + "55d5f46a4bdc2d1b198b4567": true, + "55d614004bdc2d86028b4568": true, + "55d6190f4bdc2d87028b4567": true, + "55d7217a4bdc2d86028b456d": false, + "55f84c3c4bdc2d5f408b4576": true, + "560835c74bdc2dc8488b456f": true, + "560836484bdc2d20478b456e": true, + "560836b64bdc2d57468b4567": true, + "560836fb4bdc2d773f8b4569": true, + "560837154bdc2da74d8b4568": true, + "5608373c4bdc2dc8488b4570": true, + "560837544bdc2de22e8b456e": true, + "560837824bdc2d57468b4568": true, + "5608379a4bdc2d26448b4569": true, + "560838c94bdc2d77798b4569": true, + "56083a334bdc2dc8488b4571": true, + "56083be64bdc2d20478b456f": true, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560d61e84bdc2da74d8b4571": true, + "560d657b4bdc2da74d8b4572": true, + "560d75f54bdc2da74d8b4573": true, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a69d4bdc2ded0b8b457b": true, + "5648a7494bdc2d9d488b4583": false, + "5648ac824bdc2ded0b8b457d": true, + "5648ae314bdc2d3d1c8b457f": true, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": true, + "5648b4534bdc2d3d1c8b4580": true, + "5649a2464bdc2d91118b45a8": true, + "5649aa744bdc2ded0b8b457e": false, + "5649ab884bdc2ded0b8b457f": true, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649ae4a4bdc2d1b2b8b4588": true, + "5649af094bdc2df8348b4586": false, + "5649af884bdc2d1b2b8b4589": true, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "5649b2314bdc2d79388b4576": true, + "5649be884bdc2d79388b4577": true, + "5649d9a14bdc2d79388b4580": true, + "5649ed104bdc2d3d1c8b458b": true, + "564ca99c4bdc2d16268b4589": false, + "564ca9df4bdc2d35148b4569": true, + "564caa3d4bdc2d17108b458e": true, + "5656d7c34bdc2d9d198b4587": true, + "5656eb674bdc2d35148b457c": true, + "567143bf4bdc2d1a0f8b4567": true, + "5673de654bdc2d180f8b456d": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59856d2720bd8418b456a": true, + "56d59d3ad2720bdb418b4577": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56dee2bdd2720bc8328b4567": true, + "56deec93d2720bec348b4568": true, + "56deed6ed2720b4c698b4583": true, + "56def37dd2720bec348b456a": true, + "56dfef82d2720bbd668b4567": true, + "56dff026d2720bb8668b4567": true, + "56dff061d2720bb5668b4567": true, + "56dff0bed2720bb0668b4567": true, + "56dff216d2720bbd668b4568": true, + "56dff2ced2720bb4668b4567": true, + "56dff3afd2720bba668b4567": true, + "56dff421d2720b5f5a8b4567": true, + "56dff4a2d2720bbd668b456a": true, + "56dff4ecd2720b5f5a8b4568": true, + "56e0598dd2720bb5668b45a6": true, + "56e05a6ed2720bd0748b4567": true, + "56e05b06d2720bb2668b4586": true, + "56e294cdd2720b603a8b4575": false, + "56e335e4d2720b6c058b456d": true, + "56e33634d2720bd8058b456b": true, + "56e33680d2720be2748b4576": true, + "56ea6fafd2720b844b8b4593": true, + "56ea70acd2720b844b8b4594": true, + "56ea7165d2720b6e518b4583": true, + "56ea7293d2720b8d4b8b45ba": true, + "56ea8180d2720bf2698b456a": true, + "56ea8222d2720b69698b4567": true, + "56ea8d2fd2720b7c698b4570": true, + "56eabcd4d2720b66698b4574": true, + "56eabf3bd2720b75698b4569": true, + "570fd6c2d2720bc6458b457f": true, + "570fd721d2720bc5458b4596": true, + "570fd79bd2720bc7458b4583": true, + "5710c24ad2720bc3458b45a3": false, + "571659bb2459771fb2755a12": true, + "571a26d524597720680fbe8a": true, + "571a279b24597720b4066566": true, + "571a282c2459771fb2755a69": true, + "571a28e524597720b4066567": true, + "571a29dc2459771fb2755a6a": true, + "57235b6f24597759bf5a30f1": true, + "572b7adb24597762ae139821": true, + "572b7fa524597762b747ce82": true, + "5732ee6a24597719ae0c0281": true, + "5734773724597737fd047c14": true, + "57347d3d245977448f7b7f61": true, + "57347d5f245977448b40fa81": true, + "57347d692459774491567cf1": true, + "57347d7224597744596b4e72": false, + "57347d8724597744596b4e76": true, + "57347d90245977448f7b7f65": true, + "57347d9c245977448b40fa85": true, + "57347da92459774491567cf5": true, + "5735fdcd2459776445391d61": true, + "5735ff5c245977640e39ba7e": true, + "573601b42459776410737435": true, + "573602322459776445391df1": true, + "5736026a245977644601dc61": true, + "573603562459776430731618": true, + "573603c924597764442bd9cb": true, + "573718ba2459775a75491131": false, + "573719762459775a626ccbc1": true, + "573719df2459775a626ccbc2": true, + "57371aab2459775a77142f22": true, + "57371b192459775a9f58a5e0": true, + "57371e4124597760ff7b25f1": true, + "57371eb62459776125652ac1": true, + "57371f2b24597761224311f1": true, + "57371f8d24597761006c6a81": true, + "5737201124597760fc4431f1": true, + "5737207f24597760ff7b25f2": true, + "573720e02459776143012541": true, + "57372140245977611f70ee91": true, + "5737218f245977612125ba51": true, + "573722e82459776104581c21": true, + "573724b42459776125652ac2": true, + "5737250c2459776125652acc": true, + "5737256c2459776125652acd": true, + "573725b0245977612125bae2": true, + "5737260b24597761224311f2": true, + "5737266524597761006c6a8c": true, + "573726d824597765d96be361": true, + "5737273924597765dd374461": true, + "573727c624597765cc785b5b": true, + "5737280e24597765cc785b5c": true, + "5737287724597765e1625ae2": true, + "573728cc24597765cc785b5d": true, + "573728f324597765e5728561": true, + "5737292724597765e5728562": true, + "57372a7f24597766fe0de0c1": true, + "57372ac324597767001bc261": true, + "57372b832459776701014e41": true, + "57372bad245977670b7cd242": true, + "57372bd3245977670b7cd243": true, + "57372c21245977670937c6c2": true, + "57372c56245977685e584582": true, + "57372c89245977685d4159b1": true, + "57372d1b2459776862260581": true, + "57372d4c245977685a3da2a1": true, + "57372db0245977685d4159b2": true, + "57372deb245977685d4159b3": true, + "57372e1924597768553071c1": true, + "57372e4a24597768553071c2": true, + "57372e73245977685d4159b4": true, + "57372e94245977685648d3e1": true, + "57372ebf2459776862260582": true, + "57372ee1245977685d4159b5": true, + "57372f2824597769a270a191": true, + "57372f5c24597769917c0131": true, + "57372f7d245977699b53e301": true, + "57372fc52459776998772ca1": true, + "5737300424597769942d5a01": true, + "5737330a2459776af32363a1": true, + "5737339e2459776af261abeb": true, + "573733c72459776b0b7b51b0": true, + "5739d41224597779c3645501": true, + "57486e672459770abd687134": true, + "574d967124597745970e7c94": true, + "574dad8024597745964bf05c": true, + "574db213245977459a2f3f5d": true, + "574eb85c245977648157eec3": true, + "575062b524597720a31c09a1": true, + "57513f07245977207e26a311": true, + "57513f9324597720a7128161": true, + "57513fcc24597720a31c09a6": true, + "5751435d24597720a27126d1": true, + "57514643245977207f2c2d09": true, + "575146b724597720a27126d5": true, + "5751487e245977207e26a315": true, + "5751496424597720a27126da": true, + "5751a25924597722c463c472": true, + "5751a89d24597722aa0e8db0": true, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": true, + "576165642459773c7a400233": true, + "576167ab2459773cad038c43": true, + "57616a9e2459773c7a400234": true, + "57616ca52459773c69055192": true, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "576fd4ec2459777f0b518431": true, + "577d128124597739d65d0e56": true, + "577d141e24597739c5255e01": true, + "57838ad32459774a17445cd2": true, + "57838c962459774a1651ec63": true, + "57838e1b2459774a256959b1": true, + "57838f0b2459774a256959b2": true, + "57838f9f2459774a150289a0": true, + "578395402459774a256959b5": true, + "578395e82459774a0e553c7b": true, + "579204f224597773d619e051": true, + "5798a2832459774b53341029": true, + "57a0dfb82459774d3078b56c": true, + "57a0e5022459774d1673f889": true, + "57a3459f245977764a01f703": true, + "57a9b9ce2459770ee926038d": true, + "57ac965c24597706be5f975c": true, + "57aca93d2459771f2c7e26db": true, + "57acb6222459771ec34b5cb0": true, + "57ade1442459771557167e15": true, + "57adff4f24597737f373b6e6": true, + "57ae0171245977343c27bfcf": true, + "57af48872459771f0b2ebf11": true, + "57c44b372459772d2b39b8ce": true, + "57c44dd02459772d2e0ae249": true, + "57c44e7b2459772d28133248": true, + "57c44f4f2459772d2c627113": true, + "57c44fa82459772d2d75e415": true, + "57c450252459772d28133253": true, + "57c55efc2459772d2c6271e7": true, + "57c55f092459772d291a8463": true, + "57c55f112459772d28133310": true, + "57c55f172459772d27602381": true, + "57c5ac0824597754771e88a9": true, + "57c69dd424597774c03b7bbc": true, + "57c9a89124597704ee6faec1": true, + "57cd379a24597778e7682ecf": false, + "57cff947245977638e6f2a19": true, + "57cffb66245977632f391a99": true, + "57cffcd624597763133760c5": true, + "57cffcdd24597763f5110006": true, + "57cffce524597763b31685d8": true, + "57cffd8224597763b03fc609": true, + "57cffddc24597763133760c6": true, + "57cffe0024597763b03fc60b": true, + "57cffe20245977632f391a9d": true, + "57d14d2524597714373db789": true, + "57d14e1724597714010c3f4b": true, + "57d1519e24597714373db79d": true, + "57d152ec245977144076ccdf": true, + "57d17c5e2459775a5c57d17d": true, + "57d17e212459775a1179a0f5": true, + "57da93632459771cb65bf83f": true, + "57dbb57e2459774673234890": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "57e26ea924597715ca604a09": true, + "57e26fc7245977162a14b800": true, + "57ee59b42459771c7b045da5": true, + "57f3a5ae2459772b0e0bf19e": true, + "57f3c6bd24597738e730fa2f": true, + "57f3c7e024597738ea4ba286": true, + "57f3c8cc2459773ec4480328": true, + "57f4c844245977379d5c14d1": true, + "57fd23e32459772d0805bcf1": true, + "57ffa9f4245977728561e844": true, + "57ffaea724597779f52b3a4d": true, + "57ffb0062459777a045af529": true, + "57ffb0e42459777d047111c5": true, + "5811ce772459770e9e5f9532": false, + "5827272a24597748c74bdeea": true, + "58272b392459774b4c7b3ccd": true, + "58272b842459774abc128d50": true, + "58272d7f2459774f6311ddfd": true, + "583990e32459771419544dd2": true, + "5839a40f24597726f856b511": true, + "5839a7742459773cf9693481": true, + "58491f3324597764bc48fa02": true, + "584924ec24597768f12ae244": true, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "587de4282459771bca0ec90b": true, + "587de5ba2459771c0f1e8a58": true, + "587df583245977373c4f1129": true, + "587e02ff24597743df3deaeb": true, + "587e0531245977466077a0f7": true, + "587e08ee245977446b4410cf": true, + "588200af24597742fa221dfb": true, + "588200c224597743990da9ed": true, + "588200cf2459774414733d55": true, + "588226d124597767ad33f787": true, + "588226dd24597767ad33f789": true, + "588226e62459776e3e094af7": true, + "588226ef24597767af46e39c": true, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "588892092459774ac91d4b11": true, + "5888945a2459774bf43ba385": true, + "5888956924597752983e182d": true, + "5888961624597754281f93f3": true, + "5888976c24597754281f93f5": true, + "5888988e24597752fe43a6fa": true, + "5888996c24597754281f9419": true, + "58889c7324597754281f9439": true, + "58889d0c2459775bc215d981": true, + "588b56d02459771481110ae2": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "58949fac86f77409483e16aa": true, + "5894a05586f774094708ef75": true, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "58a56f8d86f774651579314c": true, + "58a5c12e86f7745d585a2b9e": true, + "58ac1bf086f77420ed183f9f": true, + "58ac60eb86f77401897560ff": true, + "58aeaaa886f7744fc1560f81": true, + "58aeac1b86f77457c419f475": true, + "58c157be86f77403c74b2bb6": true, + "58c157c886f774032749fb06": true, + "58d2664f86f7747fec5834f6": true, + "58d268fc86f774111273f8c2": true, + "58d2912286f7744e27117493": true, + "58d2946386f774496974c37e": true, + "58d2946c86f7744e271174b5": true, + "58d2947686f774485c6a1ee5": true, + "58d2947e86f77447aa070d53": true, + "58d399e486f77442e0016fe7": true, + "58d39b0386f77443380bf13c": true, + "58d39d3d86f77445bb794ae7": true, + "58dd3ad986f77403051cba8f": true, + "5900b89686f7744e704a8747": true, + "590c5d4b86f774784e1b9c45": false, + "590c60fc86f77412b13fddcf": true, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": true, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": true, + "591aef7986f774139d495f03": true, + "591af10186f774139d495f0e": true, + "591af28e86f77414a27a9e1d": true, + "591c4e1186f77410354b316e": true, + "591c4efa86f7741030027726": true, + "591ee00d86f774592f7b841e": true, + "5926bb2186f7744b1c6c6e60": true, + "5926c0df86f77462f647f764": true, + "5926c32286f774616e42de99": true, + "5926c36d86f77467a92a8629": true, + "5926c3b286f774640d189b6b": true, + "5926d2be86f774134d668e4e": true, + "5926d33d86f77410de68ebc0": true, + "5926d3c686f77410de68ebc8": true, + "5926d40686f7740f152b6b7e": true, + "5926dad986f7741f82604363": true, + "5926e16e86f7742f5a0f7ecb": true, + "5926f2e086f7745aae644231": true, + "5926f34786f77469195bfe92": true, + "5929a2a086f7744f4b234d43": true, + "592c2d1a86f7746dbe2af32a": true, + "593d1fa786f7746da62d61ac": true, + "593d489686f7745c6255d58a": true, + "593d490386f7745ee97a1555": true, + "593d493f86f7745e6b2ceb22": true, + "5943d9c186f7745a13413ac9": true, + "5943ee5a86f77413872d25ec": true, + "5943eeeb86f77412d6384f6b": true, + "5947c73886f7747701588af5": true, + "5947db3f86f77447880cf76f": true, + "5947e98b86f774778f1448bc": true, + "5947eab886f77475961d96c5": true, + "5947f92f86f77427344a76b1": true, + "5947fa2486f77425b47c1a9b": true, + "595cf16b86f77427440c32e2": true, + "595cfa8b86f77427437e845b": true, + "5996f6cb86f774678763a6ca": true, + "5996f6d686f77467977ba6cc": true, + "5996f6fc86f7745e585b4de3": true, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a6c86f77414ec448d17": true, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59bfc5c886f7743bf6794e62": true, + "59bfe68886f7746004266202": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c0ec5b86f77435b128bfca": true, + "59c1383d86f774290a37e0ca": true, + "59c63b4486f7747afb151c1c": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "59d6272486f77466146386ff": true, + "59d64ec286f774171d1e0a42": true, + "59d650cf86f7741b846413a4": true, + "59d790f486f77403cb06aec6": true, + "59db3a1d86f77429e05b4e92": true, + "59db3acc86f7742a2c4ab912": true, + "59db3b0886f77429d72fb895": true, + "59db7e1086f77448be30ddf3": true, + "59db7eed86f77461f8380365": true, + "59e0bdb186f774156f04ce82": true, + "59e0be5d86f7742d48765bd2": true, + "59e0bed186f774156f04ce84": true, + "59e0d99486f7744a32234762": true, + "59e3577886f774176a362503": true, + "59e4cf5286f7741778269d8a": true, + "59e4d24686f7741776641ac7": true, + "59e4d3d286f774176a36250a": true, + "59e5f5a486f7746c530b3ce2": true, + "59e6152586f77473dc057aa1": true, + "59e649f986f77411d949b246": true, + "59e6542b86f77411dc52a77a": true, + "59e655cb86f77411dc52a77b": true, + "59e6658b86f77411d949b250": true, + "59e6687d86f77411d949b251": true, + "59e68f6f86f7746c9f75e846": true, + "59e6906286f7746c9f75e847": true, + "59e690b686f7746c9f75e848": true, + "59e6918f86f7746c9f75e849": true, + "59e6920f86f77411d82aa167": true, + "59e6927d86f77411da468256": true, + "59e7635f86f7742cbf2c1095": true, + "59e763f286f7742ee57895da": true, + "59e7643b86f7742cbf2c109a": true, + "59e7708286f7742cbd762753": true, + "59e770b986f7742cbd762754": true, + "59e770f986f7742cbe3164ef": true, + "59e7711e86f7746cae05fbe1": true, + "59e7715586f7742ee5789605": true, + "59e77a2386f7742ee578960a": true, + "59e8977386f77415a553c453": true, + "59eb7ebe86f7740b373438ce": true, + "59ecc28286f7746d7a68aa8c": true, + "59ecc3dd86f7746dc827481c": true, + "59ef13ca86f77445fd0e2483": true, + "59f8a37386f7747af3328f06": true, + "59f98b4986f7746f546d2cef": true, + "59f99a7d86f7745b134aa97b": true, + "59f9cabd86f7743a10721f46": true, + "59f9d81586f7744c7506ee62": true, + "59fafc5086f7740dbe19f6c3": true, + "59fafc9386f774067d462453": true, + "59fafd4b86f7745ca07e1232": true, + "59fb042886f7746c5005a7b2": true, + "59fb137a86f7740adb646af1": true, + "59fb257e86f7742981561852": true, + "59fb375986f7741b681b81a6": true, + "59fc48e086f77463b1118392": true, + "59ff346386f77477562ff5e2": true, + "5a0060fc86f7745793204432": true, + "5a01ad4786f77450561fda02": true, + "5a0abb6e1526d8000a025282": true, + "5a0c27731526d80618476ac4": true, + "5a0c59791526d8dba737bba7": true, + "5a0d63621526d8dba31fe3bf": true, + "5a0d716f1526d8000d26b1e2": true, + "5a0eb980fcdbcb001a3b00a6": true, + "5a0ec13bfcdbcb00165aa685": true, + "5a0ed824fcdbcb0176308b0d": true, + "5a0f096dfcdbcb0176308b15": true, + "5a154d5cfcdbcb001a3b00da": true, + "5a16b672fcdbcb001912fa83": true, + "5a16b7e1fcdbcb00165aa6c9": true, + "5a16b8a9fcdbcb00165aa6ca": true, + "5a16b93dfcdbcbcae6687261": true, + "5a16b9fffcdbcb0176308b34": true, + "5a16ba61fcdbcb098008728a": true, + "5a16badafcdbcb001865f72d": true, + "5a16bb52fcdbcb001a3b00dc": true, + "5a17f98cfcdbcb0980087290": true, + "5a17fb9dfcdbcbcae6687291": true, + "5a17fc70fcdbcb0176308b3d": true, + "5a1eaa87fcdbcb001865f75e": true, + "5a1eacb3fcdbcb09800872be": true, + "5a1ead28fcdbcb001912fa9f": true, + "5a269f97c4a282000b151807": true, + "5a26abfac4a28232980eabff": true, + "5a26ac06c4a282000c5a90a8": true, + "5a26ac0ec4a28200741e1e18": true, + "5a27b281c4a28200741e1e52": true, + "5a27b3d0c4a282000d721ec1": true, + "5a27b6bec4a282000e496f78": true, + "5a27bad7c4a282000b15184b": true, + "5a2a57cfc4a2826c6e06d44a": true, + "5a329052c4a28200741e22d3": true, + "5a32a064c4a28200741e22de": true, + "5a32aa0cc4a28232996e405f": true, + "5a32aa8bc4a2826c6e06d737": true, + "5a339805c4a2826c6e06d73d": true, + "5a33a8ebc4a282000c5a950d": true, + "5a33b2c9c4a282000c5a9511": true, + "5a33b652c4a28232996e407c": true, + "5a33bab6c4a28200741e22f8": true, + "5a33ca0fc4a282000d72292f": true, + "5a33cae9c4a28232980eb086": true, + "5a33e75ac4a2826c6e06d759": true, + "5a34f7f1c4a2826c6e06d75d": true, + "5a34fae7c4a2826c6e06d760": true, + "5a34fbadc4a28200741e230a": true, + "5a34fd2bc4a282329a73b4c5": true, + "5a34fe59c4a282000b1521a2": true, + "5a3501acc4a282000d72293a": true, + "5a351711c4a282000b1521a4": true, + "5a367e5dc4a282000e49738f": true, + "5a37ca54c4a282000d72296a": true, + "5a37cb10c4a282329a73b4e7": true, + "5a38e6bac4a2826c6e06d79b": true, + "5a38ed75c4a28232996e40c6": true, + "5a38ee51c4a282000c5a955c": true, + "5a398ab9c4a282000c5a9842": true, + "5a398b75c4a282000a51a266": true, + "5a3c16fe86f77452b62de32a": true, + "5a43943586f77416ad2f06e2": true, + "5a43957686f7742a2c2f11b0": true, + "5a5f1ce64f39f90b401987bc": true, + "5a6086ea4f39f99cd479502f": true, + "5a608bf24f39f98ffc77720e": true, + "5a69a2ed8dc32e000d46d1f1": true, + "5a6b585a8dc32e5a9c28b4f1": true, + "5a6b592c8dc32e00094b97bf": true, + "5a6b59a08dc32e000b452fb7": true, + "5a6b5b8a8dc32e001207faf3": true, + "5a6b5e468dc32e001207faf5": true, + "5a6b5ed88dc32e000c52ec86": true, + "5a6b5f868dc32e000a311389": true, + "5a6b60158dc32e000a31138b": true, + "5a6f58f68dc32e000a311390": true, + "5a6f5d528dc32e00094b97d9": true, + "5a6f5e048dc32e00094b97da": true, + "5a6f5f078dc32e00094b97dd": true, + "5a702d198dc32e000b452fc3": true, + "5a7033908dc32e000a311392": true, + "5a70366c8dc32e001207fb06": true, + "5a7037338dc32e000d46d257": true, + "5a705e128dc32e000d46d258": true, + "5a718b548dc32e000d46d262": true, + "5a718da68dc32e000d46d264": true, + "5a718f958dc32e00094b97e7": true, + "5a71e0048dc32e000c52ecc8": true, + "5a71e0fb8dc32e00094b97f2": true, + "5a71e1868dc32e00094b97f3": true, + "5a71e22f8dc32e00094b97f4": true, + "5a71e4f48dc32e001207fb26": true, + "5a787ebcc5856700142fdd98": true, + "5a787f25c5856700186c4ab9": true, + "5a787f7ac5856700177af660": true, + "5a787fadc5856700155a6ca1": true, + "5a787fdfc5856700142fdd9a": true, + "5a788031c585673f2b5c1c79": true, + "5a788068c5856700137e4c8f": true, + "5a788089c5856700142fdd9c": true, + "5a7880d0c5856700142fdd9d": true, + "5a78813bc5856700186c4abe": true, + "5a788169c5856700142fdd9e": true, + "5a789261c5856700186c65d3": true, + "5a7893c1c585673f2b5c374d": true, + "5a78948ec5856700177b1124": true, + "5a7ad0c451dfba0013379712": true, + "5a7ad1fb51dfba0013379715": true, + "5a7ad2e851dfba0016153692": true, + "5a7ad4af51dfba0013379717": true, + "5a7ad55551dfba0015068f42": true, + "5a7ad74e51dfba0015068f45": true, + "5a7ae0c351dfba0017554310": true, + "5a7afa25e899ef00135e31b0": true, + "5a7b32a2e899ef00135e345a": true, + "5a7b483fe899ef0016170d15": true, + "5a7b4900e899ef197b331a2a": true, + "5a7b4960e899ef197b331a2d": true, + "5a7c147ce899ef00150bd8b8": true, + "5a7c4850e899ef00150be885": true, + "5a7c74b3e899ef0014332c29": true, + "5a7d90eb159bd400165484f1": true, + "5a7d9104159bd400134c8c21": true, + "5a7d9122159bd4001438dbf4": true, + "5a7d912f159bd400165484f3": true, + "5a7dbfc1159bd40016548fde": true, + "5a800961159bd4315e3a1657": true, + "5a8036fb86f77407252ddc02": true, + "5a80a29286f7742b25692012": true, + "5a9548c9159bd400133e97b3": true, + "5a957c3fa2750c00137fa5f7": true, + "5a966ec8a2750c00171b3f36": true, + "5a966f51a2750c00156aacf6": true, + "5a9685b1a2750c0032157104": true, + "5a9d56c8a2750c0032157146": true, + "5a9d6d00a2750c5c985b5305": true, + "5a9d6d13a2750c00164f6b03": true, + "5a9d6d21a2750c00137fa649": true, + "5a9d6d34a2750c00141e07da": true, + "5a9e81fba2750c00164f6b11": true, + "5a9ea27ca2750c00137fa672": true, + "5a9eb32da2750c00171b3f9c": true, + "5a9fb739a2750c003215717f": true, + "5a9fbacda2750c00141e080f": true, + "5a9fbb74a2750c0032157181": true, + "5a9fbb84a2750c00137fa685": true, + "5a9fc7e6a2750c0032157184": true, + "5aa2b87de5b5b00016327c25": false, + "5aa2b89be5b5b0001569311f": true, + "5aa2b8d7e5b5b00014028f4a": true, + "5aa2b923e5b5b000137b7589": true, + "5aa2b986e5b5b00014028f4c": true, + "5aa2b9aee5b5b00015693121": true, + "5aa2b9ede5b5b000137b758b": true, + "5aa2ba19e5b5b00014028f4e": true, + "5aa2ba46e5b5b000137b758d": true, + "5aa2ba71e5b5b000137b758f": true, + "5aa66a9be5b5b0214e506e89": true, + "5aa66be6e5b5b0214e506e97": true, + "5aa66c72e5b5b00016327c93": true, + "5aa7cfc0e5b5b00015693143": false, + "5aa7d193e5b5b000171d063f": true, + "5aa7e276e5b5b000171d0647": true, + "5aa7e373e5b5b000137b76f0": true, + "5aa7e3abe5b5b000171d064d": true, + "5aa7e454e5b5b0214e506fa2": true, + "5aa7e4a4e5b5b000137b76f2": true, + "5aaa4194e5b5b055d06310a5": true, + "5aaa5dfee5b5b000140293d3": true, + "5aaa5e60e5b5b000140293d6": true, + "5aaf8a0be5b5b00015693243": true, + "5aaf8e43e5b5b00015693246": true, + "5aaf9d53e5b5b00015042a52": true, + "5aafa1c2e5b5b00015042a56": true, + "5aafa49ae5b5b00015042a58": true, + "5aafa857e5b5b00018480968": true, + "5aafbde786f774389d0cbc0f": true, + "5ab24ef9e5b5b00fe93c9209": true, + "5ab372a310e891001717f0d8": true, + "5ab3afb2d8ce87001660304d": true, + "5ab8dab586f77441cd04f2a2": true, + "5ab8dced86f774646209ec87": true, + "5ab8e4ed86f7742d8e50c7fa": true, + "5ab8e79e86f7742d8b372e78": true, + "5ab8e9fcd8ce870019439434": true, + "5ab8ebf186f7742d8b372e80": true, + "5ab8f04f86f774585f4237d8": true, + "5ab8f20c86f7745cdb629fb2": true, + "5ab8f39486f7745cd93a1cca": true, + "5ab8f4ff86f77431c60d91ba": true, + "5ab8f85d86f7745cd93a1cf5": true, + "5abcbb20d8ce87001773e258": true, + "5abcbc27d8ce8700182eceeb": true, + "5abcc328d8ce8700194394f3": true, + "5abccb7dd8ce87001773e277": true, + "5ac4c50d5acfc40019262e87": true, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac66c5d5acfc4001718d314": true, + "5ac66cb05acfc40198510a10": true, + "5ac66d015acfc400180ae6e4": true, + "5ac66d2e5acfc43b321d4b53": true, + "5ac66d725acfc43b321d4b60": true, + "5ac66d9b5acfc4001633997a": true, + "5ac72e475acfc400180ae6fe": true, + "5ac733a45acfc400192630e2": true, + "5ac7655e5acfc40016339a19": false, + "5ac78eaf5acfc4001926317a": true, + "5ac8d6885acfc400180ae7b0": true, + "5addba3e5acfc4001669f0ab": true, + "5addbac75acfc400194dbc56": true, + "5addbb6e5acfc408fb1393fd": true, + "5addbb825acfc408fb139400": true, + "5addbb945acfc4001a5fc44e": true, + "5addbba15acfc400185c2854": true, + "5addbbb25acfc40015621bd9": true, + "5addbf175acfc408fb13965b": true, + "5addbfbb5acfc400194dbcf7": true, + "5addbfd15acfc40015621bde": true, + "5addbfe15acfc4001a5fc58b": true, + "5addbfef5acfc400185c2857": true, + "5addbffe5acfc4001714dfac": true, + "5addc00b5acfc4001669f144": true, + "5addc7005acfc4001669f275": true, + "5addc7ac5acfc400194dbd90": true, + "5addc7db5acfc4001669f279": true, + "5addcce35acfc4001a5fc635": true, + "5addccf45acfc400185c2989": true, + "5adf23995acfc400185c2aeb": true, + "5ae096d95acfc400185c2c81": true, + "5ae30bad5acfc400185c2dc4": true, + "5ae30c9a5acfc408fb139a03": true, + "5ae30db85acfc408fb139a05": true, + "5ae30e795acfc408fb139a0b": true, + "5ae35b315acfc4001714e8b0": true, + "5af0454c86f7746bf20992e8": true, + "5af0548586f7743a532b7e99": true, + "5afd7ded5acfc40017541f5e": true, + "5afd7e095acfc40017541f61": true, + "5afd7e445acfc4001637e35a": true, + "5b04473a5acfc40018632f70": true, + "5b057b4f5acfc4771e1bd3e9": true, + "5b07db875acfc40dc528a5f6": true, + "5b07dd285acfc4001754240d": true, + "5b0800175acfc400153aebd4": true, + "5b099a765acfc47a8607efe3": true, + "5b099a9d5acfc47a8607efe7": true, + "5b099ac65acfc400186331e1": true, + "5b099b7d5acfc400186331e4": true, + "5b099b965acfc400186331e6": true, + "5b099bb25acfc400186331e8": true, + "5b099bf25acfc4001637e683": true, + "5b0bbe4e5acfc40dc528a72d": true, + "5b0bc22d5acfc47a8607f085": true, + "5b0e794b5acfc47a877359b2": true, + "5b1fa9b25acfc40018633c01": true, + "5b1fa9ea5acfc40018633c0a": true, + "5b1faa0f5acfc40dc528aeb5": true, + "5b1fb3e15acfc4001637f068": true, + "5b1fd4e35acfc40018633c39": true, + "5b222d335acfc4771e1be099": true, + "5b222d405acfc400153af4fe": true, + "5b2240bf5acfc40dc528af69": true, + "5b237e425acfc4771e1be0b6": true, + "5b2388675acfc4771e1be0be": true, + "5b2389515acfc4771e1be0c0": true, + "5b2cfa535acfc432ff4db7a0": true, + "5b30ac585acfc433000eb79c": true, + "5b30b0dc5acfc400153b7124": true, + "5b30bc165acfc40016387293": true, + "5b30bc285acfc47a8608615d": true, + "5b31163c5acfc400153b71cb": true, + "5b3116595acfc40019476364": true, + "5b363dd25acfc4001a598fd2": true, + "5b363dea5acfc4771e1c5e7e": true, + "5b363e1b5acfc4771e1c5e80": true, + "5b39f8db5acfc40016387a1b": true, + "5b39ffbd5acfc47a8773fb06": true, + "5b3a08b25acfc4001754880c": true, + "5b3a16655acfc40016387a2a": true, + "5b3a337e5acfc4704b4a19a0": true, + "5b3b6dc75acfc47a8773fb1e": true, + "5b3b6e495acfc4330140bd88": true, + "5b3b713c5acfc4330140bd8d": true, + "5b3b99265acfc4704b4a1afb": true, + "5b3b99475acfc432ff4dcbee": true, + "5b3baf8f5acfc40dc5296692": true, + "5b3cadf35acfc400194776a0": true, + "5b3cbc235acfc4001863ac44": true, + "5b3f7bf05acfc433000ecf6b": true, + "5b3f7c005acfc4704b4a1de8": true, + "5b3f7c1c5acfc40dc5296b1d": true, + "5b40e1525acfc4771e1c6611": true, + "5b40e2bc5acfc40016388216": true, + "5b40e3f35acfc40016388218": true, + "5b40e4035acfc47a87740943": true, + "5b40e5e25acfc4001a599bea": true, + "5b40e61f5acfc4001a599bec": true, + "5b4325355acfc40019478126": true, + "5b4326435acfc433000ed01d": true, + "5b43271c5acfc432ff4dce65": true, + "5b4327aa5acfc400175496e0": true, + "5b4329075acfc400153b78ff": true, + "5b4329f05acfc47a86086aa1": true, + "5b432b2f5acfc4771e1c6622": true, + "5b432b6c5acfc4001a599bf0": true, + "5b432b965acfc47a8774094e": true, + "5b432be65acfc433000ed01f": true, + "5b432c305acfc40019478128": true, + "5b432d215acfc4771e1c6624": true, + "5b432f3d5acfc4704b4a1dfb": true, + "5b44c6ae86f7742d1627baea": true, + "5b44c8ea86f7742d1627baf1": true, + "5b44cad286f77402a54ae7e5": true, + "5b44cd8b86f774503d30cba2": true, + "5b44cf1486f77431723e3d05": true, + "5b44d0de86f774503d30cba8": true, + "5b44d22286f774172b0c9de8": true, + "5b46238386f7741a693bcf9c": true, + "5b4736a986f774040571e998": true, + "5b4736b986f77405cb415c10": true, + "5b7be1125acfc4001876c0e5": true, + "5b7be1265acfc400161d0798": true, + "5b7be1ca5acfc400170e2d2f": true, + "5b7be2345acfc400196d524a": true, + "5b7be4575acfc400161d0832": true, + "5b7be4645acfc400170e2dcc": true, + "5b7be46e5acfc400170e2dcf": true, + "5b7be47f5acfc400170e2dd2": true, + "5b7be4895acfc400170e2dd5": true, + "5b7bebc85acfc43bca706666": true, + "5b7bed205acfc400161d08cc": true, + "5b7bedd75acfc43d825283f9": true, + "5b7bee755acfc400196d5383": true, + "5b7bef1e5acfc43d82528402": true, + "5b7bef5d5acfc43bca7067a3": true, + "5b7bef9c5acfc43d102852ec": true, + "5b7c2d1d5acfc43d1028532a": true, + "5b7c710788a4506dec015957": true, + "5b7d37845acfc400170e2f87": true, + "5b7d63b75acfc400170e2f8a": true, + "5b7d63cf5acfc4001876c8df": true, + "5b7d63de5acfc400170e2f8d": true, + "5b7d64555acfc4001876c8e2": true, + "5b7d645e5acfc400170e2f90": true, + "5b7d671b5acfc43d82528ddd": true, + "5b7d678a5acfc4001a5c4022": true, + "5b7d679f5acfc4001a5c4024": true, + "5b7d68af5acfc400170e30c3": true, + "5b7d693d5acfc43bca706a3d": true, + "5b7d6c105acfc40015109a5f": true, + "5b800e9286f7747a8b04f3ff": true, + "5b800ebc86f774394e230a90": true, + "5b800ed086f7747baf6e2f9e": true, + "5b80242286f77429445e0b47": true, + "5b84038986f774774913b0c1": true, + "5b8403a086f7747ff856f4e2": true, + "5b86a0e586f7745b600ccb23": true, + "5ba26383d4351e00334c93d9": true, + "5ba264f6d4351e0034777d52": true, + "5ba2657ed4351e0035628ff2": true, + "5ba26586d4351e44f824b340": true, + "5ba2678ad4351e44f824b344": true, + "5ba26812d4351e003201fef1": true, + "5ba26835d4351e0035628ff5": true, + "5ba26844d4351e00334c9475": true, + "5ba26acdd4351e003562908e": true, + "5ba26ae8d4351e00367f9bdb": true, + "5ba26b01d4351e0085325a51": true, + "5ba26b17d4351e00367f9bdd": true, + "5ba36f85d4351e0085325c81": true, + "5bae13bad4351e00320204af": true, + "5bae13ded4351e44f824bf38": true, + "5bb20d53d4351e4502010a69": true, + "5bb20d92d4351e00853263eb": true, + "5bb20d9cd4351e00334c9d8a": true, + "5bb20da5d4351e0035629dbf": true, + "5bb20dadd4351e00367faeff": true, + "5bb20dbcd4351e44f824c04e": true, + "5bb20dcad4351e3bac1212da": true, + "5bb20de5d4351e0035629e59": true, + "5bb20df1d4351e00347787d5": true, + "5bb20dfcd4351e00334c9e24": true, + "5bb20e0ed4351e3bac1212dc": true, + "5bb20e18d4351e00320205d5": true, + "5bb20e49d4351e3bac1212de": true, + "5bb20e58d4351e00320205d7": true, + "5bb20e70d4351e0035629f8f": true, + "5bb2475ed4351e00853264e3": true, + "5bbdb811d4351e45020113c7": true, + "5bbdb83fd4351e44f824c44b": true, + "5bbdb870d4351e00367fb67d": true, + "5bbdb8bdd4351e4502011460": true, + "5bbde409d4351e003562b036": true, + "5bbde41ed4351e003562b038": true, + "5bc09a18d4351e003562b68e": true, + "5bc09a30d4351e00367fb7c8": true, + "5bc5a351d4351e003477a414": true, + "5bc5a35cd4351e450201232f": true, + "5bc5a372d4351e44f824d17f": true, + "5bc9c1e2d4351e00367fbcf0": true, + "5bc9c29cd4351e003562b8a3": true, + "5bcf0213d4351e0085327c17": true, + "5bd06f5d86f77427101ad47c": true, + "5bd0716d86f774171822ef4b": true, + "5bd071d786f7747e707b93a3": true, + "5bd073a586f7747e6f135799": true, + "5bd073c986f7747f627e796c": true, + "5bd70322209c4d00d7167b8f": true, + "5bd704e7209c4d00d7167c31": true, + "5be4038986f774527d3fae60": true, + "5bead2e00db834001c062938": true, + "5bed61680db834001d2c45ab": true, + "5bed625c0db834001c062946": true, + "5beec1bd0db834001e6006f3": true, + "5beec2820db834001b095426": true, + "5beec3420db834001b095429": true, + "5beec3e30db8340019619424": true, + "5beec8b20db834001961942a": true, + "5beec8c20db834001d2c465c": true, + "5beec8ea0db834001a6f9dbf": true, + "5beec91a0db834001961942d": true, + "5beec9450db83400970084fd": true, + "5beecbb80db834001d2c465e": true, + "5beed0f50db834001c062b12": true, + "5bf3e03b0db834001d2c4a9c": true, + "5bf3e0490db83400196199af": true, + "5bf3f59f0db834001a6fa060": true, + "5bfd297f0db834001a669119": true, + "5bfd35380db83400232fe5cc": true, + "5bfd36290db834001966869a": true, + "5bfd36ad0db834001c38ef66": true, + "5bfd37c80db834001d23e842": true, + "5bfd384c0db834001a6691d3": true, + "5bfd4c980db834001b73449d": true, + "5bfd4cbe0db834001b73449f": true, + "5bfd4cc90db834001d23e846": true, + "5bfd4cd60db834001c38f095": true, + "5bfe7fb30db8340018089fed": true, + "5bfe86a20db834001d23e8f7": true, + "5bfe86bd0db83400232fe959": true, + "5bfe86df0db834001b734685": true, + "5bfe89510db834001808a127": true, + "5bfea6e90db834001b7347f3": true, + "5bfea7ad0db834001c38f1ee": true, + "5bfeaa0f0db834001b734927": true, + "5bfeb32b0db834001a6694d9": true, + "5bfebc250db834001a6694e1": true, + "5bfebc320db8340019668d79": true, + "5bfebc530db834001d23eb65": true, + "5bfebc5e0db834001a6694e5": true, + "5bffcf7a0db83400232fea79": true, + "5bffd7ed0db834001d23ebf9": true, + "5bffdc370db834001d23eca8": false, + "5bffdd7e0db834001b734a1a": true, + "5bffe7930db834001b734a39": true, + "5bffe7c50db834001d23ece1": true, + "5bffec120db834001c38f5fa": true, + "5bffef760db8340019668fe4": true, + "5c0000c00db834001a6697fc": true, + "5c0006470db834001a6697fe": true, + "5c00076d0db834001d23ee1f": true, + "5c0009510db834001966907f": true, + "5c0102aa0db834001b734ba1": true, + "5c0102b20db834001d23eebc": true, + "5c010a700db834001d23ef5d": true, + "5c010e350db83400232feec7": true, + "5c0111ab0db834001966914d": true, + "5c0125fc0db834001a669aa3": true, + "5c0126f40db834002a125382": true, + "5c012ffc0db834001d23f03f": true, + "5c0505e00db834001b735073": true, + "5c0517910db83400232ffee5": true, + "5c05293e0db83400232fff80": true, + "5c05295e0db834001a66acbb": true, + "5c052a900db834001a66acbd": true, + "5c05413a0db834001c390617": true, + "5c0548ae0db834001966a3c2": true, + "5c0558060db834001b735271": true, + "5c064c400db834001d23f468": true, + "5c06595c0db834001a66af6c": true, + "5c066e3a0db834001b7353f0": true, + "5c066ef40db834001966a595": true, + "5c0672ed0db834001b7353f3": true, + "5c0673fb0db8340023300271": true, + "5c0684e50db834002a12585a": true, + "5c0695860db834001b735461": true, + "5c0696830db834001d23f5da": true, + "5c06c6a80db834001b735491": true, + "5c079ec50db834001966a706": true, + "5c079ed60db834001a66b372": true, + "5c07a8770db8340023300450": true, + "5c07b36c0db834002a1259e9": true, + "5c07b3850db834002330045b": true, + "5c07c5ed0db834001b73571c": true, + "5c07c60e0db834002330051f": true, + "5c07c9660db834001a66b588": true, + "5c07dd120db834001c39092d": true, + "5c07df7f0db834001b73588a": true, + "5c08f87c0db8340019124324": true, + "5c0919b50db834001b7ce3b9": true, + "5c091a4e0db834001d5addc8": true, + "5c093ca986f7740a1867ab12": true, + "5c093e3486f77430cb02e593": true, + "5c0a2cec0db834001b7ce47d": true, + "5c0d2727d174af02a012cf58": true, + "5c0d32fcd174af02a1659c75": true, + "5c0d56a986f774449d5de529": true, + "5c0d591486f7744c505b416f": true, + "5c0d5ae286f7741e46554302": true, + "5c0d5e4486f77478390952fe": true, + "5c0d668f86f7747ccb7f13b2": true, + "5c0d688c86f77413ae3407b2": true, + "5c0e2f26d174af02a9625114": true, + "5c0e2f5cd174af02a012cfc9": true, + "5c0e2f94d174af029f650d56": true, + "5c0e2ff6d174af02a1659d4a": true, + "5c0e3eb886f7742015526062": true, + "5c0e446786f7742013381639": true, + "5c0e51be86f774598e797894": true, + "5c0e530286f7747fa1419862": true, + "5c0e531286f7747fa54205c2": true, + "5c0e531d86f7747fa23f4d42": true, + "5c0e533786f7747fa23f4d47": true, + "5c0e534186f7747fa1419867": true, + "5c0e53c886f7747fa54205c7": true, + "5c0e541586f7747fa54205c9": true, + "5c0e57ba86f7747fa141986d": true, + "5c0e5bab86f77461f55ed1f3": true, + "5c0e5edb86f77461f55ed1f7": true, + "5c0e625a86f7742d77340f62": true, + "5c0e655586f774045612eeb2": true, + "5c0e66e2d174af02a96252f4": true, + "5c0e6a1586f77404597b4965": true, + "5c0e722886f7740458316a57": true, + "5c0e746986f7741453628fe5": true, + "5c0e774286f77468413cc5b2": true, + "5c0e805e86f774683f3dd637": true, + "5c0e842486f77443a74d2976": true, + "5c0e874186f7745dc7616606": true, + "5c0fa877d174af02a012e1cf": true, + "5c0faeddd174af02a962601f": true, + "5c0faf68d174af02a96260b8": true, + "5c0fafb6d174af02a96260ba": true, + "5c10c8fd86f7743d7d706df3": true, + "5c11046cd174af02a012e42b": true, + "5c110624d174af029e69734c": true, + "5c11279ad174af029d64592b": true, + "5c1127bdd174af44217ab8b9": true, + "5c1127d0d174af29be75cf68": true, + "5c1260dc86f7746b106e8748": true, + "5c12619186f7743f871c8a32": true, + "5c1262a286f7743f8a69aab2": true, + "5c165d832e2216398b5a7e36": true, + "5c17664f2e2216398b5a7e3c": true, + "5c1780312e221602b66cc189": true, + "5c17804b2e2216152006c02f": true, + "5c178a942e22164bef5ceca3": true, + "5c1793902e221602b21d3de2": true, + "5c17a7ed2e2216152142459c": true, + "5c18b90d2e2216152142466b": true, + "5c18b9192e2216398b5a8104": true, + "5c1a1cc52e221602b3136e3d": true, + "5c1a1e3f2e221602b66cc4c2": true, + "5c1bc4812e22164bef5cfde7": true, + "5c1bc5612e221602b5429350": true, + "5c1bc5af2e221602b412949b": true, + "5c1bc5fb2e221602b1779b32": true, + "5c1bc7432e221602b412949d": true, + "5c1bc7752e221602b1779b34": true, + "5c1cd46f2e22164bef5cfedb": true, + "5c1cdd302e221602b3137250": true, + "5c1cdd512e22161b267d91ae": true, + "5c3df7d588a4501f290594e5": true, + "5c46fbd72e2216398b5a8c9c": true, + "5c471b5d2e221602b21d4e14": true, + "5c471b7e2e2216152006e46c": true, + "5c471ba12e221602b3137d76": true, + "5c471bd12e221602b4129c3a": true, + "5c471be12e221602b66cd9ac": true, + "5c471bfc2e221602b21d4e17": true, + "5c471c2d2e22164bef5d077f": true, + "5c471c442e221602b542a6f8": true, + "5c471c6c2e221602b66cd9ae": true, + "5c471c842e221615214259b5": true, + "5c471cb32e221602b177afaa": true, + "5c488a752e221602b412af63": true, + "5c48a14f2e2216152006edd7": true, + "5c48a2852e221602b21d5923": true, + "5c48a2a42e221602b66d1e07": true, + "5c48a2c22e221602b313fb6c": true, + "5c4ee3d62e2216152006f302": true, + "5c4eec9b2e2216398b5aaba2": true, + "5c4eecc32e221602b412b440": true, + "5c4eecde2e221602b3140418": true, + "5c501a4d2e221602b412b540": true, + "5c5039be2e221602b177c9ff": true, + "5c503ac82e221602b21d6e9a": true, + "5c503ad32e2216398b5aada2": true, + "5c503af12e221602b177ca02": true, + "5c503b1c2e221602b21d6e9d": true, + "5c503d0a2e221602b542b7ef": true, + "5c5952732e2216398b5abda2": true, + "5c59529a2e221602b177d160": true, + "5c5970672e221602b21d7855": true, + "5c5db5852e2216003a0fe71a": true, + "5c5db5962e2216000e5e46eb": true, + "5c5db5b82e2216003a0fe71d": true, + "5c5db5c62e22160012542255": true, + "5c5db5f22e2216000e5e47e8": true, + "5c5db5fc2e2216000f1b2842": true, + "5c5db6302e2216000e5e47f0": true, + "5c5db63a2e2216000f1b284a": true, + "5c5db6552e2216001026119d": true, + "5c5db6652e221600113fba51": true, + "5c5db6742e2216000f1b2852": true, + "5c5db6b32e221600102611a0": true, + "5c5db6ee2e221600113fba54": true, + "5c5db6f82e2216003a0fe914": true, + "5c6161fb2e221600113fbde5": true, + "5c6162682e22160010261a2b": true, + "5c61627a2e22160012542c55": true, + "5c6165902e22160010261b28": true, + "5c6175362e221600133e3b94": true, + "5c617a5f2e2216000f1e81b3": true, + "5c61a40d2e2216001403158d": true, + "5c6592372e221600133e47d7": true, + "5c6beec32e221601da3578f2": true, + "5c6bf4aa2e2216001219b0ae": true, + "5c6c2c9c2e2216000f2002e4": true, + "5c6d10e82e221601da357b07": true, + "5c6d10fa2e221600106f3f23": true, + "5c6d11072e2216000e69d2e4": true, + "5c6d11152e2216000f2003e7": true, + "5c6d42cb2e2216000e69d7d1": true, + "5c6d450c2e221600114c997d": true, + "5c6d46132e221601da357d56": true, + "5c6d5d8b2e221644fc630b39": true, + "5c6d710d2e22165df16b81e7": true, + "5c6d7b3d2e221600114c9b7d": true, + "5c6d85e02e22165df16b81f4": true, + "5c78f2492e221600114c9f04": true, + "5c78f2612e221600114c9f0d": true, + "5c78f26f2e221601da3581d1": true, + "5c78f2792e221600106f4683": true, + "5c78f2882e22165df16b832e": true, + "5c791e872e2216001219c40a": true, + "5c793fb92e221644f31bfb64": true, + "5c793fc42e221600114ca25d": true, + "5c793fde2e221601da358614": true, + "5c7951452e221644f31bfd5c": true, + "5c7954d52e221600106f4cc7": true, + "5c7955c22e221644f31bfd5e": true, + "5c7d55de2e221644f31bff68": true, + "5c7d55f52e221644f31bff6a": true, + "5c7d560b2e22160bc12c6139": true, + "5c7e5f112e221600106f4ede": true, + "5c7e8fab2e22165df16b889b": true, + "5c7fb51d2e2216001219ce11": true, + "5c7fc87d2e221644f31c0298": true, + "5c82342f2e221644f31c060e": true, + "5c82343a2e221644f31c0611": true, + "5c86592b2e2216000e69e77c": true, + "5c878e9d2e2216000f201903": true, + "5c878ebb2e2216001219d48a": true, + "5c87a07c2e2216001219d4a2": true, + "5c87ca002e221600114cb150": true, + "5c88f24b2e22160bc12c69a6": true, + "5c90c3622e221601da359851": true, + "5c920e902e221644f31c3c99": true, + "5c925fa22e221601da359b7b": true, + "5c99f3592e221644fc633070": true, + "5c9a07572e221644f31c4b32": true, + "5c9a1c3a2e2216000e69fb6a": true, + "5c9a1c422e221600106f69f0": true, + "5c9a25172e2216000f20314e": true, + "5c9a26332e2216001219ea70": true, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": true, + "5ca20ee186f774799474abc2": true, + "5ca2113f86f7740b2547e1d2": true, + "5ca21c6986f77479963115a7": true, + "5cadc1c6ae9215000f2775a4": true, + "5cadc2e0ae9215051e1c21e7": true, + "5cadc390ae921500126a77f1": true, + "5cadc431ae921500113bb8d5": true, + "5cadc55cae921500103bb3be": true, + "5cadd919ae921500126a77f3": true, + "5cadd940ae9215051e1c2316": true, + "5cadd954ae921500103bb3c2": true, + "5cadf6ddae9215051e1c23b2": true, + "5cadf6e5ae921500113bb973": true, + "5cadf6eeae921500134b2799": true, + "5cadfbf7ae92152ac412eeef": true, + "5caf1041ae92157c28402e3f": true, + "5caf1109ae9215753c44119f": true, + "5caf1691ae92152ac412efb9": true, + "5caf16a2ae92152ac412efbc": true, + "5caf17c9ae92150b30006be1": true, + "5caf187cae92157c28402e43": true, + "5cbda392ae92155f3c17c39f": true, + "5cbda9f4ae9215000e5b9bfc": true, + "5cbdaf89ae9215000e5b9c94": true, + "5cbdb1b0ae9215000d50e105": true, + "5cbdc23eae9215001136a407": true, + "5cc6ea78e4a949000e1ea3c1": true, + "5cc6ea85e4a949000e1ea3c3": true, + "5cc70093e4a949033c734312": true, + "5cc700b9e4a949000f0f0f25": true, + "5cc700cae4a949035e43ba72": true, + "5cc700d4e4a949000f0f0f28": true, + "5cc700ede4a949033c734315": true, + "5cc70102e4a949035e43ba74": true, + "5cc7012ae4a949001252b43e": true, + "5cc70146e4a949000d73bf6b": true, + "5cc7015ae4a949001152b4c6": true, + "5cc701aae4a949000e1ea45c": true, + "5cc701d7e4a94900100ac4e7": true, + "5cc80f38e4a949001152b560": true, + "5cc80f53e4a949000e1ea4f8": true, + "5cc80f67e4a949035e43bbba": true, + "5cc80f79e4a949033c7343b2": true, + "5cc80f8fe4a949033b0224a2": true, + "5cc82796e24e8d000f5859a8": true, + "5cc82d76e24e8d00134b4b83": true, + "5cc86832d7f00c000d3a6e6c": true, + "5cc86840d7f00c002412c56c": true, + "5cc9a96cd7f00c011c04e04a": true, + "5cc9ad73d7f00c000e2579d4": true, + "5cc9b815d7f00c000e2579d6": true, + "5cc9bcaed7f00c011c04e179": true, + "5cc9c20cd7f00c001336c65d": true, + "5cda9bcfd7f00c0c0b53e900": true, + "5cdaa99dd7f00c002412d0b2": true, + "5cdd7685d7f00c000f260ed2": true, + "5cdd7693d7f00c0010373aa5": true, + "5cde739cd7f00c0010373bd3": true, + "5cde77a9d7f00c000f261009": true, + "5cde7afdd7f00c000d36b89d": true, + "5cde7b43d7f00c000d36b93e": true, + "5cde8864d7f00c0010373be1": true, + "5cdeac22d7f00c000f26168f": true, + "5cdeac42d7f00c000d36ba73": true, + "5cdeac5cd7f00c000f261694": true, + "5cdeaca5d7f00c00b61c4b70": true, + "5ce69cbad7f00c00b61c5098": true, + "5cebec00d7f00c065c53522a": true, + "5cebec10d7f00c065703d185": true, + "5cebec38d7f00c00110a652a": true, + "5cf12a15d7f00c05464b293f": true, + "5cf13123d7f00c1085616a50": true, + "5cf4e3f3d7f00c06595bc7f0": true, + "5cf4fb76d7f00c065703d3ac": true, + "5cf50850d7f00c056e24104c": true, + "5cf508bfd7f00c056e24104e": true, + "5cf50fc5d7f00c056c53f83c": true, + "5cf518cfd7f00c065b422214": true, + "5cf54404d7f00c108840b2ef": true, + "5cf638cbd7f00c06595bc936": true, + "5cf639aad7f00c065703d455": true, + "5cf656f2d7f00c06585fb6eb": true, + "5cf67a1bd7f00c06585fb6f3": true, + "5cf67cadd7f00c065a5abab7": true, + "5cf6935bd7f00c06585fb791": true, + "5cf6937cd7f00c056c53fb39": true, + "5cf78496d7f00c065703d6ca": true, + "5cf78720d7f00c06595bc93e": true, + "5cf79389d7f00c10941a0c4d": true, + "5cf79599d7f00c10875d9212": true, + "5cf7acfcd7f00c1084477cf2": true, + "5cf8f3b0d7f00c00217872ef": true, + "5cfe8010d7ad1a59283b14c6": true, + "5cff9e5ed7ad1a09407397d4": true, + "5cff9e84d7ad1a049e54ed55": true, + "5d00e0cbd7ad1a6c6566a42d": true, + "5d00ec68d7ad1a04a067e5be": true, + "5d00ede1d7ad1a0940739a76": true, + "5d00ef6dd7ad1a0940739b16": true, + "5d00f63bd7ad1a59283b1c1e": true, + "5d010d1cd7ad1a59283b1ce7": true, + "5d0236dad7ad1a0940739d29": true, + "5d023784d7ad1a049d4aa7f2": true, + "5d024f5cd7ad1a04a067e91a": true, + "5d025cc1d7ad1a53845279ef": true, + "5d02676dd7ad1a049e54f6dc": true, + "5d02677ad7ad1a04a15c0f95": true, + "5d026791d7ad1a04a067ea63": true, + "5d02778e86f774203e7dedbe": true, + "5d02797c86f774203f38e30a": true, + "5d0a29ead7ad1a0026013f27": true, + "5d0a29fed7ad1a002769ad08": true, + "5d0a3a58d7ad1a669c15ca14": true, + "5d0a3e8cd7ad1a6f6a3d35bd": true, + "5d0b5cd3d7ad1a3fe32ad263": true, + "5d10b49bd7ad1a1a560708b0": true, + "5d120a10d7ad1a4e1026ba85": true, + "5d120a28d7ad1a1c8962e295": true, + "5d122e7bd7ad1a07102d6d7f": true, + "5d123102d7ad1a004e475fe5": true, + "5d123a3cd7ad1a004e476058": true, + "5d123b70d7ad1a0ee35e0754": true, + "5d123b7dd7ad1a004f01b262": true, + "5d124c01d7ad1a115c7d59fb": true, + "5d124c0ed7ad1a10d168dd9b": true, + "5d124c1ad7ad1a12227c53a7": true, + "5d133067d7ad1a33013f95b4": true, + "5d1340b3d7ad1a0b52682ed7": true, + "5d1340bdd7ad1a0e8d245aab": true, + "5d1340cad7ad1a0b0b249869": true, + "5d135e83d7ad1a21b83f42d8": true, + "5d135ecbd7ad1a21c176542e": true, + "5d15ce51d7ad1a1eff619092": true, + "5d15cf3bd7ad1a67e71518b2": true, + "5d19cd96d7ad1a4a992c9f52": true, + "5d1b198cd7ad1a604869ad72": true, + "5d1b33a686f7742523398398": true, + "5d1b36a186f7742523398433": true, + "5d1b371186f774253763a656": true, + "5d1b5e94d7ad1a2b865a96b0": true, + "5d1c702ad7ad1a632267f429": true, + "5d1f819086f7744b355c219b": true, + "5d2369418abbc306c62e0c80": true, + "5d25a4a98abbc30b917421a4": true, + "5d25a6538abbc306c62e630d": true, + "5d25a6a48abbc306c62e6310": true, + "5d25a7b88abbc3054f3e60bc": true, + "5d25af8f8abbc3055079fec5": true, + "5d25d0ac8abbc3054f3e61f7": true, + "5d2702e88abbc31ed91efc44": true, + "5d2703038abbc3105103d94c": true, + "5d270b3c8abbc3105335cfb8": true, + "5d270ca28abbc31ee25ee821": true, + "5d2c76ed48f03532f2136169": true, + "5d2c770c48f0354b4a07c100": true, + "5d2c772c48f0355d95672c25": true, + "5d2c829448f0353a5c7d6674": true, + "5d2da1e948f035477b1ce2ba": true, + "5d2dc3e548f035404a1a4798": true, + "5d2f0d8048f0356c925bc3b0": true, + "5d2f213448f0355009199284": true, + "5d2f259b48f0355a844acd74": true, + "5d2f25bc48f03502573e5d85": true, + "5d2f261548f03576f500e7b7": true, + "5d2f2ab648f03550091993ca": true, + "5d2f2d5748f03572ec0c0139": true, + "5d3eb3b0a4b93615055e84d2": true, + "5d3eb44aa4b93650d64e4979": true, + "5d3eb4aba4b93650d64e497d": true, + "5d3eb536a4b9363b1f22f8e2": true, + "5d3eb59ea4b9361c284bb4b2": true, + "5d3eb5b6a4b9361eab311902": true, + "5d3eb5eca4b9363b1f22f8e4": true, + "5d3ef698a4b9361182109872": true, + "5d403f9186f7743cac3f229b": true, + "5d40407c86f774318526545a": true, + "5d43021ca4b9362eab4b5e25": true, + "5d4405aaa4b9361e6a4e6bd3": true, + "5d4405f0a4b9361e6a4e6bd9": true, + "5d440625a4b9361eec4ae6c5": true, + "5d44064fa4b9361e4f6eb8b5": true, + "5d44069ca4b9361ebd26fc37": true, + "5d4406a8a4b9361e4f6eb8b7": true, + "5d440b93a4b9364276578d4b": true, + "5d440b9fa4b93601354d480c": true, + "5d44334ba4b9362b346d1948": true, + "5d443f8fa4b93678dd4a01aa": true, + "5d4aaa54a4b9365392071170": true, + "5d4aaa73a4b9365392071175": true, + "5d4aab30a4b9365435358c55": true, + "5d5d646386f7742797261fd9": true, + "5d5d85c586f774279a21cbdb": true, + "5d5d87f786f77427997cfaef": true, + "5d5d8ca986f7742798716522": true, + "5d5d940f86f7742797262046": true, + "5d5e7d28a4b936645d161203": true, + "5d5e9c74a4b9364855191c40": true, + "5d5fca1ea4b93635fd598c07": true, + "5d67abc1a4b93614ec50137f": true, + "5d6d2e22a4b9361bd5780d05": true, + "5d6d2ef3a4b93618084f58bd": true, + "5d6d3716a4b9361bc8618872": true, + "5d6d3829a4b9361bc8618943": true, + "5d6d3943a4b9360dbc46d0cc": true, + "5d6d3be5a4b9361bc73bc763": true, + "5d6e6772a4b936088465b17c": true, + "5d6e67fba4b9361bc73bc779": true, + "5d6e6806a4b936088465b17e": true, + "5d6e6869a4b9361c140bcfde": true, + "5d6e6891a4b9361bd473feea": true, + "5d6e689ca4b9361bc8618956": true, + "5d6e68a8a4b9360b6c0d54e2": true, + "5d6e68b3a4b9361bca7e50b5": true, + "5d6e68c4a4b9361b93413f79": true, + "5d6e68d1a4b93622fe60e845": true, + "5d6e68dea4b9361bcc29e659": true, + "5d6e68e6a4b9361c140bcfe0": true, + "5d6e6911a4b9361bd5780d52": true, + "5d6e695fa4b936359b35d852": true, + "5d6e69b9a4b9361bc8618958": true, + "5d6e69c7a4b9360b6c0d54e4": true, + "5d6e6a05a4b93618084f58d0": true, + "5d6e6a42a4b9364f07165f52": true, + "5d6e6a53a4b9361bd473feec": true, + "5d6e6a5fa4b93614ec501745": true, + "5d7b6bafa4b93652786f4c76": true, + "5d96141523f0ea1b7f2aacab": true, + "5dcbd56fdbd3d91b3e5468d5": true, + "5dcbd6b46ec07c0c4347a564": true, + "5dcbd6dddbd3d91b3e5468de": true, + "5dcbe9431e1f4616d354987e": true, + "5dcbe965e4ed22586443a79d": true, + "5de652c31b7e3716273428be": true, + "5de653abf76fdc1ce94a5a2a": true, + "5de65547883dde217541644b": true, + "5de6556a205ddc616a6bc4f7": true, + "5de6558e9f98ac2bc65950fc": true, + "5de655be4a9f347bc92edb88": true, + "5de7bd7bfd6b4e6e2276dc25": true, + "5de8e67c4a9f347bc92edbd7": true, + "5de8e8dafd6b4e6e2276dc32": true, + "5de8ea8ffd6b4e6e2276dc35": true, + "5de8eaadbbaf010b10528a6d": true, + "5de8eac42a78646d96665d91": true, + "5de8f237bbaf010b10528a70": true, + "5de8f2d5b74cd90030650c72": true, + "5de8fb539f98ac2bc659513a": true, + "5de8fbad2fbe23140d3ee9c4": true, + "5de8fbf2b74cd90030650c79": true, + "5de8fc0b205ddc616a6bc51b": true, + "5de910da8b6c4240ba2651b5": true, + "5de922d4b11454561e39239f": true, + "5df24cf80dee1b22f862e9bc": true, + "5df256570dee1b22f862e9c4": true, + "5df25b6c0b92095fd441e4cf": true, + "5df25d3bfd6b4e6e2276dc9a": true, + "5df35ddddfc58d14537c2036": true, + "5df35e59c41b2312ea3334d5": true, + "5df35e7f2a78646d96665dd4": true, + "5df35e970b92095fd441e4d2": true, + "5df35ea9c41b2312ea3334d8": true, + "5df35eb2b11454561e3923e2": true, + "5df36948bb49d91fb446d5ad": true, + "5df38a5fb74cd90030650cb6": true, + "5df8a2ca86f7740bfe6df777": true, + "5df8a42886f77412640e2e75": true, + "5df8a4d786f77412672a1e3b": true, + "5df8a58286f77412631087ed": true, + "5df8ce05b11454561e39243b": true, + "5df8e053bb49d91fb446d6a6": true, + "5df8e085bb49d91fb446d6a8": true, + "5df8e4080b92095fd441e594": true, + "5df8f535bb49d91fb446d6b0": true, + "5df8f541c41b2312ea3335e3": true, + "5df916dfbb49d91fb446d6b9": true, + "5df917564a9f347bc92edca3": true, + "5dfa397fb11454561e39246c": true, + "5dfa3cd1b33c0951220c079b": true, + "5dfa3d2b0dee1b22f862eade": true, + "5dfa3d45dfc58d14537c20b0": true, + "5dfa3d7ac41b2312ea33362a": true, + "5dfa3d950dee1b22f862eae0": true, + "5dfcd0e547101c39625f66f9": true, + "5dfce88fe9dc277128008b2e": true, + "5dfe14f30b92095fd441edaf": true, + "5dfe6104585a0c3e995c7b82": true, + "5dff772da3651922b360bf91": true, + "5dff77c759400025ea5150cf": true, + "5dff8db859400025ea5150d4": true, + "5e00903ae9dc277128008b87": true, + "5e0090f7e9dc277128008b93": true, + "5e00c1ad86f774747333222c": true, + "5e00cdd986f7747473332240": true, + "5e00cfa786f77469dc6e5685": true, + "5e01e9e273d8eb11426f5bc3": true, + "5e01ea19e9dc277128008c0b": true, + "5e01ef6886f77445f643baa4": true, + "5e01f31d86f77465cf261343": true, + "5e01f37686f774773c6f6c15": true, + "5e023cf8186a883be655e54f": true, + "5e023d34e8a400319a28ed44": true, + "5e023d48186a883be655e551": true, + "5e023e53d4353e3302577c4c": true, + "5e023e6e34d52a55c3304f71": true, + "5e023e88277cce2b522ff2b1": true, + "5e208b9842457a4a7a33d074": true, + "5e217ba4c1434648c13568cd": true, + "5e2192a498a36665e8337386": true, + "5e21a3c67e40bd02257a008a": true, + "5e21ca18e4d47f0da15e77dd": true, + "5e2af47786f7746d404f3aaa": true, + "5e2af4a786f7746d3f3c3400": true, + "5e2af55f86f7746d4159f07c": true, + "5e32f56fcb6d5863cc5e5ee4": true, + "5e340dcdcb6d5863cc5e5efb": true, + "5e4abb5086f77406975c9342": true, + "5e4abc1f86f774069619fbaa": true, + "5e4abc6786f77406812bd572": true, + "5e4abfed86f77406a2713cf7": true, + "5e4ac41886f77406a511c9a8": true, + "5e4bfc1586f774264f7582d3": true, + "5e4d34ca86f774264f758330": true, + "5e54f76986f7740366043752": true, + "5e54f79686f7744022011103": true, + "5e56991336989c75ab4f03f6": true, + "5e5699df2161e06ac158df6f": true, + "5e569a0156edd02abe09f27d": true, + "5e569a132642e66b0b68015c": true, + "5e569a2e56edd02abe09f280": true, + "5e71f6be86f77429f2683c44": true, + "5e71f70186f77429ee09f183": true, + "5e71fad086f77422443d4604": true, + "5e81c3cbac2bb513793cdc75": true, + "5e81c4ca763d9f754677befa": true, + "5e81c519cb2b95385c177551": true, + "5e81c539cb2b95385c177553": true, + "5e81c550763d9f754677befd": true, + "5e81c6a2ac2bb513793cdc7f": true, + "5e81c6bf763d9f754677beff": true, + "5e81ebcd8e146c7080625e15": true, + "5e81edc13397a21db957f6a1": true, + "5e81ee213397a21db957f6a6": true, + "5e81ee4dcb2b95385c177582": true, + "5e81f423763d9f754677bf2e": true, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": true, + "5e848cc2988a8701445df1e8": true, + "5e848d1c264f7c180b5e35a9": true, + "5e848d2eea0a7c419c2f9bfd": true, + "5e848d51e4dbc5266a4ec63b": true, + "5e848d99865c0f329958c83b": true, + "5e848db4681bea2ada00daa9": true, + "5e848dc4e4dbc5266a4ec63d": true, + "5e85a9f4add9fe03027d9bf1": true, + "5e85aa1a988a8701445df1f5": true, + "5e870397991fd70db46995c8": true, + "5e87071478f43e51ca2de5e1": true, + "5e87076ce2db31558c75a11d": true, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": true, + "5e87114fe2db31558c75a120": true, + "5e87116b81c4ed43e83cefdd": true, + "5e8f3423fd7471236e6e3b64": true, + "5e997f0b86f7741ac73993e2": true, + "5e9dacf986f774054d6b89f4": true, + "5e9db13186f7742f845ee9d3": true, + "5e9dcf5986f7746c417435b3": true, + "5ea02bb600685063ec28bfa1": true, + "5ea034eb5aad6446a939737b": true, + "5ea034f65aad6446a939737e": true, + "5ea03e5009aa976f2e7a514b": true, + "5ea03e9400685063ec28bfa4": true, + "5ea03f7400685063ec28bfa8": true, + "5ea058e01dbce517f324b3e2": true, + "5ea05cf85ad9772e6624305d": true, + "5ea16acdfadf1d18c87b0784": true, + "5ea16ada09aa976f2e7a51be": true, + "5ea16d4d5aad6446a939753d": true, + "5ea172e498dacb342978818e": true, + "5ea17bbc09aa976f2e7a51cd": true, + "5ea17ca01412a1425304d1c0": true, + "5ea18c84ecf1982c7712d9a2": true, + "5ea2a8e200685063ec28c05a": true, + "5ed515c8d380ab312177c0fa": true, + "5ed515e03a40a50460332579": true, + "5ed515ece452db0eb56fc028": true, + "5ed515f6915ec335206e4152": true, + "5ed5160a87bb8443d10680b5": true, + "5ed51652f6c34d2cc26336a1": true, + "5ed5166ad380ab312177c100": true, + "5ede4739e0350d05467f73e8": true, + "5ede47405b097655935d7d16": true, + "5ede474b0c226a66f5402622": true, + "5ede475339ee016e8c534742": true, + "5ede475b549eed7c6d5c18fb": true, + "5eea21647547d6330471b3c9": true, + "5eea217fc64c5d0dfc05712a": true, + "5eeb2ff5ea4f8b73c827350b": true, + "5ef1b9f0c64c5d0dfc0571a1": true, + "5ef1ba28c64c5d0dfc0571a5": true, + "5ef32e4d1c1fd62aea6a150d": true, + "5ef3448ab37dfd6af863525c": true, + "5ef3553c43cb350a955a7ccb": true, + "5ef35bc243cb350a955a7ccd": true, + "5ef35d2ac64c5d0dfc0571b0": true, + "5ef35f46382a846010715a96": true, + "5ef366938cef260c0642acad": true, + "5ef369b08cef260c0642acaf": true, + "5ef5d994dfbc9f3c660ded95": true, + "5ef61964ec7f42238c31e0c1": true, + "5efaf417aeb21837e749c7f2": true, + "5efb0c1bd79ff02a1f5e68d9": true, + "5efb0cabfb3e451d70735af5": true, + "5efb0d4f4bc50b58e81710f3": true, + "5efb0da7a29a85116f6ea05f": true, + "5efb0e16aeb21837e749c7ff": true, + "5efb0fc6aeb21837e749c801": true, + "5f0596629e22f464da6bbdd9": true, + "5f0c892565703e5c461894e9": true, + "5f2a9575926fd9352339381f": true, + "5f2aa43ba9b91d26f20ae6d2": true, + "5f2aa4464b50c14bcf07acdb": true, + "5f2aa4559b44de6b1b4e68d1": true, + "5f2aa46b878ef416f538b567": true, + "5f2aa47a200e2c0ee46efa71": true, + "5f2aa493cd375f14e15eea72": true, + "5f2aa49f9b44de6b1b4e68d4": true, + "5f36a0e5fbf956000b716b65": true, + "5f3e76d86cda304dcc634054": true, + "5f3e772a670e2a7b01739a52": true, + "5f3e777688ca2d00ad199d25": true, + "5f3e778efcd9b651187d7201": true, + "5f3e77b26cda304dcc634057": true, + "5f3e77f59103d430b93f94c1": true, + "5f3e7801153b8571434a924c": true, + "5f3e7823ddc4f03b010e2045": true, + "5f3e7897ddc4f03b010e204a": true, + "5f3e78a7fbf956000b716b8e": true, + "5f4f9eb969cdc30ff33f09db": false, + "5f5e45cc5021ce62144be7aa": true, + "5f5e467b0bc58666c37e7821": true, + "5f5e46b96bdad616ad46d613": true, + "5f5f41476bdad616ad46d631": true, + "5f5f41f56760b4138443b352": true, + "5f60b34a41e30a4ab12a6947": true, + "5f60b85bbdb8e27dee3dc985": true, + "5f60bf4558eff926626a60f2": true, + "5f60c076f2bcbb675b00dac2": true, + "5f60c74e3b85f6263c145586": true, + "5f60c85b58eff926626a60f7": true, + "5f60cd6cf2bcbb675b00dac6": true, + "5f60e6403b85f6263c14558c": true, + "5f60e7788adaa7100c3adb49": true, + "5f60e784f2bcbb675b00dac7": true, + "5f6331e097199b7db2128dc2": true, + "5f6336bbda967c74a42e9932": true, + "5f6339d53ada5942720e2dc3": true, + "5f633f68f5750b524b45f112": true, + "5f633f791b231926f2329f13": true, + "5f633ff5c444ce7e3c30a006": true, + "5f63405df5750b524b45f114": true, + "5f63407e1b231926f2329f15": true, + "5f6340d3ca442212f4047eb2": true, + "5f6341043ada5942720e2dc5": true, + "5f63418ef5750b524b45f116": true, + "5f6372e2865db925d54f3869": true, + "5f647f31b6238e5dd066e196": true, + "5f99418230835532b445e954": true, + "5f994730c91ed922dd355de3": true, + "5f9949d869e2777a0e779ba5": true, + "5fb64bc92b1b027b1f50bcf2": true, + "5fb651b52b1b027b1f50bcff": true, + "5fb651dc85f90547f674b6f4": true, + "5fb65363d1409e5ca04b54f5": true, + "5fb653962b1b027b1f50bd03": true, + "5fb65424956329274326f316": true, + "5fb6548dd1409e5ca04b54f9": true, + "5fb6558ad6f0b2136f2d7eb7": true, + "5fb655a72b1b027b1f50bd06": true, + "5fb655b748c711690e3a8d5a": true, + "5fb6564947ce63734e3fa1da": true, + "5fb6567747ce63734e3fa1dc": true, + "5fbb976df9986c4cff3fe5f2": true, + "5fbb978207e8a97d1f0902d3": true, + "5fbbaa86f9986c4cff3fe5f6": true, + "5fbbc3324e8a554c40648348": true, + "5fbbc34106bde7524f03cbe9": true, + "5fbbc366ca32ed67276c1557": true, + "5fbbc383d5cb881a7363194a": true, + "5fbbfabed5cb881a7363194e": true, + "5fbbfacda56d053a3543f799": true, + "5fbc210bf24b94483f726481": true, + "5fbc226eca32ed67276c155d": true, + "5fbc227aa56d053a3543f79e": true, + "5fbc22ccf24b94483f726483": true, + "5fbcbcf593164a5b6278efb2": true, + "5fbcbd02900b1d5091531dd3": true, + "5fbcbd10ab884124df0cd563": true, + "5fbcbd6c187fea44d52eda14": true, + "5fbcc1d9016cce60e8341ab3": true, + "5fbcc3e4d6fa9c00c571bb58": true, + "5fbcc429900b1d5091531dd7": true, + "5fbcc437d724d907e2077d5c": true, + "5fbcc640016cce60e8341acc": true, + "5fbe3ffdf8b6a877a729ea82": true, + "5fbe760793164a5b6278efc8": true, + "5fbe7618d6fa9c00c571bb6c": true, + "5fc0f9b5d724d907e2077d82": true, + "5fc0f9cbd6fa9c00c571bb90": true, + "5fc0fa362770a0045c59c677": true, + "5fc0fa957283c4046c58147e": true, + "5fc22d7c187fea44d52eda44": true, + "5fc23426900b1d5091531e15": true, + "5fc235db2770a0045c59c683": true, + "5fc2360f900b1d5091531e19": true, + "5fc23636016cce60e8341b05": true, + "5fc23678ab884124df0cd590": true, + "5fc2369685fd526b824a5713": true, + "5fc275cf85fd526b824a571a": true, + "5fc278107283c4046c581489": true, + "5fc382a9d724d907e2077dab": true, + "5fc382b6d6fa9c00c571bbc3": true, + "5fc382c1016cce60e8341b20": true, + "5fc3e272f8b6a877a729eac5": true, + "5fc3e466187fea44d52eda90": true, + "5fc3e4a27283c4046c5814ab": true, + "5fc3e4ee7283c4046c5814af": true, + "5fc3f2d5900b1d5091531e57": true, + "5fc4b97bab884124df0cd5e3": true, + "5fc4b992187fea44d52edaa9": true, + "5fc4b9b17283c4046c5814d7": true, + "5fc53954f8b6a877a729eaeb": true, + "5fc5396e900b1d5091531e72": true, + "5fc64ea372b0dd78d51159dc": true, + "5fca138c2a7b221b2852a5c6": true, + "5fca13ca637ee0341a484f46": true, + "5fce0cf655375d18a253eff0": true, + "5fce0f9b55375d18a253eff2": true, + "5fce16961f152d4312622bc9": true, + "5fd20ff893a8961fc660a954": true, + "5fd4c474dd870108a754b241": true, + "5fd4c4fa16cac650092f6771": true, + "5fd4c5477a8d854fa0105061": true, + "5fd4c60f875c30179f5d04c2": true, + "5fd8d28367cb5e077335170f": true, + "60098ad7c2240c0fe85c570a": true, + "60098af40accd37ef2175f27": true, + "60098b1705871270cd5352a1": true, + "601948682627df266209af05": true, + "60194943740c5d77f6705eea": true, + "601949593ae8f707c4608daa": true, + "601aa3d2b2bcb34913271e6d": true, + "602286df23506e50807090c6": true, + "60228924961b8d75ee233c32": true, + "60228a76d62c9b14ed777a66": true, + "60228a850ddce744014caf69": true, + "602293f023506e50807090cb": true, + "60229948cacb6b0506369e27": true, + "602a95edda11d6478d5a06da": true, + "602a95fe4e02ce1eaa358729": true, + "602a97060ddce744014caf6f": true, + "602a9740da11d6478d5a06dc": true, + "602e3f1254072b51b239f713": true, + "602e620f9b513876d4338d9a": true, + "602e63fb6335467b0c5ac94d": true, + "602e71bd53a60014f9705bfa": true, + "602f85fd9b513876d4338d9c": true, + "603372b4da11d6478d5a07ff": true, + "603372d154072b51b239f9e1": true, + "603372f153a60014f970616d": true, + "603373004e02ce1eaa358814": true, + "6033749e88382f4fab3fd2c5": true, + "60337f5dce399e10262255d1": true, + "60338ff388382f4fab3fd2c8": true, + "60339954d62c9b14ed777c06": true, + "6033fa48ffd42c541047f728": true, + "603409c80ca681766b6a0fb2": true, + "6034cf5fffd42c541047f72e": true, + "6034d0230ca681766b6a0fb5": true, + "6034d103ca006d2dca39b3f0": true, + "6034d2d697633951dc245ea6": true, + "6034e3cb0ddce744014cb870": true, + "6034e3d953a60014f970617b": true, + "6034e3e20ddce744014cb878": true, + "603618feffd42c541047f771": true, + "603619720ca681766b6a0fc4": true, + "60361a7497633951dc245eb4": true, + "60361b0b5a45383c122086a1": true, + "60361b5a9a15b10d96792291": true, + "60363c0c92ec1c31037959f5": true, + "603648ff5a45383c122086ac": true, + "6038b4b292ec1c3103795a0b": true, + "6038b4ca92ec1c3103795a0d": true, + "6038d614d10cbf667352dd44": true, + "6040dd4ddcf9592f401632d2": true, + "6040de02647ad86262233012": true, + "606587252535c57a13424cfd": true, + "60658776f2cb2e02a42ace2b": true, + "6065878ac9cf8012264142fd": true, + "606587a88900dc2d9a55b659": true, + "606587bd6d0bd7580617bacc": true, + "606587d11246154cad35d635": true, + "606587e18900dc2d9a55b65f": true, + "6065880c132d4d12c81fd8da": true, + "6065881d1246154cad35d637": true, + "6065c6e7132d4d12c81fd8e1": true, + "6065dc8a132d4d12c81fd8e3": true, + "606dae0ab0e443224b421bb7": true, + "606ee5c81246154cad35d65e": true, + "606eef46232e5a31c233d500": true, + "606eef756d0bd7580617baf8": true, + "606ef0812535c57a13424d20": true, + "606f262c6d0bd7580617bafa": true, + "606f263a8900dc2d9a55b68d": true, + "606f26752535c57a13424d22": true, + "606f2696f2cb2e02a42aceb1": true, + "6076c1b9f2cb2e02a42acedc": true, + "60785c0d232e5a31c233d51c": true, + "60785ce5132d4d12c81fd918": true, + "607d5aa50494a626335e12ed": true, + "607ea812232e5a31c233d53c": true, + "607f201b3c672b3b3a24a800": true, + "607f20859ee58b18e41ecd90": true, + "607ffb988900dc2d9a55b6e4": true, + "6086b5392535c57a13424d70": true, + "6086b5731246154cad35d6c7": true, + "6087e0336d0bd7580617bb7a": true, + "6087e2a5232e5a31c233d552": true, + "6087e663132d4d12c81fd96b": true, + "609269c3b0e443224b421cc1": true, + "60926df0132d4d12c81fd9df": true, + "609a4b4fe2ff132951242d04": true, + "609a63b6e2ff132951242d09": true, + "609b9e31506cf869cf3eaf41": true, + "609bab8b455afd752b2e6138": true, + "609e8540d5c319764c2bc2e9": true, + "609e860ebd219504d8507525": true, + "60a23797a37c940de7062d02": true, + "60a272cc93ef783291411d8e": true, + "60a2828e8689911a226117f9": true, + "60a283193cb70855c43a381d": true, + "60a3c68c37ea821725773ef5": true, + "60a3c70cde5f453f634816a3": true, + "60a621c49c197e4e8c4455e6": true, + "60a6220e953894617404b00a": true, + "60a7acf20c5cb24b01346648": true, + "60a7ad2a2198820d95707a2e": true, + "60a7ad3a0c5cb24b0134664a": true, + "60b0f988c4449e4cb624c1da": true, + "60b52e5bc7d8103275739d67": true, + "60bf74184a63fc79b60c57f6": true, + "60db29ce99594040e04c4a27": true, + "6113c3586c780c1e710c90bc": true, + "6113cc78d3a39d50044c065a": true, + "6113cce3d92c473c770200c7": true, + "6113d6c3290d254f5e6b27db": true, + "611a30addbdd8440277441dc": true, + "611a31ce5b7ffe001b4649d1": true, + "6123649463849f3d843da7c4": true, + "612368f58b401f4f51239b33": true, + "612781056f3d944a17348d60": true, + "612e0cfc8004cc50514c2d9e": true, + "612e0d3767085e45ef14057f": true, + "612e0d81290d254f5e6b291a": true, + "612e0e04568c120fdd294258": true, + "612e0e3c290d254f5e6b291d": true, + "612e0e55a112697a4b3a66e7": true, + "6130c3dffaa1272e43151c7d": true, + "6130c43c67085e45ef1405a1": true, + "6130c4d51cb55961fa0fd49f": true, + "6130ca3fd92c473c77020dbd": true, + "614451b71e5874611e2c7ae5": true, + "615d8d878004cc50514c3233": true, + "615d8da4d3a39d50044c10e8": true, + "615d8dbd290d254f5e6b2ed6": true, + "615d8df08004cc50514c3236": true, + "615d8e2f1cb55961fa0fd9a4": true, + "615d8e9867085e45ef1409c6": true, + "615d8eb350224f204c1da1cf": true, + "615d8f5dd92c473c770212ef": true, + "615d8f8567085e45ef1409ca": true, + "615d8faecabb9b7ad90f4d5d": true, + "615d8fd3290d254f5e6b2edc": true, + "61605d88ffa6e502ac5e7eeb": true, + "616442e4faa1272e43152193": true, + "616554fe50224f204c1da2aa": true, + "61657230d92c473c770213d7": true, + "616584766ef05c2ce828ef57": true, + "61659f79d92c473c770213ee": true, + "6165ac306ef05c2ce828ef74": true, + "6165ac8c290d254f5e6b2f6c": true, + "6165adcdd3a39d50044c120f": true, + "6165aeedfaa1272e431521e3": true, + "61695095d92c473c7702147a": true, + "61702be9faa1272e431522c3": true, + "61702d8a67085e45ef140b24": true, + "61702f1b67085e45ef140b26": true, + "61703001d92c473c77021497": true, + "61712eae6c780c1e710c9a1d": true, + "617130016c780c1e710c9a24": true, + "617131a4568c120fdd29482d": true, + "61713308d92c473c770214a0": true, + "6171367e1cb55961fa0fdb36": true, + "61713a8fd92c473c770214a4": true, + "61713cc4d8e3106d9806c109": true, + "6171407e50224f204c1da3c5": true, + "61714b2467085e45ef140b2c": true, + "61714eec290d254f5e6b2ffc": true, + "617151c1d92c473c770214ab": true, + "617153016c780c1e710c9a2f": true, + "617154aa1cb55961fa0fdb3b": true, + "617155ee50224f204c1da3cd": true, + "61715e7e67085e45ef140b33": true, + "6176a40f0b8c0312ac75a3d3": true, + "6176a48d732a664031271438": true, + "6176aca650224f204c1da3fb": true, + "617aa4dd8166f034d57de9c5": true, + "617fd91e5539a84ec44ce155": true, + "61816734d8e3106d9806c1f3": true, + "618167441cb55961fa0fdc71": true, + "618167528004cc50514c34f9": true, + "618167616ef05c2ce828f1a8": true, + "6181688c6c780c1e710c9b04": true, + "618168b350224f204c1da4d8": true, + "618168dc8004cc50514c34fc": true, + "61816df1d3a39d50044c139e": true, + "61816dfa6ef05c2ce828f1ad": true, + "61816fcad92c473c770215cc": true, + "61817865d3a39d50044c13a4": true, + "618178aa1cb55961fa0fdc80": true, + "61825d06d92c473c770215de": true, + "61825d136ef05c2ce828f1cc": true, + "61825d24d3a39d50044c13af": true, + "6183afd850224f204c1da514": true, + "6183b0711cb55961fa0fdcad": true, + "6183b084a112697a4b3a6e6c": true, + "6183d53f1cb55961fa0fdcda": true, + "6183fc15d3a39d50044c13e9": true, + "6183fd911cb55961fa0fdce9": true, + "6183fd9e8004cc50514c358f": true, + "618405198004cc50514c3594": true, + "6184055050224f204c1da540": true, + "618407a850224f204c1da549": true, + "61840bedd92c473c77021635": true, + "61840d85568c120fdd2962a5": true, + "618426d96c780c1e710c9b9f": true, + "618428466ef05c2ce828f218": true, + "618a431df1eb8e24b8741deb": true, + "618a5d5852ecee1505530b2a": true, + "618a75c9a3884f56c957ca1b": true, + "618a75f0bd321d49084cd399": true, + "618a760e526131765025aae3": true, + "618aef6d0a5a59657e5f55ee": true, + "618b9643526131765025ab35": true, + "618b9671d14d6d5ab879c5ea": true, + "618b9682a3884f56c957ca78": true, + "618ba27d9008e4636a67f61d": true, + "618ba91477b82356f91ae0e8": true, + "618ba92152ecee1505530bd3": true, + "618bab21526131765025ab3f": true, + "618bb76513f5097c8d5aa2d5": true, + "618cfae774bb2d036a049e7c": true, + "619256e5f8af2c1a4e1f5d92": true, + "619386379fb0c665d5490dbe": true, + "6193a720f8ee7e52e42109ed": true, + "6193d3149fb0c665d5490e32": true, + "6193d338de3cdf1d2614a6fc": true, + "6193d382ed0429009f543e65": true, + "6193d3be7c6c7b169525f0da": true, + "6193d3cded0429009f543e6a": true, + "6193d5d4f8ee7e52e4210a1b": true, + "6193dcd0f8ee7e52e4210a28": true, + "6194ef39de3cdf1d2614a768": true, + "6194efe07c6c7b169525f11b": true, + "6194eff92d2c397d6600348b": true, + "6194f017ed0429009f543eaa": true, + "6194f02d9bb3d20b0946d2f0": true, + "6194f1f918a3974e5e7421e4": true, + "6194f2912d2c397d6600348d": true, + "6194f2df645b5d229654ad77": true, + "6194f3286db0f2477964e67d": true, + "6194f35c18a3974e5e7421e6": true, + "6194f41f9fb0c665d5490e75": true, + "6194f5722d2c397d6600348f": true, + "6194f5a318a3974e5e7421eb": true, + "6194f5d418a3974e5e7421ef": true, + "619621a4de3cdf1d2614a7a7": true, + "619624b26db0f2477964e6b0": true, + "6196255558ef8c428c287d1c": true, + "61962b617c6c7b169525f168": true, + "61962d879bb3d20b0946d385": true, + "6196364158ef8c428c287d9f": true, + "6196365d58ef8c428c287da1": true, + "619636be6db0f2477964e710": true, + "61963a852d2c397d660036ad": true, + "61965d9058ef8c428c287e0d": true, + "619666f4af1f5202c57a952d": true, + "6197b229af1f5202c57a9bea": true, + "619b5db699fb192e7430664f": true, + "619b69037b9de8162902673e": true, + "619bc61e86e01e16f839a999": true, + "619bdd8886e01e16f839a99c": true, + "619bddc6c9546643a67df6ee": true, + "619bddffc9546643a67df6f0": true, + "619bde3dc9546643a67df6f2": true, + "619bde7fc9546643a67df6f4": true, + "619bdeb986e01e16f839a99e": true, + "619bdef8c9546643a67df6f6": true, + "619bdf9cc9546643a67df6f8": true, + "619bdfd4c9546643a67df6fa": true, + "619cbf7d23893217ec30b689": true, + "619cbf9e0a7c3a1a2731940a": true, + "619cf0335771dd3c390269ae": true, + "619d36da53b4d42ee724fae4": true, + "619f4ab2d25cbd424731fb95": true, + "619f4bffd25cbd424731fb97": true, + "619f4cee4c58466fe1228435": true, + "619f4d304c58466fe1228437": true, + "619f4f8c4c58466fe1228439": true, + "619f52454c58466fe122843b": true, + "61a4c8884f95bc3b2c5dc96f": true, + "61b9e1aaef9a1b5d6a79899a": true, + "61bc85697113f767765c7fe7": true, + "61bca7cda0eae612383adf57": true, + "61bcc89aef0f505f0c6cd0fc": true, + "61c18d83b00456371a66814b": true, + "61c18db6dfd64163ea78fbb4": true, + "61f4012adfc9f01a816adda1": true, + "61f7b234ea4ab34f2f59c3ec": true, + "61f7b85367ddd414173fdb36": true, + "61f7c9e189e6fb1a5e3ea78d": true, + "61f8024263dc1250e26eb029": true, + "61f803b8ced75b2e852e35f8": true, + "61faa91878830f069b6b7967": true, + "620109578d82e67e7911abf2": true, + "6217726288ed9f0845317459": true, + "62178be9d0050232da3485d9": true, + "62178c4d4ecf221597654e3d": true, + "622b327b267a1b13a44abea3": true, + "622b379bf9cfc87d675d2de5": true, + "622b3858034a3e17ad0b81f5": true, + "622b38c56762c718e457e246": true, + "622b397c9a3d4327e41843b6": true, + "622b3c081b89c677a33bcda6": true, + "622b3d5cf9cfc87d675d2de9": true, + "622b4d7df9cfc87d675d2ded": true, + "622b4f54dc8dcc0ba8742f85": true, + "622efbcb99f4ea1a4d6c9a15": true, + "622efdf8ec80d870d349b4e5": true, + "622f02437762f55aaa68ac85": true, + "622f039199f4ea1a4d6c9a17": true, + "622f07cfae33bc505b2c4dd5": true, + "622f0ee47762f55aaa68ac87": true, + "622f128cec80d870d349b4e8": true, + "622f140da5958f63c67f1735": true, + "622f14e899892a7f9e08f6c5": true, + "622f16a1a5958f63c67f1737": true, + "623063e994fc3f7b302a9696": true, + "62307b7b10d2321fa8741921": true, + "6231654c71b5bc3baa1078e5": true, + "623166e08c43374ca1567195": true, + "6231670f0b8aa5472d060095": true, + "62330b3ed4dc74626d570b95": true, + "62330bfadc5883093563729b": true, + "62330c18744e5e31df12f516": true, + "62330c40bdd19b369e1e53d1": true, + "62386b2adf47d66e835094b2": true, + "62386b7153757417e93a4e9f": true, + "62389aaba63f32501b1b444f": true, + "62389ba9a63f32501b1b4451": true, + "62389bc9423ed1685422dc57": true, + "62389be94d5d474bf712e709": true, + "623b2e9d11c3296b440d1638": true, + "623c2f4242aee3103f1c44b7": true, + "623c2f652febb22c2777d8d7": true, + "623c3be0484b5003161840dc": true, + "623c3c1f37b4b31470357737": true, + "6241c2c2117ad530666a5108": true, + "6241c316234b593b5676b637": true, + "62444cb99f47004c781903eb": true, + "62444cd3674028188b052799": true, + "624c0570c9b794431568f5d5": true, + "624c09cfbc2e27219346d955": true, + "624c09da2cec124eb67c1046": true, + "624c09e49b98e019a3315b66": true, + "624c0b3340357b5f566e8766": true, + "624c29ce09cd027dff2f8cd7": true, + "624c2e8614da335f1e034d8c": true, + "6259b864ebedf17603599e88": true, + "6259c2c1d714855d182bad85": true, + "6259c3387d6aab70bc23a18d": true, + "6259c3d8012d6678ec38eeb8": true, + "6259c4347d6aab70bc23a190": true, + "625eb0faa6e3a82193267ad9": true, + "625ebcef6f53af4aa66b44dc": true, + "625ec45bb14d7326ac20f572": true, + "625ed7c64d9b6612df732146": true, + "626667e87379c44d557b7550": true, + "626673016f1edc06f30cf6d5": true, + "62669bccdb9ebb4daa44cd14": true, + "6267c6396b642f77f56f5c1c": true, + "6269220d70b6c02e665f2635": true, + "6269545d0e57f218e4548ca2": true, + "626a74340be03179a165e30c": true, + "626a8ae89e664a2e2a75f409": true, + "626a9cb151cb5849f6002890": true, + "626bb8532c923541184624b4": true, + "626becf9582c3e319310b837": true, + "6272370ee4013c5d7e31f418": true, + "6272379924e29f06af4d5ecb": true, + "627254cc9c563e6e442c398f": true, + "6272874a6c47bd74f92e2087": true, + "6275303a9f372d6ea97f9ec7": true, + "627e14b21713922ded6f2c15": true, + "62811cd7308cb521f87a8f99": true, + "62811e2510e26c1f344e6554": true, + "62811e335631d45211793c95": true, + "62811f461d5df4475f46a332": true, + "62811f828193841aca4a45c3": true, + "62811fa609427b40ab14e765": true, + "62811fbf09427b40ab14e767": true, + "6281204f308cb521f87a8f9b": true, + "628120621d5df4475f46a335": true, + "62812081d23f207deb0ab216": true, + "6281209662cba23f6c4d7a19": true, + "628120c21d5df4475f46a337": true, + "628120d309427b40ab14e76d": true, + "628120dd308cb521f87a8fa1": true, + "628120fd5631d45211793c9f": true, + "6281212a09427b40ab14e770": true, + "628121434fa03b6b6c35dc6a": true, + "6284bd5f95250a29bc628a30": true, + "62850c28da09541f43158cca": true, + "628a60ae6b1d481ff772e9c8": true, + "628a664bccaab13006640e47": true, + "628a665a86cbd9750d2ff5e5": true, + "628a6678ccaab13006640e49": true, + "628a66b41d5e41750e314f34": true, + "628a7b23b0f75035732dd565": true, + "628a83c29179c324ed269508": true, + "628a85ee6b1d481ff772e9d5": true, + "628b5638ad252a16da6dd245": true, + "628b8d83717774443b15e248": true, + "628b916469015a4e1711ed8d": true, + "628b9471078f94059a4b9bfb": true, + "628b9784bcf6e2659e09b8a2": true, + "628b9a40717774443b15e9f2": true, + "628b9be6cff66b70c002b14c": true, + "628b9c37a733087d0d7fe84b": true, + "628b9c7d45122232a872358f": true, + "628baf0b967de16aab5a4f36": true, + "628bc7fb408e2b2e9c0801b1": true, + "628c9ab845c59e5b80768a81": true, + "628cd624459354321c4b7fa2": true, + "628d0618d1ba6e4fa07ce5a4": true, + "628dc750b910320f4c27a732": true, + "628e1ffc83ec92260c0f437f": true, + "628e4dd1f477aa12234918aa": true, + "628e4e576d783146b124c64d": true, + "62963c18dbc8ab5f0d382d0b": true, + "62a09d3bcf4a99369e262447": true, + "62a09d79de7ac81993580530": true, + "62a09dd4621468534a797ac7": true, + "62a09e08de7ac81993580532": true, + "62a09e410b9d3c46de5b6e78": true, + "62a09f32621468534a797acb": true, + "62a1b7fbc30cfa1d366af586": true, + "62a5c2c98ec41a51b34739c0": true, + "62a5c333ec21e50cad3b5dc6": true, + "62a5c41e8ec41a51b34739c3": true, + "62a61bbf8ec41a51b34758d2": true, + "62a61c988ec41a51b34758d5": true + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608815684 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 4, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 3, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 6, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 17206066, + "GameVersion": "edge_of_darkness", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 69, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 2, + "NeedWipeOptions": [], + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Usec", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49444ae6628187a2e77b8", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49444ae6628187a2e77b8", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "f5e6bdac05e699d687993249", + "_tpl": "5857a8bc2459772bad15db29", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "SecuredContainer" + }, { + "_id": "01e9d751f10e4e9aebdd94d5", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Pockets" + }, { + "_id": "5fe49444ae6628187a2e78b8", + "_tpl": "5811ce772459770e9e5f9532" + }, { + "_id": "5fe49444ae6628187a2e78ba", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49444ae6628187a2e78b9", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + }, { + "_id": "f55404fc9c2a0063bc1b9293", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "c1408429a85d87168d75e04c", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "6275a53292b3e1de7c0f94fc", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "72ec3ef07bf2ddf6c0dab838", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "SpawnedInSession": true, + "StackObjectsCount": 500000 + } + }, { + "_id": "14bdc77de1a13722eb416218", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "cadad72d72caf8c9784524d4", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 0, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "987b8edc24c5e2a9ccb9ee1d", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "e7d08b2dd0f631136f424917", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "a913602b85dcd145970c2688", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 5, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "68bdc987f801ecd7efbaaabe", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 6, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "68ffe73296918e3a751ff27d", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 7, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "7ae138bc2cbc56640fdf2506", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 8, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "57a6c6de5aa471e473c7f5c5", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "7ef87fb9eaa6c25950c09a7d", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "76f687b8388d97cd13aa18a5", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 1, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "249a3bbee6e1ba29712e6065", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 0 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 500000 + } + }, { + "_id": "5516338b341dad987bcfb18a", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "f5028bfe9f5550d5c547c9b2", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 5, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "efa4b58a3741068b3957dc25", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 7, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "08624351a590bbe7269ec79e", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "de4be08a2ffd9e880455777a", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 6, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "a47caded1ede79b972fe7ad5", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 2, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "07292f5d4592fb72775941e6", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 8, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "748e89ddd9102eab4bcf47c8", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 5, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "d88551febbfbe3757852a8d8", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 4, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "a7a5854fe4649f57bb9b2bee", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 6, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "cc8ff42be98f9f513fea9b5b", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 8, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "33a09dbb0fc6f1f1da32856b", + "_tpl": "5696686a4bdc2da3298b456a", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 1 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "fbe3dabfda80655871d2ff35", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 3, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "3cc9938ad572a73e1f26877f", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 9, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + }, { + "_id": "969b3e5c1134f1538183add6", + "_tpl": "569668774bdc2da2298b4568", + "location": { + "isSearched": true, + "r": "Horizontal", + "x": 7, + "y": 2 + }, + "parentId": "5fe49444ae6628187a2e78b8", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50000 + } + } + ], + "questRaidItems": "5fe49444ae6628187a2e78b9", + "questStashItems": "5fe49444ae6628187a2e78ba", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49444ae6628187a2e78b8" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 2000 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 2000 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cde9ec17d6c8b04723cf479", + "5cde9e957d6c8b0474535da7" + ], + "trader": { + "initialLoyaltyLevel": 4, + "initialSalesSum": 2600000, + "initialStanding": 1, + "jaegerUnlocked": true, + "setQuestsAvailableForStart": false + }, + "weaponbuilds": {} + } }, - "usec": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c2", - "templateId": "5811ce572459770cba1a34ea", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c4", - "templateId": "5811ce662459770f6f490f32", - "type": "StashSize" - }, - { - "id": "64f5b9e5fa34f11b380756c6", - "templateId": "5811ce772459770e9e5f9532", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] + "SPT Zero to hero": { + "descriptionLocaleKey": "launcher-profile_sptzerotohero", + "bear": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cc0858d14c02e000c6bea66", + "Feet": "5cc085bb14c02e000e67a5c5", + "Hands": "5cc0876314c02e000c6bea6b", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "544a11ac4bdc2d470e8b456a": false, + "544a5caa4bdc2d1a388b4568": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "54527a984bdc2d4e668b4567": false, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "55801eed4bdc2d89578b4588": true, + "55802d5f4bdc2dac148b458e": false, + "559ba5b34bdc2d1f1a8b4582": true, + "55d480c04bdc2d1d4e8b456a": false, + "55d4887d4bdc2d962f8b4570": false, + "55d7217a4bdc2d86028b456d": false, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5648b1504bdc2d9d488b4584": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "564ca99c4bdc2d16268b4589": false, + "567143bf4bdc2d1a0f8b4567": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59d3ad2720bdb418b4577": false, + "56dfef82d2720bbd668b4567": true, + "56dff3afd2720bba668b4567": false, + "56e294cdd2720b603a8b4575": false, + "56ea8222d2720b69698b4567": true, + "570fd6c2d2720bc6458b457f": false, + "5710c24ad2720bc3458b45a3": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "57cd379a24597778e7682ecf": false, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce772459770e9e5f9532": false, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "5894a05586f774094708ef75": false, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "590c5d4b86f774784e1b9c45": false, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": false, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": false, + "592c2d1a86f7746dbe2af32a": true, + "595cf16b86f77427440c32e2": true, + "59984ab886f7743e98271174": true, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a8086f77414ec448d1a": true, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c6633186f7740cf0493bb9": true, + "59ccd11386f77428f24a488f": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "59e770b986f7742cbd762754": false, + "5a0c27731526d80618476ac4": false, + "5aa2b87de5b5b00016327c25": false, + "5aa7cfc0e5b5b00015693143": false, + "5aafbde786f774389d0cbc0f": false, + "5ab8f39486f7745cd93a1cca": false, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac72e475acfc400180ae6fe": false, + "5ac7655e5acfc40016339a19": false, + "5af0454c86f7746bf20992e8": false, + "5b40e5e25acfc4001a599bea": false, + "5b432b965acfc47a8774094e": false, + "5b432d215acfc4771e1c6624": false, + "5bed625c0db834001c062946": false, + "5beec1bd0db834001e6006f3": false, + "5beec3420db834001b095429": false, + "5beec3e30db8340019619424": false, + "5beec8b20db834001961942a": false, + "5beec8c20db834001d2c465c": false, + "5beec8ea0db834001a6f9dbf": false, + "5beec91a0db834001961942d": false, + "5beec9450db83400970084fd": false, + "5beecbb80db834001d2c465e": false, + "5beed0f50db834001c062b12": false, + "5bf3f59f0db834001a6fa060": false, + "5bffdc370db834001d23eca8": false, + "5c0505e00db834001b735073": false, + "5c0e530286f7747fa1419862": false, + "5c0e53c886f7747fa54205c7": false, + "5c0e722886f7740458316a57": false, + "5c488a752e221602b412af63": false, + "5c48a14f2e2216152006edd7": false, + "5c48a2852e221602b21d5923": false, + "5c48a2a42e221602b66d1e07": false, + "5c48a2c22e221602b313fb6c": false, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": false, + "5d02778e86f774203e7dedbe": false, + "5d02797c86f774203f38e30a": false, + "5d0a29fed7ad1a002769ad08": false, + "5d0a3e8cd7ad1a6f6a3d35bd": false, + "5d1b36a186f7742523398433": false, + "5d1b371186f774253763a656": false, + "5d40407c86f774318526545a": false, + "5d5d85c586f774279a21cbdb": false, + "5d5d940f86f7742797262046": false, + "5d5e9c74a4b9364855191c40": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": false, + "5e870397991fd70db46995c8": false, + "5e87071478f43e51ca2de5e1": false, + "5e87076ce2db31558c75a11d": false, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": false, + "5e87114fe2db31558c75a120": false, + "5e87116b81c4ed43e83cefdd": false, + "5f4f9eb969cdc30ff33f09db": false + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608815684 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "standard", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Bear", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49444ae6628187a2e77b8", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49444ae6628187a2e77b8", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "f5e6bdac05e699d687993249", + "_tpl": "544a11ac4bdc2d470e8b456a", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "SecuredContainer" + }, { + "_id": "01e9d751f10e4e9aebdd94d5", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Pockets" + }, { + "_id": "5fe49444ae6628187a2e78b8", + "_tpl": "566abbc34bdc2d92178b4576" + }, { + "_id": "5fe49444ae6628187a2e78ba", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49444ae6628187a2e78b9", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + }, { + "_id": "5fe4977574f15b4ad31b661b", + "_tpl": "5bffdc370db834001d23eca8", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 80, + "MaxDurability": 80 + } + } + } + ], + "questRaidItems": "5fe49444ae6628187a2e78b9", + "questStashItems": "5fe49444ae6628187a2e78ba", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49444ae6628187a2e78b8" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cd946231388ce000d572fe3", + "5cd945d71388ce000a659dfb" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0, + "jaegerUnlocked": false + }, + "weaponbuilds": {} }, - "Customization": { - "Body": "5cde95d97d6c8b647a3769b0", - "Feet": "5cde95ef7d6c8b04713c4f2d", - "Hands": "5cde95fa7d6c8b04737c2d13", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447ac644bdc2d6c208b4567": true, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448c1d04bdc2dff2f8b4569": true, - "5448fee04bdc2dbc018b4567": false, - "5448ff904bdc2d6f028b456e": true, - "5449016a4bdc2d6f028b456f": false, - "544909bb4bdc2d6f028b4577": true, - "544a11ac4bdc2d470e8b456a": false, - "544a378f4bdc2d30388b4567": true, - "544a37c44bdc2d25388b4567": true, - "544a38634bdc2d58388b4568": true, - "544a3a774bdc2d3a388b4567": true, - "544a5caa4bdc2d1a388b4568": true, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": true, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "544fb62a4bdc2dfb738b4568": true, - "544fb6cc4bdc2d34748b456e": true, - "54527a984bdc2d4e668b4567": true, - "54527ac44bdc2d36668b4567": true, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "5580169d4bdc2d9d138b4585": true, - "55801eed4bdc2d89578b4588": true, - "5580223e4bdc2d1c128b457f": true, - "558022b54bdc2dac148b458d": true, - "55802d5f4bdc2dac148b458e": true, - "55802f5d4bdc2dac148b458f": true, - "558032614bdc2de7118b4585": true, - "559ba5b34bdc2d1f1a8b4582": true, - "55d355e64bdc2d962f8b4569": true, - "55d35ee94bdc2d61338b4568": true, - "55d3632e4bdc2d972f8b4569": true, - "55d447bb4bdc2d892f8b456f": true, - "55d448594bdc2d8c2f8b4569": true, - "55d449444bdc2d962f8b456d": true, - "55d44fd14bdc2d962f8b456e": true, - "55d459824bdc2d892f8b4573": true, - "55d45d3f4bdc2d972f8b456c": true, - "55d45f484bdc2d972f8b456d": true, - "55d480c04bdc2d1d4e8b456a": false, - "55d481904bdc2d8c2f8b456a": true, - "55d482194bdc2d1d4e8b456b": true, - "55d4837c4bdc2d1d4e8b456c": true, - "55d485be4bdc2d962f8b456f": true, - "55d4887d4bdc2d962f8b4570": true, - "55d48a634bdc2d8b2f8b456a": true, - "55d48ebc4bdc2d8c2f8b456c": true, - "55d4ae6c4bdc2d8b2f8b456e": true, - "55d4af3a4bdc2d972f8b456f": true, - "55d4b9964bdc2d1d4e8b456e": true, - "55d5f46a4bdc2d1b198b4567": true, - "55d614004bdc2d86028b4568": true, - "55d6190f4bdc2d87028b4567": true, - "55d7217a4bdc2d86028b456d": false, - "55f84c3c4bdc2d5f408b4576": true, - "560835c74bdc2dc8488b456f": true, - "560836484bdc2d20478b456e": true, - "560836b64bdc2d57468b4567": true, - "560836fb4bdc2d773f8b4569": true, - "560837154bdc2da74d8b4568": true, - "5608373c4bdc2dc8488b4570": true, - "560837544bdc2de22e8b456e": true, - "560837824bdc2d57468b4568": true, - "5608379a4bdc2d26448b4569": true, - "560838c94bdc2d77798b4569": true, - "56083a334bdc2dc8488b4571": true, - "56083be64bdc2d20478b456f": true, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560d61e84bdc2da74d8b4571": true, - "560d657b4bdc2da74d8b4572": true, - "560d75f54bdc2da74d8b4573": true, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a69d4bdc2ded0b8b457b": true, - "5648a7494bdc2d9d488b4583": false, - "5648ac824bdc2ded0b8b457d": true, - "5648ae314bdc2d3d1c8b457f": true, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": true, - "5648b4534bdc2d3d1c8b4580": true, - "5649a2464bdc2d91118b45a8": true, - "5649aa744bdc2ded0b8b457e": false, - "5649ab884bdc2ded0b8b457f": true, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649ae4a4bdc2d1b2b8b4588": true, - "5649af094bdc2df8348b4586": false, - "5649af884bdc2d1b2b8b4589": true, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "5649b2314bdc2d79388b4576": true, - "5649be884bdc2d79388b4577": true, - "5649d9a14bdc2d79388b4580": true, - "5649ed104bdc2d3d1c8b458b": true, - "564ca99c4bdc2d16268b4589": false, - "564ca9df4bdc2d35148b4569": true, - "564caa3d4bdc2d17108b458e": true, - "5656d7c34bdc2d9d198b4587": true, - "5656eb674bdc2d35148b457c": true, - "567143bf4bdc2d1a0f8b4567": true, - "5673de654bdc2d180f8b456d": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59856d2720bd8418b456a": true, - "56d59d3ad2720bdb418b4577": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56dee2bdd2720bc8328b4567": true, - "56deec93d2720bec348b4568": true, - "56deed6ed2720b4c698b4583": true, - "56def37dd2720bec348b456a": true, - "56dfef82d2720bbd668b4567": true, - "56dff026d2720bb8668b4567": true, - "56dff061d2720bb5668b4567": true, - "56dff0bed2720bb0668b4567": true, - "56dff216d2720bbd668b4568": true, - "56dff2ced2720bb4668b4567": true, - "56dff3afd2720bba668b4567": true, - "56dff421d2720b5f5a8b4567": true, - "56dff4a2d2720bbd668b456a": true, - "56dff4ecd2720b5f5a8b4568": true, - "56e0598dd2720bb5668b45a6": true, - "56e05a6ed2720bd0748b4567": true, - "56e05b06d2720bb2668b4586": true, - "56e294cdd2720b603a8b4575": false, - "56e335e4d2720b6c058b456d": true, - "56e33634d2720bd8058b456b": true, - "56e33680d2720be2748b4576": true, - "56ea6fafd2720b844b8b4593": true, - "56ea70acd2720b844b8b4594": true, - "56ea7165d2720b6e518b4583": true, - "56ea7293d2720b8d4b8b45ba": true, - "56ea8180d2720bf2698b456a": true, - "56ea8222d2720b69698b4567": true, - "56ea8d2fd2720b7c698b4570": true, - "56eabcd4d2720b66698b4574": true, - "56eabf3bd2720b75698b4569": true, - "570fd6c2d2720bc6458b457f": true, - "570fd721d2720bc5458b4596": true, - "570fd79bd2720bc7458b4583": true, - "5710c24ad2720bc3458b45a3": false, - "571659bb2459771fb2755a12": true, - "571a26d524597720680fbe8a": true, - "571a279b24597720b4066566": true, - "571a282c2459771fb2755a69": true, - "571a28e524597720b4066567": true, - "571a29dc2459771fb2755a6a": true, - "57235b6f24597759bf5a30f1": true, - "572b7adb24597762ae139821": true, - "572b7fa524597762b747ce82": true, - "5732ee6a24597719ae0c0281": true, - "5734773724597737fd047c14": true, - "57347d3d245977448f7b7f61": true, - "57347d5f245977448b40fa81": true, - "57347d692459774491567cf1": true, - "57347d7224597744596b4e72": false, - "57347d8724597744596b4e76": true, - "57347d90245977448f7b7f65": true, - "57347d9c245977448b40fa85": true, - "57347da92459774491567cf5": true, - "5735fdcd2459776445391d61": true, - "5735ff5c245977640e39ba7e": true, - "573601b42459776410737435": true, - "573602322459776445391df1": true, - "5736026a245977644601dc61": true, - "573603562459776430731618": true, - "573603c924597764442bd9cb": true, - "573718ba2459775a75491131": false, - "573719762459775a626ccbc1": true, - "573719df2459775a626ccbc2": true, - "57371aab2459775a77142f22": true, - "57371b192459775a9f58a5e0": true, - "57371e4124597760ff7b25f1": true, - "57371eb62459776125652ac1": true, - "57371f2b24597761224311f1": true, - "57371f8d24597761006c6a81": true, - "5737201124597760fc4431f1": true, - "5737207f24597760ff7b25f2": true, - "573720e02459776143012541": true, - "57372140245977611f70ee91": true, - "5737218f245977612125ba51": true, - "573722e82459776104581c21": true, - "573724b42459776125652ac2": true, - "5737250c2459776125652acc": true, - "5737256c2459776125652acd": true, - "573725b0245977612125bae2": true, - "5737260b24597761224311f2": true, - "5737266524597761006c6a8c": true, - "573726d824597765d96be361": true, - "5737273924597765dd374461": true, - "573727c624597765cc785b5b": true, - "5737280e24597765cc785b5c": true, - "5737287724597765e1625ae2": true, - "573728cc24597765cc785b5d": true, - "573728f324597765e5728561": true, - "5737292724597765e5728562": true, - "57372a7f24597766fe0de0c1": true, - "57372ac324597767001bc261": true, - "57372b832459776701014e41": true, - "57372bad245977670b7cd242": true, - "57372bd3245977670b7cd243": true, - "57372c21245977670937c6c2": true, - "57372c56245977685e584582": true, - "57372c89245977685d4159b1": true, - "57372d1b2459776862260581": true, - "57372d4c245977685a3da2a1": true, - "57372db0245977685d4159b2": true, - "57372deb245977685d4159b3": true, - "57372e1924597768553071c1": true, - "57372e4a24597768553071c2": true, - "57372e73245977685d4159b4": true, - "57372e94245977685648d3e1": true, - "57372ebf2459776862260582": true, - "57372ee1245977685d4159b5": true, - "57372f2824597769a270a191": true, - "57372f5c24597769917c0131": true, - "57372f7d245977699b53e301": true, - "57372fc52459776998772ca1": true, - "5737300424597769942d5a01": true, - "5737330a2459776af32363a1": true, - "5737339e2459776af261abeb": true, - "573733c72459776b0b7b51b0": true, - "5739d41224597779c3645501": true, - "57486e672459770abd687134": true, - "574d967124597745970e7c94": true, - "574dad8024597745964bf05c": true, - "574db213245977459a2f3f5d": true, - "574eb85c245977648157eec3": true, - "575062b524597720a31c09a1": true, - "57513f07245977207e26a311": true, - "57513f9324597720a7128161": true, - "57513fcc24597720a31c09a6": true, - "5751435d24597720a27126d1": true, - "57514643245977207f2c2d09": true, - "575146b724597720a27126d5": true, - "5751487e245977207e26a315": true, - "5751496424597720a27126da": true, - "5751a25924597722c463c472": true, - "5751a89d24597722aa0e8db0": true, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": true, - "576165642459773c7a400233": true, - "576167ab2459773cad038c43": true, - "57616a9e2459773c7a400234": true, - "57616ca52459773c69055192": true, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "576fd4ec2459777f0b518431": true, - "577d128124597739d65d0e56": true, - "577d141e24597739c5255e01": true, - "57838ad32459774a17445cd2": true, - "57838c962459774a1651ec63": true, - "57838e1b2459774a256959b1": true, - "57838f0b2459774a256959b2": true, - "57838f9f2459774a150289a0": true, - "578395402459774a256959b5": true, - "578395e82459774a0e553c7b": true, - "579204f224597773d619e051": true, - "5798a2832459774b53341029": true, - "57a0dfb82459774d3078b56c": true, - "57a0e5022459774d1673f889": true, - "57a3459f245977764a01f703": true, - "57a9b9ce2459770ee926038d": true, - "57ac965c24597706be5f975c": true, - "57aca93d2459771f2c7e26db": true, - "57acb6222459771ec34b5cb0": true, - "57ade1442459771557167e15": true, - "57adff4f24597737f373b6e6": true, - "57ae0171245977343c27bfcf": true, - "57af48872459771f0b2ebf11": true, - "57c44b372459772d2b39b8ce": true, - "57c44dd02459772d2e0ae249": true, - "57c44e7b2459772d28133248": true, - "57c44f4f2459772d2c627113": true, - "57c44fa82459772d2d75e415": true, - "57c450252459772d28133253": true, - "57c55efc2459772d2c6271e7": true, - "57c55f092459772d291a8463": true, - "57c55f112459772d28133310": true, - "57c55f172459772d27602381": true, - "57c5ac0824597754771e88a9": true, - "57c69dd424597774c03b7bbc": true, - "57c9a89124597704ee6faec1": true, - "57cd379a24597778e7682ecf": false, - "57cff947245977638e6f2a19": true, - "57cffb66245977632f391a99": true, - "57cffcd624597763133760c5": true, - "57cffcdd24597763f5110006": true, - "57cffce524597763b31685d8": true, - "57cffd8224597763b03fc609": true, - "57cffddc24597763133760c6": true, - "57cffe0024597763b03fc60b": true, - "57cffe20245977632f391a9d": true, - "57d14d2524597714373db789": true, - "57d14e1724597714010c3f4b": true, - "57d1519e24597714373db79d": true, - "57d152ec245977144076ccdf": true, - "57d17c5e2459775a5c57d17d": true, - "57d17e212459775a1179a0f5": true, - "57da93632459771cb65bf83f": true, - "57dbb57e2459774673234890": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "57e26ea924597715ca604a09": true, - "57e26fc7245977162a14b800": true, - "57ee59b42459771c7b045da5": true, - "57f3a5ae2459772b0e0bf19e": true, - "57f3c6bd24597738e730fa2f": true, - "57f3c7e024597738ea4ba286": true, - "57f3c8cc2459773ec4480328": true, - "57f4c844245977379d5c14d1": true, - "57fd23e32459772d0805bcf1": true, - "57ffa9f4245977728561e844": true, - "57ffaea724597779f52b3a4d": true, - "57ffb0062459777a045af529": true, - "57ffb0e42459777d047111c5": true, - "5811ce772459770e9e5f9532": false, - "5827272a24597748c74bdeea": true, - "58272b392459774b4c7b3ccd": true, - "58272b842459774abc128d50": true, - "58272d7f2459774f6311ddfd": true, - "583990e32459771419544dd2": true, - "5839a40f24597726f856b511": true, - "5839a7742459773cf9693481": true, - "58491f3324597764bc48fa02": true, - "584924ec24597768f12ae244": true, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "587de4282459771bca0ec90b": true, - "587de5ba2459771c0f1e8a58": true, - "587df583245977373c4f1129": true, - "587e02ff24597743df3deaeb": true, - "587e0531245977466077a0f7": true, - "587e08ee245977446b4410cf": true, - "588200af24597742fa221dfb": true, - "588200c224597743990da9ed": true, - "588200cf2459774414733d55": true, - "588226d124597767ad33f787": true, - "588226dd24597767ad33f789": true, - "588226e62459776e3e094af7": true, - "588226ef24597767af46e39c": true, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "588892092459774ac91d4b11": true, - "5888945a2459774bf43ba385": true, - "5888956924597752983e182d": true, - "5888961624597754281f93f3": true, - "5888976c24597754281f93f5": true, - "5888988e24597752fe43a6fa": true, - "5888996c24597754281f9419": true, - "58889c7324597754281f9439": true, - "58889d0c2459775bc215d981": true, - "588b56d02459771481110ae2": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "58949fac86f77409483e16aa": true, - "5894a05586f774094708ef75": true, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "58a56f8d86f774651579314c": true, - "58a5c12e86f7745d585a2b9e": true, - "58ac1bf086f77420ed183f9f": true, - "58ac60eb86f77401897560ff": true, - "58aeaaa886f7744fc1560f81": true, - "58aeac1b86f77457c419f475": true, - "58c157be86f77403c74b2bb6": true, - "58c157c886f774032749fb06": true, - "58d2664f86f7747fec5834f6": true, - "58d268fc86f774111273f8c2": true, - "58d2912286f7744e27117493": true, - "58d2946386f774496974c37e": true, - "58d2946c86f7744e271174b5": true, - "58d2947686f774485c6a1ee5": true, - "58d2947e86f77447aa070d53": true, - "58d399e486f77442e0016fe7": true, - "58d39b0386f77443380bf13c": true, - "58d39d3d86f77445bb794ae7": true, - "58dd3ad986f77403051cba8f": true, - "5900b89686f7744e704a8747": true, - "590c5d4b86f774784e1b9c45": false, - "590c60fc86f77412b13fddcf": true, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": true, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": true, - "591aef7986f774139d495f03": true, - "591af10186f774139d495f0e": true, - "591af28e86f77414a27a9e1d": true, - "591c4e1186f77410354b316e": true, - "591c4efa86f7741030027726": true, - "591ee00d86f774592f7b841e": true, - "5926bb2186f7744b1c6c6e60": true, - "5926c0df86f77462f647f764": true, - "5926c32286f774616e42de99": true, - "5926c36d86f77467a92a8629": true, - "5926c3b286f774640d189b6b": true, - "5926d2be86f774134d668e4e": true, - "5926d33d86f77410de68ebc0": true, - "5926d3c686f77410de68ebc8": true, - "5926d40686f7740f152b6b7e": true, - "5926dad986f7741f82604363": true, - "5926e16e86f7742f5a0f7ecb": true, - "5926f2e086f7745aae644231": true, - "5926f34786f77469195bfe92": true, - "5929a2a086f7744f4b234d43": true, - "592c2d1a86f7746dbe2af32a": true, - "593d1fa786f7746da62d61ac": true, - "593d489686f7745c6255d58a": true, - "593d490386f7745ee97a1555": true, - "593d493f86f7745e6b2ceb22": true, - "5943d9c186f7745a13413ac9": true, - "5943ee5a86f77413872d25ec": true, - "5943eeeb86f77412d6384f6b": true, - "5947c73886f7747701588af5": true, - "5947db3f86f77447880cf76f": true, - "5947e98b86f774778f1448bc": true, - "5947eab886f77475961d96c5": true, - "5947f92f86f77427344a76b1": true, - "5947fa2486f77425b47c1a9b": true, - "595cf16b86f77427440c32e2": true, - "595cfa8b86f77427437e845b": true, - "5996f6cb86f774678763a6ca": true, - "5996f6d686f77467977ba6cc": true, - "5996f6fc86f7745e585b4de3": true, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a6c86f77414ec448d17": true, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59bfc5c886f7743bf6794e62": true, - "59bfe68886f7746004266202": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c0ec5b86f77435b128bfca": true, - "59c1383d86f774290a37e0ca": true, - "59c63b4486f7747afb151c1c": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "59d6272486f77466146386ff": true, - "59d64ec286f774171d1e0a42": true, - "59d650cf86f7741b846413a4": true, - "59d790f486f77403cb06aec6": true, - "59db3a1d86f77429e05b4e92": true, - "59db3acc86f7742a2c4ab912": true, - "59db3b0886f77429d72fb895": true, - "59db7e1086f77448be30ddf3": true, - "59db7eed86f77461f8380365": true, - "59e0bdb186f774156f04ce82": true, - "59e0be5d86f7742d48765bd2": true, - "59e0bed186f774156f04ce84": true, - "59e0d99486f7744a32234762": true, - "59e3577886f774176a362503": true, - "59e4cf5286f7741778269d8a": true, - "59e4d24686f7741776641ac7": true, - "59e4d3d286f774176a36250a": true, - "59e5f5a486f7746c530b3ce2": true, - "59e6152586f77473dc057aa1": true, - "59e649f986f77411d949b246": true, - "59e6542b86f77411dc52a77a": true, - "59e655cb86f77411dc52a77b": true, - "59e6658b86f77411d949b250": true, - "59e6687d86f77411d949b251": true, - "59e68f6f86f7746c9f75e846": true, - "59e6906286f7746c9f75e847": true, - "59e690b686f7746c9f75e848": true, - "59e6918f86f7746c9f75e849": true, - "59e6920f86f77411d82aa167": true, - "59e6927d86f77411da468256": true, - "59e7635f86f7742cbf2c1095": true, - "59e763f286f7742ee57895da": true, - "59e7643b86f7742cbf2c109a": true, - "59e7708286f7742cbd762753": true, - "59e770b986f7742cbd762754": true, - "59e770f986f7742cbe3164ef": true, - "59e7711e86f7746cae05fbe1": true, - "59e7715586f7742ee5789605": true, - "59e77a2386f7742ee578960a": true, - "59e8977386f77415a553c453": true, - "59eb7ebe86f7740b373438ce": true, - "59ecc28286f7746d7a68aa8c": true, - "59ecc3dd86f7746dc827481c": true, - "59ef13ca86f77445fd0e2483": true, - "59f8a37386f7747af3328f06": true, - "59f98b4986f7746f546d2cef": true, - "59f99a7d86f7745b134aa97b": true, - "59f9cabd86f7743a10721f46": true, - "59f9d81586f7744c7506ee62": true, - "59fafc5086f7740dbe19f6c3": true, - "59fafc9386f774067d462453": true, - "59fafd4b86f7745ca07e1232": true, - "59fb042886f7746c5005a7b2": true, - "59fb137a86f7740adb646af1": true, - "59fb257e86f7742981561852": true, - "59fb375986f7741b681b81a6": true, - "59fc48e086f77463b1118392": true, - "59ff346386f77477562ff5e2": true, - "5a0060fc86f7745793204432": true, - "5a01ad4786f77450561fda02": true, - "5a0abb6e1526d8000a025282": true, - "5a0c27731526d80618476ac4": true, - "5a0c59791526d8dba737bba7": true, - "5a0d63621526d8dba31fe3bf": true, - "5a0d716f1526d8000d26b1e2": true, - "5a0eb980fcdbcb001a3b00a6": true, - "5a0ec13bfcdbcb00165aa685": true, - "5a0ed824fcdbcb0176308b0d": true, - "5a0f096dfcdbcb0176308b15": true, - "5a154d5cfcdbcb001a3b00da": true, - "5a16b672fcdbcb001912fa83": true, - "5a16b7e1fcdbcb00165aa6c9": true, - "5a16b8a9fcdbcb00165aa6ca": true, - "5a16b93dfcdbcbcae6687261": true, - "5a16b9fffcdbcb0176308b34": true, - "5a16ba61fcdbcb098008728a": true, - "5a16badafcdbcb001865f72d": true, - "5a16bb52fcdbcb001a3b00dc": true, - "5a17f98cfcdbcb0980087290": true, - "5a17fb9dfcdbcbcae6687291": true, - "5a17fc70fcdbcb0176308b3d": true, - "5a1eaa87fcdbcb001865f75e": true, - "5a1eacb3fcdbcb09800872be": true, - "5a1ead28fcdbcb001912fa9f": true, - "5a269f97c4a282000b151807": true, - "5a26abfac4a28232980eabff": true, - "5a26ac06c4a282000c5a90a8": true, - "5a26ac0ec4a28200741e1e18": true, - "5a27b281c4a28200741e1e52": true, - "5a27b3d0c4a282000d721ec1": true, - "5a27b6bec4a282000e496f78": true, - "5a27bad7c4a282000b15184b": true, - "5a2a57cfc4a2826c6e06d44a": true, - "5a329052c4a28200741e22d3": true, - "5a32a064c4a28200741e22de": true, - "5a32aa0cc4a28232996e405f": true, - "5a32aa8bc4a2826c6e06d737": true, - "5a339805c4a2826c6e06d73d": true, - "5a33a8ebc4a282000c5a950d": true, - "5a33b2c9c4a282000c5a9511": true, - "5a33b652c4a28232996e407c": true, - "5a33bab6c4a28200741e22f8": true, - "5a33ca0fc4a282000d72292f": true, - "5a33cae9c4a28232980eb086": true, - "5a33e75ac4a2826c6e06d759": true, - "5a34f7f1c4a2826c6e06d75d": true, - "5a34fae7c4a2826c6e06d760": true, - "5a34fbadc4a28200741e230a": true, - "5a34fd2bc4a282329a73b4c5": true, - "5a34fe59c4a282000b1521a2": true, - "5a3501acc4a282000d72293a": true, - "5a351711c4a282000b1521a4": true, - "5a367e5dc4a282000e49738f": true, - "5a37ca54c4a282000d72296a": true, - "5a37cb10c4a282329a73b4e7": true, - "5a38e6bac4a2826c6e06d79b": true, - "5a38ed75c4a28232996e40c6": true, - "5a38ee51c4a282000c5a955c": true, - "5a398ab9c4a282000c5a9842": true, - "5a398b75c4a282000a51a266": true, - "5a3c16fe86f77452b62de32a": true, - "5a43943586f77416ad2f06e2": true, - "5a43957686f7742a2c2f11b0": true, - "5a5f1ce64f39f90b401987bc": true, - "5a6086ea4f39f99cd479502f": true, - "5a608bf24f39f98ffc77720e": true, - "5a69a2ed8dc32e000d46d1f1": true, - "5a6b585a8dc32e5a9c28b4f1": true, - "5a6b592c8dc32e00094b97bf": true, - "5a6b59a08dc32e000b452fb7": true, - "5a6b5b8a8dc32e001207faf3": true, - "5a6b5e468dc32e001207faf5": true, - "5a6b5ed88dc32e000c52ec86": true, - "5a6b5f868dc32e000a311389": true, - "5a6b60158dc32e000a31138b": true, - "5a6f58f68dc32e000a311390": true, - "5a6f5d528dc32e00094b97d9": true, - "5a6f5e048dc32e00094b97da": true, - "5a6f5f078dc32e00094b97dd": true, - "5a702d198dc32e000b452fc3": true, - "5a7033908dc32e000a311392": true, - "5a70366c8dc32e001207fb06": true, - "5a7037338dc32e000d46d257": true, - "5a705e128dc32e000d46d258": true, - "5a718b548dc32e000d46d262": true, - "5a718da68dc32e000d46d264": true, - "5a718f958dc32e00094b97e7": true, - "5a71e0048dc32e000c52ecc8": true, - "5a71e0fb8dc32e00094b97f2": true, - "5a71e1868dc32e00094b97f3": true, - "5a71e22f8dc32e00094b97f4": true, - "5a71e4f48dc32e001207fb26": true, - "5a787ebcc5856700142fdd98": true, - "5a787f25c5856700186c4ab9": true, - "5a787f7ac5856700177af660": true, - "5a787fadc5856700155a6ca1": true, - "5a787fdfc5856700142fdd9a": true, - "5a788031c585673f2b5c1c79": true, - "5a788068c5856700137e4c8f": true, - "5a788089c5856700142fdd9c": true, - "5a7880d0c5856700142fdd9d": true, - "5a78813bc5856700186c4abe": true, - "5a788169c5856700142fdd9e": true, - "5a789261c5856700186c65d3": true, - "5a7893c1c585673f2b5c374d": true, - "5a78948ec5856700177b1124": true, - "5a7ad0c451dfba0013379712": true, - "5a7ad1fb51dfba0013379715": true, - "5a7ad2e851dfba0016153692": true, - "5a7ad4af51dfba0013379717": true, - "5a7ad55551dfba0015068f42": true, - "5a7ad74e51dfba0015068f45": true, - "5a7ae0c351dfba0017554310": true, - "5a7afa25e899ef00135e31b0": true, - "5a7b32a2e899ef00135e345a": true, - "5a7b483fe899ef0016170d15": true, - "5a7b4900e899ef197b331a2a": true, - "5a7b4960e899ef197b331a2d": true, - "5a7c147ce899ef00150bd8b8": true, - "5a7c4850e899ef00150be885": true, - "5a7c74b3e899ef0014332c29": true, - "5a7d90eb159bd400165484f1": true, - "5a7d9104159bd400134c8c21": true, - "5a7d9122159bd4001438dbf4": true, - "5a7d912f159bd400165484f3": true, - "5a7dbfc1159bd40016548fde": true, - "5a800961159bd4315e3a1657": true, - "5a8036fb86f77407252ddc02": true, - "5a80a29286f7742b25692012": true, - "5a9548c9159bd400133e97b3": true, - "5a957c3fa2750c00137fa5f7": true, - "5a966ec8a2750c00171b3f36": true, - "5a966f51a2750c00156aacf6": true, - "5a9685b1a2750c0032157104": true, - "5a9d56c8a2750c0032157146": true, - "5a9d6d00a2750c5c985b5305": true, - "5a9d6d13a2750c00164f6b03": true, - "5a9d6d21a2750c00137fa649": true, - "5a9d6d34a2750c00141e07da": true, - "5a9e81fba2750c00164f6b11": true, - "5a9ea27ca2750c00137fa672": true, - "5a9eb32da2750c00171b3f9c": true, - "5a9fb739a2750c003215717f": true, - "5a9fbacda2750c00141e080f": true, - "5a9fbb74a2750c0032157181": true, - "5a9fbb84a2750c00137fa685": true, - "5a9fc7e6a2750c0032157184": true, - "5aa2b87de5b5b00016327c25": false, - "5aa2b89be5b5b0001569311f": true, - "5aa2b8d7e5b5b00014028f4a": true, - "5aa2b923e5b5b000137b7589": true, - "5aa2b986e5b5b00014028f4c": true, - "5aa2b9aee5b5b00015693121": true, - "5aa2b9ede5b5b000137b758b": true, - "5aa2ba19e5b5b00014028f4e": true, - "5aa2ba46e5b5b000137b758d": true, - "5aa2ba71e5b5b000137b758f": true, - "5aa66a9be5b5b0214e506e89": true, - "5aa66be6e5b5b0214e506e97": true, - "5aa66c72e5b5b00016327c93": true, - "5aa7cfc0e5b5b00015693143": false, - "5aa7d193e5b5b000171d063f": true, - "5aa7e276e5b5b000171d0647": true, - "5aa7e373e5b5b000137b76f0": true, - "5aa7e3abe5b5b000171d064d": true, - "5aa7e454e5b5b0214e506fa2": true, - "5aa7e4a4e5b5b000137b76f2": true, - "5aaa4194e5b5b055d06310a5": true, - "5aaa5dfee5b5b000140293d3": true, - "5aaa5e60e5b5b000140293d6": true, - "5aaf8a0be5b5b00015693243": true, - "5aaf8e43e5b5b00015693246": true, - "5aaf9d53e5b5b00015042a52": true, - "5aafa1c2e5b5b00015042a56": true, - "5aafa49ae5b5b00015042a58": true, - "5aafa857e5b5b00018480968": true, - "5aafbde786f774389d0cbc0f": true, - "5ab24ef9e5b5b00fe93c9209": true, - "5ab372a310e891001717f0d8": true, - "5ab3afb2d8ce87001660304d": true, - "5ab8dab586f77441cd04f2a2": true, - "5ab8dced86f774646209ec87": true, - "5ab8e4ed86f7742d8e50c7fa": true, - "5ab8e79e86f7742d8b372e78": true, - "5ab8e9fcd8ce870019439434": true, - "5ab8ebf186f7742d8b372e80": true, - "5ab8f04f86f774585f4237d8": true, - "5ab8f20c86f7745cdb629fb2": true, - "5ab8f39486f7745cd93a1cca": true, - "5ab8f4ff86f77431c60d91ba": true, - "5ab8f85d86f7745cd93a1cf5": true, - "5abcbb20d8ce87001773e258": true, - "5abcbc27d8ce8700182eceeb": true, - "5abcc328d8ce8700194394f3": true, - "5abccb7dd8ce87001773e277": true, - "5ac4c50d5acfc40019262e87": true, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac66c5d5acfc4001718d314": true, - "5ac66cb05acfc40198510a10": true, - "5ac66d015acfc400180ae6e4": true, - "5ac66d2e5acfc43b321d4b53": true, - "5ac66d725acfc43b321d4b60": true, - "5ac66d9b5acfc4001633997a": true, - "5ac72e475acfc400180ae6fe": true, - "5ac733a45acfc400192630e2": true, - "5ac7655e5acfc40016339a19": false, - "5ac78eaf5acfc4001926317a": true, - "5ac8d6885acfc400180ae7b0": true, - "5addba3e5acfc4001669f0ab": true, - "5addbac75acfc400194dbc56": true, - "5addbb6e5acfc408fb1393fd": true, - "5addbb825acfc408fb139400": true, - "5addbb945acfc4001a5fc44e": true, - "5addbba15acfc400185c2854": true, - "5addbbb25acfc40015621bd9": true, - "5addbf175acfc408fb13965b": true, - "5addbfbb5acfc400194dbcf7": true, - "5addbfd15acfc40015621bde": true, - "5addbfe15acfc4001a5fc58b": true, - "5addbfef5acfc400185c2857": true, - "5addbffe5acfc4001714dfac": true, - "5addc00b5acfc4001669f144": true, - "5addc7005acfc4001669f275": true, - "5addc7ac5acfc400194dbd90": true, - "5addc7db5acfc4001669f279": true, - "5addcce35acfc4001a5fc635": true, - "5addccf45acfc400185c2989": true, - "5adf23995acfc400185c2aeb": true, - "5ae096d95acfc400185c2c81": true, - "5ae30bad5acfc400185c2dc4": true, - "5ae30c9a5acfc408fb139a03": true, - "5ae30db85acfc408fb139a05": true, - "5ae30e795acfc408fb139a0b": true, - "5ae35b315acfc4001714e8b0": true, - "5af0454c86f7746bf20992e8": true, - "5af0548586f7743a532b7e99": true, - "5afd7ded5acfc40017541f5e": true, - "5afd7e095acfc40017541f61": true, - "5afd7e445acfc4001637e35a": true, - "5b04473a5acfc40018632f70": true, - "5b057b4f5acfc4771e1bd3e9": true, - "5b07db875acfc40dc528a5f6": true, - "5b07dd285acfc4001754240d": true, - "5b0800175acfc400153aebd4": true, - "5b099a765acfc47a8607efe3": true, - "5b099a9d5acfc47a8607efe7": true, - "5b099ac65acfc400186331e1": true, - "5b099b7d5acfc400186331e4": true, - "5b099b965acfc400186331e6": true, - "5b099bb25acfc400186331e8": true, - "5b099bf25acfc4001637e683": true, - "5b0bbe4e5acfc40dc528a72d": true, - "5b0bc22d5acfc47a8607f085": true, - "5b0e794b5acfc47a877359b2": true, - "5b1fa9b25acfc40018633c01": true, - "5b1fa9ea5acfc40018633c0a": true, - "5b1faa0f5acfc40dc528aeb5": true, - "5b1fb3e15acfc4001637f068": true, - "5b1fd4e35acfc40018633c39": true, - "5b222d335acfc4771e1be099": true, - "5b222d405acfc400153af4fe": true, - "5b2240bf5acfc40dc528af69": true, - "5b237e425acfc4771e1be0b6": true, - "5b2388675acfc4771e1be0be": true, - "5b2389515acfc4771e1be0c0": true, - "5b2cfa535acfc432ff4db7a0": true, - "5b30ac585acfc433000eb79c": true, - "5b30b0dc5acfc400153b7124": true, - "5b30bc165acfc40016387293": true, - "5b30bc285acfc47a8608615d": true, - "5b31163c5acfc400153b71cb": true, - "5b3116595acfc40019476364": true, - "5b363dd25acfc4001a598fd2": true, - "5b363dea5acfc4771e1c5e7e": true, - "5b363e1b5acfc4771e1c5e80": true, - "5b39f8db5acfc40016387a1b": true, - "5b39ffbd5acfc47a8773fb06": true, - "5b3a08b25acfc4001754880c": true, - "5b3a16655acfc40016387a2a": true, - "5b3a337e5acfc4704b4a19a0": true, - "5b3b6dc75acfc47a8773fb1e": true, - "5b3b6e495acfc4330140bd88": true, - "5b3b713c5acfc4330140bd8d": true, - "5b3b99265acfc4704b4a1afb": true, - "5b3b99475acfc432ff4dcbee": true, - "5b3baf8f5acfc40dc5296692": true, - "5b3cadf35acfc400194776a0": true, - "5b3cbc235acfc4001863ac44": true, - "5b3f7bf05acfc433000ecf6b": true, - "5b3f7c005acfc4704b4a1de8": true, - "5b3f7c1c5acfc40dc5296b1d": true, - "5b40e1525acfc4771e1c6611": true, - "5b40e2bc5acfc40016388216": true, - "5b40e3f35acfc40016388218": true, - "5b40e4035acfc47a87740943": true, - "5b40e5e25acfc4001a599bea": true, - "5b40e61f5acfc4001a599bec": true, - "5b4325355acfc40019478126": true, - "5b4326435acfc433000ed01d": true, - "5b43271c5acfc432ff4dce65": true, - "5b4327aa5acfc400175496e0": true, - "5b4329075acfc400153b78ff": true, - "5b4329f05acfc47a86086aa1": true, - "5b432b2f5acfc4771e1c6622": true, - "5b432b6c5acfc4001a599bf0": true, - "5b432b965acfc47a8774094e": true, - "5b432be65acfc433000ed01f": true, - "5b432c305acfc40019478128": true, - "5b432d215acfc4771e1c6624": true, - "5b432f3d5acfc4704b4a1dfb": true, - "5b44c6ae86f7742d1627baea": true, - "5b44c8ea86f7742d1627baf1": true, - "5b44cad286f77402a54ae7e5": true, - "5b44cd8b86f774503d30cba2": true, - "5b44cf1486f77431723e3d05": true, - "5b44d0de86f774503d30cba8": true, - "5b44d22286f774172b0c9de8": true, - "5b46238386f7741a693bcf9c": true, - "5b4736a986f774040571e998": true, - "5b4736b986f77405cb415c10": true, - "5b7be1125acfc4001876c0e5": true, - "5b7be1265acfc400161d0798": true, - "5b7be1ca5acfc400170e2d2f": true, - "5b7be2345acfc400196d524a": true, - "5b7be4575acfc400161d0832": true, - "5b7be4645acfc400170e2dcc": true, - "5b7be46e5acfc400170e2dcf": true, - "5b7be47f5acfc400170e2dd2": true, - "5b7be4895acfc400170e2dd5": true, - "5b7bebc85acfc43bca706666": true, - "5b7bed205acfc400161d08cc": true, - "5b7bedd75acfc43d825283f9": true, - "5b7bee755acfc400196d5383": true, - "5b7bef1e5acfc43d82528402": true, - "5b7bef5d5acfc43bca7067a3": true, - "5b7bef9c5acfc43d102852ec": true, - "5b7c2d1d5acfc43d1028532a": true, - "5b7c710788a4506dec015957": true, - "5b7d37845acfc400170e2f87": true, - "5b7d63b75acfc400170e2f8a": true, - "5b7d63cf5acfc4001876c8df": true, - "5b7d63de5acfc400170e2f8d": true, - "5b7d64555acfc4001876c8e2": true, - "5b7d645e5acfc400170e2f90": true, - "5b7d671b5acfc43d82528ddd": true, - "5b7d678a5acfc4001a5c4022": true, - "5b7d679f5acfc4001a5c4024": true, - "5b7d68af5acfc400170e30c3": true, - "5b7d693d5acfc43bca706a3d": true, - "5b7d6c105acfc40015109a5f": true, - "5b800e9286f7747a8b04f3ff": true, - "5b800ebc86f774394e230a90": true, - "5b800ed086f7747baf6e2f9e": true, - "5b80242286f77429445e0b47": true, - "5b84038986f774774913b0c1": true, - "5b8403a086f7747ff856f4e2": true, - "5b86a0e586f7745b600ccb23": true, - "5ba26383d4351e00334c93d9": true, - "5ba264f6d4351e0034777d52": true, - "5ba2657ed4351e0035628ff2": true, - "5ba26586d4351e44f824b340": true, - "5ba2678ad4351e44f824b344": true, - "5ba26812d4351e003201fef1": true, - "5ba26835d4351e0035628ff5": true, - "5ba26844d4351e00334c9475": true, - "5ba26acdd4351e003562908e": true, - "5ba26ae8d4351e00367f9bdb": true, - "5ba26b01d4351e0085325a51": true, - "5ba26b17d4351e00367f9bdd": true, - "5ba36f85d4351e0085325c81": true, - "5bae13bad4351e00320204af": true, - "5bae13ded4351e44f824bf38": true, - "5bb20d53d4351e4502010a69": true, - "5bb20d92d4351e00853263eb": true, - "5bb20d9cd4351e00334c9d8a": true, - "5bb20da5d4351e0035629dbf": true, - "5bb20dadd4351e00367faeff": true, - "5bb20dbcd4351e44f824c04e": true, - "5bb20dcad4351e3bac1212da": true, - "5bb20de5d4351e0035629e59": true, - "5bb20df1d4351e00347787d5": true, - "5bb20dfcd4351e00334c9e24": true, - "5bb20e0ed4351e3bac1212dc": true, - "5bb20e18d4351e00320205d5": true, - "5bb20e49d4351e3bac1212de": true, - "5bb20e58d4351e00320205d7": true, - "5bb20e70d4351e0035629f8f": true, - "5bb2475ed4351e00853264e3": true, - "5bbdb811d4351e45020113c7": true, - "5bbdb83fd4351e44f824c44b": true, - "5bbdb870d4351e00367fb67d": true, - "5bbdb8bdd4351e4502011460": true, - "5bbde409d4351e003562b036": true, - "5bbde41ed4351e003562b038": true, - "5bc09a18d4351e003562b68e": true, - "5bc09a30d4351e00367fb7c8": true, - "5bc5a351d4351e003477a414": true, - "5bc5a35cd4351e450201232f": true, - "5bc5a372d4351e44f824d17f": true, - "5bc9c1e2d4351e00367fbcf0": true, - "5bc9c29cd4351e003562b8a3": true, - "5bcf0213d4351e0085327c17": true, - "5bd06f5d86f77427101ad47c": true, - "5bd0716d86f774171822ef4b": true, - "5bd071d786f7747e707b93a3": true, - "5bd073a586f7747e6f135799": true, - "5bd073c986f7747f627e796c": true, - "5bd70322209c4d00d7167b8f": true, - "5bd704e7209c4d00d7167c31": true, - "5be4038986f774527d3fae60": true, - "5bead2e00db834001c062938": true, - "5bed61680db834001d2c45ab": true, - "5bed625c0db834001c062946": true, - "5beec1bd0db834001e6006f3": true, - "5beec2820db834001b095426": true, - "5beec3420db834001b095429": true, - "5beec3e30db8340019619424": true, - "5beec8b20db834001961942a": true, - "5beec8c20db834001d2c465c": true, - "5beec8ea0db834001a6f9dbf": true, - "5beec91a0db834001961942d": true, - "5beec9450db83400970084fd": true, - "5beecbb80db834001d2c465e": true, - "5beed0f50db834001c062b12": true, - "5bf3e03b0db834001d2c4a9c": true, - "5bf3e0490db83400196199af": true, - "5bf3f59f0db834001a6fa060": true, - "5bfd297f0db834001a669119": true, - "5bfd35380db83400232fe5cc": true, - "5bfd36290db834001966869a": true, - "5bfd36ad0db834001c38ef66": true, - "5bfd37c80db834001d23e842": true, - "5bfd384c0db834001a6691d3": true, - "5bfd4c980db834001b73449d": true, - "5bfd4cbe0db834001b73449f": true, - "5bfd4cc90db834001d23e846": true, - "5bfd4cd60db834001c38f095": true, - "5bfe7fb30db8340018089fed": true, - "5bfe86a20db834001d23e8f7": true, - "5bfe86bd0db83400232fe959": true, - "5bfe86df0db834001b734685": true, - "5bfe89510db834001808a127": true, - "5bfea6e90db834001b7347f3": true, - "5bfea7ad0db834001c38f1ee": true, - "5bfeaa0f0db834001b734927": true, - "5bfeb32b0db834001a6694d9": true, - "5bfebc250db834001a6694e1": true, - "5bfebc320db8340019668d79": true, - "5bfebc530db834001d23eb65": true, - "5bfebc5e0db834001a6694e5": true, - "5bffcf7a0db83400232fea79": true, - "5bffd7ed0db834001d23ebf9": true, - "5bffdc370db834001d23eca8": false, - "5bffdd7e0db834001b734a1a": true, - "5bffe7930db834001b734a39": true, - "5bffe7c50db834001d23ece1": true, - "5bffec120db834001c38f5fa": true, - "5bffef760db8340019668fe4": true, - "5c0000c00db834001a6697fc": true, - "5c0006470db834001a6697fe": true, - "5c00076d0db834001d23ee1f": true, - "5c0009510db834001966907f": true, - "5c0102aa0db834001b734ba1": true, - "5c0102b20db834001d23eebc": true, - "5c010a700db834001d23ef5d": true, - "5c010e350db83400232feec7": true, - "5c0111ab0db834001966914d": true, - "5c0125fc0db834001a669aa3": true, - "5c0126f40db834002a125382": true, - "5c012ffc0db834001d23f03f": true, - "5c0505e00db834001b735073": true, - "5c0517910db83400232ffee5": true, - "5c05293e0db83400232fff80": true, - "5c05295e0db834001a66acbb": true, - "5c052a900db834001a66acbd": true, - "5c05413a0db834001c390617": true, - "5c0548ae0db834001966a3c2": true, - "5c0558060db834001b735271": true, - "5c064c400db834001d23f468": true, - "5c06595c0db834001a66af6c": true, - "5c066e3a0db834001b7353f0": true, - "5c066ef40db834001966a595": true, - "5c0672ed0db834001b7353f3": true, - "5c0673fb0db8340023300271": true, - "5c0684e50db834002a12585a": true, - "5c0695860db834001b735461": true, - "5c0696830db834001d23f5da": true, - "5c06c6a80db834001b735491": true, - "5c079ec50db834001966a706": true, - "5c079ed60db834001a66b372": true, - "5c07a8770db8340023300450": true, - "5c07b36c0db834002a1259e9": true, - "5c07b3850db834002330045b": true, - "5c07c5ed0db834001b73571c": true, - "5c07c60e0db834002330051f": true, - "5c07c9660db834001a66b588": true, - "5c07dd120db834001c39092d": true, - "5c07df7f0db834001b73588a": true, - "5c08f87c0db8340019124324": true, - "5c0919b50db834001b7ce3b9": true, - "5c091a4e0db834001d5addc8": true, - "5c093ca986f7740a1867ab12": true, - "5c093e3486f77430cb02e593": true, - "5c0a2cec0db834001b7ce47d": true, - "5c0d2727d174af02a012cf58": true, - "5c0d32fcd174af02a1659c75": true, - "5c0d56a986f774449d5de529": true, - "5c0d591486f7744c505b416f": true, - "5c0d5ae286f7741e46554302": true, - "5c0d5e4486f77478390952fe": true, - "5c0d668f86f7747ccb7f13b2": true, - "5c0d688c86f77413ae3407b2": true, - "5c0e2f26d174af02a9625114": true, - "5c0e2f5cd174af02a012cfc9": true, - "5c0e2f94d174af029f650d56": true, - "5c0e2ff6d174af02a1659d4a": true, - "5c0e3eb886f7742015526062": true, - "5c0e446786f7742013381639": true, - "5c0e51be86f774598e797894": true, - "5c0e530286f7747fa1419862": true, - "5c0e531286f7747fa54205c2": true, - "5c0e531d86f7747fa23f4d42": true, - "5c0e533786f7747fa23f4d47": true, - "5c0e534186f7747fa1419867": true, - "5c0e53c886f7747fa54205c7": true, - "5c0e541586f7747fa54205c9": true, - "5c0e57ba86f7747fa141986d": true, - "5c0e5bab86f77461f55ed1f3": true, - "5c0e5edb86f77461f55ed1f7": true, - "5c0e625a86f7742d77340f62": true, - "5c0e655586f774045612eeb2": true, - "5c0e66e2d174af02a96252f4": true, - "5c0e6a1586f77404597b4965": true, - "5c0e722886f7740458316a57": true, - "5c0e746986f7741453628fe5": true, - "5c0e774286f77468413cc5b2": true, - "5c0e805e86f774683f3dd637": true, - "5c0e842486f77443a74d2976": true, - "5c0e874186f7745dc7616606": true, - "5c0fa877d174af02a012e1cf": true, - "5c0faeddd174af02a962601f": true, - "5c0faf68d174af02a96260b8": true, - "5c0fafb6d174af02a96260ba": true, - "5c10c8fd86f7743d7d706df3": true, - "5c11046cd174af02a012e42b": true, - "5c110624d174af029e69734c": true, - "5c11279ad174af029d64592b": true, - "5c1127bdd174af44217ab8b9": true, - "5c1127d0d174af29be75cf68": true, - "5c1260dc86f7746b106e8748": true, - "5c12619186f7743f871c8a32": true, - "5c1262a286f7743f8a69aab2": true, - "5c165d832e2216398b5a7e36": true, - "5c17664f2e2216398b5a7e3c": true, - "5c1780312e221602b66cc189": true, - "5c17804b2e2216152006c02f": true, - "5c178a942e22164bef5ceca3": true, - "5c1793902e221602b21d3de2": true, - "5c17a7ed2e2216152142459c": true, - "5c18b90d2e2216152142466b": true, - "5c18b9192e2216398b5a8104": true, - "5c1a1cc52e221602b3136e3d": true, - "5c1a1e3f2e221602b66cc4c2": true, - "5c1bc4812e22164bef5cfde7": true, - "5c1bc5612e221602b5429350": true, - "5c1bc5af2e221602b412949b": true, - "5c1bc5fb2e221602b1779b32": true, - "5c1bc7432e221602b412949d": true, - "5c1bc7752e221602b1779b34": true, - "5c1cd46f2e22164bef5cfedb": true, - "5c1cdd302e221602b3137250": true, - "5c1cdd512e22161b267d91ae": true, - "5c3df7d588a4501f290594e5": true, - "5c46fbd72e2216398b5a8c9c": true, - "5c471b5d2e221602b21d4e14": true, - "5c471b7e2e2216152006e46c": true, - "5c471ba12e221602b3137d76": true, - "5c471bd12e221602b4129c3a": true, - "5c471be12e221602b66cd9ac": true, - "5c471bfc2e221602b21d4e17": true, - "5c471c2d2e22164bef5d077f": true, - "5c471c442e221602b542a6f8": true, - "5c471c6c2e221602b66cd9ae": true, - "5c471c842e221615214259b5": true, - "5c471cb32e221602b177afaa": true, - "5c488a752e221602b412af63": true, - "5c48a14f2e2216152006edd7": true, - "5c48a2852e221602b21d5923": true, - "5c48a2a42e221602b66d1e07": true, - "5c48a2c22e221602b313fb6c": true, - "5c4ee3d62e2216152006f302": true, - "5c4eec9b2e2216398b5aaba2": true, - "5c4eecc32e221602b412b440": true, - "5c4eecde2e221602b3140418": true, - "5c501a4d2e221602b412b540": true, - "5c5039be2e221602b177c9ff": true, - "5c503ac82e221602b21d6e9a": true, - "5c503ad32e2216398b5aada2": true, - "5c503af12e221602b177ca02": true, - "5c503b1c2e221602b21d6e9d": true, - "5c503d0a2e221602b542b7ef": true, - "5c5952732e2216398b5abda2": true, - "5c59529a2e221602b177d160": true, - "5c5970672e221602b21d7855": true, - "5c5db5852e2216003a0fe71a": true, - "5c5db5962e2216000e5e46eb": true, - "5c5db5b82e2216003a0fe71d": true, - "5c5db5c62e22160012542255": true, - "5c5db5f22e2216000e5e47e8": true, - "5c5db5fc2e2216000f1b2842": true, - "5c5db6302e2216000e5e47f0": true, - "5c5db63a2e2216000f1b284a": true, - "5c5db6552e2216001026119d": true, - "5c5db6652e221600113fba51": true, - "5c5db6742e2216000f1b2852": true, - "5c5db6b32e221600102611a0": true, - "5c5db6ee2e221600113fba54": true, - "5c5db6f82e2216003a0fe914": true, - "5c6161fb2e221600113fbde5": true, - "5c6162682e22160010261a2b": true, - "5c61627a2e22160012542c55": true, - "5c6165902e22160010261b28": true, - "5c6175362e221600133e3b94": true, - "5c617a5f2e2216000f1e81b3": true, - "5c61a40d2e2216001403158d": true, - "5c6592372e221600133e47d7": true, - "5c6beec32e221601da3578f2": true, - "5c6bf4aa2e2216001219b0ae": true, - "5c6c2c9c2e2216000f2002e4": true, - "5c6d10e82e221601da357b07": true, - "5c6d10fa2e221600106f3f23": true, - "5c6d11072e2216000e69d2e4": true, - "5c6d11152e2216000f2003e7": true, - "5c6d42cb2e2216000e69d7d1": true, - "5c6d450c2e221600114c997d": true, - "5c6d46132e221601da357d56": true, - "5c6d5d8b2e221644fc630b39": true, - "5c6d710d2e22165df16b81e7": true, - "5c6d7b3d2e221600114c9b7d": true, - "5c6d85e02e22165df16b81f4": true, - "5c78f2492e221600114c9f04": true, - "5c78f2612e221600114c9f0d": true, - "5c78f26f2e221601da3581d1": true, - "5c78f2792e221600106f4683": true, - "5c78f2882e22165df16b832e": true, - "5c791e872e2216001219c40a": true, - "5c793fb92e221644f31bfb64": true, - "5c793fc42e221600114ca25d": true, - "5c793fde2e221601da358614": true, - "5c7951452e221644f31bfd5c": true, - "5c7954d52e221600106f4cc7": true, - "5c7955c22e221644f31bfd5e": true, - "5c7d55de2e221644f31bff68": true, - "5c7d55f52e221644f31bff6a": true, - "5c7d560b2e22160bc12c6139": true, - "5c7e5f112e221600106f4ede": true, - "5c7e8fab2e22165df16b889b": true, - "5c7fb51d2e2216001219ce11": true, - "5c7fc87d2e221644f31c0298": true, - "5c82342f2e221644f31c060e": true, - "5c82343a2e221644f31c0611": true, - "5c86592b2e2216000e69e77c": true, - "5c878e9d2e2216000f201903": true, - "5c878ebb2e2216001219d48a": true, - "5c87a07c2e2216001219d4a2": true, - "5c87ca002e221600114cb150": true, - "5c88f24b2e22160bc12c69a6": true, - "5c90c3622e221601da359851": true, - "5c920e902e221644f31c3c99": true, - "5c925fa22e221601da359b7b": true, - "5c99f3592e221644fc633070": true, - "5c9a07572e221644f31c4b32": true, - "5c9a1c3a2e2216000e69fb6a": true, - "5c9a1c422e221600106f69f0": true, - "5c9a25172e2216000f20314e": true, - "5c9a26332e2216001219ea70": true, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": true, - "5ca20ee186f774799474abc2": true, - "5ca2113f86f7740b2547e1d2": true, - "5ca21c6986f77479963115a7": true, - "5cadc1c6ae9215000f2775a4": true, - "5cadc2e0ae9215051e1c21e7": true, - "5cadc390ae921500126a77f1": true, - "5cadc431ae921500113bb8d5": true, - "5cadc55cae921500103bb3be": true, - "5cadd919ae921500126a77f3": true, - "5cadd940ae9215051e1c2316": true, - "5cadd954ae921500103bb3c2": true, - "5cadf6ddae9215051e1c23b2": true, - "5cadf6e5ae921500113bb973": true, - "5cadf6eeae921500134b2799": true, - "5cadfbf7ae92152ac412eeef": true, - "5caf1041ae92157c28402e3f": true, - "5caf1109ae9215753c44119f": true, - "5caf1691ae92152ac412efb9": true, - "5caf16a2ae92152ac412efbc": true, - "5caf17c9ae92150b30006be1": true, - "5caf187cae92157c28402e43": true, - "5cbda392ae92155f3c17c39f": true, - "5cbda9f4ae9215000e5b9bfc": true, - "5cbdaf89ae9215000e5b9c94": true, - "5cbdb1b0ae9215000d50e105": true, - "5cbdc23eae9215001136a407": true, - "5cc6ea78e4a949000e1ea3c1": true, - "5cc6ea85e4a949000e1ea3c3": true, - "5cc70093e4a949033c734312": true, - "5cc700b9e4a949000f0f0f25": true, - "5cc700cae4a949035e43ba72": true, - "5cc700d4e4a949000f0f0f28": true, - "5cc700ede4a949033c734315": true, - "5cc70102e4a949035e43ba74": true, - "5cc7012ae4a949001252b43e": true, - "5cc70146e4a949000d73bf6b": true, - "5cc7015ae4a949001152b4c6": true, - "5cc701aae4a949000e1ea45c": true, - "5cc701d7e4a94900100ac4e7": true, - "5cc80f38e4a949001152b560": true, - "5cc80f53e4a949000e1ea4f8": true, - "5cc80f67e4a949035e43bbba": true, - "5cc80f79e4a949033c7343b2": true, - "5cc80f8fe4a949033b0224a2": true, - "5cc82796e24e8d000f5859a8": true, - "5cc82d76e24e8d00134b4b83": true, - "5cc86832d7f00c000d3a6e6c": true, - "5cc86840d7f00c002412c56c": true, - "5cc9a96cd7f00c011c04e04a": true, - "5cc9ad73d7f00c000e2579d4": true, - "5cc9b815d7f00c000e2579d6": true, - "5cc9bcaed7f00c011c04e179": true, - "5cc9c20cd7f00c001336c65d": true, - "5cda9bcfd7f00c0c0b53e900": true, - "5cdaa99dd7f00c002412d0b2": true, - "5cdd7685d7f00c000f260ed2": true, - "5cdd7693d7f00c0010373aa5": true, - "5cde739cd7f00c0010373bd3": true, - "5cde77a9d7f00c000f261009": true, - "5cde7afdd7f00c000d36b89d": true, - "5cde7b43d7f00c000d36b93e": true, - "5cde8864d7f00c0010373be1": true, - "5cdeac22d7f00c000f26168f": true, - "5cdeac42d7f00c000d36ba73": true, - "5cdeac5cd7f00c000f261694": true, - "5cdeaca5d7f00c00b61c4b70": true, - "5ce69cbad7f00c00b61c5098": true, - "5cebec00d7f00c065c53522a": true, - "5cebec10d7f00c065703d185": true, - "5cebec38d7f00c00110a652a": true, - "5cf12a15d7f00c05464b293f": true, - "5cf13123d7f00c1085616a50": true, - "5cf4e3f3d7f00c06595bc7f0": true, - "5cf4fb76d7f00c065703d3ac": true, - "5cf50850d7f00c056e24104c": true, - "5cf508bfd7f00c056e24104e": true, - "5cf50fc5d7f00c056c53f83c": true, - "5cf518cfd7f00c065b422214": true, - "5cf54404d7f00c108840b2ef": true, - "5cf638cbd7f00c06595bc936": true, - "5cf639aad7f00c065703d455": true, - "5cf656f2d7f00c06585fb6eb": true, - "5cf67a1bd7f00c06585fb6f3": true, - "5cf67cadd7f00c065a5abab7": true, - "5cf6935bd7f00c06585fb791": true, - "5cf6937cd7f00c056c53fb39": true, - "5cf78496d7f00c065703d6ca": true, - "5cf78720d7f00c06595bc93e": true, - "5cf79389d7f00c10941a0c4d": true, - "5cf79599d7f00c10875d9212": true, - "5cf7acfcd7f00c1084477cf2": true, - "5cf8f3b0d7f00c00217872ef": true, - "5cfe8010d7ad1a59283b14c6": true, - "5cff9e5ed7ad1a09407397d4": true, - "5cff9e84d7ad1a049e54ed55": true, - "5d00e0cbd7ad1a6c6566a42d": true, - "5d00ec68d7ad1a04a067e5be": true, - "5d00ede1d7ad1a0940739a76": true, - "5d00ef6dd7ad1a0940739b16": true, - "5d00f63bd7ad1a59283b1c1e": true, - "5d010d1cd7ad1a59283b1ce7": true, - "5d0236dad7ad1a0940739d29": true, - "5d023784d7ad1a049d4aa7f2": true, - "5d024f5cd7ad1a04a067e91a": true, - "5d025cc1d7ad1a53845279ef": true, - "5d02676dd7ad1a049e54f6dc": true, - "5d02677ad7ad1a04a15c0f95": true, - "5d026791d7ad1a04a067ea63": true, - "5d02778e86f774203e7dedbe": true, - "5d02797c86f774203f38e30a": true, - "5d0a29ead7ad1a0026013f27": true, - "5d0a29fed7ad1a002769ad08": true, - "5d0a3a58d7ad1a669c15ca14": true, - "5d0a3e8cd7ad1a6f6a3d35bd": true, - "5d0b5cd3d7ad1a3fe32ad263": true, - "5d10b49bd7ad1a1a560708b0": true, - "5d120a10d7ad1a4e1026ba85": true, - "5d120a28d7ad1a1c8962e295": true, - "5d122e7bd7ad1a07102d6d7f": true, - "5d123102d7ad1a004e475fe5": true, - "5d123a3cd7ad1a004e476058": true, - "5d123b70d7ad1a0ee35e0754": true, - "5d123b7dd7ad1a004f01b262": true, - "5d124c01d7ad1a115c7d59fb": true, - "5d124c0ed7ad1a10d168dd9b": true, - "5d124c1ad7ad1a12227c53a7": true, - "5d133067d7ad1a33013f95b4": true, - "5d1340b3d7ad1a0b52682ed7": true, - "5d1340bdd7ad1a0e8d245aab": true, - "5d1340cad7ad1a0b0b249869": true, - "5d135e83d7ad1a21b83f42d8": true, - "5d135ecbd7ad1a21c176542e": true, - "5d15ce51d7ad1a1eff619092": true, - "5d15cf3bd7ad1a67e71518b2": true, - "5d19cd96d7ad1a4a992c9f52": true, - "5d1b198cd7ad1a604869ad72": true, - "5d1b33a686f7742523398398": true, - "5d1b36a186f7742523398433": true, - "5d1b371186f774253763a656": true, - "5d1b5e94d7ad1a2b865a96b0": true, - "5d1c702ad7ad1a632267f429": true, - "5d1f819086f7744b355c219b": true, - "5d2369418abbc306c62e0c80": true, - "5d25a4a98abbc30b917421a4": true, - "5d25a6538abbc306c62e630d": true, - "5d25a6a48abbc306c62e6310": true, - "5d25a7b88abbc3054f3e60bc": true, - "5d25af8f8abbc3055079fec5": true, - "5d25d0ac8abbc3054f3e61f7": true, - "5d2702e88abbc31ed91efc44": true, - "5d2703038abbc3105103d94c": true, - "5d270b3c8abbc3105335cfb8": true, - "5d270ca28abbc31ee25ee821": true, - "5d2c76ed48f03532f2136169": true, - "5d2c770c48f0354b4a07c100": true, - "5d2c772c48f0355d95672c25": true, - "5d2c829448f0353a5c7d6674": true, - "5d2da1e948f035477b1ce2ba": true, - "5d2dc3e548f035404a1a4798": true, - "5d2f0d8048f0356c925bc3b0": true, - "5d2f213448f0355009199284": true, - "5d2f259b48f0355a844acd74": true, - "5d2f25bc48f03502573e5d85": true, - "5d2f261548f03576f500e7b7": true, - "5d2f2ab648f03550091993ca": true, - "5d2f2d5748f03572ec0c0139": true, - "5d3eb3b0a4b93615055e84d2": true, - "5d3eb44aa4b93650d64e4979": true, - "5d3eb4aba4b93650d64e497d": true, - "5d3eb536a4b9363b1f22f8e2": true, - "5d3eb59ea4b9361c284bb4b2": true, - "5d3eb5b6a4b9361eab311902": true, - "5d3eb5eca4b9363b1f22f8e4": true, - "5d3ef698a4b9361182109872": true, - "5d403f9186f7743cac3f229b": true, - "5d40407c86f774318526545a": true, - "5d43021ca4b9362eab4b5e25": true, - "5d4405aaa4b9361e6a4e6bd3": true, - "5d4405f0a4b9361e6a4e6bd9": true, - "5d440625a4b9361eec4ae6c5": true, - "5d44064fa4b9361e4f6eb8b5": true, - "5d44069ca4b9361ebd26fc37": true, - "5d4406a8a4b9361e4f6eb8b7": true, - "5d440b93a4b9364276578d4b": true, - "5d440b9fa4b93601354d480c": true, - "5d44334ba4b9362b346d1948": true, - "5d443f8fa4b93678dd4a01aa": true, - "5d4aaa54a4b9365392071170": true, - "5d4aaa73a4b9365392071175": true, - "5d4aab30a4b9365435358c55": true, - "5d5d646386f7742797261fd9": true, - "5d5d85c586f774279a21cbdb": true, - "5d5d87f786f77427997cfaef": true, - "5d5d8ca986f7742798716522": true, - "5d5d940f86f7742797262046": true, - "5d5e7d28a4b936645d161203": true, - "5d5e9c74a4b9364855191c40": true, - "5d5fca1ea4b93635fd598c07": true, - "5d67abc1a4b93614ec50137f": true, - "5d6d2e22a4b9361bd5780d05": true, - "5d6d2ef3a4b93618084f58bd": true, - "5d6d3716a4b9361bc8618872": true, - "5d6d3829a4b9361bc8618943": true, - "5d6d3943a4b9360dbc46d0cc": true, - "5d6d3be5a4b9361bc73bc763": true, - "5d6e6772a4b936088465b17c": true, - "5d6e67fba4b9361bc73bc779": true, - "5d6e6806a4b936088465b17e": true, - "5d6e6869a4b9361c140bcfde": true, - "5d6e6891a4b9361bd473feea": true, - "5d6e689ca4b9361bc8618956": true, - "5d6e68a8a4b9360b6c0d54e2": true, - "5d6e68b3a4b9361bca7e50b5": true, - "5d6e68c4a4b9361b93413f79": true, - "5d6e68d1a4b93622fe60e845": true, - "5d6e68dea4b9361bcc29e659": true, - "5d6e68e6a4b9361c140bcfe0": true, - "5d6e6911a4b9361bd5780d52": true, - "5d6e695fa4b936359b35d852": true, - "5d6e69b9a4b9361bc8618958": true, - "5d6e69c7a4b9360b6c0d54e4": true, - "5d6e6a05a4b93618084f58d0": true, - "5d6e6a42a4b9364f07165f52": true, - "5d6e6a53a4b9361bd473feec": true, - "5d6e6a5fa4b93614ec501745": true, - "5d7b6bafa4b93652786f4c76": true, - "5d96141523f0ea1b7f2aacab": true, - "5dcbd56fdbd3d91b3e5468d5": true, - "5dcbd6b46ec07c0c4347a564": true, - "5dcbd6dddbd3d91b3e5468de": true, - "5dcbe9431e1f4616d354987e": true, - "5dcbe965e4ed22586443a79d": true, - "5de652c31b7e3716273428be": true, - "5de653abf76fdc1ce94a5a2a": true, - "5de65547883dde217541644b": true, - "5de6556a205ddc616a6bc4f7": true, - "5de6558e9f98ac2bc65950fc": true, - "5de655be4a9f347bc92edb88": true, - "5de7bd7bfd6b4e6e2276dc25": true, - "5de8e67c4a9f347bc92edbd7": true, - "5de8e8dafd6b4e6e2276dc32": true, - "5de8ea8ffd6b4e6e2276dc35": true, - "5de8eaadbbaf010b10528a6d": true, - "5de8eac42a78646d96665d91": true, - "5de8f237bbaf010b10528a70": true, - "5de8f2d5b74cd90030650c72": true, - "5de8fb539f98ac2bc659513a": true, - "5de8fbad2fbe23140d3ee9c4": true, - "5de8fbf2b74cd90030650c79": true, - "5de8fc0b205ddc616a6bc51b": true, - "5de910da8b6c4240ba2651b5": true, - "5de922d4b11454561e39239f": true, - "5df24cf80dee1b22f862e9bc": true, - "5df256570dee1b22f862e9c4": true, - "5df25b6c0b92095fd441e4cf": true, - "5df25d3bfd6b4e6e2276dc9a": true, - "5df35ddddfc58d14537c2036": true, - "5df35e59c41b2312ea3334d5": true, - "5df35e7f2a78646d96665dd4": true, - "5df35e970b92095fd441e4d2": true, - "5df35ea9c41b2312ea3334d8": true, - "5df35eb2b11454561e3923e2": true, - "5df36948bb49d91fb446d5ad": true, - "5df38a5fb74cd90030650cb6": true, - "5df8a2ca86f7740bfe6df777": true, - "5df8a42886f77412640e2e75": true, - "5df8a4d786f77412672a1e3b": true, - "5df8a58286f77412631087ed": true, - "5df8ce05b11454561e39243b": true, - "5df8e053bb49d91fb446d6a6": true, - "5df8e085bb49d91fb446d6a8": true, - "5df8e4080b92095fd441e594": true, - "5df8f535bb49d91fb446d6b0": true, - "5df8f541c41b2312ea3335e3": true, - "5df916dfbb49d91fb446d6b9": true, - "5df917564a9f347bc92edca3": true, - "5dfa397fb11454561e39246c": true, - "5dfa3cd1b33c0951220c079b": true, - "5dfa3d2b0dee1b22f862eade": true, - "5dfa3d45dfc58d14537c20b0": true, - "5dfa3d7ac41b2312ea33362a": true, - "5dfa3d950dee1b22f862eae0": true, - "5dfcd0e547101c39625f66f9": true, - "5dfce88fe9dc277128008b2e": true, - "5dfe14f30b92095fd441edaf": true, - "5dfe6104585a0c3e995c7b82": true, - "5dff772da3651922b360bf91": true, - "5dff77c759400025ea5150cf": true, - "5dff8db859400025ea5150d4": true, - "5e00903ae9dc277128008b87": true, - "5e0090f7e9dc277128008b93": true, - "5e00c1ad86f774747333222c": true, - "5e00cdd986f7747473332240": true, - "5e00cfa786f77469dc6e5685": true, - "5e01e9e273d8eb11426f5bc3": true, - "5e01ea19e9dc277128008c0b": true, - "5e01ef6886f77445f643baa4": true, - "5e01f31d86f77465cf261343": true, - "5e01f37686f774773c6f6c15": true, - "5e023cf8186a883be655e54f": true, - "5e023d34e8a400319a28ed44": true, - "5e023d48186a883be655e551": true, - "5e023e53d4353e3302577c4c": true, - "5e023e6e34d52a55c3304f71": true, - "5e023e88277cce2b522ff2b1": true, - "5e208b9842457a4a7a33d074": true, - "5e217ba4c1434648c13568cd": true, - "5e2192a498a36665e8337386": true, - "5e21a3c67e40bd02257a008a": true, - "5e21ca18e4d47f0da15e77dd": true, - "5e2af47786f7746d404f3aaa": true, - "5e2af4a786f7746d3f3c3400": true, - "5e2af55f86f7746d4159f07c": true, - "5e32f56fcb6d5863cc5e5ee4": true, - "5e340dcdcb6d5863cc5e5efb": true, - "5e4abb5086f77406975c9342": true, - "5e4abc1f86f774069619fbaa": true, - "5e4abc6786f77406812bd572": true, - "5e4abfed86f77406a2713cf7": true, - "5e4ac41886f77406a511c9a8": true, - "5e4bfc1586f774264f7582d3": true, - "5e4d34ca86f774264f758330": true, - "5e54f76986f7740366043752": true, - "5e54f79686f7744022011103": true, - "5e56991336989c75ab4f03f6": true, - "5e5699df2161e06ac158df6f": true, - "5e569a0156edd02abe09f27d": true, - "5e569a132642e66b0b68015c": true, - "5e569a2e56edd02abe09f280": true, - "5e71f6be86f77429f2683c44": true, - "5e71f70186f77429ee09f183": true, - "5e71fad086f77422443d4604": true, - "5e81c3cbac2bb513793cdc75": true, - "5e81c4ca763d9f754677befa": true, - "5e81c519cb2b95385c177551": true, - "5e81c539cb2b95385c177553": true, - "5e81c550763d9f754677befd": true, - "5e81c6a2ac2bb513793cdc7f": true, - "5e81c6bf763d9f754677beff": true, - "5e81ebcd8e146c7080625e15": true, - "5e81edc13397a21db957f6a1": true, - "5e81ee213397a21db957f6a6": true, - "5e81ee4dcb2b95385c177582": true, - "5e81f423763d9f754677bf2e": true, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": true, - "5e848cc2988a8701445df1e8": true, - "5e848d1c264f7c180b5e35a9": true, - "5e848d2eea0a7c419c2f9bfd": true, - "5e848d51e4dbc5266a4ec63b": true, - "5e848d99865c0f329958c83b": true, - "5e848db4681bea2ada00daa9": true, - "5e848dc4e4dbc5266a4ec63d": true, - "5e85a9f4add9fe03027d9bf1": true, - "5e85aa1a988a8701445df1f5": true, - "5e870397991fd70db46995c8": true, - "5e87071478f43e51ca2de5e1": true, - "5e87076ce2db31558c75a11d": true, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": true, - "5e87114fe2db31558c75a120": true, - "5e87116b81c4ed43e83cefdd": true, - "5e8f3423fd7471236e6e3b64": true, - "5e997f0b86f7741ac73993e2": true, - "5e9dacf986f774054d6b89f4": true, - "5e9db13186f7742f845ee9d3": true, - "5e9dcf5986f7746c417435b3": true, - "5ea02bb600685063ec28bfa1": true, - "5ea034eb5aad6446a939737b": true, - "5ea034f65aad6446a939737e": true, - "5ea03e5009aa976f2e7a514b": true, - "5ea03e9400685063ec28bfa4": true, - "5ea03f7400685063ec28bfa8": true, - "5ea058e01dbce517f324b3e2": true, - "5ea05cf85ad9772e6624305d": true, - "5ea16acdfadf1d18c87b0784": true, - "5ea16ada09aa976f2e7a51be": true, - "5ea16d4d5aad6446a939753d": true, - "5ea172e498dacb342978818e": true, - "5ea17bbc09aa976f2e7a51cd": true, - "5ea17ca01412a1425304d1c0": true, - "5ea18c84ecf1982c7712d9a2": true, - "5ea2a8e200685063ec28c05a": true, - "5ed515c8d380ab312177c0fa": true, - "5ed515e03a40a50460332579": true, - "5ed515ece452db0eb56fc028": true, - "5ed515f6915ec335206e4152": true, - "5ed5160a87bb8443d10680b5": true, - "5ed51652f6c34d2cc26336a1": true, - "5ed5166ad380ab312177c100": true, - "5ede4739e0350d05467f73e8": true, - "5ede47405b097655935d7d16": true, - "5ede474b0c226a66f5402622": true, - "5ede475339ee016e8c534742": true, - "5ede475b549eed7c6d5c18fb": true, - "5eea21647547d6330471b3c9": true, - "5eea217fc64c5d0dfc05712a": true, - "5eeb2ff5ea4f8b73c827350b": true, - "5ef1b9f0c64c5d0dfc0571a1": true, - "5ef1ba28c64c5d0dfc0571a5": true, - "5ef32e4d1c1fd62aea6a150d": true, - "5ef3448ab37dfd6af863525c": true, - "5ef3553c43cb350a955a7ccb": true, - "5ef35bc243cb350a955a7ccd": true, - "5ef35d2ac64c5d0dfc0571b0": true, - "5ef35f46382a846010715a96": true, - "5ef366938cef260c0642acad": true, - "5ef369b08cef260c0642acaf": true, - "5ef5d994dfbc9f3c660ded95": true, - "5ef61964ec7f42238c31e0c1": true, - "5efaf417aeb21837e749c7f2": true, - "5efb0c1bd79ff02a1f5e68d9": true, - "5efb0cabfb3e451d70735af5": true, - "5efb0d4f4bc50b58e81710f3": true, - "5efb0da7a29a85116f6ea05f": true, - "5efb0e16aeb21837e749c7ff": true, - "5efb0fc6aeb21837e749c801": true, - "5f0596629e22f464da6bbdd9": true, - "5f0c892565703e5c461894e9": true, - "5f2a9575926fd9352339381f": true, - "5f2aa43ba9b91d26f20ae6d2": true, - "5f2aa4464b50c14bcf07acdb": true, - "5f2aa4559b44de6b1b4e68d1": true, - "5f2aa46b878ef416f538b567": true, - "5f2aa47a200e2c0ee46efa71": true, - "5f2aa493cd375f14e15eea72": true, - "5f2aa49f9b44de6b1b4e68d4": true, - "5f36a0e5fbf956000b716b65": true, - "5f3e76d86cda304dcc634054": true, - "5f3e772a670e2a7b01739a52": true, - "5f3e777688ca2d00ad199d25": true, - "5f3e778efcd9b651187d7201": true, - "5f3e77b26cda304dcc634057": true, - "5f3e77f59103d430b93f94c1": true, - "5f3e7801153b8571434a924c": true, - "5f3e7823ddc4f03b010e2045": true, - "5f3e7897ddc4f03b010e204a": true, - "5f3e78a7fbf956000b716b8e": true, - "5f4f9eb969cdc30ff33f09db": false, - "5f5e45cc5021ce62144be7aa": true, - "5f5e467b0bc58666c37e7821": true, - "5f5e46b96bdad616ad46d613": true, - "5f5f41476bdad616ad46d631": true, - "5f5f41f56760b4138443b352": true, - "5f60b34a41e30a4ab12a6947": true, - "5f60b85bbdb8e27dee3dc985": true, - "5f60bf4558eff926626a60f2": true, - "5f60c076f2bcbb675b00dac2": true, - "5f60c74e3b85f6263c145586": true, - "5f60c85b58eff926626a60f7": true, - "5f60cd6cf2bcbb675b00dac6": true, - "5f60e6403b85f6263c14558c": true, - "5f60e7788adaa7100c3adb49": true, - "5f60e784f2bcbb675b00dac7": true, - "5f6331e097199b7db2128dc2": true, - "5f6336bbda967c74a42e9932": true, - "5f6339d53ada5942720e2dc3": true, - "5f633f68f5750b524b45f112": true, - "5f633f791b231926f2329f13": true, - "5f633ff5c444ce7e3c30a006": true, - "5f63405df5750b524b45f114": true, - "5f63407e1b231926f2329f15": true, - "5f6340d3ca442212f4047eb2": true, - "5f6341043ada5942720e2dc5": true, - "5f63418ef5750b524b45f116": true, - "5f6372e2865db925d54f3869": true, - "5f647f31b6238e5dd066e196": true, - "5f99418230835532b445e954": true, - "5f994730c91ed922dd355de3": true, - "5f9949d869e2777a0e779ba5": true, - "5fb64bc92b1b027b1f50bcf2": true, - "5fb651b52b1b027b1f50bcff": true, - "5fb651dc85f90547f674b6f4": true, - "5fb65363d1409e5ca04b54f5": true, - "5fb653962b1b027b1f50bd03": true, - "5fb65424956329274326f316": true, - "5fb6548dd1409e5ca04b54f9": true, - "5fb6558ad6f0b2136f2d7eb7": true, - "5fb655a72b1b027b1f50bd06": true, - "5fb655b748c711690e3a8d5a": true, - "5fb6564947ce63734e3fa1da": true, - "5fb6567747ce63734e3fa1dc": true, - "5fbb976df9986c4cff3fe5f2": true, - "5fbb978207e8a97d1f0902d3": true, - "5fbbaa86f9986c4cff3fe5f6": true, - "5fbbc3324e8a554c40648348": true, - "5fbbc34106bde7524f03cbe9": true, - "5fbbc366ca32ed67276c1557": true, - "5fbbc383d5cb881a7363194a": true, - "5fbbfabed5cb881a7363194e": true, - "5fbbfacda56d053a3543f799": true, - "5fbc210bf24b94483f726481": true, - "5fbc226eca32ed67276c155d": true, - "5fbc227aa56d053a3543f79e": true, - "5fbc22ccf24b94483f726483": true, - "5fbcbcf593164a5b6278efb2": true, - "5fbcbd02900b1d5091531dd3": true, - "5fbcbd10ab884124df0cd563": true, - "5fbcbd6c187fea44d52eda14": true, - "5fbcc1d9016cce60e8341ab3": true, - "5fbcc3e4d6fa9c00c571bb58": true, - "5fbcc429900b1d5091531dd7": true, - "5fbcc437d724d907e2077d5c": true, - "5fbcc640016cce60e8341acc": true, - "5fbe3ffdf8b6a877a729ea82": true, - "5fbe760793164a5b6278efc8": true, - "5fbe7618d6fa9c00c571bb6c": true, - "5fc0f9b5d724d907e2077d82": true, - "5fc0f9cbd6fa9c00c571bb90": true, - "5fc0fa362770a0045c59c677": true, - "5fc0fa957283c4046c58147e": true, - "5fc22d7c187fea44d52eda44": true, - "5fc23426900b1d5091531e15": true, - "5fc235db2770a0045c59c683": true, - "5fc2360f900b1d5091531e19": true, - "5fc23636016cce60e8341b05": true, - "5fc23678ab884124df0cd590": true, - "5fc2369685fd526b824a5713": true, - "5fc275cf85fd526b824a571a": true, - "5fc278107283c4046c581489": true, - "5fc382a9d724d907e2077dab": true, - "5fc382b6d6fa9c00c571bbc3": true, - "5fc382c1016cce60e8341b20": true, - "5fc3e272f8b6a877a729eac5": true, - "5fc3e466187fea44d52eda90": true, - "5fc3e4a27283c4046c5814ab": true, - "5fc3e4ee7283c4046c5814af": true, - "5fc3f2d5900b1d5091531e57": true, - "5fc4b97bab884124df0cd5e3": true, - "5fc4b992187fea44d52edaa9": true, - "5fc4b9b17283c4046c5814d7": true, - "5fc53954f8b6a877a729eaeb": true, - "5fc5396e900b1d5091531e72": true, - "5fc64ea372b0dd78d51159dc": true, - "5fca138c2a7b221b2852a5c6": true, - "5fca13ca637ee0341a484f46": true, - "5fce0cf655375d18a253eff0": true, - "5fce0f9b55375d18a253eff2": true, - "5fce16961f152d4312622bc9": true, - "5fd20ff893a8961fc660a954": true, - "5fd4c474dd870108a754b241": true, - "5fd4c4fa16cac650092f6771": true, - "5fd4c5477a8d854fa0105061": true, - "5fd4c60f875c30179f5d04c2": true, - "5fd8d28367cb5e077335170f": true, - "60098ad7c2240c0fe85c570a": true, - "60098af40accd37ef2175f27": true, - "60098b1705871270cd5352a1": true, - "601948682627df266209af05": true, - "60194943740c5d77f6705eea": true, - "601949593ae8f707c4608daa": true, - "601aa3d2b2bcb34913271e6d": true, - "602286df23506e50807090c6": true, - "60228924961b8d75ee233c32": true, - "60228a76d62c9b14ed777a66": true, - "60228a850ddce744014caf69": true, - "602293f023506e50807090cb": true, - "60229948cacb6b0506369e27": true, - "602a95edda11d6478d5a06da": true, - "602a95fe4e02ce1eaa358729": true, - "602a97060ddce744014caf6f": true, - "602a9740da11d6478d5a06dc": true, - "602e3f1254072b51b239f713": true, - "602e620f9b513876d4338d9a": true, - "602e63fb6335467b0c5ac94d": true, - "602e71bd53a60014f9705bfa": true, - "602f85fd9b513876d4338d9c": true, - "603372b4da11d6478d5a07ff": true, - "603372d154072b51b239f9e1": true, - "603372f153a60014f970616d": true, - "603373004e02ce1eaa358814": true, - "6033749e88382f4fab3fd2c5": true, - "60337f5dce399e10262255d1": true, - "60338ff388382f4fab3fd2c8": true, - "60339954d62c9b14ed777c06": true, - "6033fa48ffd42c541047f728": true, - "603409c80ca681766b6a0fb2": true, - "6034cf5fffd42c541047f72e": true, - "6034d0230ca681766b6a0fb5": true, - "6034d103ca006d2dca39b3f0": true, - "6034d2d697633951dc245ea6": true, - "6034e3cb0ddce744014cb870": true, - "6034e3d953a60014f970617b": true, - "6034e3e20ddce744014cb878": true, - "603618feffd42c541047f771": true, - "603619720ca681766b6a0fc4": true, - "60361a7497633951dc245eb4": true, - "60361b0b5a45383c122086a1": true, - "60361b5a9a15b10d96792291": true, - "60363c0c92ec1c31037959f5": true, - "603648ff5a45383c122086ac": true, - "6038b4b292ec1c3103795a0b": true, - "6038b4ca92ec1c3103795a0d": true, - "6038d614d10cbf667352dd44": true, - "6040dd4ddcf9592f401632d2": true, - "6040de02647ad86262233012": true, - "606587252535c57a13424cfd": true, - "60658776f2cb2e02a42ace2b": true, - "6065878ac9cf8012264142fd": true, - "606587a88900dc2d9a55b659": true, - "606587bd6d0bd7580617bacc": true, - "606587d11246154cad35d635": true, - "606587e18900dc2d9a55b65f": true, - "6065880c132d4d12c81fd8da": true, - "6065881d1246154cad35d637": true, - "6065c6e7132d4d12c81fd8e1": true, - "6065dc8a132d4d12c81fd8e3": true, - "606dae0ab0e443224b421bb7": true, - "606ee5c81246154cad35d65e": true, - "606eef46232e5a31c233d500": true, - "606eef756d0bd7580617baf8": true, - "606ef0812535c57a13424d20": true, - "606f262c6d0bd7580617bafa": true, - "606f263a8900dc2d9a55b68d": true, - "606f26752535c57a13424d22": true, - "606f2696f2cb2e02a42aceb1": true, - "6076c1b9f2cb2e02a42acedc": true, - "60785c0d232e5a31c233d51c": true, - "60785ce5132d4d12c81fd918": true, - "607d5aa50494a626335e12ed": true, - "607ea812232e5a31c233d53c": true, - "607f201b3c672b3b3a24a800": true, - "607f20859ee58b18e41ecd90": true, - "607ffb988900dc2d9a55b6e4": true, - "6086b5392535c57a13424d70": true, - "6086b5731246154cad35d6c7": true, - "6087e0336d0bd7580617bb7a": true, - "6087e2a5232e5a31c233d552": true, - "6087e663132d4d12c81fd96b": true, - "609269c3b0e443224b421cc1": true, - "60926df0132d4d12c81fd9df": true, - "609a4b4fe2ff132951242d04": true, - "609a63b6e2ff132951242d09": true, - "609b9e31506cf869cf3eaf41": true, - "609bab8b455afd752b2e6138": true, - "609e8540d5c319764c2bc2e9": true, - "609e860ebd219504d8507525": true, - "60a23797a37c940de7062d02": true, - "60a272cc93ef783291411d8e": true, - "60a2828e8689911a226117f9": true, - "60a283193cb70855c43a381d": true, - "60a3c68c37ea821725773ef5": true, - "60a3c70cde5f453f634816a3": true, - "60a621c49c197e4e8c4455e6": true, - "60a6220e953894617404b00a": true, - "60a7acf20c5cb24b01346648": true, - "60a7ad2a2198820d95707a2e": true, - "60a7ad3a0c5cb24b0134664a": true, - "60b0f988c4449e4cb624c1da": true, - "60b52e5bc7d8103275739d67": true, - "60bf74184a63fc79b60c57f6": true, - "60db29ce99594040e04c4a27": true, - "6113c3586c780c1e710c90bc": true, - "6113cc78d3a39d50044c065a": true, - "6113cce3d92c473c770200c7": true, - "6113d6c3290d254f5e6b27db": true, - "611a30addbdd8440277441dc": true, - "611a31ce5b7ffe001b4649d1": true, - "6123649463849f3d843da7c4": true, - "612368f58b401f4f51239b33": true, - "612781056f3d944a17348d60": true, - "612e0cfc8004cc50514c2d9e": true, - "612e0d3767085e45ef14057f": true, - "612e0d81290d254f5e6b291a": true, - "612e0e04568c120fdd294258": true, - "612e0e3c290d254f5e6b291d": true, - "612e0e55a112697a4b3a66e7": true, - "6130c3dffaa1272e43151c7d": true, - "6130c43c67085e45ef1405a1": true, - "6130c4d51cb55961fa0fd49f": true, - "6130ca3fd92c473c77020dbd": true, - "614451b71e5874611e2c7ae5": true, - "615d8d878004cc50514c3233": true, - "615d8da4d3a39d50044c10e8": true, - "615d8dbd290d254f5e6b2ed6": true, - "615d8df08004cc50514c3236": true, - "615d8e2f1cb55961fa0fd9a4": true, - "615d8e9867085e45ef1409c6": true, - "615d8eb350224f204c1da1cf": true, - "615d8f5dd92c473c770212ef": true, - "615d8f8567085e45ef1409ca": true, - "615d8faecabb9b7ad90f4d5d": true, - "615d8fd3290d254f5e6b2edc": true, - "61605d88ffa6e502ac5e7eeb": true, - "616442e4faa1272e43152193": true, - "616554fe50224f204c1da2aa": true, - "61657230d92c473c770213d7": true, - "616584766ef05c2ce828ef57": true, - "61659f79d92c473c770213ee": true, - "6165ac306ef05c2ce828ef74": true, - "6165ac8c290d254f5e6b2f6c": true, - "6165adcdd3a39d50044c120f": true, - "6165aeedfaa1272e431521e3": true, - "61695095d92c473c7702147a": true, - "61702be9faa1272e431522c3": true, - "61702d8a67085e45ef140b24": true, - "61702f1b67085e45ef140b26": true, - "61703001d92c473c77021497": true, - "61712eae6c780c1e710c9a1d": true, - "617130016c780c1e710c9a24": true, - "617131a4568c120fdd29482d": true, - "61713308d92c473c770214a0": true, - "6171367e1cb55961fa0fdb36": true, - "61713a8fd92c473c770214a4": true, - "61713cc4d8e3106d9806c109": true, - "6171407e50224f204c1da3c5": true, - "61714b2467085e45ef140b2c": true, - "61714eec290d254f5e6b2ffc": true, - "617151c1d92c473c770214ab": true, - "617153016c780c1e710c9a2f": true, - "617154aa1cb55961fa0fdb3b": true, - "617155ee50224f204c1da3cd": true, - "61715e7e67085e45ef140b33": true, - "6176a40f0b8c0312ac75a3d3": true, - "6176a48d732a664031271438": true, - "6176aca650224f204c1da3fb": true, - "617aa4dd8166f034d57de9c5": true, - "617fd91e5539a84ec44ce155": true, - "61816734d8e3106d9806c1f3": true, - "618167441cb55961fa0fdc71": true, - "618167528004cc50514c34f9": true, - "618167616ef05c2ce828f1a8": true, - "6181688c6c780c1e710c9b04": true, - "618168b350224f204c1da4d8": true, - "618168dc8004cc50514c34fc": true, - "61816df1d3a39d50044c139e": true, - "61816dfa6ef05c2ce828f1ad": true, - "61816fcad92c473c770215cc": true, - "61817865d3a39d50044c13a4": true, - "618178aa1cb55961fa0fdc80": true, - "61825d06d92c473c770215de": true, - "61825d136ef05c2ce828f1cc": true, - "61825d24d3a39d50044c13af": true, - "6183afd850224f204c1da514": true, - "6183b0711cb55961fa0fdcad": true, - "6183b084a112697a4b3a6e6c": true, - "6183d53f1cb55961fa0fdcda": true, - "6183fc15d3a39d50044c13e9": true, - "6183fd911cb55961fa0fdce9": true, - "6183fd9e8004cc50514c358f": true, - "618405198004cc50514c3594": true, - "6184055050224f204c1da540": true, - "618407a850224f204c1da549": true, - "61840bedd92c473c77021635": true, - "61840d85568c120fdd2962a5": true, - "618426d96c780c1e710c9b9f": true, - "618428466ef05c2ce828f218": true, - "618a431df1eb8e24b8741deb": true, - "618a5d5852ecee1505530b2a": true, - "618a75c9a3884f56c957ca1b": true, - "618a75f0bd321d49084cd399": true, - "618a760e526131765025aae3": true, - "618aef6d0a5a59657e5f55ee": true, - "618b9643526131765025ab35": true, - "618b9671d14d6d5ab879c5ea": true, - "618b9682a3884f56c957ca78": true, - "618ba27d9008e4636a67f61d": true, - "618ba91477b82356f91ae0e8": true, - "618ba92152ecee1505530bd3": true, - "618bab21526131765025ab3f": true, - "618bb76513f5097c8d5aa2d5": true, - "618cfae774bb2d036a049e7c": true, - "619256e5f8af2c1a4e1f5d92": true, - "619386379fb0c665d5490dbe": true, - "6193a720f8ee7e52e42109ed": true, - "6193d3149fb0c665d5490e32": true, - "6193d338de3cdf1d2614a6fc": true, - "6193d382ed0429009f543e65": true, - "6193d3be7c6c7b169525f0da": true, - "6193d3cded0429009f543e6a": true, - "6193d5d4f8ee7e52e4210a1b": true, - "6193dcd0f8ee7e52e4210a28": true, - "6194ef39de3cdf1d2614a768": true, - "6194efe07c6c7b169525f11b": true, - "6194eff92d2c397d6600348b": true, - "6194f017ed0429009f543eaa": true, - "6194f02d9bb3d20b0946d2f0": true, - "6194f1f918a3974e5e7421e4": true, - "6194f2912d2c397d6600348d": true, - "6194f2df645b5d229654ad77": true, - "6194f3286db0f2477964e67d": true, - "6194f35c18a3974e5e7421e6": true, - "6194f41f9fb0c665d5490e75": true, - "6194f5722d2c397d6600348f": true, - "6194f5a318a3974e5e7421eb": true, - "6194f5d418a3974e5e7421ef": true, - "619621a4de3cdf1d2614a7a7": true, - "619624b26db0f2477964e6b0": true, - "6196255558ef8c428c287d1c": true, - "61962b617c6c7b169525f168": true, - "61962d879bb3d20b0946d385": true, - "6196364158ef8c428c287d9f": true, - "6196365d58ef8c428c287da1": true, - "619636be6db0f2477964e710": true, - "61963a852d2c397d660036ad": true, - "61965d9058ef8c428c287e0d": true, - "619666f4af1f5202c57a952d": true, - "6197b229af1f5202c57a9bea": true, - "619b5db699fb192e7430664f": true, - "619b69037b9de8162902673e": true, - "619bc61e86e01e16f839a999": true, - "619bdd8886e01e16f839a99c": true, - "619bddc6c9546643a67df6ee": true, - "619bddffc9546643a67df6f0": true, - "619bde3dc9546643a67df6f2": true, - "619bde7fc9546643a67df6f4": true, - "619bdeb986e01e16f839a99e": true, - "619bdef8c9546643a67df6f6": true, - "619bdf9cc9546643a67df6f8": true, - "619bdfd4c9546643a67df6fa": true, - "619cbf7d23893217ec30b689": true, - "619cbf9e0a7c3a1a2731940a": true, - "619cf0335771dd3c390269ae": true, - "619d36da53b4d42ee724fae4": true, - "619f4ab2d25cbd424731fb95": true, - "619f4bffd25cbd424731fb97": true, - "619f4cee4c58466fe1228435": true, - "619f4d304c58466fe1228437": true, - "619f4f8c4c58466fe1228439": true, - "619f52454c58466fe122843b": true, - "61a4c8884f95bc3b2c5dc96f": true, - "61b9e1aaef9a1b5d6a79899a": true, - "61bc85697113f767765c7fe7": true, - "61bca7cda0eae612383adf57": true, - "61bcc89aef0f505f0c6cd0fc": true, - "61c18d83b00456371a66814b": true, - "61c18db6dfd64163ea78fbb4": true, - "61f4012adfc9f01a816adda1": true, - "61f7b234ea4ab34f2f59c3ec": true, - "61f7b85367ddd414173fdb36": true, - "61f7c9e189e6fb1a5e3ea78d": true, - "61f8024263dc1250e26eb029": true, - "61f803b8ced75b2e852e35f8": true, - "61faa91878830f069b6b7967": true, - "620109578d82e67e7911abf2": true, - "6217726288ed9f0845317459": true, - "62178be9d0050232da3485d9": true, - "62178c4d4ecf221597654e3d": true, - "622b327b267a1b13a44abea3": true, - "622b379bf9cfc87d675d2de5": true, - "622b3858034a3e17ad0b81f5": true, - "622b38c56762c718e457e246": true, - "622b397c9a3d4327e41843b6": true, - "622b3c081b89c677a33bcda6": true, - "622b3d5cf9cfc87d675d2de9": true, - "622b4d7df9cfc87d675d2ded": true, - "622b4f54dc8dcc0ba8742f85": true, - "622efbcb99f4ea1a4d6c9a15": true, - "622efdf8ec80d870d349b4e5": true, - "622f02437762f55aaa68ac85": true, - "622f039199f4ea1a4d6c9a17": true, - "622f07cfae33bc505b2c4dd5": true, - "622f0ee47762f55aaa68ac87": true, - "622f128cec80d870d349b4e8": true, - "622f140da5958f63c67f1735": true, - "622f14e899892a7f9e08f6c5": true, - "622f16a1a5958f63c67f1737": true, - "623063e994fc3f7b302a9696": true, - "62307b7b10d2321fa8741921": true, - "6231654c71b5bc3baa1078e5": true, - "623166e08c43374ca1567195": true, - "6231670f0b8aa5472d060095": true, - "62330b3ed4dc74626d570b95": true, - "62330bfadc5883093563729b": true, - "62330c18744e5e31df12f516": true, - "62330c40bdd19b369e1e53d1": true, - "62386b2adf47d66e835094b2": true, - "62386b7153757417e93a4e9f": true, - "62389aaba63f32501b1b444f": true, - "62389ba9a63f32501b1b4451": true, - "62389bc9423ed1685422dc57": true, - "62389be94d5d474bf712e709": true, - "623b2e9d11c3296b440d1638": true, - "623c2f4242aee3103f1c44b7": true, - "623c2f652febb22c2777d8d7": true, - "623c3be0484b5003161840dc": true, - "623c3c1f37b4b31470357737": true, - "6241c2c2117ad530666a5108": true, - "6241c316234b593b5676b637": true, - "62444cb99f47004c781903eb": true, - "62444cd3674028188b052799": true, - "624c0570c9b794431568f5d5": true, - "624c09cfbc2e27219346d955": true, - "624c09da2cec124eb67c1046": true, - "624c09e49b98e019a3315b66": true, - "624c0b3340357b5f566e8766": true, - "624c29ce09cd027dff2f8cd7": true, - "624c2e8614da335f1e034d8c": true, - "6259b864ebedf17603599e88": true, - "6259c2c1d714855d182bad85": true, - "6259c3387d6aab70bc23a18d": true, - "6259c3d8012d6678ec38eeb8": true, - "6259c4347d6aab70bc23a190": true, - "625eb0faa6e3a82193267ad9": true, - "625ebcef6f53af4aa66b44dc": true, - "625ec45bb14d7326ac20f572": true, - "625ed7c64d9b6612df732146": true, - "626667e87379c44d557b7550": true, - "626673016f1edc06f30cf6d5": true, - "62669bccdb9ebb4daa44cd14": true, - "6267c6396b642f77f56f5c1c": true, - "6269220d70b6c02e665f2635": true, - "6269545d0e57f218e4548ca2": true, - "626a74340be03179a165e30c": true, - "626a8ae89e664a2e2a75f409": true, - "626a9cb151cb5849f6002890": true, - "626bb8532c923541184624b4": true, - "626becf9582c3e319310b837": true, - "6272370ee4013c5d7e31f418": true, - "6272379924e29f06af4d5ecb": true, - "627254cc9c563e6e442c398f": true, - "6272874a6c47bd74f92e2087": true, - "6275303a9f372d6ea97f9ec7": true, - "627e14b21713922ded6f2c15": true, - "62811cd7308cb521f87a8f99": true, - "62811e2510e26c1f344e6554": true, - "62811e335631d45211793c95": true, - "62811f461d5df4475f46a332": true, - "62811f828193841aca4a45c3": true, - "62811fa609427b40ab14e765": true, - "62811fbf09427b40ab14e767": true, - "6281204f308cb521f87a8f9b": true, - "628120621d5df4475f46a335": true, - "62812081d23f207deb0ab216": true, - "6281209662cba23f6c4d7a19": true, - "628120c21d5df4475f46a337": true, - "628120d309427b40ab14e76d": true, - "628120dd308cb521f87a8fa1": true, - "628120fd5631d45211793c9f": true, - "6281212a09427b40ab14e770": true, - "628121434fa03b6b6c35dc6a": true, - "6284bd5f95250a29bc628a30": true, - "62850c28da09541f43158cca": true, - "628a60ae6b1d481ff772e9c8": true, - "628a664bccaab13006640e47": true, - "628a665a86cbd9750d2ff5e5": true, - "628a6678ccaab13006640e49": true, - "628a66b41d5e41750e314f34": true, - "628a7b23b0f75035732dd565": true, - "628a83c29179c324ed269508": true, - "628a85ee6b1d481ff772e9d5": true, - "628b5638ad252a16da6dd245": true, - "628b8d83717774443b15e248": true, - "628b916469015a4e1711ed8d": true, - "628b9471078f94059a4b9bfb": true, - "628b9784bcf6e2659e09b8a2": true, - "628b9a40717774443b15e9f2": true, - "628b9be6cff66b70c002b14c": true, - "628b9c37a733087d0d7fe84b": true, - "628b9c7d45122232a872358f": true, - "628baf0b967de16aab5a4f36": true, - "628bc7fb408e2b2e9c0801b1": true, - "628c9ab845c59e5b80768a81": true, - "628cd624459354321c4b7fa2": true, - "628d0618d1ba6e4fa07ce5a4": true, - "628dc750b910320f4c27a732": true, - "628e1ffc83ec92260c0f437f": true, - "628e4dd1f477aa12234918aa": true, - "628e4e576d783146b124c64d": true, - "62963c18dbc8ab5f0d382d0b": true, - "62a09d3bcf4a99369e262447": true, - "62a09d79de7ac81993580530": true, - "62a09dd4621468534a797ac7": true, - "62a09e08de7ac81993580532": true, - "62a09e410b9d3c46de5b6e78": true, - "62a09f32621468534a797acb": true, - "62a1b7fbc30cfa1d366af586": true, - "62a5c2c98ec41a51b34739c0": true, - "62a5c333ec21e50cad3b5dc6": true, - "62a5c41e8ec41a51b34739c3": true, - "62a61bbf8ec41a51b34758d2": true, - "62a61c988ec41a51b34758d5": true - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608815684 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 4, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 3, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 6, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 17206066, - "GameVersion": "edge_of_darkness", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 69, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 2, - "NeedWipeOptions": [], - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Usec", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49444ae6628187a2e77b8", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49444ae6628187a2e77b8", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "f5e6bdac05e699d687993249", - "_tpl": "5857a8bc2459772bad15db29", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "SecuredContainer" - }, - { - "_id": "01e9d751f10e4e9aebdd94d5", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Pockets" - }, - { - "_id": "5fe49444ae6628187a2e78b8", - "_tpl": "5811ce772459770e9e5f9532" - }, - { - "_id": "5fe49444ae6628187a2e78ba", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49444ae6628187a2e78b9", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - }, - { - "_id": "f55404fc9c2a0063bc1b9293", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "c1408429a85d87168d75e04c", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "6275a53292b3e1de7c0f94fc", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "72ec3ef07bf2ddf6c0dab838", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "SpawnedInSession": true, - "StackObjectsCount": 500000 - } - }, - { - "_id": "14bdc77de1a13722eb416218", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "cadad72d72caf8c9784524d4", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 0, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "987b8edc24c5e2a9ccb9ee1d", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "e7d08b2dd0f631136f424917", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "a913602b85dcd145970c2688", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 5, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "68bdc987f801ecd7efbaaabe", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 6, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "68ffe73296918e3a751ff27d", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 7, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "7ae138bc2cbc56640fdf2506", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 8, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "57a6c6de5aa471e473c7f5c5", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "7ef87fb9eaa6c25950c09a7d", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "76f687b8388d97cd13aa18a5", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 1, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "249a3bbee6e1ba29712e6065", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 0 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 500000 - } - }, - { - "_id": "5516338b341dad987bcfb18a", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "f5028bfe9f5550d5c547c9b2", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 5, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "efa4b58a3741068b3957dc25", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 7, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "08624351a590bbe7269ec79e", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "de4be08a2ffd9e880455777a", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 6, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "a47caded1ede79b972fe7ad5", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 2, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "07292f5d4592fb72775941e6", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 8, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "748e89ddd9102eab4bcf47c8", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 5, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "d88551febbfbe3757852a8d8", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 4, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "a7a5854fe4649f57bb9b2bee", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 6, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "cc8ff42be98f9f513fea9b5b", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 8, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "33a09dbb0fc6f1f1da32856b", - "_tpl": "5696686a4bdc2da3298b456a", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 1 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "fbe3dabfda80655871d2ff35", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 3, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "3cc9938ad572a73e1f26877f", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 9, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - }, - { - "_id": "969b3e5c1134f1538183add6", - "_tpl": "569668774bdc2da2298b4568", - "location": { - "isSearched": true, - "r": "Horizontal", - "x": 7, - "y": 2 - }, - "parentId": "5fe49444ae6628187a2e78b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50000 - } - } - ], - "questRaidItems": "5fe49444ae6628187a2e78b9", - "questStashItems": "5fe49444ae6628187a2e78ba", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49444ae6628187a2e78b8" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 2000 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 2000 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cde9ec17d6c8b04723cf479", - "5cde9e957d6c8b0474535da7" - ], - "trader": { - "initialLoyaltyLevel": 4, - "initialSalesSum": 2600000, - "initialStanding": 1, - "jaegerUnlocked": true, - "setQuestsAvailableForStart": false - }, - "weaponbuilds": {} - } - }, - "SPT Zero to hero": { - "bear": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cc0858d14c02e000c6bea66", - "Feet": "5cc085bb14c02e000e67a5c5", - "Hands": "5cc0876314c02e000c6bea6b", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "544a11ac4bdc2d470e8b456a": false, - "544a5caa4bdc2d1a388b4568": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "54527a984bdc2d4e668b4567": false, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "55801eed4bdc2d89578b4588": true, - "55802d5f4bdc2dac148b458e": false, - "559ba5b34bdc2d1f1a8b4582": true, - "55d480c04bdc2d1d4e8b456a": false, - "55d4887d4bdc2d962f8b4570": false, - "55d7217a4bdc2d86028b456d": false, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5648b1504bdc2d9d488b4584": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "564ca99c4bdc2d16268b4589": false, - "567143bf4bdc2d1a0f8b4567": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59d3ad2720bdb418b4577": false, - "56dfef82d2720bbd668b4567": true, - "56dff3afd2720bba668b4567": false, - "56e294cdd2720b603a8b4575": false, - "56ea8222d2720b69698b4567": true, - "570fd6c2d2720bc6458b457f": false, - "5710c24ad2720bc3458b45a3": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "57cd379a24597778e7682ecf": false, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce772459770e9e5f9532": false, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "5894a05586f774094708ef75": false, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "590c5d4b86f774784e1b9c45": false, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": false, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": false, - "592c2d1a86f7746dbe2af32a": true, - "595cf16b86f77427440c32e2": true, - "59984ab886f7743e98271174": true, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a8086f77414ec448d1a": true, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c6633186f7740cf0493bb9": true, - "59ccd11386f77428f24a488f": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "59e770b986f7742cbd762754": false, - "5a0c27731526d80618476ac4": false, - "5aa2b87de5b5b00016327c25": false, - "5aa7cfc0e5b5b00015693143": false, - "5aafbde786f774389d0cbc0f": false, - "5ab8f39486f7745cd93a1cca": false, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac72e475acfc400180ae6fe": false, - "5ac7655e5acfc40016339a19": false, - "5af0454c86f7746bf20992e8": false, - "5b40e5e25acfc4001a599bea": false, - "5b432b965acfc47a8774094e": false, - "5b432d215acfc4771e1c6624": false, - "5bed625c0db834001c062946": false, - "5beec1bd0db834001e6006f3": false, - "5beec3420db834001b095429": false, - "5beec3e30db8340019619424": false, - "5beec8b20db834001961942a": false, - "5beec8c20db834001d2c465c": false, - "5beec8ea0db834001a6f9dbf": false, - "5beec91a0db834001961942d": false, - "5beec9450db83400970084fd": false, - "5beecbb80db834001d2c465e": false, - "5beed0f50db834001c062b12": false, - "5bf3f59f0db834001a6fa060": false, - "5bffdc370db834001d23eca8": false, - "5c0505e00db834001b735073": false, - "5c0e530286f7747fa1419862": false, - "5c0e53c886f7747fa54205c7": false, - "5c0e722886f7740458316a57": false, - "5c488a752e221602b412af63": false, - "5c48a14f2e2216152006edd7": false, - "5c48a2852e221602b21d5923": false, - "5c48a2a42e221602b66d1e07": false, - "5c48a2c22e221602b313fb6c": false, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": false, - "5d02778e86f774203e7dedbe": false, - "5d02797c86f774203f38e30a": false, - "5d0a29fed7ad1a002769ad08": false, - "5d0a3e8cd7ad1a6f6a3d35bd": false, - "5d1b36a186f7742523398433": false, - "5d1b371186f774253763a656": false, - "5d40407c86f774318526545a": false, - "5d5d85c586f774279a21cbdb": false, - "5d5d940f86f7742797262046": false, - "5d5e9c74a4b9364855191c40": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": false, - "5e870397991fd70db46995c8": false, - "5e87071478f43e51ca2de5e1": false, - "5e87076ce2db31558c75a11d": false, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": false, - "5e87114fe2db31558c75a120": false, - "5e87116b81c4ed43e83cefdd": false, - "5f4f9eb969cdc30ff33f09db": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608815684 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "standard", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Bear", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49444ae6628187a2e77b8", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49444ae6628187a2e77b8", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "f5e6bdac05e699d687993249", - "_tpl": "544a11ac4bdc2d470e8b456a", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "SecuredContainer" - }, - { - "_id": "01e9d751f10e4e9aebdd94d5", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Pockets" - }, - { - "_id": "5fe49444ae6628187a2e78b8", - "_tpl": "566abbc34bdc2d92178b4576" - }, - { - "_id": "5fe49444ae6628187a2e78ba", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49444ae6628187a2e78b9", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - }, - { - "_id": "5fe4977574f15b4ad31b661b", - "_tpl": "5bffdc370db834001d23eca8", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 80, - "MaxDurability": 80 - } - } - } - ], - "questRaidItems": "5fe49444ae6628187a2e78b9", - "questStashItems": "5fe49444ae6628187a2e78ba", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49444ae6628187a2e78b8" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cd946231388ce000d572fe3", - "5cd945d71388ce000a659dfb" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0, - "jaegerUnlocked": false - }, - "weaponbuilds": {} + "usec": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cde95d97d6c8b647a3769b0", + "Feet": "5cde95ef7d6c8b04713c4f2d", + "Hands": "5cde95fa7d6c8b04737c2d13", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5447a9cd4bdc2dbd208b4567": false, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448be9a4bdc2dfd2f8b456a": true, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "54491bb74bdc2d09088b4567": false, + "544a11ac4bdc2d470e8b456a": false, + "544a38634bdc2d58388b4568": false, + "544a5caa4bdc2d1a388b4568": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "544fb3f34bdc2d03748b456a": true, + "544fb45d4bdc2dee738b4568": true, + "54527a984bdc2d4e668b4567": false, + "545cdae64bdc2d39198b4568": true, + "545cdb794bdc2d3a198b456a": true, + "557ff21e4bdc2d89578b4586": false, + "557ffd194bdc2d28148b457f": false, + "55801eed4bdc2d89578b4588": true, + "559ba5b34bdc2d1f1a8b4582": true, + "55d355e64bdc2d962f8b4569": false, + "55d3632e4bdc2d972f8b4569": false, + "55d44fd14bdc2d962f8b456e": false, + "55d459824bdc2d892f8b4573": false, + "55d482194bdc2d1d4e8b456b": true, + "55d4887d4bdc2d962f8b4570": false, + "55d4ae6c4bdc2d8b2f8b456e": false, + "55d4af3a4bdc2d972f8b456f": false, + "55d4b9964bdc2d1d4e8b456e": false, + "55d5f46a4bdc2d1b198b4567": false, + "55d7217a4bdc2d86028b456d": false, + "56083e1b4bdc2dc8488b4572": true, + "56083eab4bdc2d26448b456a": true, + "560d5e524bdc2d25448b4571": false, + "560e620e4bdc2d724b8b456b": true, + "5644bd2b4bdc2d3b4c8b4572": true, + "5645bc214bdc2d363b8b4571": true, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b0744bdc2d363b8b4578": false, + "5649aa744bdc2ded0b8b457e": false, + "5649ad3f4bdc2df8348b4585": false, + "5649af094bdc2df8348b4586": false, + "5649b0544bdc2d1b2b8b458a": true, + "5649b1c04bdc2d16268b457c": false, + "5649be884bdc2d79388b4577": false, + "564ca99c4bdc2d16268b4589": false, + "567143bf4bdc2d1a0f8b4567": true, + "5696686a4bdc2da3298b456a": false, + "569668774bdc2da2298b4568": false, + "56d59856d2720bd8418b456a": false, + "56d59948d2720bb7418b4582": false, + "56d59d3ad2720bdb418b4577": false, + "56d5a1f7d2720bb3418b456a": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56d5a661d2720bd8418b456b": false, + "56d5a77ed2720b90418b4568": false, + "56dfef82d2720bbd668b4567": true, + "56ea8222d2720b69698b4567": true, + "56ea8d2fd2720b7c698b4570": false, + "570fd6c2d2720bc6458b457f": false, + "572b7fa524597762b747ce82": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "57c5ac0824597754771e88a9": false, + "57cd379a24597778e7682ecf": false, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "5811ce772459770e9e5f9532": false, + "584984812459776a704a82a6": true, + "5857a8bc2459772bad15db29": false, + "58864a4f2459770fcc257101": true, + "5887431f2459777e1612938f": true, + "58948c8e86f77409493f7266": true, + "58949dea86f77409483e16a8": true, + "58949edd86f77409483e16a9": true, + "5894a05586f774094708ef75": false, + "5894a13e86f7742405482982": true, + "5894a2c386f77427140b8342": true, + "5894a42086f77426d2590762": true, + "5894a51286f77426d13baf02": true, + "5894a5b586f77426d2590767": true, + "5894a73486f77426d259076c": true, + "5894a81786f77427140b8347": true, + "58d3db5386f77426186285a0": false, + "58dd3ad986f77403051cba8f": false, + "590c5f0d86f77413997acfab": false, + "590c657e86f77412b013051d": true, + "590c661e86f7741e566b646a": false, + "590c678286f77426c9660122": true, + "590c695186f7741e566b64a2": false, + "5926bb2186f7744b1c6c6e60": true, + "5926c0df86f77462f647f764": true, + "5926c32286f774616e42de99": true, + "5926c36d86f77467a92a8629": true, + "5926c3b286f774640d189b6b": true, + "5926d2be86f774134d668e4e": true, + "5926d3c686f77410de68ebc8": true, + "5926e16e86f7742f5a0f7ecb": true, + "592c2d1a86f7746dbe2af32a": true, + "595cf16b86f77427440c32e2": true, + "59bffbb386f77435b379b9c2": true, + "59bffc1f86f77435b128b872": true, + "59c6633186f7740cf0493bb9": true, + "59ccfdba86f7747f2109a587": true, + "59d36a0086f7747e673f3946": true, + "5a0c27731526d80618476ac4": false, + "5aa2a7e8e5b5b00016327c16": false, + "5aa7d03ae5b5b00016327db5": false, + "5aafbde786f774389d0cbc0f": false, + "5ab8f39486f7745cd93a1cca": false, + "5ae30bad5acfc400185c2dc4": false, + "5ae30db85acfc408fb139a05": false, + "5ae30e795acfc408fb139a0b": false, + "5af0454c86f7746bf20992e8": false, + "5b44c8ea86f7742d1627baf1": false, + "5bfea6e90db834001b7347f3": false, + "5bfea7ad0db834001c38f1ee": false, + "5bfeaa0f0db834001b734927": false, + "5bfeb32b0db834001a6694d9": false, + "5bfebc320db8340019668d79": false, + "5bfebc5e0db834001a6694e5": false, + "5c0e530286f7747fa1419862": false, + "5c0e655586f774045612eeb2": false, + "5c0e9f2c86f77432297fe0a3": false, + "5c165d832e2216398b5a7e36": false, + "5c18b90d2e2216152142466b": false, + "5c18b9192e2216398b5a8104": false, + "5c488a752e221602b412af63": false, + "5c48a14f2e2216152006edd7": false, + "5c48a2852e221602b21d5923": false, + "5c48a2a42e221602b66d1e07": false, + "5c48a2c22e221602b313fb6c": false, + "5cadc190ae921500103bb3b6": false, + "5cadc1c6ae9215000f2775a4": false, + "5cadc2e0ae9215051e1c21e7": false, + "5cadc390ae921500126a77f1": false, + "5cadc431ae921500113bb8d5": false, + "5cadc55cae921500103bb3be": false, + "5cadd919ae921500126a77f3": false, + "5cadd940ae9215051e1c2316": false, + "5d02778e86f774203e7dedbe": false, + "5d02797c86f774203f38e30a": false, + "5d1b36a186f7742523398433": false, + "5d1b371186f774253763a656": false, + "5d2f213448f0355009199284": false, + "5d403f9186f7743cac3f229b": false, + "5d5d85c586f774279a21cbdb": false, + "5d5d940f86f7742797262046": false, + "5d5e9c74a4b9364855191c40": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e4d34ca86f774264f758330": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e8488fa988a8701445df1e4": false, + "5e870397991fd70db46995c8": false, + "5e87071478f43e51ca2de5e1": false, + "5e87076ce2db31558c75a11d": false, + "5e87080c81c4ed43e83cefda": false, + "5e8708d4ae379e67d22e0102": false, + "5e87114fe2db31558c75a120": false, + "5e87116b81c4ed43e83cefdd": false, + "5e9dcf5986f7746c417435b3": false, + "5f4f9eb969cdc30ff33f09db": false + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608815684 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "standard", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Usec", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49444ae6628187a2e77b8", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49444ae6628187a2e77b8", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "f5e6bdac05e699d687993249", + "_tpl": "544a11ac4bdc2d470e8b456a", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "SecuredContainer" + }, { + "_id": "01e9d751f10e4e9aebdd94d5", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Pockets" + }, { + "_id": "5fe49444ae6628187a2e78b8", + "_tpl": "566abbc34bdc2d92178b4576" + }, { + "_id": "5fe49444ae6628187a2e78ba", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49444ae6628187a2e78b9", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + }, { + "_id": "5fe4977574f15b4ad31b661b", + "_tpl": "5bffdc370db834001d23eca8", + "parentId": "5fe49444ae6628187a2e77b8", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 80, + "MaxDurability": 80 + } + } + } + ], + "questRaidItems": "5fe49444ae6628187a2e78b9", + "questStashItems": "5fe49444ae6628187a2e78ba", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49444ae6628187a2e78b8" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cde9ec17d6c8b04723cf479", + "5cde9e957d6c8b0474535da7" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0, + "jaegerUnlocked": false + }, + "weaponbuilds": {} + } }, - "usec": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] + "Standard": { + "descriptionLocaleKey": "launcher-profile_standard", + "bear": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cc0858d14c02e000c6bea66", + "Feet": "5cc085bb14c02e000e67a5c5", + "Hands": "5cc0876314c02e000c6bea6b", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5448bd6b4bdc2dfc2f8b4569": false, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "54491bb74bdc2d09088b4567": false, + "544a11ac4bdc2d470e8b456a": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "557ffd194bdc2d28148b457f": false, + "55d480c04bdc2d1d4e8b456a": false, + "55d7217a4bdc2d86028b456d": false, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5648b1504bdc2d9d488b4584": false, + "5649ad3f4bdc2df8348b4585": false, + "5649ade84bdc2d1b2b8b4587": false, + "564ca99c4bdc2d16268b4589": false, + "566abbc34bdc2d92178b4576": false, + "56d59d3ad2720bdb418b4577": false, + "56dfef82d2720bbd668b4567": true, + "56dff3afd2720bba668b4567": false, + "5710c24ad2720bc3458b45a3": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "576a581d2459771e7b1bc4f1": true, + "576a5ed62459771e9c2096cb": false, + "576a63cd2459771e796e0e11": false, + "576a7c512459771e796e0e17": true, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "590c5d4b86f774784e1b9c45": false, + "590c5f0d86f77413997acfab": false, + "590c661e86f7741e566b646a": false, + "59984ab886f7743e98271174": false, + "5998517986f7746017232f7e": false, + "599851db86f77467372f0a18": false, + "5998597786f77414ea6da093": false, + "59985a8086f77414ec448d1a": false, + "599860ac86f77436b225ed1a": false, + "599860e986f7743bb57573a6": false, + "59c6633186f7740cf0493bb9": false, + "59ccd11386f77428f24a488f": false, + "59d36a0086f7747e673f3946": true, + "5a0c27731526d80618476ac4": false, + "5aa2b87de5b5b00016327c25": false, + "5ac4cd105acfc40016339859": false, + "5ac50c185acfc400163398d4": false, + "5ac50da15acfc4001718d287": false, + "5ac72e475acfc400180ae6fe": false, + "5ac7655e5acfc40016339a19": false, + "5b40e5e25acfc4001a599bea": false, + "5b432b965acfc47a8774094e": false, + "5bffdc370db834001d23eca8": false, + "5ca20abf86f77418567a43f2": false, + "5ca20d5986f774331e7c9602": false, + "5d1b371186f774253763a656": false, + "5d40407c86f774318526545a": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e831507ea0a7c419c2f9bd9": false + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608816501 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "standard", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Bear", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe4977574f15b4ad31b6631", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe4977574f15b4ad31b6631", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "5fe4977574f15b4ad31b661a", + "_tpl": "5ac4cd105acfc40016339859", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6612", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "5fe4977574f15b4ad31b661a", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4977574f15b4ad31b6611", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4977574f15b4ad31b6612", + "slotId": "mod_handguard" + }, { + "_id": "5fe4977574f15b4ad31b6613", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "5fe4977574f15b4ad31b661a", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4977574f15b4ad31b6614", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "5fe4977574f15b4ad31b661a", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4977574f15b4ad31b6615", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "5fe4977574f15b4ad31b661a", + "slotId": "mod_reciever" + }, { + "_id": "5fe4977574f15b4ad31b6616", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "5fe4977574f15b4ad31b661a", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6617", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "5fe4977574f15b4ad31b661a", + "slotId": "mod_stock" + }, { + "_id": "5fe4977574f15b4ad31b6619", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "5fe4977574f15b4ad31b661a", + "slotId": "mod_magazine" + }, { + "_id": "5fe4977574f15b4ad31b6618", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "5fe4977574f15b4ad31b6619", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b661b", + "_tpl": "5bffdc370db834001d23eca8", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 80, + "MaxDurability": 80 + } + } + }, { + "_id": "5fe4977574f15b4ad31b661c", + "_tpl": "5b40e5e25acfc4001a599bea", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6624", + "_tpl": "5ca20abf86f77418567a43f2", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "TacticalVest" + }, { + "_id": "5fe4977574f15b4ad31b661e", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b6624", + "slotId": "1" + }, { + "_id": "5fe4977574f15b4ad31b661d", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4977574f15b4ad31b661e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6620", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b6624", + "slotId": "2" + }, { + "_id": "5fe4977574f15b4ad31b661f", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4977574f15b4ad31b6620", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6622", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b6624", + "slotId": "3" + }, { + "_id": "5fe4977574f15b4ad31b6621", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4977574f15b4ad31b6622", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6623", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b6624", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6625", + "_tpl": "544a11ac4bdc2d470e8b456a", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "SecuredContainer" + }, { + "_id": "5fe4977574f15b4ad31b662a", + "_tpl": "5ca20d5986f774331e7c9602", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "Backpack" + }, { + "_id": "5fe4977574f15b4ad31b6626", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b662a", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4977574f15b4ad31b6627", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 1 + }, + "parentId": "5fe4977574f15b4ad31b662a", + "slotId": "main", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6628", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b662a", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6629", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b662a", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4977574f15b4ad31b662b", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4977574f15b4ad31b662f", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "Pockets" + }, { + "_id": "5fe4977574f15b4ad31b662c", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b662f", + "slotId": "pocket1" + }, { + "_id": "5fe4977574f15b4ad31b662d", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b662f", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4977574f15b4ad31b662e", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b662f", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6630", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe4977574f15b4ad31b6631", + "slotId": "Earpiece" + }, { + "_id": "5fe4977574f15b4ad31b66b6", + "_tpl": "566abbc34bdc2d92178b4576" + }, { + "_id": "5fe4977574f15b4ad31b6632", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6633", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6634", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 12 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6635", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6636", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6638", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6637", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6638", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b6639", + "_tpl": "5710c24ad2720bc3458b45a3", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 12 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b663a", + "_tpl": "5ca20abf86f77418567a43f2", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b663b", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b663c", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 16 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4977574f15b4ad31b663d", + "_tpl": "5d40407c86f774318526545a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4977574f15b4ad31b663e", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4977574f15b4ad31b6640", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b663f", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6640", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6641", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6642", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6643", + "_tpl": "5b40e5e25acfc4001a599bea", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6644", + "_tpl": "5b432b965acfc47a8774094e", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 10 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6645", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4977574f15b4ad31b6647", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6646", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6647", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b6649", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6648", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6649", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b664b", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b664a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b664b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b664d", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 5 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b664c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b664d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b664f", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b664e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b664f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b6650", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4977574f15b4ad31b6651", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4977574f15b4ad31b6653", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6652", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6653", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b6654", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4977574f15b4ad31b6655", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4977574f15b4ad31b6656", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4977574f15b4ad31b6657", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4977574f15b4ad31b6659", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6658", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6659", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b665b", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b665a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b665b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b665d", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b665c", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b665d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b665f", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b665e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b665f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6661", + "_tpl": "599860ac86f77436b225ed1a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6660", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6661", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6662", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 10 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6663", + "_tpl": "5ca20d5986f774331e7c9602", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 10 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6664", + "_tpl": "56dfef82d2720bbd668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 14 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4977574f15b4ad31b6665", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6666", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe4977574f15b4ad31b6667", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 18 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6668", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 20 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6669", + "_tpl": "56dff3afd2720bba668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe4977574f15b4ad31b666a", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b666b", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b666c", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b666d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4977574f15b4ad31b666e", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe4977574f15b4ad31b6670", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 15 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b666f", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4977574f15b4ad31b6670", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6672", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 15 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6671", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4977574f15b4ad31b6672", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6674", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 15 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6673", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4977574f15b4ad31b6674", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6676", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 15 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6675", + "_tpl": "56dff3afd2720bba668b4567", + "parentId": "5fe4977574f15b4ad31b6676", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6677", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6678", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6679", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4977574f15b4ad31b667a", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4977574f15b4ad31b667b", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe4977574f15b4ad31b667c", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 18 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4977574f15b4ad31b667d", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4977574f15b4ad31b667e", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 15 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe4977574f15b4ad31b667f", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6680", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 18 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6681", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6682", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6683", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6684", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6685", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6686", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 19 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6687", + "_tpl": "590c5d4b86f774784e1b9c45", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 17 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6689", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b6688", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6689", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b668b", + "_tpl": "576a5ed62459771e9c2096cb", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 4 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout" + }, { + "_id": "5fe4977574f15b4ad31b668a", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b668b", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b668c", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 9 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4977574f15b4ad31b668d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe4977574f15b4ad31b668e", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 20 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4977574f15b4ad31b668f", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 20 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6693", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6691", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4977574f15b4ad31b6693", + "slotId": "mod_magazine" + }, { + "_id": "5fe4977574f15b4ad31b6690", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6691", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b6692", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4977574f15b4ad31b6693", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4977574f15b4ad31b669d", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b6694", + "_tpl": "5998517986f7746017232f7e", + "parentId": "5fe4977574f15b4ad31b669d", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4977574f15b4ad31b6695", + "_tpl": "599851db86f77467372f0a18", + "parentId": "5fe4977574f15b4ad31b669d", + "slotId": "mod_stock" + }, { + "_id": "5fe4977574f15b4ad31b6697", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "5fe4977574f15b4ad31b669d", + "slotId": "mod_magazine" + }, { + "_id": "5fe4977574f15b4ad31b6696", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b6697", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b6698", + "_tpl": "5998597786f77414ea6da093", + "parentId": "5fe4977574f15b4ad31b669d", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4977574f15b4ad31b6699", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "5fe4977574f15b4ad31b669d", + "slotId": "mod_reciever" + }, { + "_id": "5fe4977574f15b4ad31b669a", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "5fe4977574f15b4ad31b669d", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4977574f15b4ad31b669c", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "5fe4977574f15b4ad31b669d", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4977574f15b4ad31b669b", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4977574f15b4ad31b669c", + "slotId": "mod_handguard" + }, { + "_id": "5fe4977574f15b4ad31b66a1", + "_tpl": "576a581d2459771e7b1bc4f1", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b669f", + "_tpl": "576a5ed62459771e9c2096cb", + "parentId": "5fe4977574f15b4ad31b66a1", + "slotId": "mod_magazine" + }, { + "_id": "5fe4977574f15b4ad31b669e", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b669f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 18 + } + }, { + "_id": "5fe4977574f15b4ad31b66a0", + "_tpl": "576a63cd2459771e796e0e11", + "parentId": "5fe4977574f15b4ad31b66a1", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4977574f15b4ad31b66ab", + "_tpl": "59984ab886f7743e98271174", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b66a2", + "_tpl": "5998517986f7746017232f7e", + "parentId": "5fe4977574f15b4ad31b66ab", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4977574f15b4ad31b66a3", + "_tpl": "599851db86f77467372f0a18", + "parentId": "5fe4977574f15b4ad31b66ab", + "slotId": "mod_stock" + }, { + "_id": "5fe4977574f15b4ad31b66a5", + "_tpl": "599860ac86f77436b225ed1a", + "parentId": "5fe4977574f15b4ad31b66ab", + "slotId": "mod_magazine" + }, { + "_id": "5fe4977574f15b4ad31b66a4", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe4977574f15b4ad31b66a5", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b66a6", + "_tpl": "5998597786f77414ea6da093", + "parentId": "5fe4977574f15b4ad31b66ab", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4977574f15b4ad31b66a7", + "_tpl": "59985a8086f77414ec448d1a", + "parentId": "5fe4977574f15b4ad31b66ab", + "slotId": "mod_reciever" + }, { + "_id": "5fe4977574f15b4ad31b66a8", + "_tpl": "599860e986f7743bb57573a6", + "parentId": "5fe4977574f15b4ad31b66ab", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4977574f15b4ad31b66aa", + "_tpl": "59ccd11386f77428f24a488f", + "parentId": "5fe4977574f15b4ad31b66ab", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4977574f15b4ad31b66a9", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4977574f15b4ad31b66aa", + "slotId": "mod_handguard" + }, { + "_id": "5fe4977574f15b4ad31b66b5", + "_tpl": "5ac4cd105acfc40016339859", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 15 + }, + "parentId": "5fe4977574f15b4ad31b66b6", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Foldable": { + "Folded": false + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe4977574f15b4ad31b66ad", + "_tpl": "59c6633186f7740cf0493bb9", + "parentId": "5fe4977574f15b4ad31b66b5", + "slotId": "mod_gas_block" + }, { + "_id": "5fe4977574f15b4ad31b66ac", + "_tpl": "5648b1504bdc2d9d488b4584", + "parentId": "5fe4977574f15b4ad31b66ad", + "slotId": "mod_handguard" + }, { + "_id": "5fe4977574f15b4ad31b66ae", + "_tpl": "5ac7655e5acfc40016339a19", + "parentId": "5fe4977574f15b4ad31b66b5", + "slotId": "mod_muzzle" + }, { + "_id": "5fe4977574f15b4ad31b66af", + "_tpl": "5649ade84bdc2d1b2b8b4587", + "parentId": "5fe4977574f15b4ad31b66b5", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe4977574f15b4ad31b66b0", + "_tpl": "5ac50da15acfc4001718d287", + "parentId": "5fe4977574f15b4ad31b66b5", + "slotId": "mod_reciever" + }, { + "_id": "5fe4977574f15b4ad31b66b1", + "_tpl": "5ac72e475acfc400180ae6fe", + "parentId": "5fe4977574f15b4ad31b66b5", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe4977574f15b4ad31b66b2", + "_tpl": "5ac50c185acfc400163398d4", + "parentId": "5fe4977574f15b4ad31b66b5", + "slotId": "mod_stock" + }, { + "_id": "5fe4977574f15b4ad31b66b4", + "_tpl": "55d480c04bdc2d1d4e8b456a", + "parentId": "5fe4977574f15b4ad31b66b5", + "slotId": "mod_magazine" + }, { + "_id": "5fe4977574f15b4ad31b66b3", + "_tpl": "56dfef82d2720bbd668b4567", + "parentId": "5fe4977574f15b4ad31b66b4", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe4977574f15b4ad31b66b8", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe4977574f15b4ad31b66b7", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + } + ], + "questRaidItems": "5fe4977574f15b4ad31b66b7", + "questStashItems": "5fe4977574f15b4ad31b66b8", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe4977574f15b4ad31b66b6" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": { + "Items": [] + }, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cd946231388ce000d572fe3", + "5cd945d71388ce000a659dfb" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0, + "jaegerUnlocked": false + }, + "weaponbuilds": {} }, - "Customization": { - "Body": "5cde95d97d6c8b647a3769b0", - "Feet": "5cde95ef7d6c8b04713c4f2d", - "Hands": "5cde95fa7d6c8b04737c2d13", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447a9cd4bdc2dbd208b4567": false, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448be9a4bdc2dfd2f8b456a": true, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "54491bb74bdc2d09088b4567": false, - "544a11ac4bdc2d470e8b456a": false, - "544a38634bdc2d58388b4568": false, - "544a5caa4bdc2d1a388b4568": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "544fb3f34bdc2d03748b456a": true, - "544fb45d4bdc2dee738b4568": true, - "54527a984bdc2d4e668b4567": false, - "545cdae64bdc2d39198b4568": true, - "545cdb794bdc2d3a198b456a": true, - "557ff21e4bdc2d89578b4586": false, - "557ffd194bdc2d28148b457f": false, - "55801eed4bdc2d89578b4588": true, - "559ba5b34bdc2d1f1a8b4582": true, - "55d355e64bdc2d962f8b4569": false, - "55d3632e4bdc2d972f8b4569": false, - "55d44fd14bdc2d962f8b456e": false, - "55d459824bdc2d892f8b4573": false, - "55d482194bdc2d1d4e8b456b": true, - "55d4887d4bdc2d962f8b4570": false, - "55d4ae6c4bdc2d8b2f8b456e": false, - "55d4af3a4bdc2d972f8b456f": false, - "55d4b9964bdc2d1d4e8b456e": false, - "55d5f46a4bdc2d1b198b4567": false, - "55d7217a4bdc2d86028b456d": false, - "56083e1b4bdc2dc8488b4572": true, - "56083eab4bdc2d26448b456a": true, - "560d5e524bdc2d25448b4571": false, - "560e620e4bdc2d724b8b456b": true, - "5644bd2b4bdc2d3b4c8b4572": true, - "5645bc214bdc2d363b8b4571": true, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b0744bdc2d363b8b4578": false, - "5649aa744bdc2ded0b8b457e": false, - "5649ad3f4bdc2df8348b4585": false, - "5649af094bdc2df8348b4586": false, - "5649b0544bdc2d1b2b8b458a": true, - "5649b1c04bdc2d16268b457c": false, - "5649be884bdc2d79388b4577": false, - "564ca99c4bdc2d16268b4589": false, - "567143bf4bdc2d1a0f8b4567": true, - "5696686a4bdc2da3298b456a": false, - "569668774bdc2da2298b4568": false, - "56d59856d2720bd8418b456a": false, - "56d59948d2720bb7418b4582": false, - "56d59d3ad2720bdb418b4577": false, - "56d5a1f7d2720bb3418b456a": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56d5a661d2720bd8418b456b": false, - "56d5a77ed2720b90418b4568": false, - "56dfef82d2720bbd668b4567": true, - "56ea8222d2720b69698b4567": true, - "56ea8d2fd2720b7c698b4570": false, - "570fd6c2d2720bc6458b457f": false, - "572b7fa524597762b747ce82": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "57c5ac0824597754771e88a9": false, - "57cd379a24597778e7682ecf": false, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "5811ce772459770e9e5f9532": false, - "584984812459776a704a82a6": true, - "5857a8bc2459772bad15db29": false, - "58864a4f2459770fcc257101": true, - "5887431f2459777e1612938f": true, - "58948c8e86f77409493f7266": true, - "58949dea86f77409483e16a8": true, - "58949edd86f77409483e16a9": true, - "5894a05586f774094708ef75": false, - "5894a13e86f7742405482982": true, - "5894a2c386f77427140b8342": true, - "5894a42086f77426d2590762": true, - "5894a51286f77426d13baf02": true, - "5894a5b586f77426d2590767": true, - "5894a73486f77426d259076c": true, - "5894a81786f77427140b8347": true, - "58d3db5386f77426186285a0": false, - "58dd3ad986f77403051cba8f": false, - "590c5f0d86f77413997acfab": false, - "590c657e86f77412b013051d": true, - "590c661e86f7741e566b646a": false, - "590c678286f77426c9660122": true, - "590c695186f7741e566b64a2": false, - "5926bb2186f7744b1c6c6e60": true, - "5926c0df86f77462f647f764": true, - "5926c32286f774616e42de99": true, - "5926c36d86f77467a92a8629": true, - "5926c3b286f774640d189b6b": true, - "5926d2be86f774134d668e4e": true, - "5926d3c686f77410de68ebc8": true, - "5926e16e86f7742f5a0f7ecb": true, - "592c2d1a86f7746dbe2af32a": true, - "595cf16b86f77427440c32e2": true, - "59bffbb386f77435b379b9c2": true, - "59bffc1f86f77435b128b872": true, - "59c6633186f7740cf0493bb9": true, - "59ccfdba86f7747f2109a587": true, - "59d36a0086f7747e673f3946": true, - "5a0c27731526d80618476ac4": false, - "5aa2a7e8e5b5b00016327c16": false, - "5aa7d03ae5b5b00016327db5": false, - "5aafbde786f774389d0cbc0f": false, - "5ab8f39486f7745cd93a1cca": false, - "5ae30bad5acfc400185c2dc4": false, - "5ae30db85acfc408fb139a05": false, - "5ae30e795acfc408fb139a0b": false, - "5af0454c86f7746bf20992e8": false, - "5b44c8ea86f7742d1627baf1": false, - "5bfea6e90db834001b7347f3": false, - "5bfea7ad0db834001c38f1ee": false, - "5bfeaa0f0db834001b734927": false, - "5bfeb32b0db834001a6694d9": false, - "5bfebc320db8340019668d79": false, - "5bfebc5e0db834001a6694e5": false, - "5c0e530286f7747fa1419862": false, - "5c0e655586f774045612eeb2": false, - "5c0e9f2c86f77432297fe0a3": false, - "5c165d832e2216398b5a7e36": false, - "5c18b90d2e2216152142466b": false, - "5c18b9192e2216398b5a8104": false, - "5c488a752e221602b412af63": false, - "5c48a14f2e2216152006edd7": false, - "5c48a2852e221602b21d5923": false, - "5c48a2a42e221602b66d1e07": false, - "5c48a2c22e221602b313fb6c": false, - "5cadc190ae921500103bb3b6": false, - "5cadc1c6ae9215000f2775a4": false, - "5cadc2e0ae9215051e1c21e7": false, - "5cadc390ae921500126a77f1": false, - "5cadc431ae921500113bb8d5": false, - "5cadc55cae921500103bb3be": false, - "5cadd919ae921500126a77f3": false, - "5cadd940ae9215051e1c2316": false, - "5d02778e86f774203e7dedbe": false, - "5d02797c86f774203f38e30a": false, - "5d1b36a186f7742523398433": false, - "5d1b371186f774253763a656": false, - "5d2f213448f0355009199284": false, - "5d403f9186f7743cac3f229b": false, - "5d5d85c586f774279a21cbdb": false, - "5d5d940f86f7742797262046": false, - "5d5e9c74a4b9364855191c40": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e4d34ca86f774264f758330": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e8488fa988a8701445df1e4": false, - "5e870397991fd70db46995c8": false, - "5e87071478f43e51ca2de5e1": false, - "5e87076ce2db31558c75a11d": false, - "5e87080c81c4ed43e83cefda": false, - "5e8708d4ae379e67d22e0102": false, - "5e87114fe2db31558c75a120": false, - "5e87116b81c4ed43e83cefdd": false, - "5e9dcf5986f7746c417435b3": false, - "5f4f9eb969cdc30ff33f09db": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608815684 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "standard", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Usec", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49444ae6628187a2e77b8", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49444ae6628187a2e77b8", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "f5e6bdac05e699d687993249", - "_tpl": "544a11ac4bdc2d470e8b456a", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "SecuredContainer" - }, - { - "_id": "01e9d751f10e4e9aebdd94d5", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Pockets" - }, - { - "_id": "5fe49444ae6628187a2e78b8", - "_tpl": "566abbc34bdc2d92178b4576" - }, - { - "_id": "5fe49444ae6628187a2e78ba", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49444ae6628187a2e78b9", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - }, - { - "_id": "5fe4977574f15b4ad31b661b", - "_tpl": "5bffdc370db834001d23eca8", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 80, - "MaxDurability": 80 - } - } - } - ], - "questRaidItems": "5fe49444ae6628187a2e78b9", - "questStashItems": "5fe49444ae6628187a2e78ba", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49444ae6628187a2e78b8" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cde9ec17d6c8b04723cf479", - "5cde9e957d6c8b0474535da7" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0, - "jaegerUnlocked": false - }, - "weaponbuilds": {} + "usec": { + "character": { + "BackendCounters": {}, + "Bonuses": [{ + "id": "64f5b9e5fa34f11b380756c0", + "templateId": "566abbc34bdc2d92178b4576", + "type": "StashSize" + } + ], + "ConditionCounters": { + "Counters": [] + }, + "Customization": { + "Body": "5cde95d97d6c8b647a3769b0", + "Feet": "5cde95ef7d6c8b04713c4f2d", + "Hands": "5cde95fa7d6c8b04737c2d13", + "Head": "__REPLACEME__" + }, + "Encyclopedia": { + "5447a9cd4bdc2dbd208b4567": false, + "5448bd6b4bdc2dfc2f8b4569": false, + "5448c12b4bdc2d02308b456f": false, + "5448fee04bdc2dbc018b4567": false, + "5449016a4bdc2d6f028b456f": false, + "54491bb74bdc2d09088b4567": false, + "544a11ac4bdc2d470e8b456a": false, + "544a38634bdc2d58388b4568": false, + "544a5cde4bdc2d39388b456b": false, + "544fb25a4bdc2dfb738b4567": false, + "544fb3364bdc2d34748b456a": false, + "544fb37f4bdc2dee738b4567": false, + "54527a984bdc2d4e668b4567": false, + "557ffd194bdc2d28148b457f": false, + "55d355e64bdc2d962f8b4569": false, + "55d3632e4bdc2d972f8b4569": false, + "55d44fd14bdc2d962f8b456e": false, + "55d459824bdc2d892f8b4573": false, + "55d4887d4bdc2d962f8b4570": false, + "55d4ae6c4bdc2d8b2f8b456e": false, + "55d4af3a4bdc2d972f8b456f": false, + "55d4b9964bdc2d1d4e8b456e": false, + "55d5f46a4bdc2d1b198b4567": false, + "55d7217a4bdc2d86028b456d": false, + "5645bcc04bdc2d363b8b4572": false, + "5648a7494bdc2d9d488b4583": false, + "5649ad3f4bdc2df8348b4585": false, + "5649be884bdc2d79388b4577": false, + "564ca99c4bdc2d16268b4589": false, + "566abbc34bdc2d92178b4576": false, + "56d59856d2720bd8418b456a": false, + "56d59948d2720bb7418b4582": false, + "56d59d3ad2720bdb418b4577": false, + "56d5a1f7d2720bb3418b456a": false, + "56d5a2bbd2720bb8418b456a": true, + "56d5a407d2720bb3418b456b": true, + "56d5a661d2720bd8418b456b": false, + "56d5a77ed2720b90418b4568": false, + "56dfef82d2720bbd668b4567": true, + "56ea8d2fd2720b7c698b4570": false, + "572b7fa524597762b747ce82": false, + "57347d7224597744596b4e72": false, + "57347da92459774491567cf5": false, + "573718ba2459775a75491131": false, + "5751a25924597722c463c472": false, + "5755356824597772cb798962": false, + "5755383e24597772cb798966": false, + "57dc2fa62459775949412633": false, + "57dc324a24597759501edc20": true, + "57dc32dc245977596d4ef3d3": false, + "57dc334d245977597164366f": true, + "57dc347d245977596754e7a1": false, + "58864a4f2459770fcc257101": false, + "58d3db5386f77426186285a0": false, + "590c5f0d86f77413997acfab": false, + "590c661e86f7741e566b646a": false, + "5926bb2186f7744b1c6c6e60": false, + "5926c0df86f77462f647f764": false, + "5926c32286f774616e42de99": false, + "5926c36d86f77467a92a8629": false, + "5926c3b286f774640d189b6b": false, + "5926d2be86f774134d668e4e": false, + "5926d3c686f77410de68ebc8": false, + "5926e16e86f7742f5a0f7ecb": false, + "59d36a0086f7747e673f3946": true, + "5a0c27731526d80618476ac4": false, + "5aa2a7e8e5b5b00016327c16": false, + "5ab8f39486f7745cd93a1cca": false, + "5ae30bad5acfc400185c2dc4": false, + "5ae30db85acfc408fb139a05": false, + "5ae30e795acfc408fb139a0b": false, + "5b44c8ea86f7742d1627baf1": false, + "5c0e9f2c86f77432297fe0a3": false, + "5cadc190ae921500103bb3b6": false, + "5cadc1c6ae9215000f2775a4": false, + "5cadc2e0ae9215051e1c21e7": false, + "5cadc390ae921500126a77f1": false, + "5cadc431ae921500113bb8d5": false, + "5cadc55cae921500103bb3be": false, + "5cadd919ae921500126a77f3": false, + "5cadd940ae9215051e1c2316": false, + "5d1b371186f774253763a656": false, + "5d2f213448f0355009199284": false, + "5d403f9186f7743cac3f229b": false, + "5e2af47786f7746d404f3aaa": false, + "5e2af4a786f7746d3f3c3400": false, + "5e4d34ca86f774264f758330": false, + "5e831507ea0a7c419c2f9bd9": false, + "5e9dcf5986f7746c417435b3": false + }, + "Health": { + "BodyParts": { + "Chest": { + "Health": { + "Current": 85, + "Maximum": 85 + } + }, + "Head": { + "Health": { + "Current": 35, + "Maximum": 35 + } + }, + "LeftArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "LeftLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "RightArm": { + "Health": { + "Current": 60, + "Maximum": 60 + } + }, + "RightLeg": { + "Health": { + "Current": 65, + "Maximum": 65 + } + }, + "Stomach": { + "Health": { + "Current": 70, + "Maximum": 70 + } + } + }, + "Energy": { + "Current": 100, + "Maximum": 100 + }, + "Hydration": { + "Current": 100, + "Maximum": 100 + }, + "Temperature": { + "Current": 36.6, + "Maximum": 40 + }, + "UpdateTime": 1608817888 + }, + "Hideout": { + "Areas": [{ + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 1, + "passiveBonusesEnabled": true, + "slots": [], + "type": 3 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 0 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 1 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 2 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 4 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 5 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 6 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 7 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 8 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 9 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 10 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 11 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 12 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 13 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 14 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 15 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 16 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": false, + "slots": [], + "type": 17 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 18 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 19 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 20 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 21 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 22 + }, { + "active": true, + "completeTime": 0, + "constructing": false, + "lastRecipe": "", + "level": 0, + "passiveBonusesEnabled": true, + "slots": [], + "type": 23 + } + ], + "Improvement": {}, + "Production": {} + }, + "Info": { + "AccountType": 0, + "BannedState": false, + "BannedUntil": 0, + "Bans": [], + "Experience": 0, + "GameVersion": "standard", + "IsStreamerModeAvailable": false, + "LastTimePlayedAsSavage": 0, + "Level": 1, + "LowerNickname": "__REPLACEME__", + "MemberCategory": 0, + "Nickname": "__REPLACEME__", + "NicknameChangeDate": 0, + "RegistrationDate": "__REPLACEME__", + "SavageLockTime": 0, + "Settings": { + "BotDifficulty": "easy", + "Experience": -1, + "Role": "assault" + }, + "Side": "Usec", + "SquadInviteRestriction": false, + "Voice": "__REPLACEME__", + "lockedMoveCommands": true + }, + "InsuredItems": [], + "Inventory": { + "equipment": "5fe49cdfa19cac3fa905407f", + "fastPanel": {}, + "hideoutAreaStashes": {}, + "items": [{ + "_id": "5fe49cdfa19cac3fa905407f", + "_tpl": "55d7217a4bdc2d86028b456d" + }, { + "_id": "63db64cbf9963741dc0d741f", + "_tpl": "6401c7b213d9b818bf0e7dd7" + }, { + "_id": "5fe49cdfa19cac3fa9054068", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "FirstPrimaryWeapon", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905405c", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe49cdfa19cac3fa9054068", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49cdfa19cac3fa905405e", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe49cdfa19cac3fa9054068", + "slotId": "mod_magazine" + }, { + "_id": "5fe49cdfa19cac3fa905405d", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa905405e", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa9054064", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe49cdfa19cac3fa9054068", + "slotId": "mod_reciever" + }, { + "_id": "5fe49cdfa19cac3fa9054061", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe49cdfa19cac3fa9054064", + "slotId": "mod_barrel" + }, { + "_id": "5fe49cdfa19cac3fa905405f", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe49cdfa19cac3fa9054061", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49cdfa19cac3fa9054060", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe49cdfa19cac3fa9054061", + "slotId": "mod_gas_block" + }, { + "_id": "5fe49cdfa19cac3fa9054062", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe49cdfa19cac3fa9054064", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe49cdfa19cac3fa9054062", + "slotId": "mod_handguard" + }, { + "_id": "5fe49cdfa19cac3fa9054063", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe49cdfa19cac3fa9054064", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054066", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe49cdfa19cac3fa9054068", + "slotId": "mod_stock" + }, { + "_id": "5fe49cdfa19cac3fa9054065", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe49cdfa19cac3fa9054066", + "slotId": "mod_stock_000" + }, { + "_id": "5fe49cdfa19cac3fa9054067", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe49cdfa19cac3fa9054068", + "slotId": "mod_charge" + }, { + "_id": "5fe49cdfa19cac3fa9054069", + "_tpl": "54491bb74bdc2d09088b4567", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "Scabbard", + "upd": { + "Repairable": { + "Durability": 70, + "MaxDurability": 70 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905406a", + "_tpl": "572b7fa524597762b747ce82", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "FaceCover", + "upd": { + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905406b", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "Headwear", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054073", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "TacticalVest" + }, { + "_id": "5fe49cdfa19cac3fa905406d", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054073", + "slotId": "1" + }, { + "_id": "5fe49cdfa19cac3fa905406c", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa905406d", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa905406f", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054073", + "slotId": "2" + }, { + "_id": "5fe49cdfa19cac3fa905406e", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa905406f", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa9054071", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054073", + "slotId": "3" + }, { + "_id": "5fe49cdfa19cac3fa9054070", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa9054071", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa9054072", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054073", + "slotId": "4", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054074", + "_tpl": "544a11ac4bdc2d470e8b456a", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "SecuredContainer" + }, { + "_id": "5fe49cdfa19cac3fa9054078", + "_tpl": "5e9dcf5986f7746c417435b3", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "Backpack" + }, { + "_id": "5fe49cdfa19cac3fa9054075", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054078", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054076", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054078", + "slotId": "main", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054077", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054078", + "slotId": "main", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe49cdfa19cac3fa9054079", + "_tpl": "5648a7494bdc2d9d488b4583", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "ArmorVest", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905407d", + "_tpl": "627a4e6b255f7527fb05a0f6", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "Pockets" + }, { + "_id": "5fe49cdfa19cac3fa905407a", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa905407d", + "slotId": "pocket1" + }, { + "_id": "5fe49cdfa19cac3fa905407b", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa905407d", + "slotId": "pocket2", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905407c", + "_tpl": "5751a25924597722c463c472", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa905407d", + "slotId": "pocket3", + "upd": { + "MedKit": { + "HpResource": 2 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905407e", + "_tpl": "5645bcc04bdc2d363b8b4572", + "parentId": "5fe49cdfa19cac3fa905407f", + "slotId": "Earpiece" + }, { + "_id": "5fe49cdfa19cac3fa9054115", + "_tpl": "566abbc34bdc2d92178b4576" + }, { + "_id": "5fe49cdfa19cac3fa9054080", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054081", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 9 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054082", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 13 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054084", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 4 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054083", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa9054084", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa9054086", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 14 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054085", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa9054086", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa9054087", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 14 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe49cdfa19cac3fa9054088", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 1, + "x": 9, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054089", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905408a", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa905408c", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 14 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa905408b", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa905408c", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa905408d", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa905408e", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054090", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 14 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa905408f", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa9054090", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa9054091", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 12 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054092", + "_tpl": "54527a984bdc2d4e668b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 15 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 60 + } + }, { + "_id": "5fe49cdfa19cac3fa9054093", + "_tpl": "590c661e86f7741e566b646a", + "location": { + "isSearched": true, + "r": 1, + "x": 8, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 220 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054094", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054095", + "_tpl": "5a0c27731526d80618476ac4", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 13 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054096", + "_tpl": "58d3db5386f77426186285a0", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 12 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054097", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054098", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 10 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa9054099", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905409a", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 3 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa905409b", + "_tpl": "590c5f0d86f77413997acfab", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905409c", + "_tpl": "5aa2a7e8e5b5b00016327c16", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 10, + "MaxDurability": 10 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905409d", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 3 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905409e", + "_tpl": "5448fee04bdc2dbc018b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 60 + } + } + }, { + "_id": "5fe49cdfa19cac3fa905409f", + "_tpl": "5755356824597772cb798962", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540a1", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540a0", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540a1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540a2", + "_tpl": "5e4d34ca86f774264f758330", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540a3", + "_tpl": "5d403f9186f7743cac3f229b", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540a4", + "_tpl": "5c0e9f2c86f77432297fe0a3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540a5", + "_tpl": "5648a7494bdc2d9d488b4583", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 0 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "Repairable": { + "Durability": 50, + "MaxDurability": 50 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540a6", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540a7", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540a8", + "_tpl": "5d1b371186f774253763a656", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 19 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 60 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540a9", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540aa", + "_tpl": "544fb25a4bdc2dfb738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540ab", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540ac", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540ad", + "_tpl": "544fb37f4bdc2dee738b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 17 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 4 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540af", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 5 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540ae", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540af", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540b0", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540b1", + "_tpl": "5e9dcf5986f7746c417435b3", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 9 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540b2", + "_tpl": "544fb3364bdc2d34748b456a", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540b3", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 17 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540b4", + "_tpl": "57347da92459774491567cf5", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 16 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FoodDrink": { + "HpPercent": 1 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540b6", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540b5", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540b6", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540b8", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 9, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540b7", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540b8", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540ba", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540b9", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540ba", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540bc", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540bb", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540bc", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540be", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540bd", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540be", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540bf", + "_tpl": "5755383e24597772cb798966", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 19 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "MedKit": { + "HpResource": 6 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540c0", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 1, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49cdfa19cac3fa90540c2", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 5 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540c1", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540c2", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540c3", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 2, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49cdfa19cac3fa90540c4", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540c6", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 2 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540c5", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540c6", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540c8", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 5 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540c7", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540c8", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540ca", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 3 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540c9", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540ca", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540cc", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540cb", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540cc", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540ce", + "_tpl": "5d2f213448f0355009199284", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540cd", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540ce", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540cf", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49cdfa19cac3fa90540d0", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 50 + } + }, { + "_id": "5fe49cdfa19cac3fa90540d1", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 8 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540d2", + "_tpl": "5e831507ea0a7c419c2f9bd9", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 18 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540d3", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 1 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe49cdfa19cac3fa90540d4", + "_tpl": "5449016a4bdc2d6f028b456f", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 1 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 250000 + } + }, { + "_id": "5fe49cdfa19cac3fa90540d6", + "_tpl": "55d4887d4bdc2d962f8b4570", + "location": { + "isSearched": true, + "r": 0, + "x": 8, + "y": 14 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540d5", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa90540d6", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa90540d7", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 6 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540d8", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 5, + "y": 6 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540da", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 6 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540d9", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540da", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540db", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540dc", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 6 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540dd", + "_tpl": "56d59d3ad2720bdb418b4577", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 7 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "StackObjectsCount": 25 + } + }, { + "_id": "5fe49cdfa19cac3fa90540de", + "_tpl": "5e2af47786f7746d404f3aaa", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 19 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540df", + "_tpl": "5e2af4a786f7746d3f3c3400", + "location": { + "isSearched": true, + "r": 0, + "x": 6, + "y": 20 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "Resource": { + "Value": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540e1", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 4 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540e0", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540e1", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540e3", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "location": { + "isSearched": true, + "r": 0, + "x": 4, + "y": 4 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout" + }, { + "_id": "5fe49cdfa19cac3fa90540e2", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540e3", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540ec", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 3 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540e5", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe49cdfa19cac3fa90540ec", + "slotId": "mod_barrel" + }, { + "_id": "5fe49cdfa19cac3fa90540e4", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe49cdfa19cac3fa90540e5", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49cdfa19cac3fa90540e6", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe49cdfa19cac3fa90540ec", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49cdfa19cac3fa90540e9", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe49cdfa19cac3fa90540ec", + "slotId": "mod_reciever" + }, { + "_id": "5fe49cdfa19cac3fa90540e7", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe49cdfa19cac3fa90540e9", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540e8", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe49cdfa19cac3fa90540e9", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540eb", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe49cdfa19cac3fa90540ec", + "slotId": "mod_magazine" + }, { + "_id": "5fe49cdfa19cac3fa90540ea", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540eb", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa90540f5", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 7, + "y": 6 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540ee", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe49cdfa19cac3fa90540f5", + "slotId": "mod_magazine" + }, { + "_id": "5fe49cdfa19cac3fa90540ed", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540ee", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540f3", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe49cdfa19cac3fa90540f5", + "slotId": "mod_reciever" + }, { + "_id": "5fe49cdfa19cac3fa90540ef", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe49cdfa19cac3fa90540f3", + "slotId": "mod_handguard" + }, { + "_id": "5fe49cdfa19cac3fa90540f0", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe49cdfa19cac3fa90540f3", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540f1", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe49cdfa19cac3fa90540f3", + "slotId": "mod_stock" + }, { + "_id": "5fe49cdfa19cac3fa90540f2", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe49cdfa19cac3fa90540f3", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49cdfa19cac3fa90540f4", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe49cdfa19cac3fa90540f5", + "slotId": "mod_charge" + }, { + "_id": "5fe49cdfa19cac3fa90540fe", + "_tpl": "5926bb2186f7744b1c6c6e60", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 6 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540f7", + "_tpl": "5d2f213448f0355009199284", + "parentId": "5fe49cdfa19cac3fa90540fe", + "slotId": "mod_magazine" + }, { + "_id": "5fe49cdfa19cac3fa90540f6", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa90540f7", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 20 + } + }, { + "_id": "5fe49cdfa19cac3fa90540fc", + "_tpl": "5926c0df86f77462f647f764", + "parentId": "5fe49cdfa19cac3fa90540fe", + "slotId": "mod_reciever" + }, { + "_id": "5fe49cdfa19cac3fa90540f8", + "_tpl": "5926c36d86f77467a92a8629", + "parentId": "5fe49cdfa19cac3fa90540fc", + "slotId": "mod_handguard" + }, { + "_id": "5fe49cdfa19cac3fa90540f9", + "_tpl": "5926d2be86f774134d668e4e", + "parentId": "5fe49cdfa19cac3fa90540fc", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa90540fa", + "_tpl": "5926d3c686f77410de68ebc8", + "parentId": "5fe49cdfa19cac3fa90540fc", + "slotId": "mod_stock" + }, { + "_id": "5fe49cdfa19cac3fa90540fb", + "_tpl": "5926e16e86f7742f5a0f7ecb", + "parentId": "5fe49cdfa19cac3fa90540fc", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49cdfa19cac3fa90540fd", + "_tpl": "5926c32286f774616e42de99", + "parentId": "5fe49cdfa19cac3fa90540fe", + "slotId": "mod_charge" + }, { + "_id": "5fe49cdfa19cac3fa9054107", + "_tpl": "5cadc190ae921500103bb3b6", + "location": { + "isSearched": true, + "r": 0, + "x": 3, + "y": 2 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054100", + "_tpl": "5cadc1c6ae9215000f2775a4", + "parentId": "5fe49cdfa19cac3fa9054107", + "slotId": "mod_barrel" + }, { + "_id": "5fe49cdfa19cac3fa90540ff", + "_tpl": "5cadc390ae921500126a77f1", + "parentId": "5fe49cdfa19cac3fa9054100", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49cdfa19cac3fa9054101", + "_tpl": "5cadc431ae921500113bb8d5", + "parentId": "5fe49cdfa19cac3fa9054107", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49cdfa19cac3fa9054104", + "_tpl": "5cadc55cae921500103bb3be", + "parentId": "5fe49cdfa19cac3fa9054107", + "slotId": "mod_reciever" + }, { + "_id": "5fe49cdfa19cac3fa9054102", + "_tpl": "5cadd940ae9215051e1c2316", + "parentId": "5fe49cdfa19cac3fa9054104", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054103", + "_tpl": "5cadd919ae921500126a77f3", + "parentId": "5fe49cdfa19cac3fa9054104", + "slotId": "mod_sight_front", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054106", + "_tpl": "5cadc2e0ae9215051e1c21e7", + "parentId": "5fe49cdfa19cac3fa9054107", + "slotId": "mod_magazine" + }, { + "_id": "5fe49cdfa19cac3fa9054105", + "_tpl": "56d59d3ad2720bdb418b4577", + "parentId": "5fe49cdfa19cac3fa9054106", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 17 + } + }, { + "_id": "5fe49cdfa19cac3fa9054114", + "_tpl": "5447a9cd4bdc2dbd208b4567", + "location": { + "isSearched": true, + "r": 0, + "x": 0, + "y": 14 + }, + "parentId": "5fe49cdfa19cac3fa9054115", + "slotId": "hideout", + "upd": { + "FireMode": { + "FireMode": "single" + }, + "Repairable": { + "Durability": 100, + "MaxDurability": 100 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054108", + "_tpl": "55d4b9964bdc2d1d4e8b456e", + "parentId": "5fe49cdfa19cac3fa9054114", + "slotId": "mod_pistol_grip" + }, { + "_id": "5fe49cdfa19cac3fa905410a", + "_tpl": "55d4887d4bdc2d962f8b4570", + "parentId": "5fe49cdfa19cac3fa9054114", + "slotId": "mod_magazine" + }, { + "_id": "5fe49cdfa19cac3fa9054109", + "_tpl": "54527a984bdc2d4e668b4567", + "parentId": "5fe49cdfa19cac3fa905410a", + "slotId": "cartridges", + "upd": { + "StackObjectsCount": 30 + } + }, { + "_id": "5fe49cdfa19cac3fa9054110", + "_tpl": "55d355e64bdc2d962f8b4569", + "parentId": "5fe49cdfa19cac3fa9054114", + "slotId": "mod_reciever" + }, { + "_id": "5fe49cdfa19cac3fa905410d", + "_tpl": "55d3632e4bdc2d972f8b4569", + "parentId": "5fe49cdfa19cac3fa9054110", + "slotId": "mod_barrel" + }, { + "_id": "5fe49cdfa19cac3fa905410b", + "_tpl": "544a38634bdc2d58388b4568", + "parentId": "5fe49cdfa19cac3fa905410d", + "slotId": "mod_muzzle" + }, { + "_id": "5fe49cdfa19cac3fa905410c", + "_tpl": "5ae30e795acfc408fb139a0b", + "parentId": "5fe49cdfa19cac3fa905410d", + "slotId": "mod_gas_block" + }, { + "_id": "5fe49cdfa19cac3fa905410e", + "_tpl": "5ae30db85acfc408fb139a05", + "parentId": "5fe49cdfa19cac3fa9054110", + "slotId": "mod_handguard" + }, { + "_id": "6396b722d604e334650f972e", + "_tpl": "637f57a68d137b27f70c4968", + "parentId": "5fe49cdfa19cac3fa905410e", + "slotId": "mod_handguard" + }, { + "_id": "5fe49cdfa19cac3fa905410f", + "_tpl": "5ae30bad5acfc400185c2dc4", + "parentId": "5fe49cdfa19cac3fa9054110", + "slotId": "mod_sight_rear", + "upd": { + "Sight": { + "ScopesCurrentCalibPointIndexes": [ + 0 + ], + "ScopesSelectedModes": [ + 0 + ], + "SelectedScope": 0 + } + } + }, { + "_id": "5fe49cdfa19cac3fa9054112", + "_tpl": "5649be884bdc2d79388b4577", + "parentId": "5fe49cdfa19cac3fa9054114", + "slotId": "mod_stock" + }, { + "_id": "5fe49cdfa19cac3fa9054111", + "_tpl": "55d4ae6c4bdc2d8b2f8b456e", + "parentId": "5fe49cdfa19cac3fa9054112", + "slotId": "mod_stock_000" + }, { + "_id": "5fe49cdfa19cac3fa9054113", + "_tpl": "55d44fd14bdc2d962f8b456e", + "parentId": "5fe49cdfa19cac3fa9054114", + "slotId": "mod_charge" + }, { + "_id": "5fe49cdfa19cac3fa9054117", + "_tpl": "5963866b86f7747bfa1c4462" + }, { + "_id": "5fe49cdfa19cac3fa9054116", + "_tpl": "5963866286f7747bf429b572" + }, { + "_id": "60dca3da42ad9b706b369aca", + "_tpl": "602543c13fee350cd564d032" + } + ], + "questRaidItems": "5fe49cdfa19cac3fa9054116", + "questStashItems": "5fe49cdfa19cac3fa9054117", + "sortingTable": "60dca3da42ad9b706b369aca", + "stash": "5fe49cdfa19cac3fa9054115" + }, + "Notes": { + "Notes": [] + }, + "Quests": [], + "RagfairInfo": { + "isRatingGrowing": true, + "offers": [], + "rating": 0.2 + }, + "Skills": { + "Common": [{ + "Id": "BotReload", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "BotSound", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Endurance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Strength", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Vitality", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Health", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "StressResistance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Metabolism", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Immunity", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Perception", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Intellect", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Attention", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Charisma", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Memory", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Pistol", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Revolver", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Assault", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shotgun", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniper", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HMG", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Launcher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AttachedLauncher", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Throwing", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Melee", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "DMR", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "RecoilControl", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AimDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "TroubleShooting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Surgery", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "CovertMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Search", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "MagDrills", + "LastAccess": -2147483648, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Sniping", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "ProneMovement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FieldMedicine", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "FirstAid", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "LightVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HeavyVests", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "AdvancedModding", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "NightOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "SilentOps", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Lockpicking", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "WeaponTreatment", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Freetrading", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Auctions", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Cleanoperations", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Barter", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Shadowconnections", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Taskperformance", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "Crafting", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + }, { + "Id": "HideoutManagement", + "LastAccess": 0, + "PointsEarnedDuringSession": 0, + "Progress": 0 + } + ], + "Mastering": [], + "Points": 0 + }, + "Stats": { + "Eft": { + "Aggressor": null, + "CarriedQuestItems": [], + "DamageHistory": { + "BodyParts": [], + "LethalDamage": null, + "LethalDamagePart": "Head" + }, + "DroppedItems": [], + "ExperienceBonusMult": 0, + "FoundInRaidItems": [], + "LastPlayerState": null, + "LastSessionDate": 0, + "OverallCounters": { + "Items": [] + }, + "SessionCounters": null, + "SessionExperienceMult": 0, + "SurvivorClass": "Unknown", + "TotalInGameTime": 0, + "TotalSessionExperience": 0, + "Victims": [] + } + }, + "TradersInfo": {}, + "UnlockedInfo": { + "unlockedProductionRecipe": [] + }, + "WishList": [], + "_id": "__REPLACEME__", + "aid": "__REPLACEME__", + "savage": "__REPLACEME__" + }, + "dialogues": {}, + "equipmentBuilds": {}, + "suits": [ + "5cde9ec17d6c8b04723cf479", + "5cde9e957d6c8b0474535da7" + ], + "trader": { + "initialLoyaltyLevel": 1, + "initialSalesSum": 0, + "initialStanding": 0, + "jaegerUnlocked": false + }, + "weaponbuilds": {} + } } - }, - "Standard": { - "bear": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cc0858d14c02e000c6bea66", - "Feet": "5cc085bb14c02e000e67a5c5", - "Hands": "5cc0876314c02e000c6bea6b", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5448bd6b4bdc2dfc2f8b4569": false, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "54491bb74bdc2d09088b4567": false, - "544a11ac4bdc2d470e8b456a": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "557ffd194bdc2d28148b457f": false, - "55d480c04bdc2d1d4e8b456a": false, - "55d7217a4bdc2d86028b456d": false, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5648b1504bdc2d9d488b4584": false, - "5649ad3f4bdc2df8348b4585": false, - "5649ade84bdc2d1b2b8b4587": false, - "564ca99c4bdc2d16268b4589": false, - "566abbc34bdc2d92178b4576": false, - "56d59d3ad2720bdb418b4577": false, - "56dfef82d2720bbd668b4567": true, - "56dff3afd2720bba668b4567": false, - "5710c24ad2720bc3458b45a3": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "576a581d2459771e7b1bc4f1": true, - "576a5ed62459771e9c2096cb": false, - "576a63cd2459771e796e0e11": false, - "576a7c512459771e796e0e17": true, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "590c5d4b86f774784e1b9c45": false, - "590c5f0d86f77413997acfab": false, - "590c661e86f7741e566b646a": false, - "59984ab886f7743e98271174": false, - "5998517986f7746017232f7e": false, - "599851db86f77467372f0a18": false, - "5998597786f77414ea6da093": false, - "59985a8086f77414ec448d1a": false, - "599860ac86f77436b225ed1a": false, - "599860e986f7743bb57573a6": false, - "59c6633186f7740cf0493bb9": false, - "59ccd11386f77428f24a488f": false, - "59d36a0086f7747e673f3946": true, - "5a0c27731526d80618476ac4": false, - "5aa2b87de5b5b00016327c25": false, - "5ac4cd105acfc40016339859": false, - "5ac50c185acfc400163398d4": false, - "5ac50da15acfc4001718d287": false, - "5ac72e475acfc400180ae6fe": false, - "5ac7655e5acfc40016339a19": false, - "5b40e5e25acfc4001a599bea": false, - "5b432b965acfc47a8774094e": false, - "5bffdc370db834001d23eca8": false, - "5ca20abf86f77418567a43f2": false, - "5ca20d5986f774331e7c9602": false, - "5d1b371186f774253763a656": false, - "5d40407c86f774318526545a": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e831507ea0a7c419c2f9bd9": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608816501 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "standard", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Bear", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe4977574f15b4ad31b6631", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe4977574f15b4ad31b6631", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "5fe4977574f15b4ad31b661a", - "_tpl": "5ac4cd105acfc40016339859", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Foldable": { - "Folded": false - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6612", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "5fe4977574f15b4ad31b661a", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4977574f15b4ad31b6611", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4977574f15b4ad31b6612", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4977574f15b4ad31b6613", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "5fe4977574f15b4ad31b661a", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4977574f15b4ad31b6614", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "5fe4977574f15b4ad31b661a", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4977574f15b4ad31b6615", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "5fe4977574f15b4ad31b661a", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4977574f15b4ad31b6616", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "5fe4977574f15b4ad31b661a", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6617", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "5fe4977574f15b4ad31b661a", - "slotId": "mod_stock" - }, - { - "_id": "5fe4977574f15b4ad31b6619", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "5fe4977574f15b4ad31b661a", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4977574f15b4ad31b6618", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "5fe4977574f15b4ad31b6619", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b661b", - "_tpl": "5bffdc370db834001d23eca8", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 80, - "MaxDurability": 80 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b661c", - "_tpl": "5b40e5e25acfc4001a599bea", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6624", - "_tpl": "5ca20abf86f77418567a43f2", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "TacticalVest" - }, - { - "_id": "5fe4977574f15b4ad31b661e", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b6624", - "slotId": "1" - }, - { - "_id": "5fe4977574f15b4ad31b661d", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4977574f15b4ad31b661e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6620", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b6624", - "slotId": "2" - }, - { - "_id": "5fe4977574f15b4ad31b661f", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4977574f15b4ad31b6620", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6622", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b6624", - "slotId": "3" - }, - { - "_id": "5fe4977574f15b4ad31b6621", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4977574f15b4ad31b6622", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6623", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b6624", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6625", - "_tpl": "544a11ac4bdc2d470e8b456a", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "SecuredContainer" - }, - { - "_id": "5fe4977574f15b4ad31b662a", - "_tpl": "5ca20d5986f774331e7c9602", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "Backpack" - }, - { - "_id": "5fe4977574f15b4ad31b6626", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b662a", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4977574f15b4ad31b6627", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 1 - }, - "parentId": "5fe4977574f15b4ad31b662a", - "slotId": "main", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6628", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b662a", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6629", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b662a", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b662b", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b662f", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "Pockets" - }, - { - "_id": "5fe4977574f15b4ad31b662c", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b662f", - "slotId": "pocket1" - }, - { - "_id": "5fe4977574f15b4ad31b662d", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b662f", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b662e", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b662f", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6630", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe4977574f15b4ad31b6631", - "slotId": "Earpiece" - }, - { - "_id": "5fe4977574f15b4ad31b66b6", - "_tpl": "566abbc34bdc2d92178b4576" - }, - { - "_id": "5fe4977574f15b4ad31b6632", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6633", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6634", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 12 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6635", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6636", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6638", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6637", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6638", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b6639", - "_tpl": "5710c24ad2720bc3458b45a3", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 12 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b663a", - "_tpl": "5ca20abf86f77418567a43f2", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b663b", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b663c", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 16 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b663d", - "_tpl": "5d40407c86f774318526545a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b663e", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4977574f15b4ad31b6640", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b663f", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6640", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6641", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6642", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6643", - "_tpl": "5b40e5e25acfc4001a599bea", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6644", - "_tpl": "5b432b965acfc47a8774094e", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 10 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6645", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4977574f15b4ad31b6647", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6646", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6647", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b6649", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6648", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6649", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b664b", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b664a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b664b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b664d", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 5 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b664c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b664d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b664f", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b664e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b664f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b6650", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4977574f15b4ad31b6651", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4977574f15b4ad31b6653", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6652", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6653", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b6654", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4977574f15b4ad31b6655", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4977574f15b4ad31b6656", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4977574f15b4ad31b6657", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4977574f15b4ad31b6659", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6658", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6659", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b665b", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b665a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b665b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b665d", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b665c", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b665d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b665f", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b665e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b665f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6661", - "_tpl": "599860ac86f77436b225ed1a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6660", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6661", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6662", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 10 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6663", - "_tpl": "5ca20d5986f774331e7c9602", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 10 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6664", - "_tpl": "56dfef82d2720bbd668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 14 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4977574f15b4ad31b6665", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6666", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe4977574f15b4ad31b6667", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 18 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6668", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 20 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6669", - "_tpl": "56dff3afd2720bba668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe4977574f15b4ad31b666a", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b666b", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b666c", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b666d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4977574f15b4ad31b666e", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe4977574f15b4ad31b6670", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 15 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b666f", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4977574f15b4ad31b6670", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6672", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 15 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6671", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4977574f15b4ad31b6672", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6674", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 15 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6673", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4977574f15b4ad31b6674", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6676", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 15 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6675", - "_tpl": "56dff3afd2720bba668b4567", - "parentId": "5fe4977574f15b4ad31b6676", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6677", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6678", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6679", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b667a", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b667b", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b667c", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 18 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b667d", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b667e", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 15 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b667f", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6680", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 18 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6681", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6682", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6683", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6684", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6685", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6686", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 19 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6687", - "_tpl": "590c5d4b86f774784e1b9c45", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 17 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6689", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b6688", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6689", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b668b", - "_tpl": "576a5ed62459771e9c2096cb", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 4 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout" - }, - { - "_id": "5fe4977574f15b4ad31b668a", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b668b", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b668c", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 9 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4977574f15b4ad31b668d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe4977574f15b4ad31b668e", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 20 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b668f", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 20 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6693", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6691", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4977574f15b4ad31b6693", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4977574f15b4ad31b6690", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6691", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b6692", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4977574f15b4ad31b6693", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4977574f15b4ad31b669d", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Foldable": { - "Folded": false - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b6694", - "_tpl": "5998517986f7746017232f7e", - "parentId": "5fe4977574f15b4ad31b669d", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4977574f15b4ad31b6695", - "_tpl": "599851db86f77467372f0a18", - "parentId": "5fe4977574f15b4ad31b669d", - "slotId": "mod_stock" - }, - { - "_id": "5fe4977574f15b4ad31b6697", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "5fe4977574f15b4ad31b669d", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4977574f15b4ad31b6696", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b6697", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b6698", - "_tpl": "5998597786f77414ea6da093", - "parentId": "5fe4977574f15b4ad31b669d", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4977574f15b4ad31b6699", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "5fe4977574f15b4ad31b669d", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4977574f15b4ad31b669a", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "5fe4977574f15b4ad31b669d", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b669c", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "5fe4977574f15b4ad31b669d", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4977574f15b4ad31b669b", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4977574f15b4ad31b669c", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4977574f15b4ad31b66a1", - "_tpl": "576a581d2459771e7b1bc4f1", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b669f", - "_tpl": "576a5ed62459771e9c2096cb", - "parentId": "5fe4977574f15b4ad31b66a1", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4977574f15b4ad31b669e", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b669f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 18 - } - }, - { - "_id": "5fe4977574f15b4ad31b66a0", - "_tpl": "576a63cd2459771e796e0e11", - "parentId": "5fe4977574f15b4ad31b66a1", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4977574f15b4ad31b66ab", - "_tpl": "59984ab886f7743e98271174", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Foldable": { - "Folded": false - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b66a2", - "_tpl": "5998517986f7746017232f7e", - "parentId": "5fe4977574f15b4ad31b66ab", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4977574f15b4ad31b66a3", - "_tpl": "599851db86f77467372f0a18", - "parentId": "5fe4977574f15b4ad31b66ab", - "slotId": "mod_stock" - }, - { - "_id": "5fe4977574f15b4ad31b66a5", - "_tpl": "599860ac86f77436b225ed1a", - "parentId": "5fe4977574f15b4ad31b66ab", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4977574f15b4ad31b66a4", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe4977574f15b4ad31b66a5", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b66a6", - "_tpl": "5998597786f77414ea6da093", - "parentId": "5fe4977574f15b4ad31b66ab", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4977574f15b4ad31b66a7", - "_tpl": "59985a8086f77414ec448d1a", - "parentId": "5fe4977574f15b4ad31b66ab", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4977574f15b4ad31b66a8", - "_tpl": "599860e986f7743bb57573a6", - "parentId": "5fe4977574f15b4ad31b66ab", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b66aa", - "_tpl": "59ccd11386f77428f24a488f", - "parentId": "5fe4977574f15b4ad31b66ab", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4977574f15b4ad31b66a9", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4977574f15b4ad31b66aa", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4977574f15b4ad31b66b5", - "_tpl": "5ac4cd105acfc40016339859", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 15 - }, - "parentId": "5fe4977574f15b4ad31b66b6", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Foldable": { - "Folded": false - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b66ad", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "5fe4977574f15b4ad31b66b5", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe4977574f15b4ad31b66ac", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "5fe4977574f15b4ad31b66ad", - "slotId": "mod_handguard" - }, - { - "_id": "5fe4977574f15b4ad31b66ae", - "_tpl": "5ac7655e5acfc40016339a19", - "parentId": "5fe4977574f15b4ad31b66b5", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe4977574f15b4ad31b66af", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "5fe4977574f15b4ad31b66b5", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe4977574f15b4ad31b66b0", - "_tpl": "5ac50da15acfc4001718d287", - "parentId": "5fe4977574f15b4ad31b66b5", - "slotId": "mod_reciever" - }, - { - "_id": "5fe4977574f15b4ad31b66b1", - "_tpl": "5ac72e475acfc400180ae6fe", - "parentId": "5fe4977574f15b4ad31b66b5", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe4977574f15b4ad31b66b2", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "5fe4977574f15b4ad31b66b5", - "slotId": "mod_stock" - }, - { - "_id": "5fe4977574f15b4ad31b66b4", - "_tpl": "55d480c04bdc2d1d4e8b456a", - "parentId": "5fe4977574f15b4ad31b66b5", - "slotId": "mod_magazine" - }, - { - "_id": "5fe4977574f15b4ad31b66b3", - "_tpl": "56dfef82d2720bbd668b4567", - "parentId": "5fe4977574f15b4ad31b66b4", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe4977574f15b4ad31b66b8", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe4977574f15b4ad31b66b7", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - } - ], - "questRaidItems": "5fe4977574f15b4ad31b66b7", - "questStashItems": "5fe4977574f15b4ad31b66b8", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe4977574f15b4ad31b66b6" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": { - "Items": [] - }, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cd946231388ce000d572fe3", - "5cd945d71388ce000a659dfb" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0, - "jaegerUnlocked": false - }, - "weaponbuilds": {} - }, - "usec": { - "character": { - "BackendCounters": {}, - "Bonuses": [ - { - "id": "64f5b9e5fa34f11b380756c0", - "templateId": "566abbc34bdc2d92178b4576", - "type": "StashSize" - } - ], - "ConditionCounters": { - "Counters": [] - }, - "Customization": { - "Body": "5cde95d97d6c8b647a3769b0", - "Feet": "5cde95ef7d6c8b04713c4f2d", - "Hands": "5cde95fa7d6c8b04737c2d13", - "Head": "__REPLACEME__" - }, - "Encyclopedia": { - "5447a9cd4bdc2dbd208b4567": false, - "5448bd6b4bdc2dfc2f8b4569": false, - "5448c12b4bdc2d02308b456f": false, - "5448fee04bdc2dbc018b4567": false, - "5449016a4bdc2d6f028b456f": false, - "54491bb74bdc2d09088b4567": false, - "544a11ac4bdc2d470e8b456a": false, - "544a38634bdc2d58388b4568": false, - "544a5cde4bdc2d39388b456b": false, - "544fb25a4bdc2dfb738b4567": false, - "544fb3364bdc2d34748b456a": false, - "544fb37f4bdc2dee738b4567": false, - "54527a984bdc2d4e668b4567": false, - "557ffd194bdc2d28148b457f": false, - "55d355e64bdc2d962f8b4569": false, - "55d3632e4bdc2d972f8b4569": false, - "55d44fd14bdc2d962f8b456e": false, - "55d459824bdc2d892f8b4573": false, - "55d4887d4bdc2d962f8b4570": false, - "55d4ae6c4bdc2d8b2f8b456e": false, - "55d4af3a4bdc2d972f8b456f": false, - "55d4b9964bdc2d1d4e8b456e": false, - "55d5f46a4bdc2d1b198b4567": false, - "55d7217a4bdc2d86028b456d": false, - "5645bcc04bdc2d363b8b4572": false, - "5648a7494bdc2d9d488b4583": false, - "5649ad3f4bdc2df8348b4585": false, - "5649be884bdc2d79388b4577": false, - "564ca99c4bdc2d16268b4589": false, - "566abbc34bdc2d92178b4576": false, - "56d59856d2720bd8418b456a": false, - "56d59948d2720bb7418b4582": false, - "56d59d3ad2720bdb418b4577": false, - "56d5a1f7d2720bb3418b456a": false, - "56d5a2bbd2720bb8418b456a": true, - "56d5a407d2720bb3418b456b": true, - "56d5a661d2720bd8418b456b": false, - "56d5a77ed2720b90418b4568": false, - "56dfef82d2720bbd668b4567": true, - "56ea8d2fd2720b7c698b4570": false, - "572b7fa524597762b747ce82": false, - "57347d7224597744596b4e72": false, - "57347da92459774491567cf5": false, - "573718ba2459775a75491131": false, - "5751a25924597722c463c472": false, - "5755356824597772cb798962": false, - "5755383e24597772cb798966": false, - "57dc2fa62459775949412633": false, - "57dc324a24597759501edc20": true, - "57dc32dc245977596d4ef3d3": false, - "57dc334d245977597164366f": true, - "57dc347d245977596754e7a1": false, - "58864a4f2459770fcc257101": false, - "58d3db5386f77426186285a0": false, - "590c5f0d86f77413997acfab": false, - "590c661e86f7741e566b646a": false, - "5926bb2186f7744b1c6c6e60": false, - "5926c0df86f77462f647f764": false, - "5926c32286f774616e42de99": false, - "5926c36d86f77467a92a8629": false, - "5926c3b286f774640d189b6b": false, - "5926d2be86f774134d668e4e": false, - "5926d3c686f77410de68ebc8": false, - "5926e16e86f7742f5a0f7ecb": false, - "59d36a0086f7747e673f3946": true, - "5a0c27731526d80618476ac4": false, - "5aa2a7e8e5b5b00016327c16": false, - "5ab8f39486f7745cd93a1cca": false, - "5ae30bad5acfc400185c2dc4": false, - "5ae30db85acfc408fb139a05": false, - "5ae30e795acfc408fb139a0b": false, - "5b44c8ea86f7742d1627baf1": false, - "5c0e9f2c86f77432297fe0a3": false, - "5cadc190ae921500103bb3b6": false, - "5cadc1c6ae9215000f2775a4": false, - "5cadc2e0ae9215051e1c21e7": false, - "5cadc390ae921500126a77f1": false, - "5cadc431ae921500113bb8d5": false, - "5cadc55cae921500103bb3be": false, - "5cadd919ae921500126a77f3": false, - "5cadd940ae9215051e1c2316": false, - "5d1b371186f774253763a656": false, - "5d2f213448f0355009199284": false, - "5d403f9186f7743cac3f229b": false, - "5e2af47786f7746d404f3aaa": false, - "5e2af4a786f7746d3f3c3400": false, - "5e4d34ca86f774264f758330": false, - "5e831507ea0a7c419c2f9bd9": false, - "5e9dcf5986f7746c417435b3": false - }, - "Health": { - "BodyParts": { - "Chest": { - "Health": { - "Current": 85, - "Maximum": 85 - } - }, - "Head": { - "Health": { - "Current": 35, - "Maximum": 35 - } - }, - "LeftArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "LeftLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "RightArm": { - "Health": { - "Current": 60, - "Maximum": 60 - } - }, - "RightLeg": { - "Health": { - "Current": 65, - "Maximum": 65 - } - }, - "Stomach": { - "Health": { - "Current": 70, - "Maximum": 70 - } - } - }, - "Energy": { - "Current": 100, - "Maximum": 100 - }, - "Hydration": { - "Current": 100, - "Maximum": 100 - }, - "Temperature": { - "Current": 36.6, - "Maximum": 40 - }, - "UpdateTime": 1608817888 - }, - "Hideout": { - "Areas": [ - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 1, - "passiveBonusesEnabled": true, - "slots": [], - "type": 3 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 0 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 1 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 2 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 4 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 5 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 6 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 7 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 8 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 9 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 10 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 11 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 12 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 13 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 14 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 15 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 16 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": false, - "slots": [], - "type": 17 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 18 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 19 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 20 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 21 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 22 - }, - { - "active": true, - "completeTime": 0, - "constructing": false, - "lastRecipe": "", - "level": 0, - "passiveBonusesEnabled": true, - "slots": [], - "type": 23 - } - ], - "Improvement": {}, - "Production": {} - }, - "Info": { - "AccountType": 0, - "BannedState": false, - "BannedUntil": 0, - "Bans": [], - "Experience": 0, - "GameVersion": "standard", - "IsStreamerModeAvailable": false, - "LastTimePlayedAsSavage": 0, - "Level": 1, - "LowerNickname": "__REPLACEME__", - "MemberCategory": 0, - "Nickname": "__REPLACEME__", - "NicknameChangeDate": 0, - "RegistrationDate": "__REPLACEME__", - "SavageLockTime": 0, - "Settings": { - "BotDifficulty": "easy", - "Experience": -1, - "Role": "assault" - }, - "Side": "Usec", - "SquadInviteRestriction": false, - "Voice": "__REPLACEME__", - "lockedMoveCommands": true - }, - "InsuredItems": [], - "Inventory": { - "equipment": "5fe49cdfa19cac3fa905407f", - "fastPanel": {}, - "hideoutAreaStashes": {}, - "items": [ - { - "_id": "5fe49cdfa19cac3fa905407f", - "_tpl": "55d7217a4bdc2d86028b456d" - }, - { - "_id": "63db64cbf9963741dc0d741f", - "_tpl": "6401c7b213d9b818bf0e7dd7" - }, - { - "_id": "5fe49cdfa19cac3fa9054068", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "FirstPrimaryWeapon", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905405c", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe49cdfa19cac3fa9054068", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49cdfa19cac3fa905405e", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe49cdfa19cac3fa9054068", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49cdfa19cac3fa905405d", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa905405e", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054064", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe49cdfa19cac3fa9054068", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49cdfa19cac3fa9054061", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe49cdfa19cac3fa9054064", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49cdfa19cac3fa905405f", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe49cdfa19cac3fa9054061", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49cdfa19cac3fa9054060", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe49cdfa19cac3fa9054061", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe49cdfa19cac3fa9054062", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe49cdfa19cac3fa9054064", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe49cdfa19cac3fa9054062", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49cdfa19cac3fa9054063", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe49cdfa19cac3fa9054064", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054066", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe49cdfa19cac3fa9054068", - "slotId": "mod_stock" - }, - { - "_id": "5fe49cdfa19cac3fa9054065", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe49cdfa19cac3fa9054066", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe49cdfa19cac3fa9054067", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe49cdfa19cac3fa9054068", - "slotId": "mod_charge" - }, - { - "_id": "5fe49cdfa19cac3fa9054069", - "_tpl": "54491bb74bdc2d09088b4567", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "Scabbard", - "upd": { - "Repairable": { - "Durability": 70, - "MaxDurability": 70 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905406a", - "_tpl": "572b7fa524597762b747ce82", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "FaceCover", - "upd": { - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905406b", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "Headwear", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054073", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "TacticalVest" - }, - { - "_id": "5fe49cdfa19cac3fa905406d", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054073", - "slotId": "1" - }, - { - "_id": "5fe49cdfa19cac3fa905406c", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa905406d", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa905406f", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054073", - "slotId": "2" - }, - { - "_id": "5fe49cdfa19cac3fa905406e", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa905406f", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054071", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054073", - "slotId": "3" - }, - { - "_id": "5fe49cdfa19cac3fa9054070", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa9054071", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054072", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054073", - "slotId": "4", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054074", - "_tpl": "544a11ac4bdc2d470e8b456a", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "SecuredContainer" - }, - { - "_id": "5fe49cdfa19cac3fa9054078", - "_tpl": "5e9dcf5986f7746c417435b3", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "Backpack" - }, - { - "_id": "5fe49cdfa19cac3fa9054075", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054078", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054076", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054078", - "slotId": "main", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054077", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054078", - "slotId": "main", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054079", - "_tpl": "5648a7494bdc2d9d488b4583", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "ArmorVest", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905407d", - "_tpl": "627a4e6b255f7527fb05a0f6", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "Pockets" - }, - { - "_id": "5fe49cdfa19cac3fa905407a", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa905407d", - "slotId": "pocket1" - }, - { - "_id": "5fe49cdfa19cac3fa905407b", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa905407d", - "slotId": "pocket2", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905407c", - "_tpl": "5751a25924597722c463c472", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa905407d", - "slotId": "pocket3", - "upd": { - "MedKit": { - "HpResource": 2 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905407e", - "_tpl": "5645bcc04bdc2d363b8b4572", - "parentId": "5fe49cdfa19cac3fa905407f", - "slotId": "Earpiece" - }, - { - "_id": "5fe49cdfa19cac3fa9054115", - "_tpl": "566abbc34bdc2d92178b4576" - }, - { - "_id": "5fe49cdfa19cac3fa9054080", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054081", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 9 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054082", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 13 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054084", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 4 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054083", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa9054084", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054086", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 14 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054085", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa9054086", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054087", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 14 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054088", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 1, - "x": 9, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054089", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905408a", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa905408c", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 14 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa905408b", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa905408c", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa905408d", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa905408e", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054090", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 14 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa905408f", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa9054090", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054091", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 12 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054092", - "_tpl": "54527a984bdc2d4e668b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 15 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 60 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054093", - "_tpl": "590c661e86f7741e566b646a", - "location": { - "isSearched": true, - "r": 1, - "x": 8, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 220 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054094", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054095", - "_tpl": "5a0c27731526d80618476ac4", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 13 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054096", - "_tpl": "58d3db5386f77426186285a0", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 12 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054097", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054098", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 10 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa9054099", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905409a", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 3 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa905409b", - "_tpl": "590c5f0d86f77413997acfab", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905409c", - "_tpl": "5aa2a7e8e5b5b00016327c16", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 10, - "MaxDurability": 10 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905409d", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 3 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905409e", - "_tpl": "5448fee04bdc2dbc018b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 60 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa905409f", - "_tpl": "5755356824597772cb798962", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540a1", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540a0", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540a1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540a2", - "_tpl": "5e4d34ca86f774264f758330", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540a3", - "_tpl": "5d403f9186f7743cac3f229b", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540a4", - "_tpl": "5c0e9f2c86f77432297fe0a3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540a5", - "_tpl": "5648a7494bdc2d9d488b4583", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 0 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "Repairable": { - "Durability": 50, - "MaxDurability": 50 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540a6", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540a7", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540a8", - "_tpl": "5d1b371186f774253763a656", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 19 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 60 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540a9", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540aa", - "_tpl": "544fb25a4bdc2dfb738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540ab", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540ac", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540ad", - "_tpl": "544fb37f4bdc2dee738b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 17 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 4 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540af", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 5 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540ae", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540af", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540b0", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540b1", - "_tpl": "5e9dcf5986f7746c417435b3", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 9 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540b2", - "_tpl": "544fb3364bdc2d34748b456a", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540b3", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 17 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540b4", - "_tpl": "57347da92459774491567cf5", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 16 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FoodDrink": { - "HpPercent": 1 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540b6", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540b5", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540b6", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540b8", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 9, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540b7", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540b8", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540ba", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540b9", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540ba", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540bc", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540bb", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540bc", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540be", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540bd", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540be", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540bf", - "_tpl": "5755383e24597772cb798966", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 19 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "MedKit": { - "HpResource": 6 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540c0", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 1, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540c2", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 5 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540c1", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540c2", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540c3", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 2, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540c4", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540c6", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 2 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540c5", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540c6", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540c8", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 5 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540c7", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540c8", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540ca", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 3 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540c9", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540ca", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540cc", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540cb", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540cc", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540ce", - "_tpl": "5d2f213448f0355009199284", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540cd", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540ce", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540cf", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540d0", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 50 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540d1", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 8 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540d2", - "_tpl": "5e831507ea0a7c419c2f9bd9", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 18 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540d3", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 1 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540d4", - "_tpl": "5449016a4bdc2d6f028b456f", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 1 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 250000 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540d6", - "_tpl": "55d4887d4bdc2d962f8b4570", - "location": { - "isSearched": true, - "r": 0, - "x": 8, - "y": 14 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540d5", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa90540d6", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540d7", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 6 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540d8", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 5, - "y": 6 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540da", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 6 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540d9", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540da", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540db", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540dc", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 6 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540dd", - "_tpl": "56d59d3ad2720bdb418b4577", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 7 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 25 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540de", - "_tpl": "5e2af47786f7746d404f3aaa", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 19 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540df", - "_tpl": "5e2af4a786f7746d3f3c3400", - "location": { - "isSearched": true, - "r": 0, - "x": 6, - "y": 20 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "Resource": { - "Value": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540e1", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 4 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540e0", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540e1", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540e3", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "location": { - "isSearched": true, - "r": 0, - "x": 4, - "y": 4 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout" - }, - { - "_id": "5fe49cdfa19cac3fa90540e2", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540e3", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540ec", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 3 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540e5", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe49cdfa19cac3fa90540ec", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49cdfa19cac3fa90540e4", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe49cdfa19cac3fa90540e5", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49cdfa19cac3fa90540e6", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe49cdfa19cac3fa90540ec", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49cdfa19cac3fa90540e9", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe49cdfa19cac3fa90540ec", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49cdfa19cac3fa90540e7", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe49cdfa19cac3fa90540e9", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540e8", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe49cdfa19cac3fa90540e9", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540eb", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe49cdfa19cac3fa90540ec", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49cdfa19cac3fa90540ea", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540eb", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540f5", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 7, - "y": 6 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540ee", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe49cdfa19cac3fa90540f5", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49cdfa19cac3fa90540ed", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540ee", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540f3", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe49cdfa19cac3fa90540f5", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49cdfa19cac3fa90540ef", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe49cdfa19cac3fa90540f3", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49cdfa19cac3fa90540f0", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe49cdfa19cac3fa90540f3", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540f1", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe49cdfa19cac3fa90540f3", - "slotId": "mod_stock" - }, - { - "_id": "5fe49cdfa19cac3fa90540f2", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe49cdfa19cac3fa90540f3", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49cdfa19cac3fa90540f4", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe49cdfa19cac3fa90540f5", - "slotId": "mod_charge" - }, - { - "_id": "5fe49cdfa19cac3fa90540fe", - "_tpl": "5926bb2186f7744b1c6c6e60", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 6 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540f7", - "_tpl": "5d2f213448f0355009199284", - "parentId": "5fe49cdfa19cac3fa90540fe", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49cdfa19cac3fa90540f6", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa90540f7", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 20 - } - }, - { - "_id": "5fe49cdfa19cac3fa90540fc", - "_tpl": "5926c0df86f77462f647f764", - "parentId": "5fe49cdfa19cac3fa90540fe", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49cdfa19cac3fa90540f8", - "_tpl": "5926c36d86f77467a92a8629", - "parentId": "5fe49cdfa19cac3fa90540fc", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49cdfa19cac3fa90540f9", - "_tpl": "5926d2be86f774134d668e4e", - "parentId": "5fe49cdfa19cac3fa90540fc", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa90540fa", - "_tpl": "5926d3c686f77410de68ebc8", - "parentId": "5fe49cdfa19cac3fa90540fc", - "slotId": "mod_stock" - }, - { - "_id": "5fe49cdfa19cac3fa90540fb", - "_tpl": "5926e16e86f7742f5a0f7ecb", - "parentId": "5fe49cdfa19cac3fa90540fc", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49cdfa19cac3fa90540fd", - "_tpl": "5926c32286f774616e42de99", - "parentId": "5fe49cdfa19cac3fa90540fe", - "slotId": "mod_charge" - }, - { - "_id": "5fe49cdfa19cac3fa9054107", - "_tpl": "5cadc190ae921500103bb3b6", - "location": { - "isSearched": true, - "r": 0, - "x": 3, - "y": 2 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054100", - "_tpl": "5cadc1c6ae9215000f2775a4", - "parentId": "5fe49cdfa19cac3fa9054107", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49cdfa19cac3fa90540ff", - "_tpl": "5cadc390ae921500126a77f1", - "parentId": "5fe49cdfa19cac3fa9054100", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49cdfa19cac3fa9054101", - "_tpl": "5cadc431ae921500113bb8d5", - "parentId": "5fe49cdfa19cac3fa9054107", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49cdfa19cac3fa9054104", - "_tpl": "5cadc55cae921500103bb3be", - "parentId": "5fe49cdfa19cac3fa9054107", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49cdfa19cac3fa9054102", - "_tpl": "5cadd940ae9215051e1c2316", - "parentId": "5fe49cdfa19cac3fa9054104", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054103", - "_tpl": "5cadd919ae921500126a77f3", - "parentId": "5fe49cdfa19cac3fa9054104", - "slotId": "mod_sight_front", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054106", - "_tpl": "5cadc2e0ae9215051e1c21e7", - "parentId": "5fe49cdfa19cac3fa9054107", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49cdfa19cac3fa9054105", - "_tpl": "56d59d3ad2720bdb418b4577", - "parentId": "5fe49cdfa19cac3fa9054106", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 17 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054114", - "_tpl": "5447a9cd4bdc2dbd208b4567", - "location": { - "isSearched": true, - "r": 0, - "x": 0, - "y": 14 - }, - "parentId": "5fe49cdfa19cac3fa9054115", - "slotId": "hideout", - "upd": { - "FireMode": { - "FireMode": "single" - }, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054108", - "_tpl": "55d4b9964bdc2d1d4e8b456e", - "parentId": "5fe49cdfa19cac3fa9054114", - "slotId": "mod_pistol_grip" - }, - { - "_id": "5fe49cdfa19cac3fa905410a", - "_tpl": "55d4887d4bdc2d962f8b4570", - "parentId": "5fe49cdfa19cac3fa9054114", - "slotId": "mod_magazine" - }, - { - "_id": "5fe49cdfa19cac3fa9054109", - "_tpl": "54527a984bdc2d4e668b4567", - "parentId": "5fe49cdfa19cac3fa905410a", - "slotId": "cartridges", - "upd": { - "StackObjectsCount": 30 - } - }, - { - "_id": "5fe49cdfa19cac3fa9054110", - "_tpl": "55d355e64bdc2d962f8b4569", - "parentId": "5fe49cdfa19cac3fa9054114", - "slotId": "mod_reciever" - }, - { - "_id": "5fe49cdfa19cac3fa905410d", - "_tpl": "55d3632e4bdc2d972f8b4569", - "parentId": "5fe49cdfa19cac3fa9054110", - "slotId": "mod_barrel" - }, - { - "_id": "5fe49cdfa19cac3fa905410b", - "_tpl": "544a38634bdc2d58388b4568", - "parentId": "5fe49cdfa19cac3fa905410d", - "slotId": "mod_muzzle" - }, - { - "_id": "5fe49cdfa19cac3fa905410c", - "_tpl": "5ae30e795acfc408fb139a0b", - "parentId": "5fe49cdfa19cac3fa905410d", - "slotId": "mod_gas_block" - }, - { - "_id": "5fe49cdfa19cac3fa905410e", - "_tpl": "5ae30db85acfc408fb139a05", - "parentId": "5fe49cdfa19cac3fa9054110", - "slotId": "mod_handguard" - }, - { - "_id": "6396b722d604e334650f972e", - "_tpl": "637f57a68d137b27f70c4968", - "parentId": "5fe49cdfa19cac3fa905410e", - "slotId": "mod_handguard" - }, - { - "_id": "5fe49cdfa19cac3fa905410f", - "_tpl": "5ae30bad5acfc400185c2dc4", - "parentId": "5fe49cdfa19cac3fa9054110", - "slotId": "mod_sight_rear", - "upd": { - "Sight": { - "ScopesCurrentCalibPointIndexes": [ - 0 - ], - "ScopesSelectedModes": [ - 0 - ], - "SelectedScope": 0 - } - } - }, - { - "_id": "5fe49cdfa19cac3fa9054112", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "5fe49cdfa19cac3fa9054114", - "slotId": "mod_stock" - }, - { - "_id": "5fe49cdfa19cac3fa9054111", - "_tpl": "55d4ae6c4bdc2d8b2f8b456e", - "parentId": "5fe49cdfa19cac3fa9054112", - "slotId": "mod_stock_000" - }, - { - "_id": "5fe49cdfa19cac3fa9054113", - "_tpl": "55d44fd14bdc2d962f8b456e", - "parentId": "5fe49cdfa19cac3fa9054114", - "slotId": "mod_charge" - }, - { - "_id": "5fe49cdfa19cac3fa9054117", - "_tpl": "5963866b86f7747bfa1c4462" - }, - { - "_id": "5fe49cdfa19cac3fa9054116", - "_tpl": "5963866286f7747bf429b572" - }, - { - "_id": "60dca3da42ad9b706b369aca", - "_tpl": "602543c13fee350cd564d032" - } - ], - "questRaidItems": "5fe49cdfa19cac3fa9054116", - "questStashItems": "5fe49cdfa19cac3fa9054117", - "sortingTable": "60dca3da42ad9b706b369aca", - "stash": "5fe49cdfa19cac3fa9054115" - }, - "Notes": { - "Notes": [] - }, - "Quests": [], - "RagfairInfo": { - "isRatingGrowing": true, - "offers": [], - "rating": 0.2 - }, - "Skills": { - "Common": [ - { - "Id": "BotReload", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "BotSound", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Endurance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Strength", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Vitality", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Health", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "StressResistance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Metabolism", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Immunity", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Perception", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Intellect", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Attention", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Charisma", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Memory", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Pistol", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Revolver", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Assault", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shotgun", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniper", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HMG", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Launcher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AttachedLauncher", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Throwing", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Melee", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "DMR", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "RecoilControl", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AimDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "TroubleShooting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Surgery", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "CovertMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Search", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "MagDrills", - "LastAccess": -2147483648, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Sniping", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "ProneMovement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FieldMedicine", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "FirstAid", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "LightVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HeavyVests", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "AdvancedModding", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "NightOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "SilentOps", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Lockpicking", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "WeaponTreatment", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Freetrading", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Auctions", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Cleanoperations", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Barter", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Shadowconnections", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Taskperformance", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "Crafting", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - }, - { - "Id": "HideoutManagement", - "LastAccess": 0, - "PointsEarnedDuringSession": 0, - "Progress": 0 - } - ], - "Mastering": [], - "Points": 0 - }, - "Stats": { - "Eft": { - "Aggressor": null, - "CarriedQuestItems": [], - "DamageHistory": { - "BodyParts": [], - "LethalDamage": null, - "LethalDamagePart": "Head" - }, - "DroppedItems": [], - "ExperienceBonusMult": 0, - "FoundInRaidItems": [], - "LastPlayerState": null, - "LastSessionDate": 0, - "OverallCounters": { - "Items": [] - }, - "SessionCounters": null, - "SessionExperienceMult": 0, - "SurvivorClass": "Unknown", - "TotalInGameTime": 0, - "TotalSessionExperience": 0, - "Victims": [] - } - }, - "TradersInfo": {}, - "UnlockedInfo": { - "unlockedProductionRecipe": [] - }, - "WishList": [], - "_id": "__REPLACEME__", - "aid": "__REPLACEME__", - "savage": "__REPLACEME__" - }, - "dialogues": {}, - "equipmentBuilds": {}, - "suits": [ - "5cde9ec17d6c8b04723cf479", - "5cde9e957d6c8b0474535da7" - ], - "trader": { - "initialLoyaltyLevel": 1, - "initialSalesSum": 0, - "initialStanding": 0, - "jaegerUnlocked": false - }, - "weaponbuilds": {} - } - } } diff --git a/project/src/controllers/LauncherController.ts b/project/src/controllers/LauncherController.ts index 0e7bd5fb..a181ace7 100644 --- a/project/src/controllers/LauncherController.ts +++ b/project/src/controllers/LauncherController.ts @@ -11,6 +11,7 @@ import { IConnectResponse } from "@spt-aki/models/eft/profile/IConnectResponse"; import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; import { ICoreConfig } from "@spt-aki/models/spt/config/ICoreConfig"; import { IPackageJsonData } from "@spt-aki/models/spt/mod/IPackageJsonData"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { ConfigServer } from "@spt-aki/servers/ConfigServer"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; import { SaveServer } from "@spt-aki/servers/SaveServer"; @@ -23,6 +24,7 @@ export class LauncherController protected coreConfig: ICoreConfig; constructor( + @inject("WinstonLogger") protected logger: ILogger, @inject("HashUtil") protected hashUtil: HashUtil, @inject("SaveServer") protected saveServer: SaveServer, @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper, @@ -47,26 +49,26 @@ export class LauncherController } /** - * Get descriptive text for each of the profile edtions a player can choose - * @returns + * Get descriptive text for each of the profile edtions a player can choose, keyed by profile.json profile type e.g. "Edge Of Darkness" + * @returns Dictionary of profile types with related descriptive text */ protected getProfileDescriptions(): Record { - return { - "Standard": this.localisationService.getText("launcher-profile_standard"), - // eslint-disable-next-line @typescript-eslint/naming-convention - "Left Behind": this.localisationService.getText("launcher-profile_leftbehind"), - // eslint-disable-next-line @typescript-eslint/naming-convention - "Prepare To Escape": this.localisationService.getText("launcher-profile_preparetoescape"), - // eslint-disable-next-line @typescript-eslint/naming-convention - "Edge Of Darkness": this.localisationService.getText("launcher-edgeofdarkness"), - // eslint-disable-next-line @typescript-eslint/naming-convention - "SPT Easy start": this.localisationService.getText("launcher-profile_spteasystart"), - // eslint-disable-next-line @typescript-eslint/naming-convention - "SPT Zero to hero": this.localisationService.getText("launcher-profile_sptzerotohero"), - // eslint-disable-next-line @typescript-eslint/naming-convention - "SPT Developer": this.localisationService.getText("launcher-profile_sptdeveloper") - }; + const result = {}; + const dbProfiles = this.databaseServer.getTables().templates.profiles; + for (const profileKey in dbProfiles) + { + const localeKey = dbProfiles[profileKey]?.descriptionLocaleKey; + if (!localeKey) + { + this.logger.warning(this.localisationService.getText("launcher-missing_property", profileKey)); + continue; + } + + result[profileKey] = this.localisationService.getText(localeKey); + } + + return result; } public find(sessionIdKey: string): Info diff --git a/project/src/models/eft/common/tables/IProfileTemplate.ts b/project/src/models/eft/common/tables/IProfileTemplate.ts index 0f4ab7fc..cb89201a 100644 --- a/project/src/models/eft/common/tables/IProfileTemplate.ts +++ b/project/src/models/eft/common/tables/IProfileTemplate.ts @@ -9,11 +9,18 @@ export interface IProfileTemplates // eslint-disable-next-line @typescript-eslint/naming-convention "Prepare To Escape": IProfileSides // eslint-disable-next-line @typescript-eslint/naming-convention - "Edge Of Darkness": IProfileSides + "Edge Of Darkness": IProfileSides, + // eslint-disable-next-line @typescript-eslint/naming-convention + "SPT Developer": IProfileSides, + // eslint-disable-next-line @typescript-eslint/naming-convention + "SPT Easy start": IProfileSides, + // eslint-disable-next-line @typescript-eslint/naming-convention + "SPT Zero to hero": IProfileSides } export interface IProfileSides { + descriptionLocaleKey: string usec: TemplateSide bear: TemplateSide } From 95ae543d7a614772f8577edec13d14158b4ca052 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 15 Nov 2023 11:21:33 +0000 Subject: [PATCH 14/23] Fix typo --- project/assets/database/templates/profiles.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/assets/database/templates/profiles.json b/project/assets/database/templates/profiles.json index 3934a2f7..117c5dd3 100644 --- a/project/assets/database/templates/profiles.json +++ b/project/assets/database/templates/profiles.json @@ -1,6 +1,6 @@ { "Edge Of Darkness": { - "descriptionLocaleKey": "launcher-profile-edgeofdarkness1", + "descriptionLocaleKey": "launcher-profile-edgeofdarkness", "bear": { "character": { "BackendCounters": {}, From 6dddeed6a82085996191dfad49aa3c2a871920d4 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 15 Nov 2023 19:43:35 +0000 Subject: [PATCH 15/23] Add 25% chance to double daily reward stack (item should be stackable and not weapon) --- .../generators/RepeatableQuestGenerator.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/project/src/generators/RepeatableQuestGenerator.ts b/project/src/generators/RepeatableQuestGenerator.ts index a834d0c5..dd3ea169 100644 --- a/project/src/generators/RepeatableQuestGenerator.ts +++ b/project/src/generators/RepeatableQuestGenerator.ts @@ -862,6 +862,13 @@ export class RepeatableQuestGenerator children = this.ragfairServerHelper.reparentPresets(defaultPreset._items[0], defaultPreset._items); weaponRewardCount ++; } + + // 25% chance to double reward stack (item should be stackable and not weapon) + if (this.increaseRewardItemStackSize(itemSelected)) + { + itemCount = 2; + } + rewards.Success.push(this.generateRewardItem(itemSelected._id, itemCount, index, children)); const itemCost = (this.itemHelper.isOfBaseclass(itemSelected._id, BaseClasses.WEAPON)) ? this.itemHelper.getItemMaxPrice(children[0]._tpl) // use if preset is not default : this.itemHelper.getWeaponPresetPrice(children[0], children, this.itemHelper.getStaticItemPrice(itemSelected._id)) @@ -913,6 +920,18 @@ export class RepeatableQuestGenerator return rewards; } + /** + * Should reward item have stack size increased (25% chance) + * @param item Item to possibly increase stack size of + * @returns True if it should + */ + protected increaseRewardItemStackSize(item: ITemplateItem): boolean + { + return item._props.StackMaxSize > 1 + && !this.itemHelper.isOfBaseclass(item._id, BaseClasses.WEAPON) + && this.randomUtil.getChance100(25); + } + /** * Select a number of items that have a colelctive value of the passed in parameter * @param repeatableConfig Config From 54a81b87d674c284d967e0cd4ac5c21ca74bbcc1 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 15 Nov 2023 19:46:39 +0000 Subject: [PATCH 16/23] First pass at improving accuracy of daily quest xp and rouble rewards --- project/assets/configs/quest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/assets/configs/quest.json b/project/assets/configs/quest.json index d98fd72a..189b4e40 100644 --- a/project/assets/configs/quest.json +++ b/project/assets/configs/quest.json @@ -144,8 +144,8 @@ "minPlayerLevel": 5, "rewardScaling": { "levels": [1, 10, 20, 30, 40, 50, 60], - "experience": [1000, 5000, 11000, 59000, 147000, 250000, 450000], - "roubles": [15000, 40000, 75000, 100000, 140000, 170000, 210000], + "experience": [1000, 2000, 8000, 14000, 20000, 24000, 28000], + "roubles": [11000, 20000, 45000, 60000, 77000, 95000, 115000], "items": [2, 4, 5, 5, 5, 5, 5], "reputation": [0.01, 0.01, 0.02, 0.02, 0.03, 0.03, 0.03], "rewardSpread": 0.5, From 467c87b026e7c10d4ad2e63593029a0ae40ca9b2 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 15 Nov 2023 20:17:24 +0000 Subject: [PATCH 17/23] Fix trader repair not costing any money --- project/src/models/eft/trade/IProcessBuyTradeRequestData.ts | 2 +- project/src/services/RepairService.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts b/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts index 54b4f8b7..36a03db6 100644 --- a/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts +++ b/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts @@ -3,7 +3,7 @@ import { IProcessBaseTradeRequestData } from "@spt-aki/models/eft/trade/IProcess export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { - Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | "" | "SptInsure" + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | "" | "SptInsure" | "SptRepair" type: string tid: string item_id: string diff --git a/project/src/services/RepairService.ts b/project/src/services/RepairService.ts index 918503ea..bfb5619d 100644 --- a/project/src/services/RepairService.ts +++ b/project/src/services/RepairService.ts @@ -119,12 +119,12 @@ export class RepairService // eslint-disable-next-line @typescript-eslint/naming-convention scheme_items: [ { - id: repairedItemId, + id: "5449016a4bdc2d6f028b456f", // Rouble tpl count: Math.round(repairCost) } ], tid: traderId, - Action: "", + Action: "SptRepair", type: "", // eslint-disable-next-line @typescript-eslint/naming-convention item_id: "", From 925d9b3f079c8b842959933fa2f1f70ed374fa06 Mon Sep 17 00:00:00 2001 From: Dev Date: Thu, 16 Nov 2023 11:38:55 +0000 Subject: [PATCH 18/23] Add fence rep gain on taking COOP extract Refactored fence rep handling code for Car extracts --- project/assets/configs/inraid.json | 3 +- project/src/controllers/MatchController.ts | 64 +++++++++++++++---- project/src/controllers/ProfileController.ts | 1 + .../src/models/eft/common/tables/IBotBase.ts | 8 +-- .../src/models/spt/config/IInRaidConfig.ts | 4 +- 5 files changed, 58 insertions(+), 22 deletions(-) diff --git a/project/assets/configs/inraid.json b/project/assets/configs/inraid.json index 0efebce0..7a0980d4 100644 --- a/project/assets/configs/inraid.json +++ b/project/assets/configs/inraid.json @@ -24,9 +24,10 @@ "tunnel_shared", "EXFIL_ScavCooperation", "Factory Gate", - "Exit_E10_coop" + "Exit_E10_coop" ], "carExtractBaseStandingGain": 0.4, + "coopExtractBaseStandingGain": 0.25, "scavExtractGain": 0.01, "keepFiRSecureContainerOnDeath": false } diff --git a/project/src/controllers/MatchController.ts b/project/src/controllers/MatchController.ts index 319fe499..bd4fa79e 100644 --- a/project/src/controllers/MatchController.ts +++ b/project/src/controllers/MatchController.ts @@ -198,6 +198,7 @@ export class MatchController if (extractName && this.extractWasViaCoop(extractName) && this.traderConfig.fence.coopExtractGift.sendGift) { + this.handleCoopExtract(pmcData, extractName); this.sendCoopTakenFenceMessage(sessionId); } } @@ -252,6 +253,37 @@ export class MatchController ); } + /** + * Handle when a player extracts using a coop extract - add rep to fence + * @param pmcData Profile + * @param extractName Name of extract taken + */ + protected handleCoopExtract(pmcData: IPmcData, extractName: string): void + { + if (!pmcData.CoopExtractCounts) + { + pmcData.CoopExtractCounts = {}; + } + + // Ensure key exists for extract + if (!(extractName in pmcData.CoopExtractCounts)) + { + pmcData.CoopExtractCounts[extractName] = 0; + } + + // Increment extract count value + pmcData.CoopExtractCounts[extractName] += 1; + + // Get new fence standing value + const newFenceStanding = this.getFenceStandingAfterExtract(pmcData, this.inraidConfig.coopExtractBaseStandingGain, pmcData.CoopExtractCounts[extractName]); + const fenceId: string = Traders.FENCE; + pmcData.TradersInfo[fenceId].standing = newFenceStanding; + + // Check if new standing has leveled up trader + this.traderHelper.lvlUp(fenceId, pmcData); + pmcData.TradersInfo[fenceId].loyaltyLevel = Math.max(pmcData.TradersInfo[fenceId].loyaltyLevel, 1); + } + /** * Was extract by car * @param extractName name of extract @@ -290,9 +322,13 @@ export class MatchController // Increment extract count value pmcData.CarExtractCounts[extractName] += 1; + // Not exact replica of Live behaviour + // Simplified for now, no real reason to do the whole (unconfirmed) extra 0.01 standing per day regeneration mechanic + const newFenceStanding = this.getFenceStandingAfterExtract(pmcData, this.inraidConfig.carExtractBaseStandingGain, pmcData.CarExtractCounts[extractName]); const fenceId: string = Traders.FENCE; - this.updateFenceStandingInProfile(pmcData, fenceId, extractName); - + pmcData.TradersInfo[fenceId].standing = newFenceStanding; + + // Check if new standing has leveled up trader this.traderHelper.lvlUp(fenceId, pmcData); pmcData.TradersInfo[fenceId].loyaltyLevel = Math.max(pmcData.TradersInfo[fenceId].loyaltyLevel, 1); @@ -300,25 +336,25 @@ export class MatchController } /** - * Update players fence trader standing value in profile - * @param pmcData Player profile - * @param fenceId Id of fence trader - * @param extractName Name of extract used + * Get the fence rep gain from using a car or coop extract + * @param pmcData Profile + * @param baseGain amount gained for the first extract + * @param extractCount Number of times extract was taken + * @returns Fence standing after taking extract */ - protected updateFenceStandingInProfile(pmcData: IPmcData, fenceId: string, extractName: string): void + protected getFenceStandingAfterExtract(pmcData: IPmcData, baseGain: number, extractCount: number): number { + // Get current standing + const fenceId: string = Traders.FENCE; let fenceStanding = Number(pmcData.TradersInfo[fenceId].standing); - // Not exact replica of Live behaviour - // Simplified for now, no real reason to do the whole (unconfirmed) extra 0.01 standing per day regeneration mechanic - const baseGain: number = this.inraidConfig.carExtractBaseStandingGain; - const extractCount: number = pmcData.CarExtractCounts[extractName]; - + // get standing after taking extract x times, x.xx format, gain from extract can be no smaller than 0.01 fenceStanding += Math.max(baseGain / extractCount, 0.01); - // Ensure fence loyalty level is not above/below the range -7 - 15 + // Ensure fence loyalty level is not above/below the range -7 to 15 const newFenceStanding = Math.min(Math.max(fenceStanding, -7), 15); this.logger.debug(`Old vs new fence standing: ${pmcData.TradersInfo[fenceId].standing}, ${newFenceStanding}`); - pmcData.TradersInfo[fenceId].standing = newFenceStanding; + + return Number(newFenceStanding.toFixed(2)); } } \ No newline at end of file diff --git a/project/src/controllers/ProfileController.ts b/project/src/controllers/ProfileController.ts index e5b1adc5..7caf7fad 100644 --- a/project/src/controllers/ProfileController.ts +++ b/project/src/controllers/ProfileController.ts @@ -144,6 +144,7 @@ export class ProfileController pmcData.Hideout.Seed = this.timeUtil.getTimestamp() + (8 * 60 * 60 * 24 * 365); // 8 years in future why? who knows, we saw it in live pmcData.RepeatableQuests = []; pmcData.CarExtractCounts = {}; + pmcData.CoopExtractCounts = {}; if (!pmcData.UnlockedInfo) { diff --git a/project/src/models/eft/common/tables/IBotBase.ts b/project/src/models/eft/common/tables/IBotBase.ts index f279df12..aa23dc97 100644 --- a/project/src/models/eft/common/tables/IBotBase.ts +++ b/project/src/models/eft/common/tables/IBotBase.ts @@ -31,7 +31,8 @@ export interface IBotBase RepeatableQuests: IPmcDataRepeatableQuest[] Bonuses: Bonus[] Notes: Notes - CarExtractCounts: CarExtractCounts + CarExtractCounts: Record + CoopExtractCounts: Record SurvivorClass: SurvivorClass WishList: string[] /** SPT specific property used during bot generation in raid */ @@ -445,11 +446,6 @@ export interface Notes Notes: Note[] } -export interface CarExtractCounts -{ - -} - export enum SurvivorClass { UNKNOWN = 0, diff --git a/project/src/models/spt/config/IInRaidConfig.ts b/project/src/models/spt/config/IInRaidConfig.ts index a0248170..9a4d5f16 100644 --- a/project/src/models/spt/config/IInRaidConfig.ts +++ b/project/src/models/spt/config/IInRaidConfig.ts @@ -12,8 +12,10 @@ export interface IInRaidConfig extends IBaseConfig carExtracts: string[] /** Names of coop extracts */ coopExtracts: string[] - /** Fene rep gain from a single car extract */ + /** Fence rep gain from a single car extract */ carExtractBaseStandingGain: number + /** Fence rep gain from a single coop extract */ + coopExtractBaseStandingGain: number /** Fence rep gain when successfully extracting as pscav */ scavExtractGain: number /** On death should items in your secure keep their Find in raid status regardless of how you finished the raid */ From fce724b380d006300ea62da8c66d24246b391af8 Mon Sep 17 00:00:00 2001 From: Dev Date: Thu, 16 Nov 2023 12:55:57 +0000 Subject: [PATCH 19/23] Fix water collector craft not resetting after completion of craft --- project/src/controllers/HideoutController.ts | 6 ++-- .../src/models/eft/common/tables/IBotBase.ts | 2 ++ project/src/routers/EventOutputHolder.ts | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/project/src/controllers/HideoutController.ts b/project/src/controllers/HideoutController.ts index 7b188ef1..16096f06 100644 --- a/project/src/controllers/HideoutController.ts +++ b/project/src/controllers/HideoutController.ts @@ -740,7 +740,7 @@ export class HideoutController counterHoursCrafting.value = hoursCrafting; // Null production data now it's complete - will be cleaned up later by update() process - pmcData.Hideout.Production[prodId] = null; + pmcData.Hideout.Production[prodId].sptIsComplete = true; }; // Remove the old production from output object before its sent to client @@ -820,8 +820,8 @@ export class HideoutController const callback = () => { - // Null production data now it's complete - will be cleaned up later by update() process - pmcData.Hideout.Production[prodId] = null; + // Flag as complete - will be cleaned up later by update() process + pmcData.Hideout.Production[prodId].sptIsComplete = true; }; return this.inventoryHelper.addItem(pmcData, newReq, output, sessionID, callback, true); diff --git a/project/src/models/eft/common/tables/IBotBase.ts b/project/src/models/eft/common/tables/IBotBase.ts index aa23dc97..5190c225 100644 --- a/project/src/models/eft/common/tables/IBotBase.ts +++ b/project/src/models/eft/common/tables/IBotBase.ts @@ -389,6 +389,8 @@ export interface Productive /** Used when sending data to client */ NeedFuelForAllProductionTime?: boolean sptIsScavCase?: boolean + /** Some crafts are always inProgress, but need to be reset, e.g. water collector */ + sptIsComplete?: boolean } export interface Production extends Productive diff --git a/project/src/routers/EventOutputHolder.ts b/project/src/routers/EventOutputHolder.ts index 2e9ddf49..b3b1a079 100644 --- a/project/src/routers/EventOutputHolder.ts +++ b/project/src/routers/EventOutputHolder.ts @@ -92,6 +92,9 @@ export class EventOutputHolder profileChanges.production = this.getProductionsFromProfileAndFlagComplete(this.jsonUtil.clone(pmcData.Hideout.Production)); profileChanges.improvements = this.jsonUtil.clone(this.getImprovementsFromProfileAndFlagComplete(pmcData)); profileChanges.traderRelations = this.constructTraderRelations(pmcData.TradersInfo); + + // Fixes container craft from water collector not resetting after collection + this.resetSptIsCompleteFlaggedCrafts(pmcData.Hideout.Production); } /** @@ -160,6 +163,13 @@ export class EventOutputHolder continue; } + // Complete and is a water collector craft + // Needed as canister craft (water collector) is continuous + if (production.sptIsComplete && productionKey === "5d5589c1f934db045e6c5492") + { + continue; + } + // Skip completed if (!production.inProgress) { @@ -183,4 +193,22 @@ export class EventOutputHolder return productions; } + + /** + * Required as continuous productions don't reset and stay at 100% completion but client thinks it hasn't started + * @param productions Productions in a profile + */ + protected resetSptIsCompleteFlaggedCrafts(productions: Record): void + { + for (const productionKey in productions) + { + const production = productions[productionKey]; + if (production.sptIsComplete) + { + production.sptIsComplete = false; + production.Progress = 0; + production.StartTimestamp = this.timeUtil.getTimestamp(); + } + } + } } From 15082afde27f261ad5613fc425a10b608eb9cdb2 Mon Sep 17 00:00:00 2001 From: Dev Date: Thu, 16 Nov 2023 14:30:08 +0000 Subject: [PATCH 20/23] Fix `reorderHideoutAreasWithResouceInputs()` off by one error because it was checking the index instead of finding the area type --- project/src/services/ProfileFixerService.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/project/src/services/ProfileFixerService.ts b/project/src/services/ProfileFixerService.ts index 0a819231..403505e6 100644 --- a/project/src/services/ProfileFixerService.ts +++ b/project/src/services/ProfileFixerService.ts @@ -575,8 +575,7 @@ export class ProfileFixerService for (const areaId of areasToCheck) { - const area = pmcProfile.Hideout.Areas[areaId]; - + const area = pmcProfile.Hideout.Areas.find(x => x.type === areaId); if (!area) { this.logger.debug(`unable to sort ${areaId} slots, no area found`); From b70474133b5a46e9169bfaee8c073d2ca978f54e Mon Sep 17 00:00:00 2001 From: Dev Date: Thu, 16 Nov 2023 14:33:39 +0000 Subject: [PATCH 21/23] Fix multiple locations in code where an array for hideout areas is incorrectly accessed like a dictionary --- project/src/controllers/HideoutController.ts | 2 +- project/src/services/ProfileFixerService.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/project/src/controllers/HideoutController.ts b/project/src/controllers/HideoutController.ts index 16096f06..bea71a5b 100644 --- a/project/src/controllers/HideoutController.ts +++ b/project/src/controllers/HideoutController.ts @@ -704,7 +704,7 @@ export class HideoutController } // check if the recipe is the same as the last one - const area = pmcData.Hideout.Areas[recipe.areaType]; + const area = pmcData.Hideout.Areas.find(x => x.type === recipe.areaType); if (area && request.recipeId !== area.lastRecipe) { // 1 point per craft upon the end of production for alternating between 2 different crafting recipes in the same module diff --git a/project/src/services/ProfileFixerService.ts b/project/src/services/ProfileFixerService.ts index 403505e6..ae390807 100644 --- a/project/src/services/ProfileFixerService.ts +++ b/project/src/services/ProfileFixerService.ts @@ -81,27 +81,27 @@ export class ProfileFixerService this.reorderHideoutAreasWithResouceInputs(pmcProfile); - if (pmcProfile.Hideout.Areas[HideoutAreas.GENERATOR].slots.length < + if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.GENERATOR).slots.length < (6 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.Generator.Slots)) { this.logger.debug("Updating generator area slots to a size of 6 + hideout management skill"); this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.GENERATOR, (6 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.Generator.Slots), pmcProfile); } - if (pmcProfile.Hideout.Areas[HideoutAreas.WATER_COLLECTOR].slots.length < (1 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.WaterCollector.Slots)) + if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WATER_COLLECTOR).slots.length < (1 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.WaterCollector.Slots)) { this.logger.debug("Updating water collector area slots to a size of 1 + hideout management skill"); this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.WATER_COLLECTOR, (1 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.WaterCollector.Slots), pmcProfile); } - if (pmcProfile.Hideout.Areas[HideoutAreas.AIR_FILTERING].slots.length < (3 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.AirFilteringUnit.Slots)) + if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.AIR_FILTERING).slots.length < (3 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.AirFilteringUnit.Slots)) { this.logger.debug("Updating air filter area slots to a size of 3 + hideout management skill"); this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.AIR_FILTERING, (3 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.AirFilteringUnit.Slots), pmcProfile); } // BTC Farm doesnt have extra slots for hideout management, but we still check for modded stuff!! - if (pmcProfile.Hideout.Areas[HideoutAreas.BITCOIN_FARM].slots.length < (50 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.BitcoinFarm.Slots)) + if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.BITCOIN_FARM).slots.length < (50 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.BitcoinFarm.Slots)) { this.logger.debug("Updating bitcoin farm area slots to a size of 50 + hideout management skill"); this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.BITCOIN_FARM, (50 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.BitcoinFarm.Slots), pmcProfile); @@ -506,7 +506,7 @@ export class ProfileFixerService */ protected addMissingWallImprovements(pmcProfile: IPmcData): void { - const profileWallArea = pmcProfile.Hideout.Areas[HideoutAreas.EMERGENCY_WALL]; + const profileWallArea = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.EMERGENCY_WALL); const wallDb = this.databaseServer.getTables().hideout.areas.find(x => x.type === HideoutAreas.EMERGENCY_WALL); if (profileWallArea.level > 0) From 4ac12ef70a1ce746740dab92d0c2598e0500e0b8 Mon Sep 17 00:00:00 2001 From: Refringe Date: Thu, 16 Nov 2023 21:42:06 +0000 Subject: [PATCH 22/23] Formatting/Linting Changes (!168) These are the formatting & linting configuration changes from the `3.8.0` branch and the changes that they make to the overall project. The majority of these changes are from running two commands: `npm run lint:fix` `npm run style:fix` This has already been run on the `3.8.0` branch and this PR should make `master` play nicer when it comes to merges going forward. There are now four VSCode plugins recommended for server development. They've been added to the workspace file and a user should get a UI notification when the workspace is opened if they're not installed. The four plugins are: https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig https://marketplace.visualstudio.com/items?itemName=dprint.dprint https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint https://marketplace.visualstudio.com/items?itemName=biomejs.biome Once installed they should just work within the workspace. Also, be sure to `npm i` to get the new dprint application. Co-authored-by: Refringe Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/168 --- project/.editorconfig | 9 + project/.eslintrc.json | 145 +- project/.vscode/launch.json | 4 +- project/.vscode/settings.json | 13 - project/Dockerfile | 5 +- project/Server.code-workspace | 25 +- project/biome.json | 36 +- project/dprint.json | 90 + project/gulpfile.mjs | 89 +- project/jest.config.ts | 10 +- project/package.json | 13 +- project/src/ErrorHandler.ts | 13 +- project/src/Program.ts | 19 +- project/src/callbacks/BotCallbacks.ts | 13 +- project/src/callbacks/BundleCallbacks.ts | 4 +- project/src/callbacks/ClientLogCallbacks.ts | 8 +- .../src/callbacks/CustomizationCallbacks.ts | 8 +- project/src/callbacks/DataCallbacks.ts | 66 +- project/src/callbacks/DialogueCallbacks.ts | 96 +- project/src/callbacks/GameCallbacks.ts | 45 +- project/src/callbacks/HandbookCallbacks.ts | 10 +- project/src/callbacks/HealthCallbacks.ts | 21 +- project/src/callbacks/HideoutCallbacks.ts | 78 +- project/src/callbacks/HttpCallbacks.ts | 9 +- project/src/callbacks/InraidCallbacks.ts | 14 +- project/src/callbacks/InsuranceCallbacks.ts | 8 +- project/src/callbacks/InventoryCallbacks.ts | 56 +- project/src/callbacks/ItemEventCallbacks.ts | 18 +- project/src/callbacks/LauncherCallbacks.ts | 7 +- project/src/callbacks/LocationCallbacks.ts | 18 +- project/src/callbacks/MatchCallbacks.ts | 30 +- project/src/callbacks/ModCallbacks.ts | 7 +- project/src/callbacks/NoteCallbacks.ts | 5 +- project/src/callbacks/NotifierCallbacks.ts | 29 +- project/src/callbacks/PresetBuildCallbacks.ts | 37 +- project/src/callbacks/PresetCallbacks.ts | 5 +- project/src/callbacks/ProfileCallbacks.ts | 83 +- project/src/callbacks/QuestCallbacks.ts | 29 +- project/src/callbacks/RagfairCallbacks.ts | 21 +- project/src/callbacks/RepairCallbacks.ts | 19 +- project/src/callbacks/SaveCallbacks.ts | 8 +- project/src/callbacks/TradeCallbacks.ts | 26 +- project/src/callbacks/TraderCallbacks.ts | 14 +- project/src/callbacks/WeatherCallbacks.ts | 6 +- project/src/callbacks/WishlistCallbacks.ts | 7 +- project/src/context/ApplicationContext.ts | 26 +- project/src/context/ContextVariable.ts | 2 +- project/src/context/ContextVariableType.ts | 14 +- project/src/controllers/BotController.ts | 67 +- .../src/controllers/ClientLogController.ts | 8 +- .../controllers/CustomizationController.ts | 60 +- project/src/controllers/DialogueController.ts | 136 +- project/src/controllers/GameController.ts | 182 +- project/src/controllers/HandbookController.ts | 6 +- project/src/controllers/HealthController.ts | 38 +- project/src/controllers/HideoutController.ts | 474 ++-- project/src/controllers/InraidController.ts | 92 +- .../src/controllers/InsuranceController.ts | 93 +- .../src/controllers/InventoryController.ts | 240 +- project/src/controllers/LauncherController.ts | 6 +- project/src/controllers/LocationController.ts | 29 +- project/src/controllers/MatchController.ts | 87 +- project/src/controllers/NoteController.ts | 13 +- project/src/controllers/NotifierController.ts | 4 +- .../src/controllers/PresetBuildController.ts | 83 +- project/src/controllers/PresetController.ts | 4 +- project/src/controllers/ProfileController.ts | 76 +- project/src/controllers/QuestController.ts | 297 ++- project/src/controllers/RagfairController.ts | 252 +- project/src/controllers/RepairController.ts | 31 +- .../controllers/RepeatableQuestController.ts | 119 +- project/src/controllers/TradeController.ts | 110 +- project/src/controllers/TraderController.ts | 13 +- project/src/controllers/WeatherController.ts | 11 +- project/src/controllers/WishlistController.ts | 8 +- project/src/di/Container.ts | 231 +- project/src/di/OnLoad.ts | 4 +- project/src/di/OnUpdate.ts | 4 +- project/src/di/Router.ts | 73 +- project/src/di/Serializer.ts | 4 +- .../generators/BotEquipmentModGenerator.ts | 386 ++- project/src/generators/BotGenerator.ts | 178 +- .../src/generators/BotInventoryGenerator.ts | 250 +- project/src/generators/BotLevelGenerator.ts | 28 +- project/src/generators/BotLootGenerator.ts | 222 +- project/src/generators/BotWeaponGenerator.ts | 307 ++- .../generators/FenceBaseAssortGenerator.ts | 23 +- project/src/generators/LocationGenerator.ts | 374 ++- project/src/generators/LootGenerator.ts | 138 +- project/src/generators/PMCLootGenerator.ts | 55 +- project/src/generators/PlayerScavGenerator.ts | 42 +- .../src/generators/RagfairAssortGenerator.ts | 22 +- .../src/generators/RagfairOfferGenerator.ts | 203 +- .../generators/RepeatableQuestGenerator.ts | 450 ++-- .../src/generators/ScavCaseRewardGenerator.ts | 122 +- project/src/generators/WeatherGenerator.ts | 50 +- .../generators/weapongen/IInventoryMagGen.ts | 2 +- .../generators/weapongen/InventoryMagGen.ts | 18 +- .../implementations/BarrelInventoryMagGen.ts | 30 +- .../ExternalInventoryMagGen.ts | 44 +- .../InternalMagazineInventoryMagGen.ts | 26 +- .../implementations/UbglExternalMagGen.ts | 27 +- project/src/helpers/AssortHelper.ts | 31 +- project/src/helpers/BotDifficultyHelper.ts | 36 +- project/src/helpers/BotGeneratorHelper.ts | 227 +- project/src/helpers/BotHelper.ts | 28 +- .../src/helpers/BotWeaponGeneratorHelper.ts | 72 +- project/src/helpers/ContainerHelper.ts | 23 +- project/src/helpers/DialogueHelper.ts | 71 +- project/src/helpers/DurabilityLimitsHelper.ts | 28 +- project/src/helpers/GameEventHelper.ts | 5 +- project/src/helpers/HandbookHelper.ts | 20 +- project/src/helpers/HealthHelper.ts | 57 +- project/src/helpers/HideoutHelper.ts | 241 +- project/src/helpers/HttpServerHelper.ts | 26 +- project/src/helpers/InRaidHelper.ts | 90 +- project/src/helpers/InventoryHelper.ts | 316 ++- project/src/helpers/ItemHelper.ts | 104 +- project/src/helpers/NotificationSendHelper.ts | 25 +- project/src/helpers/NotifierHelper.ts | 26 +- project/src/helpers/PaymentHelper.ts | 18 +- project/src/helpers/PresetHelper.ts | 20 +- project/src/helpers/ProbabilityHelper.ts | 8 +- project/src/helpers/ProfileHelper.ts | 77 +- project/src/helpers/QuestConditionHelper.ts | 31 +- project/src/helpers/QuestHelper.ts | 235 +- project/src/helpers/RagfairHelper.ts | 20 +- project/src/helpers/RagfairOfferHelper.ts | 111 +- project/src/helpers/RagfairSellHelper.ts | 48 +- project/src/helpers/RagfairServerHelper.ts | 34 +- project/src/helpers/RagfairSortHelper.ts | 14 +- project/src/helpers/RepairHelper.ts | 58 +- project/src/helpers/RepeatableQuestHelper.ts | 17 +- project/src/helpers/SecureContainerHelper.ts | 19 +- project/src/helpers/TradeHelper.ts | 45 +- project/src/helpers/TraderAssortHelper.ts | 40 +- project/src/helpers/TraderHelper.ts | 78 +- project/src/helpers/UtilityHelper.ts | 4 +- project/src/helpers/WeightedRandomHelper.ts | 7 +- project/src/loaders/BundleLoader.ts | 18 +- project/src/loaders/ModLoadOrder.ts | 15 +- project/src/loaders/ModTypeCheck.ts | 24 +- project/src/loaders/PostAkiModLoader.ts | 21 +- project/src/loaders/PostDBModLoader.ts | 26 +- project/src/loaders/PreAkiModLoader.ts | 145 +- project/src/models/common/MinMax.ts | 8 +- .../eft/bot/IGenerateBotsRequestData.ts | 14 +- .../eft/bot/IRandomisedBotLevelResult.ts | 6 +- .../models/eft/common/IEmptyRequestData.ts | 3 +- project/src/models/eft/common/IGlobals.ts | 2358 ++++++++--------- project/src/models/eft/common/ILocation.ts | 20 +- .../src/models/eft/common/ILocationBase.ts | 444 ++-- .../common/ILocationsSourceDestinationBase.ts | 14 +- project/src/models/eft/common/ILooseLoot.ts | 58 +- .../models/eft/common/IMetricsTableData.ts | 14 +- project/src/models/eft/common/IPmcData.ts | 4 +- project/src/models/eft/common/Ixyz.ts | 3 +- .../request/IBaseInteractionRequestData.ts | 16 +- .../src/models/eft/common/tables/IBotBase.ts | 609 +++-- .../src/models/eft/common/tables/IBotCore.ts | 266 +- .../src/models/eft/common/tables/IBotType.ts | 294 +- .../eft/common/tables/ICustomizationItem.ts | 52 +- .../models/eft/common/tables/IHandbookBase.ts | 28 +- project/src/models/eft/common/tables/IItem.ts | 261 +- .../eft/common/tables/ILocationsBase.ts | 18 +- .../src/models/eft/common/tables/ILootBase.ts | 84 +- .../src/models/eft/common/tables/IMatch.ts | 16 +- .../eft/common/tables/IProfileTemplate.ts | 44 +- .../src/models/eft/common/tables/IQuest.ts | 208 +- .../eft/common/tables/IRepeatableQuests.ts | 432 ++- .../models/eft/common/tables/ITemplateItem.ts | 938 +++---- .../src/models/eft/common/tables/ITrader.ts | 170 +- .../customization/IBuyClothingRequestData.ts | 16 +- .../eft/customization/IGetSuitsResponse.ts | 6 +- .../customization/IWearClothingRequestData.ts | 8 +- .../eft/dialog/IAcceptFriendRequestData.ts | 14 +- project/src/models/eft/dialog/IChatServer.ts | 24 +- .../eft/dialog/IClearMailMessageRequest.ts | 4 +- .../models/eft/dialog/IDeleteFriendRequest.ts | 4 +- .../models/eft/dialog/IFriendRequestData.ts | 6 +- .../eft/dialog/IFriendRequestSendResponse.ts | 8 +- .../dialog/IGetAllAttachmentsRequestData.ts | 6 +- .../eft/dialog/IGetAllAttachmentsResponse.ts | 8 +- .../dialog/IGetChatServerListRequestData.ts | 4 +- .../eft/dialog/IGetFriendListDataResponse.ts | 8 +- .../dialog/IGetMailDialogInfoRequestData.ts | 3 +- .../dialog/IGetMailDialogListRequestData.ts | 8 +- .../dialog/IGetMailDialogViewRequestData.ts | 12 +- .../dialog/IGetMailDialogViewResponseData.ts | 10 +- .../eft/dialog/IPinDialogRequestData.ts | 6 +- .../eft/dialog/IRemoveDialogRequestData.ts | 5 +- .../eft/dialog/IRemoveMailMessageRequest.ts | 4 +- .../models/eft/dialog/ISendMessageRequest.ts | 10 +- .../eft/dialog/ISetDialogReadRequestData.ts | 4 +- .../models/eft/game/ICheckVersionResponse.ts | 6 +- .../models/eft/game/ICurrentGroupResponse.ts | 22 +- .../models/eft/game/IGameConfigResponse.ts | 38 +- .../eft/game/IGameEmptyCrcRequestData.ts | 6 +- .../models/eft/game/IGameKeepAliveResponse.ts | 6 +- .../eft/game/IGameLogoutResponseData.ts | 4 +- .../src/models/eft/game/IGameStartResponse.ts | 4 +- .../models/eft/game/IGetItemPricesResponse.ts | 8 +- .../eft/game/IReportNicknameRequestData.ts | 4 +- project/src/models/eft/game/IServerDetails.ts | 6 +- .../eft/game/IVersionValidateRequestData.ts | 20 +- project/src/models/eft/health/Effect.ts | 6 +- .../eft/health/IHealthTreatmentRequestData.ts | 50 +- .../eft/health/IOffraidEatRequestData.ts | 12 +- .../eft/health/IOffraidHealRequestData.ts | 20 +- .../eft/health/ISyncHealthRequestData.ts | 36 +- project/src/models/eft/health/IWorkoutData.ts | 8 +- .../HideoutUpgradeCompleteRequestData.ts | 10 +- .../eft/hideout/IHandleQTEEventRequestData.ts | 10 +- .../src/models/eft/hideout/IHideoutArea.ts | 124 +- .../IHideoutCancelProductionRequestData.ts | 8 +- ...outContinuousProductionStartRequestData.ts | 10 +- .../hideout/IHideoutImproveAreaRequestData.ts | 16 +- .../models/eft/hideout/IHideoutProduction.ts | 46 +- .../hideout/IHideoutPutItemInRequestData.ts | 18 +- .../models/eft/hideout/IHideoutScavCase.ts | 30 +- .../IHideoutScavCaseStartRequestData.ts | 24 +- .../eft/hideout/IHideoutSettingsBase.ts | 12 +- ...HideoutSingleProductionStartRequestData.ts | 18 +- .../hideout/IHideoutTakeItemOutRequestData.ts | 12 +- .../IHideoutTakeProductionRequestData.ts | 10 +- .../hideout/IHideoutToggleAreaRequestData.ts | 12 +- .../IHideoutUpgradeCompleteRequestData.ts | 10 +- .../eft/hideout/IHideoutUpgradeRequestData.ts | 18 +- project/src/models/eft/hideout/IQteData.ts | 54 +- .../eft/hideout/IRecordShootingRangePoints.ts | 6 +- .../eft/httpResponse/IGetBodyResponseData.ts | 10 +- .../eft/httpResponse/INullResponseData.ts | 10 +- .../models/eft/inRaid/IInsuredItemsData.ts | 12 +- .../eft/inRaid/IRegisterPlayerRequestData.ts | 10 +- .../eft/inRaid/ISaveProgressRequestData.ts | 14 +- .../insurance/IGetInsuranceCostRequestData.ts | 8 +- .../IGetInsuranceCostResponseData.ts | 2 +- .../eft/insurance/IInsureRequestData.ts | 10 +- .../eft/inventory/IAddItemRequestData.ts | 2 +- .../eft/inventory/IAddItemTempObject.ts | 12 +- .../eft/inventory/IInventoryAddRequestData.ts | 15 +- .../IInventoryBaseActionRequestData.ts | 49 +- .../inventory/IInventoryBindRequestData.ts | 10 +- .../IInventoryCreateMarkerRequestData.ts | 20 +- .../IInventoryDeleteMarkerRequestData.ts | 12 +- .../IInventoryEditMarkerRequestData.ts | 24 +- .../inventory/IInventoryExamineRequestData.ts | 10 +- .../inventory/IInventoryFoldRequestData.ts | 10 +- .../inventory/IInventoryMergeRequestData.ts | 10 +- .../inventory/IInventoryMoveRequestData.ts | 10 +- .../IInventoryReadEncyclopediaRequestData.ts | 8 +- .../inventory/IInventoryRemoveRequestData.ts | 8 +- .../inventory/IInventorySortRequestData.ts | 32 +- .../inventory/IInventorySplitRequestData.ts | 18 +- .../inventory/IInventorySwapRequestData.ts | 18 +- .../eft/inventory/IInventoryTagRequestData.ts | 12 +- .../inventory/IInventoryToggleRequestData.ts | 10 +- .../IInventoryTransferRequestData.ts | 12 +- .../IOpenRandomLootContainerRequestData.ts | 12 +- .../eft/itemEvent/IItemEventRouterBase.ts | 106 +- .../eft/itemEvent/IItemEventRouterRequest.ts | 39 +- .../eft/itemEvent/IItemEventRouterResponse.ts | 2 +- .../models/eft/launcher/IChangeRequestData.ts | 4 +- .../launcher/IGetMiniProfileRequestData.ts | 8 +- .../models/eft/launcher/ILoginRequestData.ts | 6 +- .../src/models/eft/launcher/IMiniProfile.ts | 26 +- .../src/models/eft/launcher/IRegisterData.ts | 4 +- .../models/eft/launcher/IRemoveProfileData.ts | 2 +- .../models/eft/location/IAirdropLootResult.ts | 6 +- .../eft/location/IGetLocationRequestData.ts | 10 +- .../eft/match/IAcceptGroupInviteRequest.ts | 4 +- .../eft/match/IAcceptGroupInviteResponse.ts | 26 +- .../eft/match/ICancelGroupInviteRequest.ts | 4 +- .../eft/match/ICreateGroupRequestData.ts | 8 +- .../eft/match/IEndOfflineRaidRequestData.ts | 10 +- .../eft/match/IGetGroupStatusRequestData.ts | 14 +- .../eft/match/IGetProfileRequestData.ts | 2 +- .../match/IGetRaidConfigurationRequestData.ts | 54 +- .../models/eft/match/IJoinMatchRequestData.ts | 12 +- .../src/models/eft/match/IJoinMatchResult.ts | 30 +- .../eft/match/IPutMetricsRequestData.ts | 18 +- .../match/IRemovePlayerFromGroupRequest.ts | 4 +- .../eft/match/ISendGroupInviteRequest.ts | 6 +- .../models/eft/match/ITransferGroupRequest.ts | 4 +- .../eft/match/IUpdatePingRequestData.ts | 4 +- .../src/models/eft/notes/INoteActionData.ts | 10 +- project/src/models/eft/notifier/INotifier.ts | 23 +- .../eft/notifier/ISelectProfileRequestData.ts | 6 +- .../eft/notifier/ISelectProfileResponse.ts | 4 +- .../IPlayerIncrementSkillLevelRequestData.ts | 36 +- .../IPresetBuildActionRequestData.ts | 14 +- .../presetBuild/IRemoveBuildRequestData.ts | 6 +- .../profile/GetProfileStatusResponseData.ts | 30 +- project/src/models/eft/profile/IAkiProfile.ts | 300 +-- .../models/eft/profile/IConnectResponse.ts | 10 +- .../eft/profile/IGetProfileSettingsRequest.ts | 4 +- .../IProfileChangeNicknameRequestData.ts | 6 +- .../profile/IProfileChangeVoiceRequestData.ts | 6 +- .../eft/profile/IProfileCreateRequestData.ts | 12 +- .../eft/profile/ISearchFriendRequestData.ts | 4 +- .../eft/profile/ISearchFriendResponse.ts | 13 +- .../profile/IValidateNicknameRequestData.ts | 6 +- .../eft/quests/IAcceptQuestRequestData.ts | 10 +- .../eft/quests/ICompleteQuestRequestData.ts | 10 +- .../eft/quests/IFailQuestRequestData.ts | 10 +- .../eft/quests/IHandoverQuestRequestData.ts | 18 +- .../eft/quests/IListQuestsRequestData.ts | 6 +- .../quests/IRepeatableQuestChangeRequest.ts | 6 +- .../eft/ragfair/IAddOfferRequestData.ts | 24 +- .../eft/ragfair/IExtendOfferRequestData.ts | 8 +- .../models/eft/ragfair/IGetItemPriceResult.ts | 4 +- .../eft/ragfair/IGetMarketPriceRequestData.ts | 4 +- .../models/eft/ragfair/IGetOffersResult.ts | 12 +- .../src/models/eft/ragfair/IRagfairOffer.ts | 72 +- .../eft/ragfair/IRemoveOfferRequestData.ts | 8 +- .../models/eft/ragfair/ISearchRequestData.ts | 56 +- .../ragfair/ISendRagfairReportRequestData.ts | 4 +- .../IStorePlayerOfferTaxAmountRequestData.ts | 10 +- .../repair/IBaseRepairActionDataRequest.ts | 4 +- .../eft/repair/IRepairActionDataRequest.ts | 12 +- .../repair/ITraderRepairActionDataRequest.ts | 14 +- .../eft/trade/IProcessBaseTradeRequestData.ts | 10 +- .../eft/trade/IProcessBuyTradeRequestData.ts | 25 +- .../trade/IProcessRagfairTradeRequestData.ts | 22 +- .../eft/trade/IProcessSellTradeRequestData.ts | 22 +- .../trade/ISellScavItemsToFenceRequestData.ts | 8 +- .../src/models/eft/weather/IWeatherData.ts | 6 +- .../eft/wishlist/IWishlistActionData.ts | 7 +- project/src/models/enums/AccountTypes.ts | 6 +- project/src/models/enums/AirdropType.ts | 6 +- project/src/models/enums/AmmoTypes.ts | 104 +- project/src/models/enums/BackendErrorCodes.ts | 8 +- project/src/models/enums/BaseClasses.ts | 48 +- project/src/models/enums/BotAmount.ts | 6 +- project/src/models/enums/BotDifficulty.ts | 6 +- project/src/models/enums/ConfigTypes.ts | 6 +- project/src/models/enums/ContainerTypes.ts | 12 +- project/src/models/enums/ELocationName.ts | 8 +- .../src/models/enums/EquipmentBuildType.ts | 6 +- project/src/models/enums/EquipmentSlots.ts | 6 +- project/src/models/enums/ExitStatis.ts | 6 +- project/src/models/enums/GiftSenderType.ts | 6 +- project/src/models/enums/GiftSentResult.ts | 6 +- project/src/models/enums/HideoutAreas.ts | 8 +- .../src/models/enums/HideoutEventActions.ts | 6 +- project/src/models/enums/ItemAddedResult.ts | 6 +- project/src/models/enums/ItemEventActions.ts | 6 +- project/src/models/enums/MemberCategory.ts | 5 +- project/src/models/enums/MessageType.ts | 7 +- project/src/models/enums/Money.ts | 6 +- .../src/models/enums/PlayerRaidEndState.ts | 6 +- project/src/models/enums/QuestRewardType.ts | 6 +- project/src/models/enums/QuestStatus.ts | 6 +- project/src/models/enums/QuestTypeEnum.ts | 7 +- project/src/models/enums/RagfairSort.ts | 6 +- project/src/models/enums/RaidMode.ts | 6 +- project/src/models/enums/SeasonalEventType.ts | 6 +- project/src/models/enums/SkillTypes.ts | 6 +- project/src/models/enums/Traders.ts | 8 +- project/src/models/enums/WeaponSkillTypes.ts | 6 +- project/src/models/enums/WeaponTypes.ts | 86 +- project/src/models/enums/WeatherType.ts | 6 +- .../src/models/enums/WildSpawnTypeNumber.ts | 6 +- project/src/models/enums/WindDirection.ts | 6 +- project/src/models/external/HttpFramework.ts | 50 +- .../src/models/external/IPostAkiLoadMod.ts | 2 +- .../models/external/IPostAkiLoadModAsync.ts | 2 +- project/src/models/external/IPostDBLoadMod.ts | 2 +- .../models/external/IPostDBLoadModAsync.ts | 2 +- project/src/models/external/IPreAkiLoadMod.ts | 2 +- .../models/external/IPreAkiLoadModAsync.ts | 2 +- project/src/models/external/tsyringe.ts | 2 +- project/src/models/spt/bindings/Route.ts | 4 +- .../models/spt/bots/BotGenerationDetails.ts | 18 +- .../models/spt/bots/GenerateWeaponResult.ts | 2 +- project/src/models/spt/bots/IBotLootCache.ts | 25 +- .../models/spt/callbacks/IBundleCallbacks.ts | 6 +- .../spt/callbacks/ICustomizationCallbacks.ts | 2 +- .../models/spt/callbacks/IDataCallbacks.ts | 24 +- .../spt/callbacks/IDialogueCallbacks.ts | 24 +- .../models/spt/callbacks/IGameCallbacks.ts | 6 +- .../models/spt/callbacks/IHideoutCallbacks.ts | 44 +- .../spt/callbacks/IInventoryCallbacks.ts | 24 +- .../spt/callbacks/IItemEventCallbacks.ts | 6 +- .../spt/callbacks/INotifierCallbacks.ts | 8 +- .../spt/callbacks/IPresetBuildCallbacks.ts | 24 +- .../models/spt/callbacks/IProfileCallbacks.ts | 6 +- .../models/spt/callbacks/IQuestCallbacks.ts | 12 +- .../models/spt/callbacks/IRagfairCallbacks.ts | 8 +- .../models/spt/callbacks/ITradeCallbacks.ts | 6 +- .../models/spt/callbacks/ITraderCallbacks.ts | 15 +- .../src/models/spt/config/IAirdropConfig.ts | 55 +- project/src/models/spt/config/IBaseConfig.ts | 4 +- project/src/models/spt/config/IBotConfig.ts | 164 +- .../src/models/spt/config/IBotDurability.ts | 76 +- project/src/models/spt/config/ICoreConfig.ts | 4 +- project/src/models/spt/config/IGiftsConfig.ts | 26 +- .../src/models/spt/config/IHealthConfig.ts | 20 +- .../src/models/spt/config/IHideoutConfig.ts | 8 +- project/src/models/spt/config/IHttpConfig.ts | 14 +- .../src/models/spt/config/IInRaidConfig.ts | 42 +- .../src/models/spt/config/IInsuranceConfig.ts | 12 +- .../src/models/spt/config/IInventoryConfig.ts | 32 +- project/src/models/spt/config/IItemConfig.ts | 8 +- .../src/models/spt/config/ILocaleConfig.ts | 8 +- .../src/models/spt/config/ILocationConfig.ts | 92 +- project/src/models/spt/config/ILootConfig.ts | 6 +- .../models/spt/config/ILostOnDeathConfig.ts | 32 +- project/src/models/spt/config/IMatchConfig.ts | 6 +- .../models/spt/config/IPlayerScavConfig.ts | 30 +- .../src/models/spt/config/IPmChatResponse.ts | 14 +- project/src/models/spt/config/IPmcConfig.ts | 70 +- project/src/models/spt/config/IQuestConfig.ts | 210 +- .../src/models/spt/config/IRagfairConfig.ts | 148 +- .../src/models/spt/config/IRepairConfig.ts | 52 +- .../src/models/spt/config/IScavCaseConfig.ts | 46 +- .../models/spt/config/ISeasonalEventConfig.ts | 30 +- .../src/models/spt/config/ITraderConfig.ts | 64 +- .../src/models/spt/config/IWeatherConfig.ts | 32 +- .../models/spt/controllers/IBotController.ts | 2 +- .../models/spt/dialog/ISendMessageDetails.ts | 24 +- .../models/spt/generators/IBotGenerator.ts | 8 +- .../spt/generators/ILocationGenerator.ts | 21 +- .../spt/generators/IRagfairOfferGenerator.ts | 10 +- .../hideout/ScavCaseRewardCountsAndPrices.ts | 16 +- .../models/spt/logging/IClientLogRequest.ts | 14 +- .../models/spt/logging/LogBackgroundColor.ts | 6 +- project/src/models/spt/logging/LogLevel.ts | 8 +- .../src/models/spt/logging/LogTextColor.ts | 6 +- project/src/models/spt/logging/SptLogger.ts | 12 +- project/src/models/spt/mod/IModLoader.ts | 2 +- project/src/models/spt/mod/NewItemDetails.ts | 6 +- .../spt/ragfair/IRagfairServerPrices.ts | 8 +- .../models/spt/repeatable/IQuestTypePool.ts | 40 +- .../src/models/spt/server/IDatabaseTables.ts | 58 +- project/src/models/spt/server/ILocaleBase.ts | 12 +- project/src/models/spt/server/ILocations.ts | 42 +- project/src/models/spt/server/IServerBase.ts | 8 +- .../src/models/spt/server/ISettingsBase.ts | 84 +- .../src/models/spt/services/CustomPreset.ts | 6 +- .../spt/services/CustomTraderAssortData.ts | 6 +- project/src/models/spt/services/LootItem.ts | 2 +- .../src/models/spt/services/LootRequest.ts | 20 +- project/src/models/spt/utils/IAsyncQueue.ts | 6 +- project/src/models/spt/utils/ICommand.ts | 8 +- project/src/models/spt/utils/ILogger.ts | 10 +- .../src/models/spt/utils/IUuidGenerator.ts | 6 +- project/src/routers/EventOutputHolder.ts | 37 +- project/src/routers/HttpRouter.ts | 23 +- project/src/routers/ImageRouter.ts | 6 +- project/src/routers/ItemEventRouter.ts | 19 +- .../src/routers/dynamic/BotDynamicRouter.ts | 78 +- .../routers/dynamic/BundleDynamicRouter.ts | 30 +- .../dynamic/CustomizationDynamicRouter.ts | 31 +- .../src/routers/dynamic/DataDynamicRouter.ts | 61 +- .../src/routers/dynamic/HttpDynamicRouter.ts | 63 +- .../routers/dynamic/InraidDynamicRouter.ts | 32 +- .../routers/dynamic/LocationDynamicRouter.ts | 32 +- .../routers/dynamic/NotifierDynamicRouter.ts | 79 +- .../routers/dynamic/TraderDynamicRouter.ts | 46 +- .../CustomizationItemEventRouter.ts | 22 +- .../item_events/HealthItemEventRouter.ts | 19 +- .../item_events/HideoutItemEventRouter.ts | 19 +- .../item_events/InsuranceItemEventRouter.ts | 22 +- .../item_events/InventoryItemEventRouter.ts | 20 +- .../item_events/NoteItemEventRouter.ts | 23 +- .../item_events/PresetBuildItemEventRouter.ts | 19 +- .../item_events/QuestItemEventRouter.ts | 25 +- .../item_events/RagfairItemEventRouter.ts | 19 +- .../item_events/RepairItemEventRouter.ts | 22 +- .../item_events/TradeItemEventRouter.ts | 19 +- .../item_events/WishlistItemEventRouter.ts | 22 +- .../routers/save_load/HealthSaveLoadRouter.ts | 30 +- .../routers/save_load/InraidSaveLoadRouter.ts | 22 +- .../save_load/InsuranceSaveLoadRouter.ts | 17 +- .../save_load/ProfileSaveLoadRouter.ts | 22 +- .../routers/serializers/BundleSerializer.ts | 5 +- .../routers/serializers/ImageSerializer.ts | 10 +- .../routers/serializers/NotifySerializer.ts | 13 +- project/src/routers/static/BotStaticRouter.ts | 30 +- .../src/routers/static/BundleStaticRouter.ts | 30 +- .../routers/static/ClientLogStaticRouter.ts | 28 +- .../static/CustomizationStaticRouter.ts | 30 +- .../src/routers/static/DataStaticRouter.ts | 206 +- .../src/routers/static/DialogStaticRouter.ts | 350 ++- .../src/routers/static/GameStaticRouter.ts | 174 +- .../src/routers/static/HealthStaticRouter.ts | 46 +- .../src/routers/static/InraidStaticRouter.ts | 94 +- .../routers/static/InsuranceStaticRouter.ts | 30 +- .../routers/static/ItemEventStaticRouter.ts | 30 +- .../routers/static/LauncherStaticRouter.ts | 222 +- .../routers/static/LocationStaticRouter.ts | 46 +- .../src/routers/static/MatchStaticRouter.ts | 383 ++- .../routers/static/NotifierStaticRouter.ts | 46 +- .../src/routers/static/PresetStaticRouter.ts | 30 +- .../src/routers/static/ProfileStaticRouter.ts | 194 +- .../src/routers/static/QuestStaticRouter.ts | 44 +- .../src/routers/static/RagfairStaticRouter.ts | 105 +- .../src/routers/static/TraderStaticRouter.ts | 30 +- .../src/routers/static/WeatherStaticRouter.ts | 29 +- project/src/servers/ConfigServer.ts | 15 +- project/src/servers/DatabaseServer.ts | 2 +- project/src/servers/HttpServer.ts | 14 +- project/src/servers/RagfairServer.ts | 8 +- project/src/servers/SaveServer.ts | 17 +- project/src/servers/WebSocketServer.ts | 48 +- project/src/servers/http/AkiHttpListener.ts | 50 +- project/src/servers/http/HttpMethods.ts | 8 +- project/src/servers/http/IHttpListener.ts | 6 +- .../src/services/BotEquipmentFilterService.ts | 111 +- .../services/BotEquipmentModPoolService.ts | 27 +- .../src/services/BotGenerationCacheService.ts | 18 +- project/src/services/BotLootCacheService.ts | 116 +- .../src/services/BotWeaponModLimitService.ts | 72 +- .../src/services/CustomLocationWaveService.ts | 12 +- project/src/services/FenceService.ts | 167 +- project/src/services/GiftService.ts | 32 +- project/src/services/HashCacheService.ts | 12 +- project/src/services/InsuranceService.ts | 86 +- project/src/services/ItemBaseClassService.ts | 8 +- project/src/services/ItemFilterService.ts | 8 +- project/src/services/LocaleService.ts | 14 +- project/src/services/LocalisationService.ts | 31 +- project/src/services/MailSendService.ts | 130 +- .../services/MatchBotDetailsCacheService.ts | 5 +- project/src/services/MatchLocationService.ts | 44 +- project/src/services/ModCompilerService.ts | 64 +- project/src/services/NotificationService.ts | 2 +- project/src/services/OpenZoneService.ts | 6 +- project/src/services/PaymentService.ts | 96 +- project/src/services/PlayerService.ts | 5 +- .../src/services/PmcChatResponseService.ts | 65 +- project/src/services/ProfileFixerService.ts | 368 ++- .../src/services/ProfileSnapshotService.ts | 8 +- .../src/services/RagfairCategoriesService.ts | 24 +- .../src/services/RagfairLinkedItemService.ts | 21 +- project/src/services/RagfairOfferService.ts | 23 +- project/src/services/RagfairPriceService.ts | 81 +- .../services/RagfairRequiredItemsService.ts | 7 +- project/src/services/RagfairTaxService.ts | 65 +- project/src/services/RepairService.ts | 178 +- project/src/services/SeasonalEventService.ts | 89 +- project/src/services/TraderAssortService.ts | 4 +- .../TraderPurchasePersisterService.ts | 19 +- project/src/services/mod/CustomItemService.ts | 25 +- .../mod/dynamicRouter/DynamicRouterMod.ts | 9 +- .../dynamicRouter/DynamicRouterModService.ts | 14 +- .../mod/httpListener/HttpListenerMod.ts | 10 +- .../httpListener/HttpListenerModService.ts | 16 +- .../services/mod/image/ImageRouteService.ts | 2 +- project/src/services/mod/onLoad/OnLoadMod.ts | 11 +- .../services/mod/onLoad/OnLoadModService.ts | 16 +- .../src/services/mod/onUpdate/OnUpdateMod.ts | 10 +- .../mod/onUpdate/OnUpdateModService.ts | 16 +- .../mod/staticRouter/StaticRouterMod.ts | 9 +- .../staticRouter/StaticRouterModService.ts | 14 +- project/src/utils/App.ts | 12 +- project/src/utils/AsyncQueue.ts | 10 +- project/src/utils/DatabaseImporter.ts | 51 +- project/src/utils/EncodingUtil.ts | 8 +- project/src/utils/HashUtil.ts | 6 +- project/src/utils/HttpFileUtil.ts | 11 +- project/src/utils/HttpResponseUtil.ts | 37 +- project/src/utils/ImporterUtil.ts | 86 +- project/src/utils/JsonUtil.ts | 56 +- project/src/utils/MathUtil.ts | 30 +- project/src/utils/ObjectId.ts | 8 +- project/src/utils/RagfairOfferHolder.ts | 10 +- project/src/utils/RandomUtil.ts | 136 +- project/src/utils/TimeUtil.ts | 6 +- project/src/utils/UUidGenerator.ts | 20 +- project/src/utils/VFS.ts | 149 +- project/src/utils/Watermark.ts | 12 +- .../src/utils/collections/lists/LinkedList.ts | 72 +- project/src/utils/collections/queue/Queue.ts | 19 +- .../utils/logging/AbstractWinstonLogger.ts | 126 +- .../src/utils/logging/WinstonMainLogger.ts | 23 +- .../src/utils/logging/WinstonRequestLogger.ts | 14 +- project/tests/BotDifficultyHelper.test.ts | 42 +- project/tests/BotHelper.test.ts | 14 +- project/tests/PaymentHelper.test.ts | 2 +- project/tests/RepairHelper.test.ts | 109 +- project/tests/common/MockHelper.ts | 7 +- project/tests/common/TestHelper.ts | 41 +- .../tests/common/__mocks__/WinstonLogger.ts | 17 +- project/tests/utils/HashUtil.test.ts | 2 +- project/tests/utils/ItemHelper.test.ts | 101 +- project/tests/utils/RandomUtil.test.ts | 12 +- project/tests/utils/TimeUtil.test.ts | 10 +- project/tests/utils/UUidGenerator.test.ts | 2 +- project/typedoc.json | 2 +- 591 files changed, 15574 insertions(+), 12324 deletions(-) create mode 100644 project/.editorconfig delete mode 100644 project/.vscode/settings.json create mode 100644 project/dprint.json diff --git a/project/.editorconfig b/project/.editorconfig new file mode 100644 index 00000000..a3284cad --- /dev/null +++ b/project/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +max_line_length = 120 diff --git a/project/.eslintrc.json b/project/.eslintrc.json index 3653c8e7..54b23e15 100644 --- a/project/.eslintrc.json +++ b/project/.eslintrc.json @@ -1,91 +1,62 @@ { - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint" - ], - "env": { - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "semi": [1, "always"], - "@typescript-eslint/no-explicit-any": 0, - "@typescript-eslint/no-unused-vars": 1, - "@typescript-eslint/no-empty-interface": 0, - "@typescript-eslint/no-namespace": 0, - "@typescript-eslint/comma-dangle": 1, - "@typescript-eslint/func-call-spacing": 2, - "@typescript-eslint/quotes": 1, - "@typescript-eslint/brace-style": [ - "error", - "allman" + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" ], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": [ - "camelCase" + "env": { + "node": true + }, + "extends": [ + "plugin:@typescript-eslint/eslint-recommended" + ], + "rules": { + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-explicit-any": "off", // We use a bunch of these. + "@typescript-eslint/no-unused-vars": "off", // Typescript compiler already checks--Will grey out variable. + "@typescript-eslint/no-var-requires": "error", + "@typescript-eslint/explicit-module-boundary-types": ["error", { "allowArgumentsExplicitlyTypedAsAny": true }], + "@typescript-eslint/naming-convention": ["error", { + "selector": "default", + "format": ["camelCase"], + "leadingUnderscore": "allow" + }, { + "selector": "typeLike", + "format": ["PascalCase"] + }, { + "selector": "objectLiteralProperty", + "format": ["PascalCase", "camelCase", "snake_case"], + "leadingUnderscore": "allow" + }, { + "selector": "typeProperty", + "format": ["PascalCase", "camelCase"], + "leadingUnderscore": "allow" + }, { + "selector": "enumMember", + "format": ["UPPER_CASE"] + }, { + "selector": "property", + "modifiers": ["readonly", "static"], + "format": ["UPPER_CASE"] + }] + }, + "overrides": [{ + "files": [ + "src/loaders/**/*.ts" ], - "leadingUnderscore": "allow" - }, - { - "selector": "typeLike", - "format": [ - "PascalCase" - ] - }, - { - "selector": "objectLiteralProperty", - "format": [ - "PascalCase", - "camelCase" + "rules": { + "@typescript-eslint/no-var-requires": "off" + } + }, { + "files": [ + "**/vitest.config.ts" ], - "leadingUnderscore": "allow" - }, - { - "selector": "typeProperty", - "format": [ - "PascalCase", - "camelCase" - ], - "leadingUnderscore": "allow" - }, - { - "selector": "enumMember", - "format": [ - "UPPER_CASE" - ] - } - ], - "@typescript-eslint/indent": [ - "error", - 4 - ], - "@typescript-eslint/no-unused-expressions": [ - "error", - { - "allowShortCircuit": false, - "allowTernary": false - } - ], - "@typescript-eslint/keyword-spacing": [ - "error", - { - "before": true, - "after": true - } - ], - "@typescript-eslint/explicit-module-boundary-types": [ - "warn", - { - "allowArgumentsExplicitlyTypedAsAny": true - } - ] - } -} \ No newline at end of file + "rules": { + "@typescript-eslint/naming-convention": ["error", { + "selector": "objectLiteralProperty", + "format": null + }] + } + }] +} diff --git a/project/.vscode/launch.json b/project/.vscode/launch.json index 56bdf049..eefad0da 100644 --- a/project/.vscode/launch.json +++ b/project/.vscode/launch.json @@ -34,8 +34,8 @@ "internalConsoleOptions": "neverOpen", "disableOptimisticBPs": true, "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest", + "program": "${workspaceFolder}/node_modules/jest/bin/jest" } } ] -} \ No newline at end of file +} diff --git a/project/.vscode/settings.json b/project/.vscode/settings.json deleted file mode 100644 index bbd5e706..00000000 --- a/project/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "editor.defaultFormatter": "dbaeumer.vscode-eslint", - "eslint.format.enable": true, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - }, - "[json]": { - "editor.defaultFormatter": "vscode.json-language-features", - "editor.detectIndentation": false, - "editor.tabSize": 4, - "editor.insertSpaces": true - } -} \ No newline at end of file diff --git a/project/Dockerfile b/project/Dockerfile index 9c98106e..a10df6f5 100644 --- a/project/Dockerfile +++ b/project/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16-buster as builder +FROM node:16-buster AS builder WORKDIR /app @@ -9,7 +9,6 @@ COPY tsconfig.json tsconfig.base.json ./ COPY src ./src RUN yarn test:comp-linux - ############################################## FROM debian:buster @@ -18,4 +17,4 @@ COPY --from=builder /app/bundle /bin/Aki-server EXPOSE 6969 -CMD ["/bin/Aki-server"] \ No newline at end of file +CMD ["/bin/Aki-server"] diff --git a/project/Server.code-workspace b/project/Server.code-workspace index be7a3097..1758f080 100644 --- a/project/Server.code-workspace +++ b/project/Server.code-workspace @@ -5,18 +5,19 @@ } ], "extensions": { - "recommendations": ["dbaeumer.vscode-eslint"], + "recommendations": [ + "EditorConfig.EditorConfig", + "dprint.dprint", + "dbaeumer.vscode-eslint", + "biomejs.biome" + ] }, "settings": { "window.title": "SPT-AKI Server", - "[typescript]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "dbaeumer.vscode-eslint" - }, - "eslint.validate": ["typescript"], - "editor.codeActionsOnSave": { - "source.organizeImports": true, - "source.fixAll.eslint": true - } - }, -} \ No newline at end of file + "editor.formatOnSave": true, + "editor.defaultFormatter": "dprint.dprint", + "editor.codeActionsOnSave": [ + "source.organizeImports.biome" + ] + } +} diff --git a/project/biome.json b/project/biome.json index ded78fca..8316dc82 100644 --- a/project/biome.json +++ b/project/biome.json @@ -1,5 +1,13 @@ { "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "javascript": { + "parser": { + "unsafeParameterDecoratorsEnabled": true + } + }, + "organizeImports": { + "enabled": true + }, "linter": { "enabled": true, "rules": { @@ -18,7 +26,7 @@ "noExplicitAny": "off", "noDoubleEquals": "warn", "noShadowRestrictedNames": "warn", - "noEmptyInterface":"off" + "noEmptyInterface": "off" }, "performance": { "noDelete": "off" @@ -27,16 +35,34 @@ "noUnnecessaryContinue": "warn" }, "complexity": { + "noStaticOnlyClass": "off", "useSimplifiedLogicExpression": "warn", "useOptionalChain": "warn" } - }, + } + }, + "formatter": { + "enabled": false + }, + "files": { "ignore": [ "**/*.js", "**/*.json", - "**/*.mjs", + "**/*.d.ts", "**/Dockerfile.*", - "**/node_modules/**/*" + "**/.git/**/*", + "**/.vscode/**/*", + "**/node_modules/**/*", + "**/build/**/*", + "**/obj/**/*", + "**/dist/**/*", + "**/user/**/*", + "**/logs/**/*", + "**/assets/**/*", + "**/Aki_Data/**/*", + "**/types/**/*", + "**/tests/__cache__/**/*", + "**/tests/__coverage__/**/*" ] - } + } } diff --git a/project/dprint.json b/project/dprint.json new file mode 100644 index 00000000..96405138 --- /dev/null +++ b/project/dprint.json @@ -0,0 +1,90 @@ +{ + "incremental": false, + "lineWidth": 120, + "indentWidth": 4, + "newLineKind": "lf", + "useTabs": false, + "typescript": { + "semiColons": "always", + "quoteStyle": "alwaysDouble", + "quoteProps": "asNeeded", + "useBraces": "always", + "bracePosition": "nextLine", + "singleBodyPosition": "maintain", + "nextControlFlowPosition": "nextLine", + "trailingCommas": "onlyMultiLine", + "operatorPosition": "nextLine", + "preferHanging": false, + "preferSingleLine": true, + "arrowFunction.useParentheses": "force", + "binaryExpression.linePerExpression": false, + "memberExpression.linePerExpression": false, + "typeLiteral.separatorKind": "semiColon", + "enumDeclaration.memberSpacing": "newLine", + "spaceAround": false, + "spaceSurroundingProperties": true, + "objectExpression.spaceSurroundingProperties": true, + "objectPattern.spaceSurroundingProperties": true, + "typeLiteral.spaceSurroundingProperties": true, + "binaryExpression.spaceSurroundingBitwiseAndArithmeticOperator": true, + "commentLine.forceSpaceAfterSlashes": true, + "constructor.spaceBeforeParentheses": false, + "constructorType.spaceAfterNewKeyword": false, + "constructSignature.spaceAfterNewKeyword": false, + "doWhileStatement.spaceAfterWhileKeyword": true, + "module.sortImportDeclarations": "maintain", + "module.sortExportDeclarations": "maintain", + "exportDeclaration.sortNamedExports": "maintain", + "importDeclaration.sortNamedImports": "maintain", + "exportDeclaration.spaceSurroundingNamedExports": false, + "forInStatement.spaceAfterForKeyword": true, + "forOfStatement.spaceAfterForKeyword": true, + "forStatement.spaceAfterForKeyword": true, + "forStatement.spaceAfterSemiColons": true, + "functionDeclaration.spaceBeforeParentheses": false, + "functionExpression.spaceBeforeParentheses": false, + "functionExpression.spaceAfterFunctionKeyword": false, + "getAccessor.spaceBeforeParentheses": false, + "ifStatement.spaceAfterIfKeyword": true, + "importDeclaration.spaceSurroundingNamedImports": true, + "method.spaceBeforeParentheses": false, + "setAccessor.spaceBeforeParentheses": false, + "taggedTemplate.spaceBeforeLiteral": false, + "typeAnnotation.spaceBeforeColon": false, + "typeAssertion.spaceBeforeExpression": false, + "whileStatement.spaceAfterWhileKeyword": true + }, + "json": { + "trailingCommas": "never", + "preferSingleLine": false + }, + "markdown": { + "textWrap": "always", + "emphasisKind": "underscores", + "strongKind": "asterisks" + }, + "dockerfile": {}, + "excludes": [ + "**/*.js", + "**/*.d.ts", + "**/*-lock.json", + "**/.git/**/*", + "**/node_modules/**/*", + "**/build/**/*", + "**/obj/**/*", + "**/dist/**/*", + "**/user/**/*", + "**/logs/**/*", + "**/assets/**/*", + "**/Aki_Data/**/*", + "**/types/**/*", + "**/tests/__cache__/**/*", + "**/tests/__coverage__/**/*" + ], + "plugins": [ + "https://plugins.dprint.dev/typescript-0.88.3.wasm", + "https://plugins.dprint.dev/json-0.19.0.wasm", + "https://plugins.dprint.dev/markdown-0.16.2.wasm", + "https://plugins.dprint.dev/dockerfile-0.3.0.wasm" + ] +} diff --git a/project/gulpfile.mjs b/project/gulpfile.mjs index 56615014..7a1cef6d 100644 --- a/project/gulpfile.mjs +++ b/project/gulpfile.mjs @@ -1,12 +1,12 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import gulp from "gulp"; -import { exec } from "gulp-execa"; -import rename from "gulp-rename"; import crypto from "node:crypto"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import gulp from "gulp"; +import { exec } from "gulp-execa"; +import rename from "gulp-rename"; import pkg from "pkg"; import pkgfetch from "pkg-fetch"; import * as ResEdit from "resedit"; @@ -22,7 +22,7 @@ const pkgConfig = "pkgconfig.json"; const entries = { release: path.join("obj", "ide", "ReleaseEntry.js"), debug: path.join("obj", "ide", "DebugEntry.js"), - bleeding: path.join("obj", "ide", "BleedingEdgeEntry.js") + bleeding: path.join("obj", "ide", "BleedingEdgeEntry.js"), }; const licenseFile = "../LICENSE.md"; @@ -37,7 +37,12 @@ const fetchPackageImage = async () => try { const output = "./.pkg-cache/v3.5"; - const fetchedPkg = await pkgfetch.need({ arch: process.arch, nodeRange: nodeVersion, platform: process.platform, output }); + const fetchedPkg = await pkgfetch.need({ + arch: process.arch, + nodeRange: nodeVersion, + platform: process.platform, + output, + }); console.log(`fetched node binary at ${fetchedPkg}`); const builtPkg = fetchedPkg.replace("node", "built"); await fs.copyFile(fetchedPkg, builtPkg); @@ -66,22 +71,19 @@ const updateBuildProperties = async () => res.entries, 1, 1033, - iconFile.icons.map(item => item.data) + iconFile.icons.map((item) => item.data), ); const vi = ResEdit.Resource.VersionInfo.fromEntries(res.entries)[0]; - vi.setStringValues( - {lang: 1033, codepage: 1200}, - { - ProductName: manifest.author, - FileDescription: manifest.description, - CompanyName: manifest.name, - LegalCopyright: manifest.license - } - ); - vi.removeStringValue({lang: 1033, codepage: 1200}, "OriginalFilename"); - vi.removeStringValue({lang: 1033, codepage: 1200}, "InternalName"); + vi.setStringValues({ lang: 1033, codepage: 1200 }, { + ProductName: manifest.author, + FileDescription: manifest.description, + CompanyName: manifest.name, + LegalCopyright: manifest.license, + }); + vi.removeStringValue({ lang: 1033, codepage: 1200 }, "OriginalFilename"); + vi.removeStringValue({ lang: 1033, codepage: 1200 }, "InternalName"); vi.setFileVersion(...manifest.version.split(".").map(Number)); vi.setProductVersion(...manifest.version.split(".").map(Number)); vi.outputToResourceEntries(res.entries); @@ -92,12 +94,16 @@ const updateBuildProperties = async () => /** * Copy various asset files to the destination directory */ -const copyAssets = () => gulp.src(["assets/**/*.json", "assets/**/*.json5", "assets/**/*.png", "assets/**/*.jpg", "assets/**/*.ico"]).pipe(gulp.dest(dataDir)); +const copyAssets = () => + gulp.src(["assets/**/*.json", "assets/**/*.json5", "assets/**/*.png", "assets/**/*.jpg", "assets/**/*.ico"]).pipe( + gulp.dest(dataDir), + ); /** * Copy executables from node_modules */ -const copyExecutables = () => gulp.src(["node_modules/@pnpm/exe/**/*"]).pipe(gulp.dest(path.join(dataDir, "@pnpm", "exe"))); +const copyExecutables = () => + gulp.src(["node_modules/@pnpm/exe/**/*"]).pipe(gulp.dest(path.join(dataDir, "@pnpm", "exe"))); /** * Rename and copy the license file @@ -159,9 +165,9 @@ const cleanCompiled = async () => await fs.rm("./obj", { recursive: true, force: /** * Recursively builds an array of paths for json files. - * - * @param {fs.PathLike} dir - * @param {string[]} files + * + * @param {fs.PathLike} dir + * @param {string[]} files * @returns {Promise} */ const getJSONFiles = async (dir, files = []) => @@ -206,8 +212,8 @@ const validateJSONs = async () => /** * Hash helper function - * - * @param {crypto.BinaryLike} data + * + * @param {crypto.BinaryLike} data * @returns {string} */ const generateHashForData = (data) => @@ -219,8 +225,8 @@ const generateHashForData = (data) => /** * Loader to recursively find all json files in a folder - * - * @param {fs.PathLike} filepath + * + * @param {fs.PathLike} filepath * @returns {} */ const loadRecursiveAsync = async (filepath) => @@ -244,7 +250,7 @@ const loadRecursiveAsync = async (filepath) => // set all loadRecursive to be executed asynchronously const resEntries = Object.entries(result); - const resResolved = await Promise.all(resEntries.map(ent => ent[1])); + const resResolved = await Promise.all(resEntries.map((ent) => ent[1])); for (let resIdx = 0; resIdx < resResolved.length; resIdx++) { resEntries[resIdx][1] = resResolved[resIdx]; @@ -259,7 +265,16 @@ const build = (packagingType) => { const anonPackaging = () => packaging(entries[packagingType]); anonPackaging.displayName = `packaging-${packagingType}`; - const tasks = [cleanBuild, validateJSONs, compile, fetchPackageImage, anonPackaging, addAssets, updateBuildProperties, cleanCompiled]; + const tasks = [ + cleanBuild, + validateJSONs, + compile, + fetchPackageImage, + anonPackaging, + addAssets, + updateBuildProperties, + cleanCompiled, + ]; return gulp.series(tasks); }; @@ -269,7 +284,18 @@ const packaging = async (entry) => const target = `${nodeVersion}-${process.platform}-${process.arch}`; try { - await pkg.exec([entry, "--compress", "GZip", "--target", target, "--output", serverExe, "--config", pkgConfig, "--public"]); + await pkg.exec([ + entry, + "--compress", + "GZip", + "--target", + target, + "--output", + serverExe, + "--config", + pkgConfig, + "--public", + ]); } catch (error) { @@ -282,7 +308,10 @@ gulp.task("build:release", build("release")); gulp.task("build:bleeding", build("bleeding")); gulp.task("run:build", async () => await exec("Aki.Server.exe", { stdio, cwd: buildDir })); -gulp.task("run:debug", async () => await exec("ts-node-dev -r tsconfig-paths/register src/ide/TestEntry.ts", { stdio })); +gulp.task( + "run:debug", + async () => await exec("ts-node-dev -r tsconfig-paths/register src/ide/TestEntry.ts", { stdio }), +); gulp.task("run:profiler", async () => { await cleanCompiled(); diff --git a/project/jest.config.ts b/project/jest.config.ts index e9b6e540..fc79268b 100644 --- a/project/jest.config.ts +++ b/project/jest.config.ts @@ -1,15 +1,13 @@ -import { pathsToModuleNameMapper } from "ts-jest"; +import { pathsToModuleNameMapper } from "ts-jest"; import type { JestConfigWithTsJest } from "ts-jest"; import { compilerOptions } from "./tsconfig.json"; const config: JestConfigWithTsJest = { preset: "ts-jest", testEnvironment: "node", - roots: [ - "./tests/" - ], - modulePaths: [ compilerOptions.baseUrl ], - moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths) + roots: ["./tests/"], + modulePaths: [compilerOptions.baseUrl], + moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths), }; export default config; diff --git a/project/package.json b/project/package.json index 77184a9d..04c5c838 100644 --- a/project/package.json +++ b/project/package.json @@ -11,11 +11,15 @@ "node": "18.15.0" }, "scripts": { - "check:circular": "madge --circular --extensions ts ./src/", + "check:circular": "madge --circular --ts-config tsconfig.json --extensions ts ./src/", "lint": "biome ci src --formatter-enabled=false --max-diagnostics=200", - "lint:fix": "eslint --fix --ext .ts src/**", - "test:run": "jest --colors --runInBand", - "test:coverage": "jest --coverage --maxWorkers=1 --no-cache", + "lint:fix": "biome check --apply-unsafe --max-diagnostics=200 . && dprint fmt --incremental=false", + "style": "dprint check --incremental=false", + "style:fix": "dprint fmt --incremental=false", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "test:ui": "vitest --ui --coverage", "build:release": "cross-env PKG_CACHE_PATH=\"./.pkg-cache\" gulp build:release", "build:debug": "cross-env PKG_CACHE_PATH=\"./.pkg-cache\" gulp build:debug", "build:bleeding": "cross-env PKG_CACHE_PATH=\"./.pkg-cache\" gulp build:bleeding", @@ -57,6 +61,7 @@ "@typescript-eslint/eslint-plugin": "6.7.5", "@typescript-eslint/parser": "6.7.5", "cross-env": "7.0.3", + "dprint": "0.42.5", "eslint": "8.51.0", "gulp": "4.0.2", "gulp-execa": "5.0.1", diff --git a/project/src/ErrorHandler.ts b/project/src/ErrorHandler.ts index 28f21ba2..bf3272da 100644 --- a/project/src/ErrorHandler.ts +++ b/project/src/ErrorHandler.ts @@ -7,16 +7,13 @@ import { WinstonMainLogger } from "@spt-aki/utils/logging/WinstonMainLogger"; export class ErrorHandler { - private logger:ILogger; + private logger: ILogger; private readLine: readline.Interface; constructor() { this.logger = new WinstonMainLogger(new AsyncQueue(), new UUidGenerator()); - this.readLine = readline.createInterface({ - input: process.stdin, - output: process.stdout - }); + this.readLine = readline.createInterface({ input: process.stdin, output: process.stdout }); } public handleCriticalError(err: any): void @@ -24,10 +21,12 @@ export class ErrorHandler this.logger.error("The application had a critical error and failed to run"); this.logger.error(`Exception produced: ${err}`); if (err.stack) + { this.logger.error(`\nStacktrace:\n ${err.stack}`); - + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars this.readLine.question("Press Enter to close the window", (_ans) => this.readLine.close()); this.readLine.on("close", () => process.exit(0)); } -} \ No newline at end of file +} diff --git a/project/src/Program.ts b/project/src/Program.ts index b92a46e2..b90a2c28 100644 --- a/project/src/Program.ts +++ b/project/src/Program.ts @@ -8,17 +8,16 @@ import { Watermark } from "@spt-aki/utils/Watermark"; export class Program { - private errorHandler: ErrorHandler; - constructor() + constructor() { // set window properties process.stdout.setEncoding("utf8"); process.title = "SPT-AKI Server"; this.errorHandler = new ErrorHandler(); } - - public start(): void + + public start(): void { try { @@ -27,13 +26,11 @@ export class Program childContainer.resolve("Watermark"); const preAkiModLoader = childContainer.resolve("PreAkiModLoader"); Container.registerListTypes(childContainer); - preAkiModLoader.load(childContainer) - .then(() => - { - Container.registerPostLoadTypes(container, childContainer); - childContainer.resolve("App").load(); - }).catch(rej => this.errorHandler.handleCriticalError(rej)); - + preAkiModLoader.load(childContainer).then(() => + { + Container.registerPostLoadTypes(container, childContainer); + childContainer.resolve("App").load(); + }).catch((rej) => this.errorHandler.handleCriticalError(rej)); } catch (e) { diff --git a/project/src/callbacks/BotCallbacks.ts b/project/src/callbacks/BotCallbacks.ts index 52a5d674..5b5b8bcf 100644 --- a/project/src/callbacks/BotCallbacks.ts +++ b/project/src/callbacks/BotCallbacks.ts @@ -12,8 +12,9 @@ export class BotCallbacks { constructor( @inject("BotController") protected botController: BotController, - @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil) - { } + @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, + ) + {} /** * Handle singleplayer/settings/bot/limit @@ -50,7 +51,11 @@ export class BotCallbacks * Handle client/game/bot/generate * @returns IGetBodyResponseData */ - public generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData + public generateBots( + url: string, + info: IGenerateBotsRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.botController.generate(sessionID, info)); } @@ -72,4 +77,4 @@ export class BotCallbacks { return this.httpResponse.noBody(this.botController.getAiBotBrainTypes()); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/BundleCallbacks.ts b/project/src/callbacks/BundleCallbacks.ts index 20f23b8b..3276644c 100644 --- a/project/src/callbacks/BundleCallbacks.ts +++ b/project/src/callbacks/BundleCallbacks.ts @@ -18,7 +18,7 @@ export class BundleCallbacks @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("HttpFileUtil") protected httpFileUtil: HttpFileUtil, @inject("BundleLoader") protected bundleLoader: BundleLoader, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.httpConfig = this.configServer.getConfig(ConfigTypes.HTTP); @@ -42,7 +42,7 @@ export class BundleCallbacks // eslint-disable-next-line @typescript-eslint/no-unused-vars public getBundles(url: string, info: any, sessionID: string): string { - const local = (this.httpConfig.ip === "127.0.0.1" || this.httpConfig.ip === "localhost"); + const local = this.httpConfig.ip === "127.0.0.1" || this.httpConfig.ip === "localhost"; return this.httpResponse.noBody(this.bundleLoader.getBundles(local)); } diff --git a/project/src/callbacks/ClientLogCallbacks.ts b/project/src/callbacks/ClientLogCallbacks.ts index 79fa117c..698ed70d 100644 --- a/project/src/callbacks/ClientLogCallbacks.ts +++ b/project/src/callbacks/ClientLogCallbacks.ts @@ -10,9 +10,9 @@ export class ClientLogCallbacks { constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("ClientLogController") protected clientLogController: ClientLogController - ) - { } + @inject("ClientLogController") protected clientLogController: ClientLogController, + ) + {} /** * Handle /singleplayer/log @@ -23,4 +23,4 @@ export class ClientLogCallbacks this.clientLogController.clientLog(info); return this.httpResponse.nullResponse(); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/CustomizationCallbacks.ts b/project/src/callbacks/CustomizationCallbacks.ts index 048fceb6..35c85210 100644 --- a/project/src/callbacks/CustomizationCallbacks.ts +++ b/project/src/callbacks/CustomizationCallbacks.ts @@ -18,9 +18,9 @@ export class CustomizationCallbacks constructor( @inject("CustomizationController") protected customizationController: CustomizationController, @inject("SaveServer") protected saveServer: SaveServer, - @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil + @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, ) - { } + {} /** * Handle client/trading/customization/storage @@ -30,7 +30,7 @@ export class CustomizationCallbacks { const result: IGetSuitsResponse = { _id: `pmc${sessionID}`, - suites: this.saveServer.getProfile(sessionID).suits + suites: this.saveServer.getProfile(sessionID).suits, }; return this.httpResponse.getBody(result); } @@ -62,4 +62,4 @@ export class CustomizationCallbacks { return this.customizationController.buyClothing(pmcData, body, sessionID); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/DataCallbacks.ts b/project/src/callbacks/DataCallbacks.ts index c8ba02f0..6880092b 100644 --- a/project/src/callbacks/DataCallbacks.ts +++ b/project/src/callbacks/DataCallbacks.ts @@ -27,9 +27,9 @@ export class DataCallbacks @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("RagfairController") protected ragfairController: RagfairController, - @inject("HideoutController") protected hideoutController: HideoutController + @inject("HideoutController") protected hideoutController: HideoutController, ) - { } + {} /** * Handle client/settings @@ -67,7 +67,11 @@ export class DataCallbacks * @returns IHandbookBase */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getTemplateHandbook( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.databaseServer.getTables().templates.handbook); } @@ -77,7 +81,11 @@ export class DataCallbacks * @returns Record> + public getTemplateSuits( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData> { return this.httpResponse.getBody(this.databaseServer.getTables().templates.customization); } @@ -97,25 +105,41 @@ export class DataCallbacks * @returns IHideoutSettingsBase */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getHideoutSettings( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.databaseServer.getTables().hideout.settings); } // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getHideoutAreas( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.databaseServer.getTables().hideout.areas); } // eslint-disable-next-line @typescript-eslint/no-unused-vars - public gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public gethideoutProduction( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.databaseServer.getTables().hideout.production); } // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getHideoutScavcase( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.databaseServer.getTables().hideout.scavcase); } @@ -124,7 +148,11 @@ export class DataCallbacks * Handle client/languages */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData> + public getLocalesLanguages( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData> { return this.httpResponse.getBody(this.databaseServer.getTables().locales.languages); } @@ -135,7 +163,9 @@ export class DataCallbacks // eslint-disable-next-line @typescript-eslint/no-unused-vars public getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData { - return this.httpResponse.getBody(this.databaseServer.getTables().locales.menu[url.replace("/client/menu/locale/", "")]); + return this.httpResponse.getBody( + this.databaseServer.getTables().locales.menu[url.replace("/client/menu/locale/", "")], + ); } /** @@ -144,7 +174,9 @@ export class DataCallbacks // eslint-disable-next-line @typescript-eslint/no-unused-vars public getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string { - return this.httpResponse.getUnclearedBody(this.databaseServer.getTables().locales.global[url.replace("/client/locale/", "")]); + return this.httpResponse.getUnclearedBody( + this.databaseServer.getTables().locales.global[url.replace("/client/locale/", "")], + ); } /** @@ -162,7 +194,11 @@ export class DataCallbacks * TODO - fully implement this */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getItemPrices( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { const handbookPrices = this.ragfairController.getStaticPrices(); const response: IGetItemPricesResponse = { @@ -174,9 +210,9 @@ export class DataCallbacks // eslint-disable-next-line @typescript-eslint/naming-convention "569668774bdc2da2298b4568": handbookPrices[Money.EUROS], // eslint-disable-next-line @typescript-eslint/naming-convention - "5696686a4bdc2da3298b456a": handbookPrices[Money.DOLLARS] - } + "5696686a4bdc2da3298b456a": handbookPrices[Money.DOLLARS], + }, }; return this.httpResponse.getBody(response); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/DialogueCallbacks.ts b/project/src/callbacks/DialogueCallbacks.ts index 63d15257..ee981d1f 100644 --- a/project/src/callbacks/DialogueCallbacks.ts +++ b/project/src/callbacks/DialogueCallbacks.ts @@ -3,7 +3,10 @@ import { inject, injectable } from "tsyringe"; import { DialogueController } from "@spt-aki/controllers/DialogueController"; import { OnUpdate } from "@spt-aki/di/OnUpdate"; import { IEmptyRequestData } from "@spt-aki/models/eft/common/IEmptyRequestData"; -import { IAcceptFriendRequestData, ICancelFriendRequestData } from "@spt-aki/models/eft/dialog/IAcceptFriendRequestData"; +import { + IAcceptFriendRequestData, + ICancelFriendRequestData, +} from "@spt-aki/models/eft/dialog/IAcceptFriendRequestData"; import { IChatServer } from "@spt-aki/models/eft/dialog/IChatServer"; import { IClearMailMessageRequest } from "@spt-aki/models/eft/dialog/IClearMailMessageRequest"; import { IDeleteFriendRequest } from "@spt-aki/models/eft/dialog/IDeleteFriendRequest"; @@ -36,7 +39,7 @@ export class DialogueCallbacks implements OnUpdate @inject("HashUtil") protected hashUtil: HashUtil, @inject("TimeUtil") protected timeUtil: TimeUtil, @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("DialogueController") protected dialogueController: DialogueController + @inject("DialogueController") protected dialogueController: DialogueController, ) { } @@ -45,7 +48,11 @@ export class DialogueCallbacks implements OnUpdate * Handle client/friend/list * @returns IGetFriendListDataResponse */ - public getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getFriendList( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.dialogueController.getFriendList(sessionID)); } @@ -55,44 +62,53 @@ export class DialogueCallbacks implements OnUpdate * @returns IChatServer[] */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData + public getChatServerList( + url: string, + info: IGetChatServerListRequestData, + sessionID: string, + ): IGetBodyResponseData { - - const chatServer: IChatServer = - { - _id: this.hashUtil.generate(), - RegistrationId: 20, - DateTime: this.timeUtil.getTimestamp(), - IsDeveloper: true, - Regions: ["EUR"], - "VersionId": "bgkidft87ddd", - "Ip": "", - "Port": 0, - "Chats": [ - { - "_id": "0", - "Members": 0 - } - ] - }; + const chatServer: IChatServer = { + _id: this.hashUtil.generate(), + RegistrationId: 20, + DateTime: this.timeUtil.getTimestamp(), + IsDeveloper: true, + Regions: ["EUR"], + VersionId: "bgkidft87ddd", + Ip: "", + Port: 0, + Chats: [{ _id: "0", Members: 0 }], + }; return this.httpResponse.getBody([chatServer]); } /** Handle client/mail/dialog/list */ - public getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData + public getMailDialogList( + url: string, + info: IGetMailDialogListRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.dialogueController.generateDialogueList(sessionID)); } /** Handle client/mail/dialog/view */ - public getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData + public getMailDialogView( + url: string, + info: IGetMailDialogViewRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.dialogueController.generateDialogueView(info, sessionID)); } /** Handle client/mail/dialog/info */ - public getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData + public getMailDialogInfo( + url: string, + info: IGetMailDialogInfoRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.dialogueController.getDialogueInfo(info.dialogId, sessionID)); } @@ -129,7 +145,11 @@ export class DialogueCallbacks implements OnUpdate * Handle client/mail/dialog/getAllAttachments * @returns IGetAllAttachmentsResponse */ - public getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData + public getAllAttachments( + url: string, + info: IGetAllAttachmentsRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.dialogueController.getAllAttachments(info.dialogId, sessionID)); } @@ -160,16 +180,24 @@ export class DialogueCallbacks implements OnUpdate * Handle client/friend/request/send */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public sendFriendRequest(url: string, request: IFriendRequestData, sessionID: string): IGetBodyResponseData + public sendFriendRequest( + url: string, + request: IFriendRequestData, + sessionID: string, + ): IGetBodyResponseData { - return this.httpResponse.getBody({status: 0, requestid: "12345", retryAfter: 600}); + return this.httpResponse.getBody({ status: 0, requestid: "12345", retryAfter: 600 }); } /** * Handle client/friend/request/accept */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public acceptFriendRequest(url: string, request: IAcceptFriendRequestData, sessionID: string): IGetBodyResponseData + public acceptFriendRequest( + url: string, + request: IAcceptFriendRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(true); } @@ -178,7 +206,11 @@ export class DialogueCallbacks implements OnUpdate * Handle client/friend/request/cancel */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public cancelFriendRequest(url: string, request: ICancelFriendRequestData, sessionID: string): IGetBodyResponseData + public cancelFriendRequest( + url: string, + request: ICancelFriendRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(true); } @@ -192,14 +224,14 @@ export class DialogueCallbacks implements OnUpdate /** Handle client/friend/ignore/set */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public ignoreFriend(url: string, request: {uid: string}, sessionID: string): any + public ignoreFriend(url: string, request: { uid: string; }, sessionID: string): any { return this.httpResponse.nullResponse(); } /** Handle client/friend/ignore/remove */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public unIgnoreFriend(url: string, request: {uid: string}, sessionID: string): any + public unIgnoreFriend(url: string, request: { uid: string; }, sessionID: string): any { return this.httpResponse.nullResponse(); } diff --git a/project/src/callbacks/GameCallbacks.ts b/project/src/callbacks/GameCallbacks.ts index 24c3131b..bfa3f74d 100644 --- a/project/src/callbacks/GameCallbacks.ts +++ b/project/src/callbacks/GameCallbacks.ts @@ -26,7 +26,7 @@ class GameCallbacks implements OnLoad @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("Watermark") protected watermark: Watermark, @inject("SaveServer") protected saveServer: SaveServer, - @inject("GameController") protected gameController: GameController + @inject("GameController") protected gameController: GameController, ) {} @@ -61,7 +61,7 @@ class GameCallbacks implements OnLoad this.gameController.gameStart(url, info, sessionID, startTimeStampMS); return this.httpResponse.getBody({ // eslint-disable-next-line @typescript-eslint/naming-convention - utc_time: startTimeStampMS / 1000 + utc_time: startTimeStampMS / 1000, }); } @@ -71,19 +71,25 @@ class GameCallbacks implements OnLoad * @returns IGameLogoutResponseData */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public gameLogout( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { this.saveServer.save(); - return this.httpResponse.getBody({ - status: "ok" - }); + return this.httpResponse.getBody({ status: "ok" }); } /** * Handle client/game/config * @returns IGameConfigResponse */ - public getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData + public getGameConfig( + url: string, + info: IGameEmptyCrcRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.gameController.getGameConfig(sessionID)); } @@ -100,7 +106,11 @@ class GameCallbacks implements OnLoad /** * Handle client/match/group/current */ - public getCurrentGroup(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getCurrentGroup( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.gameController.getCurrentGroup(sessionID)); } @@ -109,7 +119,11 @@ class GameCallbacks implements OnLoad * Handle client/checkVersion */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public validateGameVersion( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.gameController.getValidGameVersion(sessionID)); } @@ -119,7 +133,11 @@ class GameCallbacks implements OnLoad * @returns IGameKeepAliveResponse */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public gameKeepalive( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.gameController.getKeepAlive(sessionID)); } @@ -131,9 +149,7 @@ class GameCallbacks implements OnLoad // eslint-disable-next-line @typescript-eslint/no-unused-vars public getVersion(url: string, info: IEmptyRequestData, sessionID: string): string { - return this.httpResponse.noBody({ - Version: this.watermark.getInGameVersionLabel() - }); + return this.httpResponse.noBody({ Version: this.watermark.getInGameVersionLabel() }); } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -143,5 +159,4 @@ class GameCallbacks implements OnLoad } } -export { GameCallbacks }; - +export {GameCallbacks}; diff --git a/project/src/callbacks/HandbookCallbacks.ts b/project/src/callbacks/HandbookCallbacks.ts index 602f2bda..7f0c323b 100644 --- a/project/src/callbacks/HandbookCallbacks.ts +++ b/project/src/callbacks/HandbookCallbacks.ts @@ -6,17 +6,15 @@ import { OnLoad } from "@spt-aki/di/OnLoad"; @injectable() export class HandbookCallbacks implements OnLoad { - constructor( - @inject("HandbookController") protected handbookController: HandbookController - ) + constructor(@inject("HandbookController") protected handbookController: HandbookController) { } - public async onLoad(): Promise + public async onLoad(): Promise { this.handbookController.load(); } - public getRoute(): string + public getRoute(): string { return "aki-handbook"; } -} \ No newline at end of file +} diff --git a/project/src/callbacks/HealthCallbacks.ts b/project/src/callbacks/HealthCallbacks.ts index 7d8fdf5c..e05b1578 100644 --- a/project/src/callbacks/HealthCallbacks.ts +++ b/project/src/callbacks/HealthCallbacks.ts @@ -18,12 +18,13 @@ export class HealthCallbacks constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("ProfileHelper") protected profileHelper: ProfileHelper, - @inject("HealthController") protected healthController: HealthController) - { } + @inject("HealthController") protected healthController: HealthController, + ) + {} /** * Custom aki server request found in modules/HealthSynchronizer.cs - * @param url + * @param url * @param info HealthListener.Instance.CurrentHealth class * @param sessionID session id * @returns empty response, no data sent back to client @@ -36,17 +37,15 @@ export class HealthCallbacks /** * Custom aki server request found in modules/QTEPatch.cs - * @param url + * @param url * @param info HealthListener.Instance.CurrentHealth class * @param sessionID session id * @returns empty response, no data sent back to client */ public handleWorkoutEffects(url: string, info: IWorkoutData, sessionID: string): IGetBodyResponseData { - this.healthController.applyWorkoutChanges( - this.profileHelper.getPmcProfile(sessionID), info, sessionID - ); - + this.healthController.applyWorkoutChanges(this.profileHelper.getPmcProfile(sessionID), info, sessionID); + return this.httpResponse.emptyResponse(); } @@ -72,7 +71,11 @@ export class HealthCallbacks * Handle RestoreHealth * @returns IItemEventRouterResponse */ - public healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse + public healthTreatment( + pmcData: IPmcData, + info: IHealthTreatmentRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.healthController.healthTreatment(pmcData, info, sessionID); } diff --git a/project/src/callbacks/HideoutCallbacks.ts b/project/src/callbacks/HideoutCallbacks.ts index 58581c8a..61b5931b 100644 --- a/project/src/callbacks/HideoutCallbacks.ts +++ b/project/src/callbacks/HideoutCallbacks.ts @@ -28,7 +28,7 @@ export class HideoutCallbacks implements OnUpdate constructor( @inject("HideoutController") protected hideoutController: HideoutController, // TODO: delay needed - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.hideoutConfig = this.configServer.getConfig(ConfigTypes.HIDEOUT); @@ -45,7 +45,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutUpgradeComplete event */ - public upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse + public upgradeComplete( + pmcData: IPmcData, + body: IHideoutUpgradeCompleteRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.upgradeComplete(pmcData, body, sessionID); } @@ -53,7 +57,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutPutItemsInAreaSlots */ - public putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse + public putItemsInAreaSlots( + pmcData: IPmcData, + body: IHideoutPutItemInRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.putItemsInAreaSlots(pmcData, body, sessionID); } @@ -61,7 +69,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutTakeItemsFromAreaSlots event */ - public takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse + public takeItemsFromAreaSlots( + pmcData: IPmcData, + body: IHideoutTakeItemOutRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.takeItemsFromAreaSlots(pmcData, body, sessionID); } @@ -69,7 +81,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutToggleArea event */ - public toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse + public toggleArea( + pmcData: IPmcData, + body: IHideoutToggleAreaRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.toggleArea(pmcData, body, sessionID); } @@ -77,7 +93,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutSingleProductionStart event */ - public singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse + public singleProductionStart( + pmcData: IPmcData, + body: IHideoutSingleProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.singleProductionStart(pmcData, body, sessionID); } @@ -85,7 +105,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutScavCaseProductionStart event */ - public scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse + public scavCaseProductionStart( + pmcData: IPmcData, + body: IHideoutScavCaseStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.scavCaseProductionStart(pmcData, body, sessionID); } @@ -93,7 +117,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutContinuousProductionStart */ - public continuousProductionStart(pmcData: IPmcData, body: IHideoutContinuousProductionStartRequestData, sessionID: string): IItemEventRouterResponse + public continuousProductionStart( + pmcData: IPmcData, + body: IHideoutContinuousProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.continuousProductionStart(pmcData, body, sessionID); } @@ -101,7 +129,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutTakeProduction event */ - public takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse + public takeProduction( + pmcData: IPmcData, + body: IHideoutTakeProductionRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutController.takeProduction(pmcData, body, sessionID); } @@ -109,7 +141,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle HideoutQuickTimeEvent */ - public handleQTEEvent(pmcData: IPmcData, request: IHandleQTEEventRequestData, sessionId: string): IItemEventRouterResponse + public handleQTEEvent( + pmcData: IPmcData, + request: IHandleQTEEventRequestData, + sessionId: string, + ): IItemEventRouterResponse { return this.hideoutController.handleQTEEventOutcome(sessionId, pmcData, request); } @@ -117,7 +153,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle client/game/profile/items/moving - RecordShootingRangePoints */ - public recordShootingRangePoints(pmcData: IPmcData, request: IRecordShootingRangePoints, sessionId: string): IItemEventRouterResponse + public recordShootingRangePoints( + pmcData: IPmcData, + request: IRecordShootingRangePoints, + sessionId: string, + ): IItemEventRouterResponse { return this.hideoutController.recordShootingRangePoints(sessionId, pmcData, request); } @@ -125,7 +165,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle client/game/profile/items/moving - RecordShootingRangePoints */ - public improveArea(pmcData: IPmcData, request: IHideoutImproveAreaRequestData, sessionId: string): IItemEventRouterResponse + public improveArea( + pmcData: IPmcData, + request: IHideoutImproveAreaRequestData, + sessionId: string, + ): IItemEventRouterResponse { return this.hideoutController.improveArea(sessionId, pmcData, request); } @@ -133,7 +177,11 @@ export class HideoutCallbacks implements OnUpdate /** * Handle client/game/profile/items/moving - HideoutCancelProductionCommand */ - public cancelProduction(pmcData: IPmcData, request: IHideoutCancelProductionRequestData, sessionId: string): IItemEventRouterResponse + public cancelProduction( + pmcData: IPmcData, + request: IHideoutCancelProductionRequestData, + sessionId: string, + ): IItemEventRouterResponse { return this.hideoutController.cancelProduction(sessionId, pmcData, request); } @@ -149,8 +197,8 @@ export class HideoutCallbacks implements OnUpdate return false; } - public getRoute() :string + public getRoute(): string { return "aki-hideout"; } -} \ No newline at end of file +} diff --git a/project/src/callbacks/HttpCallbacks.ts b/project/src/callbacks/HttpCallbacks.ts index b0c18e19..a2363027 100644 --- a/project/src/callbacks/HttpCallbacks.ts +++ b/project/src/callbacks/HttpCallbacks.ts @@ -6,23 +6,20 @@ import { HttpServer } from "@spt-aki/servers/HttpServer"; @injectable() export class HttpCallbacks implements OnLoad { - constructor( - @inject("HttpServer") protected httpServer: HttpServer - ) + constructor(@inject("HttpServer") protected httpServer: HttpServer) { } - + public async onLoad(): Promise { this.httpServer.load(); } - public getRoute(): string + public getRoute(): string { return "aki-http"; } - public getImage(): string { return ""; diff --git a/project/src/callbacks/InraidCallbacks.ts b/project/src/callbacks/InraidCallbacks.ts index a4d935cd..4409aab5 100644 --- a/project/src/callbacks/InraidCallbacks.ts +++ b/project/src/callbacks/InraidCallbacks.ts @@ -14,14 +14,14 @@ export class InraidCallbacks { constructor( @inject("InraidController") protected inraidController: InraidController, - @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil + @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, ) - { } + {} /** * Handle client/location/getLocalloot * Store active map in profile + applicationContext - * @param url + * @param url * @param info register player request * @param sessionID Session id * @returns Null http response @@ -34,7 +34,7 @@ export class InraidCallbacks /** * Handle raid/profile/save - * @param url + * @param url * @param info Save progress request * @param sessionID Session id * @returns Null http response @@ -47,7 +47,7 @@ export class InraidCallbacks /** * Handle singleplayer/settings/raid/endstate - * @returns + * @returns */ public getRaidEndState(): string { @@ -66,7 +66,7 @@ export class InraidCallbacks /** * Handle singleplayer/settings/weapon/durability - * @returns + * @returns */ public getWeaponDurability(): string { @@ -81,4 +81,4 @@ export class InraidCallbacks { return this.httpResponse.noBody(this.inraidController.getAirdropConfig()); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/InsuranceCallbacks.ts b/project/src/callbacks/InsuranceCallbacks.ts index ec79c625..7cde4123 100644 --- a/project/src/callbacks/InsuranceCallbacks.ts +++ b/project/src/callbacks/InsuranceCallbacks.ts @@ -22,7 +22,7 @@ export class InsuranceCallbacks implements OnUpdate @inject("InsuranceController") protected insuranceController: InsuranceController, @inject("InsuranceService") protected insuranceService: InsuranceService, @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.insuranceConfig = this.configServer.getConfig(ConfigTypes.INSURANCE); @@ -32,7 +32,11 @@ export class InsuranceCallbacks implements OnUpdate * Handle client/insurance/items/list/cost * @returns IGetInsuranceCostResponseData */ - public getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData + public getInsuranceCost( + url: string, + info: IGetInsuranceCostRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.insuranceController.cost(info, sessionID)); } diff --git a/project/src/callbacks/InventoryCallbacks.ts b/project/src/callbacks/InventoryCallbacks.ts index 433a36b7..22dd7145 100644 --- a/project/src/callbacks/InventoryCallbacks.ts +++ b/project/src/callbacks/InventoryCallbacks.ts @@ -24,10 +24,8 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve @injectable() export class InventoryCallbacks { - constructor( - @inject("InventoryController") protected inventoryController: InventoryController - ) - { } + constructor(@inject("InventoryController") protected inventoryController: InventoryController) + {} /** Handle Move event */ public moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse @@ -52,7 +50,11 @@ export class InventoryCallbacks return this.inventoryController.mergeItem(pmcData, body, sessionID); } - public transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse + public transferItem( + pmcData: IPmcData, + body: IInventoryTransferRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.transferItem(pmcData, body, sessionID); } @@ -89,41 +91,69 @@ export class InventoryCallbacks return this.inventoryController.unbindItem(pmcData, body, sessionID); } - public examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse + public examineItem( + pmcData: IPmcData, + body: IInventoryExamineRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.examineItem(pmcData, body, sessionID); } /** Handle ReadEncyclopedia */ - public readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse + public readEncyclopedia( + pmcData: IPmcData, + body: IInventoryReadEncyclopediaRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.readEncyclopedia(pmcData, body, sessionID); } /** Handle ApplyInventoryChanges */ - public sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse + public sortInventory( + pmcData: IPmcData, + body: IInventorySortRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.sortInventory(pmcData, body, sessionID); } - public createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse + public createMapMarker( + pmcData: IPmcData, + body: IInventoryCreateMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.createMapMarker(pmcData, body, sessionID); } - public deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse + public deleteMapMarker( + pmcData: IPmcData, + body: IInventoryDeleteMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.deleteMapMarker(pmcData, body, sessionID); } - public editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse + public editMapMarker( + pmcData: IPmcData, + body: IInventoryEditMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.editMapMarker(pmcData, body, sessionID); } /** Handle OpenRandomLootContainer */ - public openRandomLootContainer(pmcData: IPmcData, body: IOpenRandomLootContainerRequestData, sessionID: string): IItemEventRouterResponse + public openRandomLootContainer( + pmcData: IPmcData, + body: IOpenRandomLootContainerRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.inventoryController.openRandomLootContainer(pmcData, body, sessionID); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/ItemEventCallbacks.ts b/project/src/callbacks/ItemEventCallbacks.ts index 448cffaa..d166284a 100644 --- a/project/src/callbacks/ItemEventCallbacks.ts +++ b/project/src/callbacks/ItemEventCallbacks.ts @@ -13,15 +13,23 @@ export class ItemEventCallbacks { constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("ItemEventRouter") protected itemEventRouter: ItemEventRouter + @inject("ItemEventRouter") protected itemEventRouter: ItemEventRouter, ) - { } + {} - public handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData + public handleEvents( + url: string, + info: IItemEventRouterRequest, + sessionID: string, + ): IGetBodyResponseData { const eventResponse = this.itemEventRouter.handleEvents(info, sessionID); const result = (eventResponse.warnings.length > 0) - ? this.httpResponse.getBody(eventResponse, this.getErrorCode(eventResponse.warnings), eventResponse.warnings[0].errmsg) // TODO: map 228 to its enum value + ? this.httpResponse.getBody( + eventResponse, + this.getErrorCode(eventResponse.warnings), + eventResponse.warnings[0].errmsg, + ) // TODO: map 228 to its enum value : this.httpResponse.getBody(eventResponse); return result; @@ -36,4 +44,4 @@ export class ItemEventCallbacks return BackendErrorCodes.UNKNOWN_ERROR; } -} \ No newline at end of file +} diff --git a/project/src/callbacks/LauncherCallbacks.ts b/project/src/callbacks/LauncherCallbacks.ts index 14bd5b57..13b439a4 100644 --- a/project/src/callbacks/LauncherCallbacks.ts +++ b/project/src/callbacks/LauncherCallbacks.ts @@ -17,9 +17,9 @@ class LauncherCallbacks @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("LauncherController") protected launcherController: LauncherController, @inject("SaveServer") protected saveServer: SaveServer, - @inject("Watermark") protected watermark: Watermark + @inject("Watermark") protected watermark: Watermark, ) - { } + {} public connect(): string { @@ -100,5 +100,4 @@ class LauncherCallbacks } } -export { LauncherCallbacks }; - +export {LauncherCallbacks}; diff --git a/project/src/callbacks/LocationCallbacks.ts b/project/src/callbacks/LocationCallbacks.ts index 79c77155..14f92c57 100644 --- a/project/src/callbacks/LocationCallbacks.ts +++ b/project/src/callbacks/LocationCallbacks.ts @@ -13,24 +13,32 @@ export class LocationCallbacks { constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("LocationController") protected locationController: LocationController + @inject("LocationController") protected locationController: LocationController, ) - { } + {} /** Handle client/locations */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getLocationData( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.locationController.generateAll(sessionID)); } /** Handle client/location/getLocalloot */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData + public getLocation( + url: string, + info: IGetLocationRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.locationController.get(sessionID, info)); } - + /** Handle client/location/getAirdropLoot */ // eslint-disable-next-line @typescript-eslint/no-unused-vars public getAirdropLoot(url: string, info: IEmptyRequestData, sessionID: string): string diff --git a/project/src/callbacks/MatchCallbacks.ts b/project/src/callbacks/MatchCallbacks.ts index 35e67fb2..7fa0af09 100644 --- a/project/src/callbacks/MatchCallbacks.ts +++ b/project/src/callbacks/MatchCallbacks.ts @@ -31,9 +31,9 @@ export class MatchCallbacks @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("MatchController") protected matchController: MatchController, - @inject("DatabaseServer") protected databaseServer: DatabaseServer + @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) - { } + {} /** Handle client/match/updatePing */ // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -77,7 +77,11 @@ export class MatchCallbacks /** Handle client/match/group/invite/accept */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public acceptGroupInvite(url: string, info: IAcceptGroupInviteRequest, sessionID: string): IGetBodyResponseData + public acceptGroupInvite( + url: string, + info: IAcceptGroupInviteRequest, + sessionID: string, + ): IGetBodyResponseData { const result = []; result.push({}); @@ -87,7 +91,11 @@ export class MatchCallbacks /** Handle client/match/group/invite/cancel */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public cancelGroupInvite(url: string, info: ICancelGroupInviteRequest, sessionID: string): IGetBodyResponseData + public cancelGroupInvite( + url: string, + info: ICancelGroupInviteRequest, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(true); } @@ -129,7 +137,11 @@ export class MatchCallbacks } /** Handle match/group/start_game */ - public joinMatch(url: string, info: IJoinMatchRequestData, sessionID: string): IGetBodyResponseData + public joinMatch( + url: string, + info: IJoinMatchRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.matchController.joinMatch(info, sessionID)); } @@ -144,7 +156,7 @@ export class MatchCallbacks /** * @deprecated - not called on raid start/end or game start/exit * Handle client/match/group/status - * @returns + * @returns */ // eslint-disable-next-line @typescript-eslint/no-unused-vars public getGroupStatus(url: string, info: IGetGroupStatusRequestData, sessionID: string): IGetBodyResponseData @@ -188,7 +200,11 @@ export class MatchCallbacks } /** Handle client/raid/configuration */ - public getRaidConfiguration(url: string, info: IGetRaidConfigurationRequestData, sessionID: string): INullResponseData + public getRaidConfiguration( + url: string, + info: IGetRaidConfigurationRequestData, + sessionID: string, + ): INullResponseData { this.matchController.startOfflineRaid(info, sessionID); return this.httpResponse.nullResponse(); diff --git a/project/src/callbacks/ModCallbacks.ts b/project/src/callbacks/ModCallbacks.ts index 2ce67a72..b56b0851 100644 --- a/project/src/callbacks/ModCallbacks.ts +++ b/project/src/callbacks/ModCallbacks.ts @@ -21,12 +21,12 @@ class ModCallbacks implements OnLoad @inject("HttpFileUtil") protected httpFileUtil: HttpFileUtil, @inject("PostAkiModLoader") protected postAkiModLoader: PostAkiModLoader, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.httpConfig = this.configServer.getConfig(ConfigTypes.HTTP); } - + public async onLoad(): Promise { if (globalThis.G_MODS_ENABLED) @@ -41,5 +41,4 @@ class ModCallbacks implements OnLoad } } -export { ModCallbacks }; - +export {ModCallbacks}; diff --git a/project/src/callbacks/NoteCallbacks.ts b/project/src/callbacks/NoteCallbacks.ts index b781e62b..95e450ec 100644 --- a/project/src/callbacks/NoteCallbacks.ts +++ b/project/src/callbacks/NoteCallbacks.ts @@ -8,9 +8,8 @@ import { INoteActionData } from "@spt-aki/models/eft/notes/INoteActionData"; @injectable() export class NoteCallbacks { - constructor( - @inject("NoteController") protected noteController: NoteController) - { } + constructor(@inject("NoteController") protected noteController: NoteController) + {} /** Handle AddNote event */ public addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse diff --git a/project/src/callbacks/NotifierCallbacks.ts b/project/src/callbacks/NotifierCallbacks.ts index 361cb2ae..baab1b3a 100644 --- a/project/src/callbacks/NotifierCallbacks.ts +++ b/project/src/callbacks/NotifierCallbacks.ts @@ -17,8 +17,9 @@ export class NotifierCallbacks @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper, @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("NotifierController") protected notifierController: NotifierController) - { } + @inject("NotifierController") protected notifierController: NotifierController, + ) + {} /** * If we don't have anything to send, it's ok to not send anything back @@ -36,9 +37,9 @@ export class NotifierCallbacks * Take our array of JSON message objects and cast them to JSON strings, so that they can then * be sent to client as NEWLINE separated strings... yup. */ - this.notifierController.notifyAsync(tmpSessionID) - .then((messages: any) => messages.map((message: any) => this.jsonUtil.serialize(message)).join("\n")) - .then((text) => this.httpServerHelper.sendTextJson(resp, text)); + this.notifierController.notifyAsync(tmpSessionID).then((messages: any) => + messages.map((message: any) => this.jsonUtil.serialize(message)).join("\n") + ).then((text) => this.httpServerHelper.sendTextJson(resp, text)); } /** Handle push/notifier/get */ @@ -50,7 +51,11 @@ export class NotifierCallbacks } /** Handle client/notifier/channel/create */ - public createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public createNotifierChannel( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.notifierController.getChannel(sessionID)); } @@ -60,11 +65,13 @@ export class NotifierCallbacks * @returns ISelectProfileResponse */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData + public selectProfile( + url: string, + info: ISelectProfileRequestData, + sessionID: string, + ): IGetBodyResponseData { - return this.httpResponse.getBody({ - status: "ok" - }); + return this.httpResponse.getBody({ status: "ok" }); } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -72,4 +79,4 @@ export class NotifierCallbacks { return "NOTIFY"; } -} \ No newline at end of file +} diff --git a/project/src/callbacks/PresetBuildCallbacks.ts b/project/src/callbacks/PresetBuildCallbacks.ts index bda577e1..a7343333 100644 --- a/project/src/callbacks/PresetBuildCallbacks.ts +++ b/project/src/callbacks/PresetBuildCallbacks.ts @@ -15,17 +15,26 @@ export class PresetBuildCallbacks { constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("PresetBuildController") protected presetBuildController: PresetBuildController) - { } + @inject("PresetBuildController") protected presetBuildController: PresetBuildController, + ) + {} /** Handle client/handbook/builds/my/list */ - public getHandbookUserlist(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getHandbookUserlist( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.presetBuildController.getUserBuilds(sessionID)); } /** Handle SaveWeaponBuild event */ - public saveWeaponBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse + public saveWeaponBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.presetBuildController.saveWeaponBuild(pmcData, body, sessionID); } @@ -37,20 +46,32 @@ export class PresetBuildCallbacks } /** Handle RemoveWeaponBuild event*/ - public removeWeaponBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse + public removeWeaponBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.presetBuildController.removeWeaponBuild(pmcData, body, sessionID); } /** Handle SaveEquipmentBuild event */ - public saveEquipmentBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse + public saveEquipmentBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.presetBuildController.saveEquipmentBuild(pmcData, body, sessionID); } /** Handle RemoveEquipmentBuild event*/ - public removeEquipmentBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse + public removeEquipmentBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.presetBuildController.removeEquipmentBuild(pmcData, body, sessionID); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/PresetCallbacks.ts b/project/src/callbacks/PresetCallbacks.ts index 288c0399..0b4f62d9 100644 --- a/project/src/callbacks/PresetCallbacks.ts +++ b/project/src/callbacks/PresetCallbacks.ts @@ -6,8 +6,7 @@ import { OnLoad } from "@spt-aki/di/OnLoad"; @injectable() export class PresetCallbacks implements OnLoad { - constructor( - @inject("PresetController") protected presetController: PresetController) + constructor(@inject("PresetController") protected presetController: PresetController) { } @@ -16,7 +15,7 @@ export class PresetCallbacks implements OnLoad this.presetController.initialize(); } - public getRoute(): string + public getRoute(): string { return "aki-presets"; } diff --git a/project/src/callbacks/ProfileCallbacks.ts b/project/src/callbacks/ProfileCallbacks.ts index 0aba65d6..eec0519c 100644 --- a/project/src/callbacks/ProfileCallbacks.ts +++ b/project/src/callbacks/ProfileCallbacks.ts @@ -24,8 +24,9 @@ export class ProfileCallbacks constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("TimeUtil") protected timeUtil: TimeUtil, - @inject("ProfileController") protected profileController: ProfileController) - { } + @inject("ProfileController") protected profileController: ProfileController, + ) + {} /** * Handle client/game/profile/create @@ -49,7 +50,7 @@ export class ProfileCallbacks * Handle client/game/profile/savage/regenerate * Handle the creation of a scav profile for player * Occurs post-raid and when profile first created immediately after character details are confirmed by player - * @param url + * @param url * @param info empty * @param sessionID Session id * @returns Profile object @@ -72,7 +73,11 @@ export class ProfileCallbacks * Handle client/game/profile/nickname/change event * Client allows player to adjust their profile name */ - public changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData + public changeNickname( + url: string, + info: IProfileChangeNicknameRequestData, + sessionID: string, + ): IGetBodyResponseData { const output = this.profileController.changeNickname(info, sessionID); @@ -86,16 +91,17 @@ export class ProfileCallbacks return this.httpResponse.getBody(null, 1, "The nickname is too short"); } - return this.httpResponse.getBody({ - status: 0, - nicknamechangedate: this.timeUtil.getTimestamp() - }); + return this.httpResponse.getBody({ status: 0, nicknamechangedate: this.timeUtil.getTimestamp() }); } /** * Handle client/game/profile/nickname/validate */ - public validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData + public validateNickname( + url: string, + info: IValidateNicknameRequestData, + sessionID: string, + ): IGetBodyResponseData { const output = this.profileController.validateNickname(info, sessionID); @@ -109,7 +115,7 @@ export class ProfileCallbacks return this.httpResponse.getBody(null, 256, "256 - "); } - return this.httpResponse.getBody({ "status": "ok" }); + return this.httpResponse.getBody({ status: "ok" }); } /** @@ -125,34 +131,27 @@ export class ProfileCallbacks * Handle client/profile/status * Called when creating a character when choosing a character face/voice */ - public getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getProfileStatus( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { const response: GetProfileStatusResponseData = { maxPveCountExceeded: false, - profiles: [ - { - "profileid": `scav${sessionID}`, - profileToken: null, - "status": "Free", - "sid": "", - "ip": "", - "port": 0, - version: "live", - location: "bigmap", - raidMode: "Online", - mode: "deathmatch", - shortId: "xxx1x1" - - }, - { - "profileid": `pmc${sessionID}`, - profileToken: null, - "status": "Free", - "sid": "", - "ip": "", - "port": 0 - } - ] + profiles: [{ + profileid: `scav${sessionID}`, + profileToken: null, + status: "Free", + sid: "", + ip: "", + port: 0, + version: "live", + location: "bigmap", + raidMode: "Online", + mode: "deathmatch", + shortId: "xxx1x1", + }, { profileid: `pmc${sessionID}`, profileToken: null, status: "Free", sid: "", ip: "", port: 0 }], }; return this.httpResponse.getBody(response); @@ -162,7 +161,11 @@ export class ProfileCallbacks * Handle client/profile/settings */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getProfileSettings(url: string, info: IGetProfileSettingsRequest, sessionId: string): IGetBodyResponseData + public getProfileSettings( + url: string, + info: IGetProfileSettingsRequest, + sessionId: string, + ): IGetBodyResponseData { return this.httpResponse.emptyResponse(); } @@ -170,7 +173,11 @@ export class ProfileCallbacks /** * Handle client/game/profile/search */ - public searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData + public searchFriend( + url: string, + info: ISearchFriendRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.profileController.getFriends(info, sessionID)); } @@ -191,4 +198,4 @@ export class ProfileCallbacks { return this.httpResponse.noBody(this.profileController.getMiniProfiles()); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/QuestCallbacks.ts b/project/src/callbacks/QuestCallbacks.ts index a97a93f9..1c3a2891 100644 --- a/project/src/callbacks/QuestCallbacks.ts +++ b/project/src/callbacks/QuestCallbacks.ts @@ -21,13 +21,18 @@ export class QuestCallbacks constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("QuestController") protected questController: QuestController, - @inject("RepeatableQuestController") protected repeatableQuestController: RepeatableQuestController) - { } + @inject("RepeatableQuestController") protected repeatableQuestController: RepeatableQuestController, + ) + {} /** * Handle RepeatableQuestChange event */ - public changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse + public changeRepeatableQuest( + pmcData: IPmcData, + body: IRepeatableQuestChangeRequest, + sessionID: string, + ): IItemEventRouterResponse { return this.repeatableQuestController.changeRepeatableQuest(pmcData, body, sessionID); } @@ -48,7 +53,11 @@ export class QuestCallbacks /** * Handle QuestComplete event */ - public completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse + public completeQuest( + pmcData: IPmcData, + body: ICompleteQuestRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.questController.completeQuest(pmcData, body, sessionID); } @@ -56,7 +65,11 @@ export class QuestCallbacks /** * Handle QuestHandover event */ - public handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse + public handoverQuest( + pmcData: IPmcData, + body: IHandoverQuestRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.questController.handoverQuest(pmcData, body, sessionID); } @@ -72,7 +85,11 @@ export class QuestCallbacks /** * Handle client/repeatalbeQuests/activityPeriods */ - public activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public activityPeriods( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.repeatableQuestController.getClientRepeatableQuests(info, sessionID)); } diff --git a/project/src/callbacks/RagfairCallbacks.ts b/project/src/callbacks/RagfairCallbacks.ts index 6b95a323..b60c8f11 100644 --- a/project/src/callbacks/RagfairCallbacks.ts +++ b/project/src/callbacks/RagfairCallbacks.ts @@ -39,7 +39,7 @@ export class RagfairCallbacks implements OnLoad, OnUpdate @inject("RagfairServer") protected ragfairServer: RagfairServer, @inject("RagfairController") protected ragfairController: RagfairController, @inject("RagfairTaxService") protected ragfairTaxService: RagfairTaxService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -82,7 +82,11 @@ export class RagfairCallbacks implements OnLoad, OnUpdate /** Handle client/ragfair/itemMarketPrice */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData + public getMarketPrice( + url: string, + info: IGetMarketPriceRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.ragfairController.getItemMinAvgMaxFleaPriceValues(info)); } @@ -110,7 +114,11 @@ export class RagfairCallbacks implements OnLoad, OnUpdate * Called when clicking an item to list on flea */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public getFleaPrices(url: string, request: IEmptyRequestData, sessionID: string): IGetBodyResponseData> + public getFleaPrices( + url: string, + request: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData> { return this.httpResponse.getBody(this.ragfairController.getAllFleaPrices()); } @@ -122,10 +130,13 @@ export class RagfairCallbacks implements OnLoad, OnUpdate return this.httpResponse.nullResponse(); } - public storePlayerOfferTaxAmount(url: string, request: IStorePlayerOfferTaxAmountRequestData, sessionId: string): INullResponseData + public storePlayerOfferTaxAmount( + url: string, + request: IStorePlayerOfferTaxAmountRequestData, + sessionId: string, + ): INullResponseData { this.ragfairTaxService.storeClientOfferTaxValue(sessionId, request); return this.httpResponse.nullResponse(); } - } diff --git a/project/src/callbacks/RepairCallbacks.ts b/project/src/callbacks/RepairCallbacks.ts index 85f5c5ea..d5514850 100644 --- a/project/src/callbacks/RepairCallbacks.ts +++ b/project/src/callbacks/RepairCallbacks.ts @@ -9,9 +9,8 @@ import { ITraderRepairActionDataRequest } from "@spt-aki/models/eft/repair/ITrad @injectable() export class RepairCallbacks { - constructor( - @inject("RepairController") protected repairController: RepairController) - { } + constructor(@inject("RepairController") protected repairController: RepairController) + {} /** * Handle TraderRepair event @@ -21,7 +20,11 @@ export class RepairCallbacks * @param sessionID Session id * @returns IItemEventRouterResponse */ - public traderRepair(pmcData: IPmcData, traderRepairRequest: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse + public traderRepair( + pmcData: IPmcData, + traderRepairRequest: ITraderRepairActionDataRequest, + sessionID: string, + ): IItemEventRouterResponse { return this.repairController.traderRepair(sessionID, traderRepairRequest, pmcData); } @@ -34,8 +37,12 @@ export class RepairCallbacks * @param sessionID Session id * @returns IItemEventRouterResponse */ - public repair(pmcData: IPmcData, repairRequest: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse + public repair( + pmcData: IPmcData, + repairRequest: IRepairActionDataRequest, + sessionID: string, + ): IItemEventRouterResponse { return this.repairController.repairWithKit(sessionID, repairRequest, pmcData); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/SaveCallbacks.ts b/project/src/callbacks/SaveCallbacks.ts index 86e0dbd0..583a665e 100644 --- a/project/src/callbacks/SaveCallbacks.ts +++ b/project/src/callbacks/SaveCallbacks.ts @@ -14,18 +14,18 @@ export class SaveCallbacks implements OnLoad, OnUpdate constructor( @inject("SaveServer") protected saveServer: SaveServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.coreConfig = this.configServer.getConfig(ConfigTypes.CORE); } - + public async onLoad(): Promise { this.saveServer.load(); } - public getRoute(): string + public getRoute(): string { return "aki-save"; } @@ -41,4 +41,4 @@ export class SaveCallbacks implements OnLoad, OnUpdate return false; } -} \ No newline at end of file +} diff --git a/project/src/callbacks/TradeCallbacks.ts b/project/src/callbacks/TradeCallbacks.ts index 1c39e280..3fad61eb 100644 --- a/project/src/callbacks/TradeCallbacks.ts +++ b/project/src/callbacks/TradeCallbacks.ts @@ -10,29 +10,39 @@ import { ISellScavItemsToFenceRequestData } from "@spt-aki/models/eft/trade/ISel @injectable() export class TradeCallbacks { - constructor( - @inject("TradeController") protected tradeController: TradeController - ) - { } + constructor(@inject("TradeController") protected tradeController: TradeController) + {} /** * Handle client/game/profile/items/moving TradingConfirm event */ - public processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse + public processTrade( + pmcData: IPmcData, + body: IProcessBaseTradeRequestData, + sessionID: string, + ): IItemEventRouterResponse { // body can be IProcessBuyTradeRequestData or IProcessSellTradeRequestData return this.tradeController.confirmTrading(pmcData, body, sessionID); } /** Handle RagFairBuyOffer event */ - public processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse + public processRagfairTrade( + pmcData: IPmcData, + body: IProcessRagfairTradeRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.tradeController.confirmRagfairTrading(pmcData, body, sessionID); } /** Handle SellAllFromSavage event */ - public sellAllFromSavage(pmcData: IPmcData, body: ISellScavItemsToFenceRequestData, sessionID: string): IItemEventRouterResponse + public sellAllFromSavage( + pmcData: IPmcData, + body: ISellScavItemsToFenceRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.tradeController.sellScavItemsToFence(pmcData, body, sessionID); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/TraderCallbacks.ts b/project/src/callbacks/TraderCallbacks.ts index 8d271616..4c734406 100644 --- a/project/src/callbacks/TraderCallbacks.ts +++ b/project/src/callbacks/TraderCallbacks.ts @@ -13,7 +13,9 @@ export class TraderCallbacks implements OnLoad, OnUpdate { constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("TraderController") protected traderController: TraderController) // TODO: delay required + @inject("TraderController") protected traderController: TraderController, + ) + // TODO: delay required { } public async onLoad(): Promise @@ -26,13 +28,17 @@ export class TraderCallbacks implements OnLoad, OnUpdate return this.traderController.update(); } - public getRoute(): string + public getRoute(): string { return "aki-traders"; } /** Handle client/trading/api/traderSettings */ - public getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData + public getTraderSettings( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.traderController.getAllTraders(sessionID)); } @@ -50,4 +56,4 @@ export class TraderCallbacks implements OnLoad, OnUpdate const traderID = url.replace("/client/trading/api/getTraderAssort/", ""); return this.httpResponse.getBody(this.traderController.getAssort(sessionID, traderID)); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/WeatherCallbacks.ts b/project/src/callbacks/WeatherCallbacks.ts index 0067db90..ea6cf327 100644 --- a/project/src/callbacks/WeatherCallbacks.ts +++ b/project/src/callbacks/WeatherCallbacks.ts @@ -11,9 +11,9 @@ export class WeatherCallbacks { constructor( @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("WeatherController") protected weatherController: WeatherController + @inject("WeatherController") protected weatherController: WeatherController, ) - { } + {} /** * Handle client/weather @@ -24,4 +24,4 @@ export class WeatherCallbacks { return this.httpResponse.getBody(this.weatherController.generate()); } -} \ No newline at end of file +} diff --git a/project/src/callbacks/WishlistCallbacks.ts b/project/src/callbacks/WishlistCallbacks.ts index a13402d3..550e59d5 100644 --- a/project/src/callbacks/WishlistCallbacks.ts +++ b/project/src/callbacks/WishlistCallbacks.ts @@ -8,9 +8,8 @@ import { IWishlistActionData } from "@spt-aki/models/eft/wishlist/IWishlistActio @injectable() export class WishlistCallbacks { - constructor( - @inject("WishlistController") protected wishlistController: WishlistController) - { } + constructor(@inject("WishlistController") protected wishlistController: WishlistController) + {} /** Handle AddToWishList event */ public addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse @@ -23,4 +22,4 @@ export class WishlistCallbacks { return this.wishlistController.removeFromWishList(pmcData, body, sessionID); } -} \ No newline at end of file +} diff --git a/project/src/context/ApplicationContext.ts b/project/src/context/ApplicationContext.ts index bd8dc12f..afb85008 100644 --- a/project/src/context/ApplicationContext.ts +++ b/project/src/context/ApplicationContext.ts @@ -5,25 +5,25 @@ import { ContextVariableType } from "@spt-aki/context/ContextVariableType"; import { LinkedList } from "@spt-aki/utils/collections/lists/LinkedList"; @injectable() -export class ApplicationContext +export class ApplicationContext { private variables = new Map>(); private static holderMaxSize = 10; /** * Called like: - * + * * const registerPlayerInfo = this.applicationContext.getLatestValue(ContextVariableType.REGISTER_PLAYER_REQUEST).getValue(); - * + * * const activePlayerSessionId = this.applicationContext.getLatestValue(ContextVariableType.SESSION_ID).getValue(); - * + * * const matchInfo = this.applicationContext.getLatestValue(ContextVariableType.MATCH_INFO).getValue(); - * @param type - * @returns + * @param type + * @returns */ - public getLatestValue(type: ContextVariableType): ContextVariable + public getLatestValue(type: ContextVariableType): ContextVariable { - if (this.variables.has(type)) + if (this.variables.has(type)) { return this.variables.get(type)?.getTail()?.getValue(); } @@ -41,18 +41,24 @@ export class ApplicationContext return undefined; } - public addValue(type: ContextVariableType, value: any): void + public addValue(type: ContextVariableType, value: any): void { let list: LinkedList; if (this.variables.has(type)) + { list = this.variables.get(type); + } else + { list = new LinkedList(); + } if (list.getSize() >= ApplicationContext.holderMaxSize) + { list.removeFirst(); + } list.add(new ContextVariable(value, type)); this.variables.set(type, list); } -} \ No newline at end of file +} diff --git a/project/src/context/ContextVariable.ts b/project/src/context/ContextVariable.ts index 8abc00d7..9dd5755d 100644 --- a/project/src/context/ContextVariable.ts +++ b/project/src/context/ContextVariable.ts @@ -27,4 +27,4 @@ export class ContextVariable { return this.type; } -} \ No newline at end of file +} diff --git a/project/src/context/ContextVariableType.ts b/project/src/context/ContextVariableType.ts index b838d193..7914815c 100644 --- a/project/src/context/ContextVariableType.ts +++ b/project/src/context/ContextVariableType.ts @@ -1,11 +1,11 @@ -export enum ContextVariableType - { +export enum ContextVariableType +{ /** Logged in users session id */ - SESSION_ID, + SESSION_ID = 0, /** Currently acive raid information */ - RAID_CONFIGURATION, + RAID_CONFIGURATION = 1, /** Timestamp when client first connected */ - CLIENT_START_TIMESTAMP, + CLIENT_START_TIMESTAMP = 2, /** When player is loading into map and loot is requested */ - REGISTER_PLAYER_REQUEST -} \ No newline at end of file + REGISTER_PLAYER_REQUEST = 3, +} diff --git a/project/src/controllers/BotController.ts b/project/src/controllers/BotController.ts index d7ecc335..fa92a9d3 100644 --- a/project/src/controllers/BotController.ts +++ b/project/src/controllers/BotController.ts @@ -41,7 +41,7 @@ export class BotController @inject("ProfileHelper") protected profileHelper: ProfileHelper, @inject("ConfigServer") protected configServer: ConfigServer, @inject("ApplicationContext") protected applicationContext: ApplicationContext, - @inject("JsonUtil") protected jsonUtil: JsonUtil + @inject("JsonUtil") protected jsonUtil: JsonUtil, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -55,9 +55,7 @@ export class BotController */ public getBotPresetGenerationLimit(type: string): number { - return this.botConfig.presetBatch[(type === "assaultGroup") - ? "assault" - : type]; + return this.botConfig.presetBatch[(type === "assaultGroup") ? "assault" : type]; } /** @@ -79,10 +77,14 @@ export class BotController */ public getBotDifficulty(type: string, difficulty: string): Difficulty { - const raidConfig = this.applicationContext.getLatestValue(ContextVariableType.RAID_CONFIGURATION)?.getValue(); + const raidConfig = this.applicationContext.getLatestValue(ContextVariableType.RAID_CONFIGURATION)?.getValue< + IGetRaidConfigurationRequestData + >(); if (!raidConfig) { - this.logger.error(this.localisationService.getText("bot-missing_application_context", "RAID_CONFIGURATION")); + this.logger.error( + this.localisationService.getText("bot-missing_application_context", "RAID_CONFIGURATION"), + ); } // Check value chosen in pre-raid difficulty dropdown @@ -90,7 +92,9 @@ export class BotController const botDifficultyDropDownValue = raidConfig.wavesSettings.botDifficulty.toLowerCase(); if (botDifficultyDropDownValue !== "asonline") { - difficulty = this.botDifficultyHelper.convertBotDifficultyDropdownToBotDifficulty(botDifficultyDropDownValue); + difficulty = this.botDifficultyHelper.convertBotDifficultyDropdownToBotDifficulty( + botDifficultyDropDownValue, + ); } let difficultySettings: Difficulty; @@ -98,19 +102,32 @@ export class BotController switch (lowercasedBotType) { case this.pmcConfig.bearType.toLowerCase(): - difficultySettings = this.botDifficultyHelper.getPmcDifficultySettings("bear", difficulty, this.pmcConfig.usecType, this.pmcConfig.bearType); + difficultySettings = this.botDifficultyHelper.getPmcDifficultySettings( + "bear", + difficulty, + this.pmcConfig.usecType, + this.pmcConfig.bearType, + ); break; case this.pmcConfig.usecType.toLowerCase(): - difficultySettings = this.botDifficultyHelper.getPmcDifficultySettings("usec", difficulty, this.pmcConfig.usecType, this.pmcConfig.bearType); + difficultySettings = this.botDifficultyHelper.getPmcDifficultySettings( + "usec", + difficulty, + this.pmcConfig.usecType, + this.pmcConfig.bearType, + ); break; default: difficultySettings = this.botDifficultyHelper.getBotDifficultySettings(type, difficulty); // Don't add pmcs to gifter enemy list if (type.toLowerCase() !== "gifter") { - this.botHelper.addBotToEnemyList(difficultySettings, [this.pmcConfig.bearType, this.pmcConfig.usecType], lowercasedBotType); + this.botHelper.addBotToEnemyList(difficultySettings, [ + this.pmcConfig.bearType, + this.pmcConfig.usecType, + ], lowercasedBotType); } - + break; } @@ -138,7 +155,7 @@ export class BotController botRelativeLevelDeltaMax: this.pmcConfig.botRelativeLevelDeltaMax, botCountToGenerate: this.botConfig.presetBatch[condition.Role], botDifficulty: condition.Difficulty, - isPlayerScav: false + isPlayerScav: false, }; // Custom map waves can have spt roles in them @@ -151,7 +168,7 @@ export class BotController // Loop over and make x bots for this condition let cacheKey = ""; - for (let i = 0; i < botGenerationDetails.botCountToGenerate; i ++) + for (let i = 0; i < botGenerationDetails.botCountToGenerate; i++) { const details = this.jsonUtil.clone(botGenerationDetails); @@ -197,8 +214,8 @@ export class BotController /** * Get the difficulty passed in, if its not "asoline", get selected difficulty from config - * @param requestedDifficulty - * @returns + * @param requestedDifficulty + * @returns */ public getPMCDifficulty(requestedDifficulty: string): string { @@ -224,20 +241,25 @@ export class BotController public getBotCap(): number { const defaultMapCapId = "default"; - const raidConfig = this.applicationContext.getLatestValue(ContextVariableType.RAID_CONFIGURATION).getValue(); + const raidConfig = this.applicationContext.getLatestValue(ContextVariableType.RAID_CONFIGURATION).getValue< + IGetRaidConfigurationRequestData + >(); if (!raidConfig) { this.logger.warning(this.localisationService.getText("bot-missing_saved_match_info")); } - const mapName = (raidConfig) - ? raidConfig.location - : defaultMapCapId; + const mapName = raidConfig ? raidConfig.location : defaultMapCapId; let botCap = this.botConfig.maxBotCap[mapName.toLowerCase()]; if (!botCap) { - this.logger.warning(this.localisationService.getText("bot-no_bot_cap_found_for_location", raidConfig.location.toLowerCase())); + this.logger.warning( + this.localisationService.getText( + "bot-no_bot_cap_found_for_location", + raidConfig.location.toLowerCase(), + ), + ); botCap = this.botConfig.maxBotCap[defaultMapCapId]; } @@ -246,9 +268,6 @@ export class BotController public getAiBotBrainTypes(): any { - return { - pmc: this.pmcConfig.pmcType, - assault: this.botConfig.assaultBrainType - }; + return { pmc: this.pmcConfig.pmcType, assault: this.botConfig.assaultBrainType }; } } diff --git a/project/src/controllers/ClientLogController.ts b/project/src/controllers/ClientLogController.ts index f8c0b6dc..988f6442 100644 --- a/project/src/controllers/ClientLogController.ts +++ b/project/src/controllers/ClientLogController.ts @@ -8,10 +8,8 @@ import { inject, injectable } from "tsyringe"; @injectable() export class ClientLogController { - constructor( - @inject("WinstonLogger") protected logger: ILogger - ) - { } + constructor(@inject("WinstonLogger") protected logger: ILogger) + {} /** * Handle /singleplayer/log @@ -54,4 +52,4 @@ export class ClientLogController this.logger.info(message); } } -} \ No newline at end of file +} diff --git a/project/src/controllers/CustomizationController.ts b/project/src/controllers/CustomizationController.ts index 4cf18ea9..f9d680b0 100644 --- a/project/src/controllers/CustomizationController.ts +++ b/project/src/controllers/CustomizationController.ts @@ -17,7 +17,7 @@ export class CustomizationController { protected readonly clothingIds = { lowerParentId: "5cd944d01388ce000a659df9", - upperParentId: "5cd944ca1388ce03a44dc2a4" + upperParentId: "5cd944ca1388ce03a44dc2a4", }; constructor( @@ -26,7 +26,7 @@ export class CustomizationController @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("SaveServer") protected saveServer: SaveServer, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ProfileHelper") protected profileHelper: ProfileHelper + @inject("ProfileHelper") protected profileHelper: ProfileHelper, ) {} @@ -43,17 +43,21 @@ export class CustomizationController const suits = this.databaseServer.getTables().traders[traderID].suits; // Get an inner join of clothing from templates.customization and ragmans suits array - const matchingSuits = suits.filter(x => x.suiteId in templates); + const matchingSuits = suits.filter((x) => x.suiteId in templates); // Return all suits that have a side array containing the players side (usec/bear) - return matchingSuits.filter(x => templates[x.suiteId]._props.Side.includes(pmcData.Info.Side)); + return matchingSuits.filter((x) => templates[x.suiteId]._props.Side.includes(pmcData.Info.Side)); } /** * Handle CustomizationWear event * Equip one to many clothing items to player */ - public wearClothing(pmcData: IPmcData, wearClothingRequest: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse + public wearClothing( + pmcData: IPmcData, + wearClothingRequest: IWearClothingRequestData, + sessionID: string, + ): IItemEventRouterResponse { for (const suitId of wearClothingRequest.suites) { @@ -85,7 +89,11 @@ export class CustomizationController * @param sessionId Session id * @returns IItemEventRouterResponse */ - public buyClothing(pmcData: IPmcData, buyClothingRequest: IBuyClothingRequestData, sessionId: string): IItemEventRouterResponse + public buyClothing( + pmcData: IPmcData, + buyClothingRequest: IBuyClothingRequestData, + sessionId: string, + ): IItemEventRouterResponse { const db = this.databaseServer.getTables(); const output = this.eventOutputHolder.getOutput(sessionId); @@ -93,7 +101,9 @@ export class CustomizationController const traderOffer = this.getTraderClothingOffer(sessionId, buyClothingRequest.offer); if (!traderOffer) { - this.logger.error(this.localisationService.getText("customisation-unable_to_find_suit_by_id", buyClothingRequest.offer)); + this.logger.error( + this.localisationService.getText("customisation-unable_to_find_suit_by_id", buyClothingRequest.offer), + ); return output; } @@ -102,7 +112,12 @@ export class CustomizationController if (this.outfitAlreadyPurchased(suitId, sessionId)) { const suitDetails = db.templates.customization[suitId]; - this.logger.error(this.localisationService.getText("customisation-item_already_purchased", {itemId: suitDetails._id, itemName: suitDetails._name})); + this.logger.error( + this.localisationService.getText("customisation-item_already_purchased", { + itemId: suitDetails._id, + itemName: suitDetails._name, + }), + ); return output; } @@ -118,7 +133,7 @@ export class CustomizationController protected getTraderClothingOffer(sessionId: string, offerId: string): ISuit { - return this.getAllTraderSuits(sessionId).find(x => x._id === offerId); + return this.getAllTraderSuits(sessionId).find((x) => x._id === offerId); } /** @@ -139,7 +154,12 @@ export class CustomizationController * @param clothingItems Clothing purchased * @param output Client response */ - protected payForClothingItems(sessionId: string, pmcData: IPmcData, clothingItems: ClothingItem[], output: IItemEventRouterResponse): void + protected payForClothingItems( + sessionId: string, + pmcData: IPmcData, + clothingItems: ClothingItem[], + output: IItemEventRouterResponse, + ): void { for (const sellItem of clothingItems) { @@ -154,12 +174,22 @@ export class CustomizationController * @param clothingItem Clothing item purchased * @param output Client response */ - protected payForClothingItem(sessionId: string, pmcData: IPmcData, clothingItem: ClothingItem, output: IItemEventRouterResponse): void + protected payForClothingItem( + sessionId: string, + pmcData: IPmcData, + clothingItem: ClothingItem, + output: IItemEventRouterResponse, + ): void { - const relatedItem = pmcData.Inventory.items.find(x => x._id === clothingItem.id); + const relatedItem = pmcData.Inventory.items.find((x) => x._id === clothingItem.id); if (!relatedItem) { - this.logger.error(this.localisationService.getText("customisation-unable_to_find_clothing_item_in_inventory", clothingItem.id)); + this.logger.error( + this.localisationService.getText( + "customisation-unable_to_find_clothing_item_in_inventory", + clothingItem.id, + ), + ); return; } @@ -179,7 +209,7 @@ export class CustomizationController parentId: relatedItem.parentId, slotId: relatedItem.slotId, location: relatedItem.location, - upd: { StackObjectsCount: relatedItem.upd.StackObjectsCount } + upd: { StackObjectsCount: relatedItem.upd.StackObjectsCount }, }); } } @@ -199,4 +229,4 @@ export class CustomizationController return result; } -} \ No newline at end of file +} diff --git a/project/src/controllers/DialogueController.ts b/project/src/controllers/DialogueController.ts index 21c3a2f4..095bf7c9 100644 --- a/project/src/controllers/DialogueController.ts +++ b/project/src/controllers/DialogueController.ts @@ -37,7 +37,7 @@ export class DialogueController @inject("MailSendService") protected mailSendService: MailSendService, @inject("GiftService") protected giftService: GiftService, @inject("HashUtil") protected hashUtil: HashUtil, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.coreConfig = this.configServer.getConfig(ConfigTypes.CORE); @@ -61,11 +61,7 @@ export class DialogueController public getFriendList(sessionID: string): IGetFriendListDataResponse { // Force a fake friend called SPT into friend list - return { - "Friends": [this.getSptFriendData()], - "Ignore": [], - "InIgnoreList": [] - }; + return { Friends: [this.getSptFriendData()], Ignore: [], InIgnoreList: [] }; } /** @@ -104,7 +100,7 @@ export class DialogueController new: dialogue.new, attachmentsNew: dialogue.attachmentsNew, pinned: dialogue.pinned, - Users: this.getDialogueUsers(dialogue, dialogue.type, sessionID) + Users: this.getDialogueUsers(dialogue, dialogue.type, sessionID), }; return result; @@ -121,7 +117,9 @@ export class DialogueController const profile = this.saveServer.getProfile(sessionID); // User to user messages are special in that they need the player to exist in them, add if they don't - if (messageType === MessageType.USER_MESSAGE && !dialog.Users?.find(x => x._id === profile.characters.pmc._id)) + if ( + messageType === MessageType.USER_MESSAGE && !dialog.Users?.find((x) => x._id === profile.characters.pmc._id) + ) { if (!dialog.Users) { @@ -134,8 +132,8 @@ export class DialogueController Level: profile.characters.pmc.Info.Level, Nickname: profile.characters.pmc.Info.Nickname, Side: profile.characters.pmc.Info.Side, - MemberCategory: profile.characters.pmc.Info.MemberCategory - } + MemberCategory: profile.characters.pmc.Info.MemberCategory, + }, }); } @@ -151,7 +149,10 @@ export class DialogueController * @param sessionId Session id * @returns IGetMailDialogViewResponseData object */ - public generateDialogueView(request: IGetMailDialogViewRequestData, sessionId: string): IGetMailDialogViewResponseData + public generateDialogueView( + request: IGetMailDialogViewRequestData, + sessionId: string, + ): IGetMailDialogViewResponseData { const dialogueId = request.dialogId; const fullProfile = this.saveServer.getProfile(sessionId); @@ -163,10 +164,10 @@ export class DialogueController // Set number of new attachments, but ignore those that have expired. dialogue.attachmentsNew = this.getUnreadMessagesWithAttachmentsCount(sessionId, dialogueId); - return { + return { messages: dialogue.messages, profiles: this.getProfilesForMail(fullProfile, dialogue.Users), - hasMessagesWithRewards: this.messagesHaveUncollectedRewards(dialogue.messages) + hasMessagesWithRewards: this.messagesHaveUncollectedRewards(dialogue.messages), }; } @@ -186,7 +187,7 @@ export class DialogueController pinned: false, messages: [], new: 0, - type: request.type + type: request.type, }; if (request.type === MessageType.USER_MESSAGE) @@ -212,7 +213,7 @@ export class DialogueController result.push(...dialogUsers); // Player doesnt exist, add them in before returning - if (!result.find(x => x._id === fullProfile.info.id)) + if (!result.find((x) => x._id === fullProfile.info.id)) { const pmcProfile = fullProfile.characters.pmc; result.push({ @@ -221,8 +222,8 @@ export class DialogueController Nickname: pmcProfile.Info.Nickname, Side: pmcProfile.Info.Side, Level: pmcProfile.Info.Level, - MemberCategory: pmcProfile.Info.MemberCategory - } + MemberCategory: pmcProfile.Info.MemberCategory, + }, }); } } @@ -258,7 +259,7 @@ export class DialogueController */ protected messagesHaveUncollectedRewards(messages: Message[]): boolean { - return messages.some(x => x.items?.data?.length > 0); + return messages.some((x) => x.items?.data?.length > 0); } /** @@ -323,7 +324,7 @@ export class DialogueController * Get all uncollected items attached to mail in a particular dialog * @param dialogueId Dialog to get mail attachments from * @param sessionId Session id - * @returns + * @returns */ public getAllAttachments(dialogueId: string, sessionId: string): IGetAllAttachmentsResponse { @@ -338,14 +339,14 @@ export class DialogueController // Removes corner 'new messages' tag dialog.attachmentsNew = 0; - + const activeMessages = this.getActiveMessagesFromDialog(sessionId, dialogueId); const messagesWithAttachments = this.getMessagesWithAttachments(activeMessages); - return { + return { messages: messagesWithAttachments, profiles: [], - hasMessagesWithRewards: this.messagesHaveUncollectedRewards(messagesWithAttachments) + hasMessagesWithRewards: this.messagesHaveUncollectedRewards(messagesWithAttachments), }; } @@ -377,43 +378,96 @@ export class DialogueController const giftSent = this.giftService.sendGiftToPlayer(sessionId, request.text); - if (giftSent === GiftSentResult.SUCCESS) + if (giftSent === GiftSentResult.SUCCESS) { - this.mailSendService.sendUserMessageToPlayer(sessionId, sptFriendUser, this.randomUtil.getArrayValue(["Hey! you got the right code!", "A secret code, how exciting!", "You found a gift code!"])); + this.mailSendService.sendUserMessageToPlayer( + sessionId, + sptFriendUser, + this.randomUtil.getArrayValue([ + "Hey! you got the right code!", + "A secret code, how exciting!", + "You found a gift code!", + ]), + ); return; } - if (giftSent === GiftSentResult.FAILED_GIFT_ALREADY_RECEIVED) + if (giftSent === GiftSentResult.FAILED_GIFT_ALREADY_RECEIVED) { - this.mailSendService.sendUserMessageToPlayer(sessionId, sptFriendUser, this.randomUtil.getArrayValue(["Looks like you already used that code", "You already have that!!"])); + this.mailSendService.sendUserMessageToPlayer( + sessionId, + sptFriendUser, + this.randomUtil.getArrayValue(["Looks like you already used that code", "You already have that!!"]), + ); return; } - if (request.text.toLowerCase().includes("love you")) + if (request.text.toLowerCase().includes("love you")) { - this.mailSendService.sendUserMessageToPlayer(sessionId, sptFriendUser, this.randomUtil.getArrayValue(["That's quite forward but i love you too in a purely chatbot-human way", "I love you too buddy :3!", "uwu", `love you too ${sender?.Info?.Nickname}`])); + this.mailSendService.sendUserMessageToPlayer( + sessionId, + sptFriendUser, + this.randomUtil.getArrayValue([ + "That's quite forward but i love you too in a purely chatbot-human way", + "I love you too buddy :3!", + "uwu", + `love you too ${sender?.Info?.Nickname}`, + ]), + ); } - if (request.text.toLowerCase() === "spt") + if (request.text.toLowerCase() === "spt") { - this.mailSendService.sendUserMessageToPlayer(sessionId, sptFriendUser, this.randomUtil.getArrayValue(["Its me!!", "spt? i've heard of that project"])); + this.mailSendService.sendUserMessageToPlayer( + sessionId, + sptFriendUser, + this.randomUtil.getArrayValue(["Its me!!", "spt? i've heard of that project"]), + ); } - if (["hello", "hi", "sup", "yo", "hey"].includes(request.text.toLowerCase())) + if (["hello", "hi", "sup", "yo", "hey"].includes(request.text.toLowerCase())) { - this.mailSendService.sendUserMessageToPlayer(sessionId, sptFriendUser, this.randomUtil.getArrayValue(["Howdy", "Hi", "Greetings", "Hello", "bonjor", "Yo", "Sup", "Heyyyyy", "Hey there", `Hello ${sender?.Info?.Nickname}`])); + this.mailSendService.sendUserMessageToPlayer( + sessionId, + sptFriendUser, + this.randomUtil.getArrayValue([ + "Howdy", + "Hi", + "Greetings", + "Hello", + "bonjor", + "Yo", + "Sup", + "Heyyyyy", + "Hey there", + `Hello ${sender?.Info?.Nickname}`, + ]), + ); } - if (request.text.toLowerCase() === "nikita") + if (request.text.toLowerCase() === "nikita") { - this.mailSendService.sendUserMessageToPlayer(sessionId, sptFriendUser, this.randomUtil.getArrayValue(["I know that guy!", "Cool guy, he made EFT!", "Legend", "Remember when he said webel-webel-webel-webel, classic nikita moment"])); + this.mailSendService.sendUserMessageToPlayer( + sessionId, + sptFriendUser, + this.randomUtil.getArrayValue([ + "I know that guy!", + "Cool guy, he made EFT!", + "Legend", + "Remember when he said webel-webel-webel-webel, classic nikita moment", + ]), + ); } - if (request.text.toLowerCase() === "are you a bot") + if (request.text.toLowerCase() === "are you a bot") { - this.mailSendService.sendUserMessageToPlayer(sessionId, sptFriendUser, this.randomUtil.getArrayValue(["beep boop", "**sad boop**", "probably", "sometimes", "yeah lol"])); + this.mailSendService.sendUserMessageToPlayer( + sessionId, + sptFriendUser, + this.randomUtil.getArrayValue(["beep boop", "**sad boop**", "probably", "sometimes", "yeah lol"]), + ); } } @@ -425,8 +479,8 @@ export class DialogueController Level: 1, MemberCategory: MemberCategory.DEVELOPER, Nickname: this.coreConfig.sptFriendNickname, - Side: "Usec" - } + Side: "Usec", + }, }; } @@ -440,7 +494,7 @@ export class DialogueController { const timeNow = this.timeUtil.getTimestamp(); const dialogs = this.dialogueHelper.getDialogsForProfile(sessionId); - return dialogs[dialogueId].messages.filter(x => timeNow < (x.dt + x.maxStorageTime)); + return dialogs[dialogueId].messages.filter((x) => timeNow < (x.dt + x.maxStorageTime)); } /** @@ -450,7 +504,7 @@ export class DialogueController */ protected getMessagesWithAttachments(messages: Message[]): Message[] { - return messages.filter(x => x.items?.data?.length > 0); + return messages.filter((x) => x.items?.data?.length > 0); } /** @@ -497,4 +551,4 @@ export class DialogueController { return (this.timeUtil.getTimestamp()) > (message.dt + message.maxStorageTime); } -} \ No newline at end of file +} diff --git a/project/src/controllers/GameController.ts b/project/src/controllers/GameController.ts index df65186d..a3789066 100644 --- a/project/src/controllers/GameController.ts +++ b/project/src/controllers/GameController.ts @@ -69,7 +69,7 @@ export class GameController @inject("ItemBaseClassService") protected itemBaseClassService: ItemBaseClassService, @inject("GiftService") protected giftService: GiftService, @inject("ApplicationContext") protected applicationContext: ApplicationContext, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.httpConfig = this.configServer.getConfig(ConfigTypes.HTTP); @@ -166,7 +166,7 @@ export class GameController this.profileFixerService.fixIncorrectAidValue(fullProfile); this.profileFixerService.migrateStatsToNewStructure(fullProfile); - + this.sendPraporGiftsToNewProfiles(pmcProfile); this.profileFixerService.checkForOrphanedModdedItems(sessionID, fullProfile); @@ -184,7 +184,7 @@ export class GameController this.hideoutHelper.unlockHideoutWallInProfile(pmcProfile); this.profileFixerService.addMissingIdsToBonuses(pmcProfile); } - + this.logProfileDetails(fullProfile); this.adjustLabsRaiderSpawnRate(); @@ -240,7 +240,9 @@ export class GameController const trader = this.databaseServer.getTables().traders[traderKey]; if (!trader?.base?.repair) { - this.logger.warning(`Trader ${trader.base._id} ${trader.base.nickname} is missing a repair object, adding in default values`); + this.logger.warning( + `Trader ${trader.base._id} ${trader.base.nickname} is missing a repair object, adding in default values`, + ); trader.base.repair = this.jsonUtil.clone(this.databaseServer.getTables().traders.ragfair.base.repair); return; @@ -248,7 +250,9 @@ export class GameController if (trader.base.repair?.quality === undefined) { - this.logger.warning(`Trader ${trader.base._id} ${trader.base.nickname} is missing a repair quality value, adding in default value`); + this.logger.warning( + `Trader ${trader.base._id} ${trader.base.nickname} is missing a repair quality value, adding in default value`, + ); trader.base.repair.quality = this.databaseServer.getTables().traders.ragfair.base.repair.quality; } } @@ -274,7 +278,9 @@ export class GameController for (const positionToAdd of positionsToAdd) { // Exists already, add new items to existing positions pool - const existingLootPosition = mapLooseLoot.spawnpoints.find(x => x.template.Id === positionToAdd.template.Id); + const existingLootPosition = mapLooseLoot.spawnpoints.find((x) => + x.template.Id === positionToAdd.template.Id + ); if (existingLootPosition) { existingLootPosition.template.Items.push(...positionToAdd.template.Items); @@ -303,7 +309,7 @@ export class GameController const mapLootAdjustmentsDict = adjustments[mapId]; for (const lootKey in mapLootAdjustmentsDict) { - const lootPostionToAdjust = mapLooseLootData.spawnpoints.find(x => x.template.Id === lootKey); + const lootPostionToAdjust = mapLooseLootData.spawnpoints.find((x) => x.template.Id === lootKey); if (!lootPostionToAdjust) { this.logger.warning(`Unable to adjust loot position: ${lootKey} on map: ${mapId}`); @@ -314,24 +320,24 @@ export class GameController } } } - + protected setHideoutAreasAndCraftsTo40Secs(): void { - for (const hideoutProd of this.databaseServer.getTables().hideout.production) + for (const hideoutProd of this.databaseServer.getTables().hideout.production) { - if (hideoutProd.productionTime > 40) + if (hideoutProd.productionTime > 40) { hideoutProd.productionTime = 40; } } this.logger.warning("DEVELOPER: SETTING ALL HIDEOUT PRODUCTIONS TO 40 SECONDS"); - for (const hideoutArea of this.databaseServer.getTables().hideout.areas) + for (const hideoutArea of this.databaseServer.getTables().hideout.areas) { - for (const stageKey in hideoutArea.stages) + for (const stageKey in hideoutArea.stages) { const stage = hideoutArea.stages[stageKey]; - if (stage.constructionTime > 40) + if (stage.constructionTime > 40) { stage.constructionTime = 40; } @@ -339,9 +345,9 @@ export class GameController } this.logger.warning("DEVELOPER: SETTING ALL HIDEOUT AREAS TO 40 SECOND UPGRADES"); - for (const scavCaseCraft of this.databaseServer.getTables().hideout.scavcase) + for (const scavCaseCraft of this.databaseServer.getTables().hideout.scavcase) { - if (scavCaseCraft.ProductionTime > 40) + if (scavCaseCraft.ProductionTime > 40) { scavCaseCraft.ProductionTime = 40; } @@ -363,12 +369,14 @@ export class GameController const map: ILocationData = mapsDb[mapId]; if (!map) { - this.logger.warning(this.localisationService.getText("bot-unable_to_edit_limits_of_unknown_map", mapId)); + this.logger.warning( + this.localisationService.getText("bot-unable_to_edit_limits_of_unknown_map", mapId), + ); } for (const botToLimit of this.locationConfig.botTypeLimits[mapId]) { - const index = map.base.MinMaxBots.findIndex(x => x.WildSpawnType === botToLimit.type); + const index = map.base.MinMaxBots.findIndex((x) => x.WildSpawnType === botToLimit.type); if (index !== -1) { // Existing bot type found in MinMaxBots array, edit @@ -378,14 +386,12 @@ export class GameController } else { - map.base.MinMaxBots.push( - { - // Bot type not found, add new object - WildSpawnType: botToLimit.type, - min: botToLimit.min, - max: botToLimit.max - } - ); + map.base.MinMaxBots.push({ + // Bot type not found, add new object + WildSpawnType: botToLimit.type, + min: botToLimit.min, + max: botToLimit.max, + }); } } } @@ -412,12 +418,12 @@ export class GameController Trading: this.httpServerHelper.getBackendUrl(), Messaging: this.httpServerHelper.getBackendUrl(), Main: this.httpServerHelper.getBackendUrl(), - RagFair: this.httpServerHelper.getBackendUrl() + RagFair: this.httpServerHelper.getBackendUrl(), }, useProtobuf: false, // eslint-disable-next-line @typescript-eslint/naming-convention utc_time: new Date().getTime() / 1000, - totalInGame: profile.Stats?.Eft?.TotalInGameTime ?? 0 + totalInGame: profile.Stats?.Eft?.TotalInGameTime ?? 0, }; return config; @@ -429,12 +435,7 @@ export class GameController // eslint-disable-next-line @typescript-eslint/no-unused-vars public getServer(sessionId: string): IServerDetails[] { - return [ - { - ip: this.httpConfig.ip, - port: this.httpConfig.port - } - ]; + return [{ ip: this.httpConfig.ip, port: this.httpConfig.port }]; } /** @@ -443,9 +444,7 @@ export class GameController // eslint-disable-next-line @typescript-eslint/no-unused-vars public getCurrentGroup(sessionId: string): ICurrentGroupResponse { - return { - squad: [] - }; + return { squad: [] }; } /** @@ -454,10 +453,7 @@ export class GameController // eslint-disable-next-line @typescript-eslint/no-unused-vars public getValidGameVersion(sessionId: string): ICheckVersionResponse { - return { - isvalid: true, - latestVersion: this.coreConfig.compatibleTarkovVersion - }; + return { isvalid: true, latestVersion: this.coreConfig.compatibleTarkovVersion }; } /** @@ -469,7 +465,7 @@ export class GameController return { msg: "OK", // eslint-disable-next-line @typescript-eslint/naming-convention - utc_time: new Date().getTime() / 1000 + utc_time: new Date().getTime() / 1000, }; } @@ -521,7 +517,7 @@ export class GameController /** * When player logs in, iterate over all active effects and reduce timer * TODO - add body part HP regen - * @param pmcProfile + * @param pmcProfile */ protected updateProfileHealthValues(pmcProfile: IPmcData): void { @@ -538,14 +534,23 @@ export class GameController let hpRegenPerHour = 456.6; // Set new values, whatever is smallest - energyRegenPerHour += pmcProfile.Bonuses.filter(x => x.type === "EnergyRegeneration").reduce((sum, curr) => sum + curr.value, 0); - hydrationRegenPerHour += pmcProfile.Bonuses.filter(x => x.type === "HydrationRegeneration").reduce((sum, curr) => sum + curr.value, 0); - hpRegenPerHour += pmcProfile.Bonuses.filter(x => x.type === "HealthRegeneration").reduce((sum, curr) => sum + curr.value, 0); + energyRegenPerHour += pmcProfile.Bonuses.filter((x) => x.type === "EnergyRegeneration").reduce( + (sum, curr) => sum + curr.value, + 0, + ); + hydrationRegenPerHour += pmcProfile.Bonuses.filter((x) => x.type === "HydrationRegeneration").reduce( + (sum, curr) => sum + curr.value, + 0, + ); + hpRegenPerHour += pmcProfile.Bonuses.filter((x) => x.type === "HealthRegeneration").reduce( + (sum, curr) => sum + curr.value, + 0, + ); if (pmcProfile.Health.Energy.Current !== pmcProfile.Health.Energy.Maximum) { // Set new value, whatever is smallest - pmcProfile.Health.Energy.Current += Math.round((energyRegenPerHour * (diffSeconds / 3600))); + pmcProfile.Health.Energy.Current += Math.round(energyRegenPerHour * (diffSeconds / 3600)); if (pmcProfile.Health.Energy.Current > pmcProfile.Health.Energy.Maximum) { pmcProfile.Health.Energy.Current = pmcProfile.Health.Energy.Maximum; @@ -554,7 +559,7 @@ export class GameController if (pmcProfile.Health.Hydration.Current !== pmcProfile.Health.Hydration.Maximum) { - pmcProfile.Health.Hydration.Current += Math.round((hydrationRegenPerHour * (diffSeconds / 3600))); + pmcProfile.Health.Hydration.Current += Math.round(hydrationRegenPerHour * (diffSeconds / 3600)); if (pmcProfile.Health.Hydration.Current > pmcProfile.Health.Hydration.Maximum) { pmcProfile.Health.Hydration.Current = pmcProfile.Health.Hydration.Maximum; @@ -565,17 +570,17 @@ export class GameController for (const bodyPartKey in pmcProfile.Health.BodyParts) { const bodyPart = pmcProfile.Health.BodyParts[bodyPartKey] as BodyPartHealth; - + // Check part hp if (bodyPart.Health.Current < bodyPart.Health.Maximum) { - bodyPart.Health.Current += Math.round((hpRegenPerHour * (diffSeconds / 3600))); + bodyPart.Health.Current += Math.round(hpRegenPerHour * (diffSeconds / 3600)); } if (bodyPart.Health.Current > bodyPart.Health.Maximum) { bodyPart.Health.Current = bodyPart.Health.Maximum; } - + // Look for effects if (Object.keys(bodyPart.Effects ?? {}).length > 0) { @@ -618,7 +623,9 @@ export class GameController const location: ILocationData = this.databaseServer.getTables().locations[locationKey]; if (!location.base) { - this.logger.warning(this.localisationService.getText("location-unable_to_fix_broken_waves_missing_base", locationKey)); + this.logger.warning( + this.localisationService.getText("location-unable_to_fix_broken_waves_missing_base", locationKey), + ); continue; } @@ -626,7 +633,9 @@ export class GameController { if ((wave.slots_max - wave.slots_min === 0)) { - this.logger.debug(`Fixed ${wave.WildSpawnType} Spawn: ${locationKey} wave: ${wave.number} of type: ${wave.WildSpawnType} in zone: ${wave.SpawnPoints} with Max Slots of ${wave.slots_max}`); + this.logger.debug( + `Fixed ${wave.WildSpawnType} Spawn: ${locationKey} wave: ${wave.number} of type: ${wave.WildSpawnType} in zone: ${wave.SpawnPoints} with Max Slots of ${wave.slots_max}`, + ); wave.slots_max++; } } @@ -638,7 +647,7 @@ export class GameController */ protected fixRoguesSpawningInstantlyOnLighthouse(): void { - const lighthouse = this.databaseServer.getTables().locations["lighthouse"].base; + const lighthouse = this.databaseServer.getTables().locations.lighthouse.base; for (const wave of lighthouse.BossLocationSpawn) { // Find Rogues that spawn instantly @@ -689,18 +698,23 @@ export class GameController for (const wave of location.base.waves) { // Wave has size that makes it candidate for splitting - if (wave.slots_max - wave.slots_min >= this.locationConfig.splitWaveIntoSingleSpawnsSettings.waveSizeThreshold) + if ( + wave.slots_max - wave.slots_min + >= this.locationConfig.splitWaveIntoSingleSpawnsSettings.waveSizeThreshold + ) { // Get count of bots to be spawned in wave const waveSize = wave.slots_max - wave.slots_min; - + // Update wave to spawn single bot wave.slots_min = 1; wave.slots_max = 2; - + // Get index of wave const indexOfWaveToSplit = location.base.waves.indexOf(wave); - this.logger.debug(`Splitting map: ${location.base.Id} wave: ${indexOfWaveToSplit} with ${waveSize} bots`); + this.logger.debug( + `Splitting map: ${location.base.Id} wave: ${indexOfWaveToSplit} with ${waveSize} bots`, + ); // Add new waves to fill gap from bots we removed in above wave let wavesAddedCount = 0; @@ -722,14 +736,17 @@ export class GameController } // Update subsequent wave number property to accomodate the new waves - for (let index = indexOfWaveToSplit + wavesAddedCount + 1; index < location.base.waves.length; index++) + for ( + let index = indexOfWaveToSplit + wavesAddedCount + 1; + index < location.base.waves.length; + index++ + ) { // Some waves have value of 0, leave them as-is if (location.base.waves[index].number !== 0) { location.base.waves[index].number += wavesAddedCount; } - } } } @@ -753,9 +770,11 @@ export class GameController for (const modKey in activeMods) { const modDetails = activeMods[modKey]; - if (fullProfile.aki.mods.some(x => x.author === modDetails.author - && x.name === modDetails.name - && x.version === modDetails.version)) + if ( + fullProfile.aki.mods.some((x) => + x.author === modDetails.author && x.name === modDetails.name && x.version === modDetails.version + ) + ) { // Exists already, skip continue; @@ -765,7 +784,7 @@ export class GameController author: modDetails.author, dateAdded: Date.now(), name: modDetails.name, - version: modDetails.version + version: modDetails.version, }); } } @@ -788,7 +807,11 @@ export class GameController } // Merge started/success/fail quest assorts into one dictionary - const mergedQuestAssorts = { ...traderData.questassort["started"], ...traderData.questassort["success"], ...traderData.questassort["fail"]}; + const mergedQuestAssorts = { + ...traderData.questassort.started, + ...traderData.questassort.success, + ...traderData.questassort.fail, + }; // loop over all assorts for trader for (const [assortKey, questKey] of Object.entries(mergedQuestAssorts)) @@ -796,11 +819,14 @@ export class GameController // Does assort key exist in trader assort file if (!traderAssorts.loyal_level_items[assortKey]) { - // reverse lookup of enum key by value + // reverse lookup of enum key by value const messageValues = { traderName: Object.keys(Traders)[Object.values(Traders).indexOf(traderId)], - questName: quests[questKey]?.QuestName ?? "UNKNOWN"}; - this.logger.debug(this.localisationService.getText("assort-missing_quest_assort_unlock", messageValues)); + questName: quests[questKey]?.QuestName ?? "UNKNOWN", + }; + this.logger.debug( + this.localisationService.getText("assort-missing_quest_assort_unlock", messageValues), + ); } } } @@ -817,15 +843,15 @@ export class GameController { const bots = this.databaseServer.getTables().bots.types; - if (bots["bear"]) + if (bots.bear) { - bots["bear"].firstName.push(playerName); + bots.bear.firstName.push(playerName); } - - if (bots["usec"]) + + if (bots.usec) { - bots["usec"].firstName.push(playerName); - } + bots.usec.firstName.push(playerName); + } } } @@ -835,10 +861,10 @@ export class GameController */ protected checkForAndRemoveUndefinedDialogs(fullProfile: IAkiProfile): void { - const undefinedDialog = fullProfile.dialogues["undefined"]; + const undefinedDialog = fullProfile.dialogues.undefined; if (undefinedDialog) { - delete fullProfile.dialogues["undefined"]; + delete fullProfile.dialogues.undefined; } } @@ -860,7 +886,9 @@ export class GameController protected adjustLabsRaiderSpawnRate(): void { const labsBase = this.databaseServer.getTables().locations.laboratory.base; - const nonTriggerLabsBossSpawns = labsBase.BossLocationSpawn.filter(x => x.TriggerId === "" && x.TriggerName === ""); + const nonTriggerLabsBossSpawns = labsBase.BossLocationSpawn.filter((x) => + x.TriggerId === "" && x.TriggerName === "" + ); if (nonTriggerLabsBossSpawns) { for (const boss of nonTriggerLabsBossSpawns) @@ -878,4 +906,4 @@ export class GameController this.logger.debug(`Debug enabled: ${globalThis.G_DEBUG_CONFIGURATION}`); this.logger.debug(`Mods enabled: ${globalThis.G_MODS_ENABLED}`); } -} \ No newline at end of file +} diff --git a/project/src/controllers/HandbookController.ts b/project/src/controllers/HandbookController.ts index 96fdcdb2..d9a957da 100644 --- a/project/src/controllers/HandbookController.ts +++ b/project/src/controllers/HandbookController.ts @@ -8,12 +8,12 @@ export class HandbookController { constructor( @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("HandbookHelper") protected handbookHelper: HandbookHelper + @inject("HandbookHelper") protected handbookHelper: HandbookHelper, ) - { } + {} public load(): void { return; } -} \ No newline at end of file +} diff --git a/project/src/controllers/HealthController.ts b/project/src/controllers/HealthController.ts index 3060f102..e29d44bd 100644 --- a/project/src/controllers/HealthController.ts +++ b/project/src/controllers/HealthController.ts @@ -31,7 +31,7 @@ export class HealthController @inject("InventoryHelper") protected inventoryHelper: InventoryHelper, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("HealthHelper") protected healthHelper: HealthHelper + @inject("HealthHelper") protected healthHelper: HealthHelper, ) {} @@ -43,7 +43,13 @@ export class HealthController * @param addEffects Should effects found be added or removed from profile * @param deleteExistingEffects Should all prior effects be removed before apply new ones */ - public saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string, addEffects = true, deleteExistingEffects = true): void + public saveVitality( + pmcData: IPmcData, + info: ISyncHealthRequestData, + sessionID: string, + addEffects = true, + deleteExistingEffects = true, + ): void { this.healthHelper.saveVitality(pmcData, info, sessionID, addEffects, deleteExistingEffects); } @@ -60,10 +66,13 @@ export class HealthController const output = this.eventOutputHolder.getOutput(sessionID); // Update medkit used (hpresource) - const healingItemToUse = pmcData.Inventory.items.find(item => item._id === request.item); + const healingItemToUse = pmcData.Inventory.items.find((item) => item._id === request.item); if (!healingItemToUse) { - const errorMessage = this.localisationService.getText("health-healing_item_not_found", healingItemToUse._id); + const errorMessage = this.localisationService.getText( + "health-healing_item_not_found", + healingItemToUse._id, + ); this.logger.error(errorMessage); return this.httpResponse.appendErrorToOutput(output, errorMessage); @@ -108,11 +117,14 @@ export class HealthController let output = this.eventOutputHolder.getOutput(sessionID); let resourceLeft = 0; - const itemToConsume = pmcData.Inventory.items.find(x => x._id === request.item); + const itemToConsume = pmcData.Inventory.items.find((x) => x._id === request.item); if (!itemToConsume) { // Item not found, very bad - return this.httpResponse.appendErrorToOutput(output, this.localisationService.getText("health-unable_to_find_item_to_consume", request.item)); + return this.httpResponse.appendErrorToOutput( + output, + this.localisationService.getText("health-unable_to_find_item_to_consume", request.item), + ); } const consumedItemMaxResource = this.itemHelper.getItem(itemToConsume._tpl)[1]._props.MaxResource; @@ -138,7 +150,7 @@ export class HealthController return output; } - + /** * Handle RestoreHealth event * Occurs on post-raid healing page @@ -147,7 +159,11 @@ export class HealthController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public healthTreatment(pmcData: IPmcData, healthTreatmentRequest: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse + public healthTreatment( + pmcData: IPmcData, + healthTreatmentRequest: IHealthTreatmentRequestData, + sessionID: string, + ): IItemEventRouterResponse { let output = this.eventOutputHolder.getOutput(sessionID); const payMoneyRequest: IProcessBuyTradeRequestData = { @@ -160,7 +176,7 @@ export class HealthController item_id: "", count: 0, // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_id: 0 + scheme_id: 0, }; output = this.paymentService.payMoney(pmcData, payMoneyRequest, sessionID, output); @@ -205,7 +221,7 @@ export class HealthController * applies skills from hideout workout. * @param pmcData Player profile * @param info Request data - * @param sessionID + * @param sessionID */ // eslint-disable-next-line @typescript-eslint/no-unused-vars public applyWorkoutChanges(pmcData: IPmcData, info: IWorkoutData, sessionId: string): void @@ -215,4 +231,4 @@ export class HealthController // Health effects (fractures etc) are handled in /player/health/sync. pmcData.Skills.Common = info.skills.Common; } -} \ No newline at end of file +} diff --git a/project/src/controllers/HideoutController.ts b/project/src/controllers/HideoutController.ts index bea71a5b..c01df79d 100644 --- a/project/src/controllers/HideoutController.ts +++ b/project/src/controllers/HideoutController.ts @@ -69,7 +69,7 @@ export class HideoutController @inject("LocalisationService") protected localisationService: LocalisationService, @inject("ConfigServer") protected configServer: ConfigServer, @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("FenceService") protected fenceService: FenceService + @inject("FenceService") protected fenceService: FenceService, ) { this.hideoutConfig = this.configServer.getConfig(ConfigTypes.HIDEOUT); @@ -83,16 +83,17 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public startUpgrade(pmcData: IPmcData, request: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse + public startUpgrade( + pmcData: IPmcData, + request: IHideoutUpgradeRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); - const items = request.items.map(reqItem => + const items = request.items.map((reqItem) => { - const item = pmcData.Inventory.items.find(invItem => invItem._id === reqItem.id); - return { - inventoryItem: item, - requestedItem: reqItem - }; + const item = pmcData.Inventory.items.find((invItem) => invItem._id === reqItem.id); + return { inventoryItem: item, requestedItem: reqItem }; }); // If it's not money, its construction / barter items @@ -100,14 +101,18 @@ export class HideoutController { if (!item.inventoryItem) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_item_in_inventory", item.requestedItem.id)); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_item_in_inventory", item.requestedItem.id), + ); return this.httpResponse.appendErrorToOutput(output); } - if (this.paymentHelper.isMoneyTpl(item.inventoryItem._tpl) + if ( + this.paymentHelper.isMoneyTpl(item.inventoryItem._tpl) && item.inventoryItem.upd && item.inventoryItem.upd.StackObjectsCount - && item.inventoryItem.upd.StackObjectsCount > item.requestedItem.count) + && item.inventoryItem.upd.StackObjectsCount > item.requestedItem.count + ) { item.inventoryItem.upd.StackObjectsCount -= item.requestedItem.count; } @@ -118,17 +123,21 @@ export class HideoutController } // Construction time management - const hideoutArea = pmcData.Hideout.Areas.find(area => area.type === request.areaType); + const hideoutArea = pmcData.Hideout.Areas.find((area) => area.type === request.areaType); if (!hideoutArea) { this.logger.error(this.localisationService.getText("hideout-unable_to_find_area", request.areaType)); return this.httpResponse.appendErrorToOutput(output); } - const hideoutData = this.databaseServer.getTables().hideout.areas.find(area => area.type === request.areaType); + const hideoutData = this.databaseServer.getTables().hideout.areas.find((area) => + area.type === request.areaType + ); if (!hideoutData) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_area_in_database", request.areaType)); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_area_in_database", request.areaType), + ); return this.httpResponse.appendErrorToOutput(output); } @@ -152,12 +161,16 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public upgradeComplete(pmcData: IPmcData, request: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse + public upgradeComplete( + pmcData: IPmcData, + request: HideoutUpgradeCompleteRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); const db = this.databaseServer.getTables(); - const profileHideoutArea = pmcData.Hideout.Areas.find(area => area.type === request.areaType); + const profileHideoutArea = pmcData.Hideout.Areas.find((area) => area.type === request.areaType); if (!profileHideoutArea) { this.logger.error(this.localisationService.getText("hideout-unable_to_find_area", request.areaType)); @@ -169,10 +182,12 @@ export class HideoutController profileHideoutArea.completeTime = 0; profileHideoutArea.constructing = false; - const hideoutData = db.hideout.areas.find(area => area.type === profileHideoutArea.type); + const hideoutData = db.hideout.areas.find((area) => area.type === profileHideoutArea.type); if (!hideoutData) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_area_in_database", request.areaType)); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_area_in_database", request.areaType), + ); return this.httpResponse.appendErrorToOutput(output); } @@ -190,18 +205,32 @@ export class HideoutController // Upgrade includes a container improvement/addition if (hideoutStage?.container) { - this.addContainerImprovementToProfile(output, sessionID, pmcData, profileHideoutArea, hideoutData, hideoutStage); + this.addContainerImprovementToProfile( + output, + sessionID, + pmcData, + profileHideoutArea, + hideoutData, + hideoutStage, + ); } // Upgrading water collector / med station - if (profileHideoutArea.type === HideoutAreas.WATER_COLLECTOR || profileHideoutArea.type === HideoutAreas.MEDSTATION) + if ( + profileHideoutArea.type === HideoutAreas.WATER_COLLECTOR + || profileHideoutArea.type === HideoutAreas.MEDSTATION + ) { this.checkAndUpgradeWall(pmcData); } // Add Skill Points Per Area Upgrade - this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.HIDEOUT_MANAGEMENT, db.globals.config.SkillsSettings.HideoutManagement.SkillPointsPerAreaUpgrade); - + this.profileHelper.addSkillPointsToPlayer( + pmcData, + SkillTypes.HIDEOUT_MANAGEMENT, + db.globals.config.SkillsSettings.HideoutManagement.SkillPointsPerAreaUpgrade, + ); + return output; } @@ -211,11 +240,11 @@ export class HideoutController */ protected checkAndUpgradeWall(pmcData: IPmcData): void { - const medStation = pmcData.Hideout.Areas.find(area => area.type === HideoutAreas.MEDSTATION); - const waterCollector = pmcData.Hideout.Areas.find(area => area.type === HideoutAreas.WATER_COLLECTOR); + const medStation = pmcData.Hideout.Areas.find((area) => area.type === HideoutAreas.MEDSTATION); + const waterCollector = pmcData.Hideout.Areas.find((area) => area.type === HideoutAreas.WATER_COLLECTOR); if (medStation?.level >= 1 && waterCollector?.level >= 1) { - const wall = pmcData.Hideout.Areas.find(area => area.type === HideoutAreas.EMERGENCY_WALL); + const wall = pmcData.Hideout.Areas.find((area) => area.type === HideoutAreas.EMERGENCY_WALL); if (wall?.level === 0) { wall.level = 3; @@ -224,7 +253,6 @@ export class HideoutController } /** - * * @param pmcData Profile to edit * @param output Object to send back to client * @param sessionID Session/player id @@ -232,7 +260,14 @@ export class HideoutController * @param dbHideoutArea Hideout area being upgraded * @param hideoutStage Stage hideout area is being upgraded to */ - protected addContainerImprovementToProfile(output: IItemEventRouterResponse, sessionID: string, pmcData: IPmcData, profileParentHideoutArea: HideoutArea, dbHideoutArea: IHideoutArea, hideoutStage: Stage): void + protected addContainerImprovementToProfile( + output: IItemEventRouterResponse, + sessionID: string, + pmcData: IPmcData, + profileParentHideoutArea: HideoutArea, + dbHideoutArea: IHideoutArea, + hideoutStage: Stage, + ): void { // Add key/value to `hideoutAreaStashes` dictionary - used to link hideout area to inventory stash by its id if (!pmcData.Inventory.hideoutAreaStashes[dbHideoutArea.type]) @@ -247,7 +282,9 @@ export class HideoutController this.addContainerUpgradeToClientOutput(output, sessionID, dbHideoutArea.type, dbHideoutArea, hideoutStage); // Some areas like gun stand have a child area linked to it, it needs to do the same as above - const childDbArea = this.databaseServer.getTables().hideout.areas.find(x => x.parentArea === dbHideoutArea._id); + const childDbArea = this.databaseServer.getTables().hideout.areas.find((x) => + x.parentArea === dbHideoutArea._id + ); if (childDbArea) { // Add key/value to `hideoutAreaStashes` dictionary - used to link hideout area to inventory stash by its id @@ -257,7 +294,9 @@ export class HideoutController } // Set child area level to same as parent area - pmcData.Hideout.Areas.find(x => x.type === childDbArea.type).level = pmcData.Hideout.Areas.find(x => x.type === profileParentHideoutArea.type).level; + pmcData.Hideout.Areas.find((x) => x.type === childDbArea.type).level = pmcData.Hideout.Areas.find((x) => + x.type === profileParentHideoutArea.type + ).level; // Add/upgrade stash item in player inventory const childDbAreaStage = childDbArea.stages[profileParentHideoutArea.level]; @@ -276,8 +315,8 @@ export class HideoutController */ protected addUpdateInventoryItemToProfile(pmcData: IPmcData, dbHideoutData: IHideoutArea, hideoutStage: Stage): void { - const existingInventoryItem = pmcData.Inventory.items.find(x => x._id === dbHideoutData._id); - if (existingInventoryItem) + const existingInventoryItem = pmcData.Inventory.items.find((x) => x._id === dbHideoutData._id); + if (existingInventoryItem) { // Update existing items container tpl to point to new id (tpl) existingInventoryItem._tpl = hideoutStage.container; @@ -290,24 +329,28 @@ export class HideoutController } /** - * * @param output Objet to send to client * @param sessionID Session/player id * @param areaType Hideout area that had stash added * @param hideoutDbData Hideout area that caused addition of stash * @param hideoutStage Hideout area upgraded to this */ - protected addContainerUpgradeToClientOutput(output: IItemEventRouterResponse, sessionID: string, areaType: HideoutAreas, hideoutDbData: IHideoutArea, hideoutStage: Stage): void + protected addContainerUpgradeToClientOutput( + output: IItemEventRouterResponse, + sessionID: string, + areaType: HideoutAreas, + hideoutDbData: IHideoutArea, + hideoutStage: Stage, + ): void { if (!output.profileChanges[sessionID].changedHideoutStashes) { output.profileChanges[sessionID].changedHideoutStashes = {}; } - output.profileChanges[sessionID].changedHideoutStashes[areaType] = - { + output.profileChanges[sessionID].changedHideoutStashes[areaType] = { Id: hideoutDbData._id, - Tpl: hideoutStage.container + Tpl: hideoutStage.container, }; } @@ -319,24 +362,29 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse object */ - public putItemsInAreaSlots(pmcData: IPmcData, addItemToHideoutRequest: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse + public putItemsInAreaSlots( + pmcData: IPmcData, + addItemToHideoutRequest: IHideoutPutItemInRequestData, + sessionID: string, + ): IItemEventRouterResponse { let output = this.eventOutputHolder.getOutput(sessionID); - const itemsToAdd = Object.entries(addItemToHideoutRequest.items).map(kvp => + const itemsToAdd = Object.entries(addItemToHideoutRequest.items).map((kvp) => { - const item = pmcData.Inventory.items.find(invItem => invItem._id === kvp[1]["id"]); - return { - inventoryItem: item, - requestedItem: kvp[1], - slot: kvp[0] - }; + const item = pmcData.Inventory.items.find((invItem) => invItem._id === kvp[1].id); + return { inventoryItem: item, requestedItem: kvp[1], slot: kvp[0] }; }); - const hideoutArea = pmcData.Hideout.Areas.find(area => area.type === addItemToHideoutRequest.areaType); + const hideoutArea = pmcData.Hideout.Areas.find((area) => area.type === addItemToHideoutRequest.areaType); if (!hideoutArea) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_area_in_database", addItemToHideoutRequest.areaType)); + this.logger.error( + this.localisationService.getText( + "hideout-unable_to_find_area_in_database", + addItemToHideoutRequest.areaType, + ), + ); return this.httpResponse.appendErrorToOutput(output); } @@ -344,21 +392,26 @@ export class HideoutController { if (!item.inventoryItem) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_item_in_inventory", {itemId: item.requestedItem["id"], area: hideoutArea.type})); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_item_in_inventory", { + itemId: item.requestedItem.id, + area: hideoutArea.type, + }), + ); return this.httpResponse.appendErrorToOutput(output); } // Add item to area.slots const destinationLocationIndex = Number(item.slot); - const hideoutSlotIndex = hideoutArea.slots.findIndex(x => x.locationIndex === destinationLocationIndex); + const hideoutSlotIndex = hideoutArea.slots.findIndex((x) => x.locationIndex === destinationLocationIndex); hideoutArea.slots[hideoutSlotIndex].item = [{ _id: item.inventoryItem._id, _tpl: item.inventoryItem._tpl, - upd: item.inventoryItem.upd + upd: item.inventoryItem.upd, }]; output = this.inventoryHelper.removeItem(pmcData, item.inventoryItem._id, sessionID, output); - } + } // Trigger a forced update this.hideoutHelper.updatePlayerHideout(sessionID); @@ -374,11 +427,15 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public takeItemsFromAreaSlots(pmcData: IPmcData, request: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse + public takeItemsFromAreaSlots( + pmcData: IPmcData, + request: IHideoutTakeItemOutRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); - const hideoutArea = pmcData.Hideout.Areas.find(area => area.type === request.areaType); + const hideoutArea = pmcData.Hideout.Areas.find((area) => area.type === request.areaType); if (!hideoutArea) { this.logger.error(this.localisationService.getText("hideout-unable_to_find_area", request.areaType)); @@ -387,19 +444,30 @@ export class HideoutController if (!hideoutArea.slots || hideoutArea.slots.length === 0) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_item_to_remove_from_area", hideoutArea.type)); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_item_to_remove_from_area", hideoutArea.type), + ); return this.httpResponse.appendErrorToOutput(output); } // Handle areas that have resources that can be placed in/taken out of slots from the area - if ([HideoutAreas.AIR_FILTERING, HideoutAreas.WATER_COLLECTOR, HideoutAreas.GENERATOR, HideoutAreas.BITCOIN_FARM].includes(hideoutArea.type)) + if ( + [ + HideoutAreas.AIR_FILTERING, + HideoutAreas.WATER_COLLECTOR, + HideoutAreas.GENERATOR, + HideoutAreas.BITCOIN_FARM, + ].includes(hideoutArea.type) + ) { const response = this.removeResourceFromArea(sessionID, pmcData, request, output, hideoutArea); this.update(); return response; } - throw new Error(this.localisationService.getText("hideout-unhandled_remove_item_from_area_request", hideoutArea.type)); + throw new Error( + this.localisationService.getText("hideout-unhandled_remove_item_from_area_request", hideoutArea.type), + ); } /** @@ -411,22 +479,36 @@ export class HideoutController * @param hideoutArea Area fuel is being removed from * @returns IItemEventRouterResponse response */ - protected removeResourceFromArea(sessionID: string, pmcData: IPmcData, removeResourceRequest: IHideoutTakeItemOutRequestData, output: IItemEventRouterResponse, hideoutArea: HideoutArea): IItemEventRouterResponse + protected removeResourceFromArea( + sessionID: string, + pmcData: IPmcData, + removeResourceRequest: IHideoutTakeItemOutRequestData, + output: IItemEventRouterResponse, + hideoutArea: HideoutArea, + ): IItemEventRouterResponse { const slotIndexToRemove = removeResourceRequest.slots[0]; - const itemToReturn = hideoutArea.slots.find(x => x.locationIndex === slotIndexToRemove).item[0]; - + const itemToReturn = hideoutArea.slots.find((x) => x.locationIndex === slotIndexToRemove).item[0]; + const newReq = { items: [{ // eslint-disable-next-line @typescript-eslint/naming-convention item_id: itemToReturn._tpl, - count: 1 + count: 1, }], - tid: "ragfair" + tid: "ragfair", }; - output = this.inventoryHelper.addItem(pmcData, newReq, output, sessionID, null, !!itemToReturn.upd.SpawnedInSession, itemToReturn.upd); + output = this.inventoryHelper.addItem( + pmcData, + newReq, + output, + sessionID, + null, + !!itemToReturn.upd.SpawnedInSession, + itemToReturn.upd, + ); // If addItem returned with errors, drop out if (output.warnings && output.warnings.length > 0) @@ -435,7 +517,7 @@ export class HideoutController } // Remove items from slot, locationIndex remains - const hideoutSlotIndex = hideoutArea.slots.findIndex(x => x.locationIndex === slotIndexToRemove); + const hideoutSlotIndex = hideoutArea.slots.findIndex((x) => x.locationIndex === slotIndexToRemove); hideoutArea.slots[hideoutSlotIndex].item = undefined; return output; @@ -449,14 +531,18 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public toggleArea(pmcData: IPmcData, request: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse + public toggleArea( + pmcData: IPmcData, + request: IHideoutToggleAreaRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); // Force a production update (occur before area is toggled as it could be generator and doing it after generator enabled would cause incorrect calculaton of production progress) this.hideoutHelper.updatePlayerHideout(sessionID); - const hideoutArea = pmcData.Hideout.Areas.find(area => area.type === request.areaType); + const hideoutArea = pmcData.Hideout.Areas.find((area) => area.type === request.areaType); if (!hideoutArea) { this.logger.error(this.localisationService.getText("hideout-unable_to_find_area", request.areaType)); @@ -476,23 +562,27 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse + public singleProductionStart( + pmcData: IPmcData, + body: IHideoutSingleProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { // Start production this.registerProduction(pmcData, body, sessionID); // Find the recipe of the production - const recipe = this.databaseServer.getTables().hideout.production.find(p => p._id === body.recipeId); + const recipe = this.databaseServer.getTables().hideout.production.find((p) => p._id === body.recipeId); // Find the actual amount of items we need to remove because body can send weird data - const requirements = this.jsonUtil.clone(recipe.requirements.filter(i => i.type === "Item")); + const requirements = this.jsonUtil.clone(recipe.requirements.filter((i) => i.type === "Item")); const output = this.eventOutputHolder.getOutput(sessionID); for (const itemToDelete of body.items) { - const itemToCheck = pmcData.Inventory.items.find(i => i._id === itemToDelete.id); - const requirement = requirements.find(requirement => requirement.templateId === itemToCheck._tpl); + const itemToCheck = pmcData.Inventory.items.find((i) => i._id === itemToDelete.id); + const requirement = requirements.find((requirement) => requirement.templateId === itemToCheck._tpl); if (requirement.count <= 0) { continue; @@ -513,21 +603,29 @@ export class HideoutController * @param sessionID session id * @returns item event router response */ - public scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse + public scavCaseProductionStart( + pmcData: IPmcData, + body: IHideoutScavCaseStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { let output = this.eventOutputHolder.getOutput(sessionID); for (const requestedItem of body.items) { - const inventoryItem = pmcData.Inventory.items.find(item => item._id === requestedItem.id); + const inventoryItem = pmcData.Inventory.items.find((item) => item._id === requestedItem.id); if (!inventoryItem) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_scavcase_requested_item_in_profile_inventory", requestedItem.id)); + this.logger.error( + this.localisationService.getText( + "hideout-unable_to_find_scavcase_requested_item_in_profile_inventory", + requestedItem.id, + ), + ); return this.httpResponse.appendErrorToOutput(output); } - if (inventoryItem.upd?.StackObjectsCount - && inventoryItem.upd.StackObjectsCount > requestedItem.count) + if (inventoryItem.upd?.StackObjectsCount && inventoryItem.upd.StackObjectsCount > requestedItem.count) { inventoryItem.upd.StackObjectsCount -= requestedItem.count; } @@ -537,19 +635,25 @@ export class HideoutController } } - const recipe = this.databaseServer.getTables().hideout.scavcase.find(r => r._id === body.recipeId); + const recipe = this.databaseServer.getTables().hideout.scavcase.find((r) => r._id === body.recipeId); if (!recipe) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_scav_case_recipie_in_database", body.recipeId)); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_scav_case_recipie_in_database", body.recipeId), + ); return this.httpResponse.appendErrorToOutput(output); } - + // @Important: Here we need to be very exact: // - normal recipe: Production time value is stored in attribute "productionType" with small "p" // - scav case recipe: Production time value is stored in attribute "ProductionType" with capital "P" const modifiedScavCaseTime = this.getScavCaseTime(pmcData, recipe.ProductionTime); - pmcData.Hideout.Production[body.recipeId] = this.hideoutHelper.initProduction(body.recipeId, modifiedScavCaseTime, false); + pmcData.Hideout.Production[body.recipeId] = this.hideoutHelper.initProduction( + body.recipeId, + modifiedScavCaseTime, + false, + ); pmcData.Hideout.Production[body.recipeId].sptIsScavCase = true; return output; @@ -557,7 +661,7 @@ export class HideoutController /** * Adjust scav case time based on fence standing - * + * * @param pmcData Player profile * @param productionTime Time to complete scav case in seconds * @returns Adjusted scav case time in seconds @@ -569,7 +673,7 @@ export class HideoutController { return productionTime; } - + return productionTime * fenceLevel.ScavCaseTimeModifier; } @@ -581,9 +685,7 @@ export class HideoutController */ protected addScavCaseRewardsToProfile(pmcData: IPmcData, rewards: Product[], recipeId: string): void { - pmcData.Hideout.Production[`ScavCase${recipeId}`] = { - Products: rewards - }; + pmcData.Hideout.Production[`ScavCase${recipeId}`] = { Products: rewards }; } /** @@ -593,7 +695,11 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public continuousProductionStart(pmcData: IPmcData, request: IHideoutContinuousProductionStartRequestData, sessionID: string): IItemEventRouterResponse + public continuousProductionStart( + pmcData: IPmcData, + request: IHideoutContinuousProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { this.registerProduction(pmcData, request, sessionID); @@ -608,7 +714,11 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public takeProduction(pmcData: IPmcData, request: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse + public takeProduction( + pmcData: IPmcData, + request: IHideoutTakeProductionRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); @@ -617,19 +727,24 @@ export class HideoutController return this.hideoutHelper.getBTC(pmcData, request, sessionID); } - const recipe = this.databaseServer.getTables().hideout.production.find(r => r._id === request.recipeId); + const recipe = this.databaseServer.getTables().hideout.production.find((r) => r._id === request.recipeId); if (recipe) { return this.handleRecipe(sessionID, recipe, pmcData, request, output); } - const scavCase = this.databaseServer.getTables().hideout.scavcase.find(r => r._id === request.recipeId); + const scavCase = this.databaseServer.getTables().hideout.scavcase.find((r) => r._id === request.recipeId); if (scavCase) { return this.handleScavCase(sessionID, pmcData, request, output); } - this.logger.error(this.localisationService.getText("hideout-unable_to_find_production_in_profile_by_recipie_id", request.recipeId)); + this.logger.error( + this.localisationService.getText( + "hideout-unable_to_find_production_in_profile_by_recipie_id", + request.recipeId, + ), + ); return this.httpResponse.appendErrorToOutput(output); } @@ -643,7 +758,13 @@ export class HideoutController * @param output Output object to update * @returns IItemEventRouterResponse */ - protected handleRecipe(sessionID: string, recipe: IHideoutProduction, pmcData: IPmcData, request: IHideoutTakeProductionRequestData, output: IItemEventRouterResponse): IItemEventRouterResponse + protected handleRecipe( + sessionID: string, + recipe: IHideoutProduction, + pmcData: IPmcData, + request: IHideoutTakeProductionRequestData, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { // Variables for managemnet of skill let craftingExpAmount = 0; @@ -652,11 +773,13 @@ export class HideoutController let counterHoursCrafting = pmcData.BackendCounters[HideoutController.nameBackendCountersCrafting]; if (!counterHoursCrafting) { - pmcData.BackendCounters[HideoutController.nameBackendCountersCrafting] = { id: HideoutController.nameBackendCountersCrafting, value: 0 }; + pmcData.BackendCounters[HideoutController.nameBackendCountersCrafting] = { + id: HideoutController.nameBackendCountersCrafting, + value: 0, + }; counterHoursCrafting = pmcData.BackendCounters[HideoutController.nameBackendCountersCrafting]; } let hoursCrafting = counterHoursCrafting.value; - // create item and throw it into profile let id = recipe.endProduct; @@ -671,9 +794,9 @@ export class HideoutController items: [{ // eslint-disable-next-line @typescript-eslint/naming-convention item_id: id, - count: recipe.count + count: recipe.count, }], - tid: "ragfair" + tid: "ragfair", }; const entries = Object.entries(pmcData.Hideout.Production); @@ -686,8 +809,8 @@ export class HideoutController continue; } - if (this.hideoutHelper.isProductionType(x[1])) // Production or ScavCase - { + if (this.hideoutHelper.isProductionType(x[1])) + { // Production or ScavCase if ((x[1] as Production).RecipeId === request.recipeId) { prodId = x[0]; // set to objects key @@ -698,13 +821,18 @@ export class HideoutController if (prodId === undefined) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_production_in_profile_by_recipie_id", request.recipeId)); + this.logger.error( + this.localisationService.getText( + "hideout-unable_to_find_production_in_profile_by_recipie_id", + request.recipeId, + ), + ); return this.httpResponse.appendErrorToOutput(output); } // check if the recipe is the same as the last one - const area = pmcData.Hideout.Areas.find(x => x.type === recipe.areaType); + const area = pmcData.Hideout.Areas.find((x) => x.type === recipe.areaType); if (area && request.recipeId !== area.lastRecipe) { // 1 point per craft upon the end of production for alternating between 2 different crafting recipes in the same module @@ -715,9 +843,9 @@ export class HideoutController hoursCrafting += recipe.productionTime; if ((hoursCrafting / this.hideoutConfig.hoursForSkillCrafting) >= 1) { - const multiplierCrafting = Math.floor((hoursCrafting / this.hideoutConfig.hoursForSkillCrafting)); - craftingExpAmount += (1 * multiplierCrafting); - hoursCrafting -= (this.hideoutConfig.hoursForSkillCrafting * multiplierCrafting); + const multiplierCrafting = Math.floor(hoursCrafting / this.hideoutConfig.hoursForSkillCrafting); + craftingExpAmount += 1 * multiplierCrafting; + hoursCrafting -= this.hideoutConfig.hoursForSkillCrafting * multiplierCrafting; } // increment @@ -729,12 +857,21 @@ export class HideoutController // manager Hideout skill // ? use a configuration variable for the value? const globals = this.databaseServer.getTables().globals; - this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.HIDEOUT_MANAGEMENT, globals.config.SkillsSettings.HideoutManagement.SkillPointsPerCraft, true); - //manager Crafting skill + this.profileHelper.addSkillPointsToPlayer( + pmcData, + SkillTypes.HIDEOUT_MANAGEMENT, + globals.config.SkillsSettings.HideoutManagement.SkillPointsPerCraft, + true, + ); + // manager Crafting skill if (craftingExpAmount > 0) { this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.CRAFTING, craftingExpAmount); - this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.INTELLECT, 0.5 * (Math.round(craftingExpAmount / 15))); + this.profileHelper.addSkillPointsToPlayer( + pmcData, + SkillTypes.INTELLECT, + 0.5 * (Math.round(craftingExpAmount / 15)), + ); } area.lastRecipe = request.recipeId; counterHoursCrafting.value = hoursCrafting; @@ -749,9 +886,7 @@ export class HideoutController // Handle the isEncoded flag from recipe if (recipe.isEncoded) { - const upd: Upd = { - RecodableComponent: { IsEncoded: true} - }; + const upd: Upd = { RecodableComponent: { IsEncoded: true } }; return this.inventoryHelper.addItem(pmcData, newReq, output, sessionID, callback, true, upd); } @@ -767,14 +902,19 @@ export class HideoutController * @param output Output object to update * @returns IItemEventRouterResponse */ - protected handleScavCase(sessionID: string, pmcData: IPmcData, request: IHideoutTakeProductionRequestData, output: IItemEventRouterResponse): IItemEventRouterResponse + protected handleScavCase( + sessionID: string, + pmcData: IPmcData, + request: IHideoutTakeProductionRequestData, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { const ongoingProductions = Object.entries(pmcData.Hideout.Production); let prodId: string; for (const production of ongoingProductions) { - if (this.hideoutHelper.isProductionType(production[1])) // Production or ScavCase - { + if (this.hideoutHelper.isProductionType(production[1])) + { // Production or ScavCase if ((production[1] as ScavCase).RecipeId === request.recipeId) { prodId = production[0]; // Set to objects key @@ -785,7 +925,12 @@ export class HideoutController if (prodId === undefined) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_production_in_profile_by_recipie_id", request.recipeId)); + this.logger.error( + this.localisationService.getText( + "hideout-unable_to_find_production_in_profile_by_recipie_id", + request.recipeId, + ), + ); return this.httpResponse.appendErrorToOutput(output); } @@ -798,28 +943,24 @@ export class HideoutController // Remove the old production from output object before its sent to client delete output.profileChanges[sessionID].production[request.recipeId]; - const itemsToAdd = pmcData.Hideout.Production[prodId].Products.map((x: { _tpl: string; upd?: { StackObjectsCount?: number; }; }) => - { - let id = x._tpl; - if (this.presetHelper.hasPreset(id)) + const itemsToAdd = pmcData.Hideout.Production[prodId].Products.map( + (x: { _tpl: string; upd?: { StackObjectsCount?: number; }; }) => { - id = this.presetHelper.getDefaultPreset(id)._id; - } - const numOfItems = !x.upd?.StackObjectsCount - ? 1 - : x.upd.StackObjectsCount; - // eslint-disable-next-line @typescript-eslint/naming-convention - return { item_id: id, count: numOfItems }; - }); + let id = x._tpl; + if (this.presetHelper.hasPreset(id)) + { + id = this.presetHelper.getDefaultPreset(id)._id; + } + const numOfItems = !x.upd?.StackObjectsCount ? 1 : x.upd.StackObjectsCount; + // eslint-disable-next-line @typescript-eslint/naming-convention + return { item_id: id, count: numOfItems }; + }, + ); - const newReq = { - items: itemsToAdd, - tid: "ragfair" - }; + const newReq = { items: itemsToAdd, tid: "ragfair" }; const callback = () => { - // Flag as complete - will be cleaned up later by update() process pmcData.Hideout.Production[prodId].sptIsComplete = true; }; @@ -834,7 +975,11 @@ export class HideoutController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public registerProduction(pmcData: IPmcData, request: IHideoutSingleProductionStartRequestData | IHideoutContinuousProductionStartRequestData, sessionID: string): IItemEventRouterResponse + public registerProduction( + pmcData: IPmcData, + request: IHideoutSingleProductionStartRequestData | IHideoutContinuousProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.hideoutHelper.registerProduction(pmcData, request, sessionID); } @@ -844,7 +989,7 @@ export class HideoutController * // TODO - implement this * @param sessionId Session id * @returns IQteData array - */ + */ // eslint-disable-next-line @typescript-eslint/no-unused-vars public getQteList(sessionId: string): IQteData[] { @@ -859,7 +1004,11 @@ export class HideoutController * @param request QTE result object */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public handleQTEEventOutcome(sessionId: string, pmcData: IPmcData, request: IHandleQTEEventRequestData): IItemEventRouterResponse + public handleQTEEventOutcome( + sessionId: string, + pmcData: IPmcData, + request: IHandleQTEEventRequestData, + ): IItemEventRouterResponse { // { // "Action": "HideoutQuickTimeEvent", @@ -868,7 +1017,7 @@ export class HideoutController // "timestamp": 1672585349 // } - // Skill changes are done in + // Skill changes are done in // /client/hideout/workout (applyWorkoutChanges). pmcData.Health.Energy.Current -= 50; @@ -893,19 +1042,22 @@ export class HideoutController * @param request shooting range score request * @returns IItemEventRouterResponse */ - public recordShootingRangePoints(sessionId: string, pmcData: IPmcData, request: IRecordShootingRangePoints): IItemEventRouterResponse + public recordShootingRangePoints( + sessionId: string, + pmcData: IPmcData, + request: IRecordShootingRangePoints, + ): IItemEventRouterResponse { // Check if counter exists, add placeholder if it doesnt - if (!pmcData.Stats.Eft.OverallCounters.Items.find(x => x.Key.includes("ShootingRangePoints"))) + if (!pmcData.Stats.Eft.OverallCounters.Items.find((x) => x.Key.includes("ShootingRangePoints"))) { - pmcData.Stats.Eft.OverallCounters.Items.push({ - Key: ["ShootingRangePoints"], - Value: 0 - }); + pmcData.Stats.Eft.OverallCounters.Items.push({ Key: ["ShootingRangePoints"], Value: 0 }); } // Find counter by key and update value - const shootingRangeHighScore = pmcData.Stats.Eft.OverallCounters.Items.find(x => x.Key.includes("ShootingRangePoints")); + const shootingRangeHighScore = pmcData.Stats.Eft.OverallCounters.Items.find((x) => + x.Key.includes("ShootingRangePoints") + ); shootingRangeHighScore.Value = request.points; // Check against live, maybe a response isnt necessary @@ -918,18 +1070,19 @@ export class HideoutController * @param pmcData Profile to improve area in * @param request Improve area request data */ - public improveArea(sessionId: string, pmcData: IPmcData, request: IHideoutImproveAreaRequestData): IItemEventRouterResponse + public improveArea( + sessionId: string, + pmcData: IPmcData, + request: IHideoutImproveAreaRequestData, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionId); // Create mapping of required item with corrisponding item from player inventory - const items = request.items.map(reqItem => + const items = request.items.map((reqItem) => { - const item = pmcData.Inventory.items.find(invItem => invItem._id === reqItem.id); - return { - inventoryItem: item, - requestedItem: reqItem - }; + const item = pmcData.Inventory.items.find((invItem) => invItem._id === reqItem.id); + return { inventoryItem: item, requestedItem: reqItem }; }); // If it's not money, its construction / barter items @@ -937,14 +1090,18 @@ export class HideoutController { if (!item.inventoryItem) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_item_in_inventory", item.requestedItem.id)); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_item_in_inventory", item.requestedItem.id), + ); return this.httpResponse.appendErrorToOutput(output); } - if (this.paymentHelper.isMoneyTpl(item.inventoryItem._tpl) + if ( + this.paymentHelper.isMoneyTpl(item.inventoryItem._tpl) && item.inventoryItem.upd && item.inventoryItem.upd.StackObjectsCount - && item.inventoryItem.upd.StackObjectsCount > item.requestedItem.count) + && item.inventoryItem.upd.StackObjectsCount > item.requestedItem.count + ) { item.inventoryItem.upd.StackObjectsCount -= item.requestedItem.count; } @@ -954,17 +1111,19 @@ export class HideoutController } } - const profileHideoutArea = pmcData.Hideout.Areas.find(x => x.type === request.areaType); + const profileHideoutArea = pmcData.Hideout.Areas.find((x) => x.type === request.areaType); if (!profileHideoutArea) { this.logger.error(this.localisationService.getText("hideout-unable_to_find_area", request.areaType)); return this.httpResponse.appendErrorToOutput(output); } - const hideoutDbData = this.databaseServer.getTables().hideout.areas.find(x => x.type === request.areaType); + const hideoutDbData = this.databaseServer.getTables().hideout.areas.find((x) => x.type === request.areaType); if (!hideoutDbData) { - this.logger.error(this.localisationService.getText("hideout-unable_to_find_area_in_database", request.areaType)); + this.logger.error( + this.localisationService.getText("hideout-unable_to_find_area_in_database", request.areaType), + ); return this.httpResponse.appendErrorToOutput(output); } @@ -978,10 +1137,13 @@ export class HideoutController output.profileChanges[sessionId].improvements = {}; } - const improvementDetails = {completed: false, improveCompleteTimestamp: timestamp + improvement.improvementTime}; + const improvementDetails = { + completed: false, + improveCompleteTimestamp: timestamp + improvement.improvementTime, + }; output.profileChanges[sessionId].improvements[improvement.id] = improvementDetails; pmcData.Hideout.Improvement[improvement.id] = improvementDetails; - } + } return output; } @@ -993,7 +1155,11 @@ export class HideoutController * @param request Cancel production request data * @returns IItemEventRouterResponse */ - public cancelProduction(sessionId: string, pmcData: IPmcData, request: IHideoutCancelProductionRequestData): IItemEventRouterResponse + public cancelProduction( + sessionId: string, + pmcData: IPmcData, + request: IHideoutCancelProductionRequestData, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionId); diff --git a/project/src/controllers/InraidController.ts b/project/src/controllers/InraidController.ts index beda6701..f949644d 100644 --- a/project/src/controllers/InraidController.ts +++ b/project/src/controllers/InraidController.ts @@ -56,7 +56,7 @@ export class InraidController @inject("InsuranceService") protected insuranceService: InsuranceService, @inject("InRaidHelper") protected inRaidHelper: InRaidHelper, @inject("ApplicationContext") protected applicationContext: ApplicationContext, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.airdropConfig = this.configServer.getConfig(ConfigTypes.AIRDROP); @@ -124,7 +124,12 @@ export class InraidController // Check for exit status this.markOrRemoveFoundInRaidItems(postRaidRequest); - postRaidRequest.profile.Inventory.items = this.itemHelper.replaceIDs(postRaidRequest.profile, postRaidRequest.profile.Inventory.items, serverPmcData.InsuredItems, postRaidRequest.profile.Inventory.fastPanel); + postRaidRequest.profile.Inventory.items = this.itemHelper.replaceIDs( + postRaidRequest.profile, + postRaidRequest.profile.Inventory.items, + serverPmcData.InsuredItems, + postRaidRequest.profile.Inventory.fastPanel, + ); this.inRaidHelper.addUpdToMoneyFromRaid(postRaidRequest.profile.Inventory.items); // Purge profile of equipment/container items @@ -146,22 +151,30 @@ export class InraidController if (locationName === "lighthouse" && postRaidRequest.profile.Info.Side.toLowerCase() === "usec") { // Decrement counter if it exists, don't go below 0 - const remainingCounter = serverPmcData?.Stats.Eft.OverallCounters.Items.find(x => x.Key.includes("UsecRaidRemainKills")); + const remainingCounter = serverPmcData?.Stats.Eft.OverallCounters.Items.find((x) => + x.Key.includes("UsecRaidRemainKills") + ); if (remainingCounter?.Value > 0) { - remainingCounter.Value --; + remainingCounter.Value--; } } if (isDead) { - this.pmcChatResponseService.sendKillerResponse(sessionID, serverPmcData, postRaidRequest.profile.Stats.Eft.Aggressor); + this.pmcChatResponseService.sendKillerResponse( + sessionID, + serverPmcData, + postRaidRequest.profile.Stats.Eft.Aggressor, + ); this.matchBotDetailsCacheService.clearCache(); serverPmcData = this.performPostRaidActionsWhenDead(postRaidRequest, serverPmcData, sessionID); } - const victims = postRaidRequest.profile.Stats.Eft.Victims.filter(x => ["sptbear", "sptusec"].includes(x.Role.toLowerCase())); + const victims = postRaidRequest.profile.Stats.Eft.Victims.filter((x) => + ["sptbear", "sptusec"].includes(x.Role.toLowerCase()) + ); if (victims?.length > 0) { this.pmcChatResponseService.sendVictimResponse(sessionID, victims, serverPmcData); @@ -176,12 +189,16 @@ export class InraidController /** * Make changes to pmc profile after they've died in raid, * Alter bodypart hp, handle insurance, delete inventory items, remove carried quest items - * @param postRaidSaveRequest Post-raid save request + * @param postRaidSaveRequest Post-raid save request * @param pmcData Pmc profile * @param sessionID Session id * @returns Updated profile object */ - protected performPostRaidActionsWhenDead(postRaidSaveRequest: ISaveProgressRequestData, pmcData: IPmcData, sessionID: string): IPmcData + protected performPostRaidActionsWhenDead( + postRaidSaveRequest: ISaveProgressRequestData, + pmcData: IPmcData, + sessionID: string, + ): IPmcData { this.updatePmcHealthPostRaid(postRaidSaveRequest, pmcData); this.inRaidHelper.deleteInventory(pmcData, sessionID); @@ -190,11 +207,17 @@ export class InraidController { // Find and remove the completed condition from profile if player died, otherwise quest is stuck in limbo and quest items cannot be picked up again const allQuests = this.questHelper.getQuestsFromDb(); - const activeQuestIdsInProfile = pmcData.Quests.filter(x => ![QuestStatus.AvailableForStart, QuestStatus.Success, QuestStatus.Expired].includes(x.status)).map(x => x.qid); + const activeQuestIdsInProfile = pmcData.Quests.filter((x) => + ![QuestStatus.AvailableForStart, QuestStatus.Success, QuestStatus.Expired].includes(x.status) + ).map((x) => x.qid); for (const questItem of postRaidSaveRequest.profile.Stats.Eft.CarriedQuestItems) { // Get quest/find condition for carried quest item - const questAndFindItemConditionId = this.questHelper.getFindItemConditionByQuestItem(questItem, activeQuestIdsInProfile, allQuests); + const questAndFindItemConditionId = this.questHelper.getFindItemConditionByQuestItem( + questItem, + activeQuestIdsInProfile, + allQuests, + ); if (questAndFindItemConditionId) { this.profileHelper.removeCompletedQuestConditionFromProfile(pmcData, questAndFindItemConditionId); @@ -269,7 +292,12 @@ export class InraidController // Check for exit status this.markOrRemoveFoundInRaidItems(postRaidRequest); - postRaidRequest.profile.Inventory.items = this.itemHelper.replaceIDs(postRaidRequest.profile, postRaidRequest.profile.Inventory.items, pmcData.InsuredItems, postRaidRequest.profile.Inventory.fastPanel); + postRaidRequest.profile.Inventory.items = this.itemHelper.replaceIDs( + postRaidRequest.profile, + postRaidRequest.profile.Inventory.items, + pmcData.InsuredItems, + postRaidRequest.profile.Inventory.fastPanel, + ); this.inRaidHelper.addUpdToMoneyFromRaid(postRaidRequest.profile.Inventory.items); this.handlePostRaidPlayerScavProcess(scavData, sessionID, postRaidRequest, pmcData, isDead); @@ -278,7 +306,7 @@ export class InraidController /** * Does provided profile contain any condition counters * @param profile Profile to check for condition counters - * @returns + * @returns */ protected profileHasConditionCounters(profile: IPmcData): boolean { @@ -294,7 +322,7 @@ export class InraidController { for (const quest of scavProfile.Quests) { - const pmcQuest = pmcProfile.Quests.find(x => x.qid === quest.qid); + const pmcQuest = pmcProfile.Quests.find((x) => x.qid === quest.qid); if (!pmcQuest) { this.logger.warning(`No PMC quest found for ID: ${quest.qid}`); @@ -303,9 +331,14 @@ export class InraidController // Post-raid status is enum word e.g. `Started` but pmc quest status is number e.g. 2 // Status values mismatch or statusTimers counts mismatch - if (quest.status !== QuestStatus[pmcQuest.status] || quest.statusTimers.length !== pmcQuest.statusTimers.length) + if ( + quest.status !== QuestStatus[pmcQuest.status] + || quest.statusTimers.length !== pmcQuest.statusTimers.length + ) { - this.logger.warning(`Quest: ${quest.qid} found in PMC profile has different status/statustimer. Scav: ${quest.status} vs PMC: ${pmcQuest.status}`); + this.logger.warning( + `Quest: ${quest.qid} found in PMC profile has different status/statustimer. Scav: ${quest.status} vs PMC: ${pmcQuest.status}`, + ); pmcQuest.status = QuestStatus[quest.status]; // Copy status timers over + fix bad enum key for each @@ -324,17 +357,21 @@ export class InraidController // Loop over all scav counters and add into pmc profile for (const scavCounter of scavProfile.ConditionCounters.Counters) { - this.logger.warning(`Processing counter: ${scavCounter.id} value:${scavCounter.value} quest:${scavCounter.qid}`); - const counterInPmcProfile = pmcProfile.ConditionCounters.Counters.find(x => x.id === scavCounter.id); + this.logger.warning( + `Processing counter: ${scavCounter.id} value:${scavCounter.value} quest:${scavCounter.qid}`, + ); + const counterInPmcProfile = pmcProfile.ConditionCounters.Counters.find((x) => x.id === scavCounter.id); if (!counterInPmcProfile) { // Doesn't exist yet, push it straight in pmcProfile.ConditionCounters.Counters.push(scavCounter); - + continue; } - this.logger.warning(`Counter id: ${scavCounter.id} already exists in pmc profile! with value: ${counterInPmcProfile.value} for quest: ${counterInPmcProfile.qid}`); + this.logger.warning( + `Counter id: ${scavCounter.id} already exists in pmc profile! with value: ${counterInPmcProfile.value} for quest: ${counterInPmcProfile.qid}`, + ); // Only adjust counter value if its changed if (counterInPmcProfile.value !== scavCounter.value) @@ -376,7 +413,13 @@ export class InraidController * @param pmcData Pmc profile * @param isDead Is player dead */ - protected handlePostRaidPlayerScavProcess(scavData: IPmcData, sessionID: string, offraidData: ISaveProgressRequestData, pmcData: IPmcData, isDead: boolean): void + protected handlePostRaidPlayerScavProcess( + scavData: IPmcData, + sessionID: string, + offraidData: ISaveProgressRequestData, + pmcData: IPmcData, + isDead: boolean, + ): void { // Update scav profile inventory scavData = this.inRaidHelper.setInventory(sessionID, scavData, offraidData.profile); @@ -411,14 +454,17 @@ export class InraidController let fenceStanding = Number(pmcData.TradersInfo[fenceId].standing); this.logger.debug(`Old fence standing: ${fenceStanding}`); - fenceStanding = this.inRaidHelper.calculateFenceStandingChangeFromKills(fenceStanding, offraidData.profile.Stats.Eft.Victims); + fenceStanding = this.inRaidHelper.calculateFenceStandingChangeFromKills( + fenceStanding, + offraidData.profile.Stats.Eft.Victims, + ); // Successful extract with scav adds 0.01 standing if (offraidData.exit === PlayerRaidEndState.SURVIVED) { fenceStanding += this.inraidConfig.scavExtractGain; } - + // Make standing changes to pmc profile pmcData.TradersInfo[fenceId].standing = Math.min(Math.max(fenceStanding, -7), 15); // Ensure it stays between -7 and 15 this.logger.debug(`New fence standing: ${pmcData.TradersInfo[fenceId].standing}`); @@ -443,4 +489,4 @@ export class InraidController { return this.airdropConfig; } -} \ No newline at end of file +} diff --git a/project/src/controllers/InsuranceController.ts b/project/src/controllers/InsuranceController.ts index d6ab3634..3fe01f82 100644 --- a/project/src/controllers/InsuranceController.ts +++ b/project/src/controllers/InsuranceController.ts @@ -47,7 +47,7 @@ export class InsuranceController @inject("PaymentService") protected paymentService: PaymentService, @inject("InsuranceService") protected insuranceService: InsuranceService, @inject("MailSendService") protected mailSendService: MailSendService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.insuranceConfig = this.configServer.getConfig(ConfigTypes.INSURANCE); @@ -57,7 +57,7 @@ export class InsuranceController * Process insurance items of all profiles prior to being given back to the player through the mail service. * * @returns void - */ + */ public processReturn(): void { // Process each installed profile. @@ -71,7 +71,7 @@ export class InsuranceController * Process insurance items of a single profile prior to being given back to the player through the mail service. * * @returns void - */ + */ public processReturnByProfile(sessionID: string): void { // Filter out items that don't need to be processed yet. @@ -116,10 +116,14 @@ export class InsuranceController */ protected processInsuredItems(insuranceDetails: Insurance[], sessionID: string): void { - this.logger.debug(`Processing ${insuranceDetails.length} insurance packages, which includes a total of ${insuranceDetails.map(ins => ins.items.length).reduce((acc, len) => acc + len, 0)} items, in profile ${sessionID}`); + this.logger.debug( + `Processing ${insuranceDetails.length} insurance packages, which includes a total of ${ + insuranceDetails.map((ins) => ins.items.length).reduce((acc, len) => acc + len, 0) + } items, in profile ${sessionID}`, + ); // Iterate over each of the insurance packages. - insuranceDetails.forEach(insured => + insuranceDetails.forEach((insured) => { // Find items that should be deleted from the insured items. const itemsToDelete = this.findItemsToDelete(insured); @@ -148,13 +152,15 @@ export class InsuranceController protected removeInsurancePackageFromProfile(sessionID: string, packageInfo: ISystemData): void { const profile = this.saveServer.getProfile(sessionID); - profile.insurance = profile.insurance.filter(insurance => - insurance.messageContent.systemData.date !== packageInfo.date || - insurance.messageContent.systemData.time !== packageInfo.time || - insurance.messageContent.systemData.location !== packageInfo.location + profile.insurance = profile.insurance.filter((insurance) => + insurance.messageContent.systemData.date !== packageInfo.date + || insurance.messageContent.systemData.time !== packageInfo.time + || insurance.messageContent.systemData.location !== packageInfo.location ); - this.logger.debug(`Removed insurance package with date: ${packageInfo.date}, time: ${packageInfo.time}, and location: ${packageInfo.location} from profile ${sessionID}. Remaining packages: ${profile.insurance.length}`); + this.logger.debug( + `Removed insurance package with date: ${packageInfo.date}, time: ${packageInfo.time}, and location: ${packageInfo.location} from profile ${sessionID}. Remaining packages: ${profile.insurance.length}`, + ); } /** @@ -196,7 +202,7 @@ export class InsuranceController protected populateItemsMap(insured: Insurance): Map { const itemsMap = new Map(); - insured.items.forEach(item => itemsMap.set(item._id, item)); + insured.items.forEach((item) => itemsMap.set(item._id, item)); return itemsMap; } @@ -215,7 +221,7 @@ export class InsuranceController for (const insuredItem of insured.items) { // Use the template ID from the item to get the parent item's template details. - const parentItem = insured.items.find(item => item._id === insuredItem.parentId); + const parentItem = insured.items.find((item) => item._id === insuredItem.parentId); // Check if this is an attachment currently attached to its parent. if (this.itemHelper.isAttachmentAttached(insuredItem)) @@ -231,7 +237,11 @@ export class InsuranceController if (!mainParent) { // Odd. The parent couldn't be found. Skip this attachment and warn. - this.logger.warning(`Could not find main-parent for insured attachment: ${this.itemHelper.getItemName(insuredItem._tpl)}`); + this.logger.warning( + `Could not find main-parent for insured attachment: ${ + this.itemHelper.getItemName(insuredItem._tpl) + }`, + ); continue; } @@ -280,11 +290,13 @@ export class InsuranceController // Check if the item has any children and mark those for deletion as well, but only if those // children are currently attached attachments. - const directChildren = insured.items.filter(item => item.parentId === insuredItem._id); - const allChildrenAreAttachments = directChildren.every(child => this.itemHelper.isAttachmentAttached(child)); + const directChildren = insured.items.filter((item) => item.parentId === insuredItem._id); + const allChildrenAreAttachments = directChildren.every((child) => + this.itemHelper.isAttachmentAttached(child) + ); if (allChildrenAreAttachments) { - itemAndChildren.forEach(item => toDelete.add(item._id)); + itemAndChildren.forEach((item) => toDelete.add(item._id)); } } } @@ -301,7 +313,12 @@ export class InsuranceController * @param traderId The trader ID from the Insurance object. * @param toDelete A Set object to keep track of items marked for deletion. */ - protected processAttachments(mainParentToAttachmentsMap: Map, itemsMap: Map, traderId: string, toDelete: Set): void + protected processAttachments( + mainParentToAttachmentsMap: Map, + itemsMap: Map, + traderId: string, + toDelete: Set, + ): void { mainParentToAttachmentsMap.forEach((attachmentItems, parentId) => { @@ -345,10 +362,10 @@ export class InsuranceController */ protected sortAttachmentsByPrice(attachments: Item[]): EnrichedItem[] { - return attachments.map(item => ({ + return attachments.map((item) => ({ ...item, name: this.itemHelper.getItemName(item._tpl), - maxPrice: this.itemHelper.getItemMaxPrice(item._tpl) + maxPrice: this.itemHelper.getItemMaxPrice(item._tpl), })).sort((a, b) => b.maxPrice - a.maxPrice); } @@ -385,11 +402,15 @@ export class InsuranceController * @param successfulRolls The number of successful rolls. * @param toDelete The array that accumulates the IDs of the items to be deleted. */ - protected attachmentDeletionByValue(attachments: EnrichedItem[], successfulRolls: number, toDelete: Set): void + protected attachmentDeletionByValue( + attachments: EnrichedItem[], + successfulRolls: number, + toDelete: Set, + ): void { const valuableToDelete = attachments.slice(0, successfulRolls).map(({ _id }) => _id); - valuableToDelete.forEach(attachmentsId => + valuableToDelete.forEach((attachmentsId) => { const valuableChild = attachments.find(({ _id }) => _id === attachmentsId); if (valuableChild) @@ -410,7 +431,7 @@ export class InsuranceController */ protected removeItemsFromInsurance(insured: Insurance, toDelete: Set): void { - insured.items = insured.items.filter(item => !toDelete.has(item._id)); + insured.items = insured.items.filter((item) => !toDelete.has(item._id)); } /** @@ -424,10 +445,10 @@ export class InsuranceController { const hideoutParentId = this.fetchHideoutItemParent(insured.items); - insured.items.forEach(item => + insured.items.forEach((item) => { // Check if the item's parent exists in the insured items list. - const parentExists = insured.items.some(parentItem => parentItem._id === item.parentId); + const parentExists = insured.items.some((parentItem) => parentItem._id === item.parentId); // If the parent does not exist and the item is not already a 'hideout' item, adopt the orphaned item. if (!parentExists && item.parentId !== hideoutParentId && item.slotId !== "hideout") @@ -448,7 +469,7 @@ export class InsuranceController */ protected fetchHideoutItemParent(items: Item[]): string { - const hideoutItem = items.find(item => item.slotId === "hideout"); + const hideoutItem = items.find((item) => item.slotId === "hideout"); return hideoutItem ? hideoutItem?.parentId : ""; } @@ -466,7 +487,8 @@ export class InsuranceController // successfully "failed" to return anything and an appropriate message should be sent to the player. if (noItems) { - const insuranceFailedTemplates = this.databaseServer.getTables().traders[insurance.traderId].dialogue.insuranceFailed; + const insuranceFailedTemplates = + this.databaseServer.getTables().traders[insurance.traderId].dialogue.insuranceFailed; insurance.messageContent.templateId = this.randomUtil.getArrayValue(insuranceFailedTemplates); } @@ -478,7 +500,7 @@ export class InsuranceController insurance.messageContent.templateId, insurance.items, insurance.messageContent.maxStorageTime, - insurance.messageContent.systemData + insurance.messageContent.systemData, ); } @@ -503,7 +525,9 @@ export class InsuranceController const itemName = insuredItem ? ` for "${this.itemHelper.getItemName(insuredItem._tpl)}"` : ""; const trader = this.traderHelper.getTraderById(traderId); const status = roll ? "Delete" : "Keep"; - this.logger.debug(`Rolling deletion${itemName} with ${trader} - Return ${traderReturnChance}% - Roll: ${returnChance} - Status: ${status}`); + this.logger.debug( + `Rolling deletion${itemName} with ${trader} - Return ${traderReturnChance}% - Roll: ${returnChance} - Status: ${status}`, + ); return roll; } @@ -534,7 +558,7 @@ export class InsuranceController { itemsToPay.push({ id: this.roubleTpl, // TODO: update to handle different currencies - count: Math.round(this.insuranceService.getPremium(pmcData, inventoryItemsHash[key], body.tid)) + count: Math.round(this.insuranceService.getPremium(pmcData, inventoryItemsHash[key], body.tid)), }); } @@ -548,7 +572,7 @@ export class InsuranceController item_id: "", count: 0, // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_id: 0 + scheme_id: 0, }; // pay for the item insurance @@ -561,10 +585,7 @@ export class InsuranceController // add items to InsuredItems list once money has been paid for (const key of body.items) { - pmcData.InsuredItems.push({ - tid: body.tid, - itemId: inventoryItemsHash[key]._id - }); + pmcData.InsuredItems.push({ tid: body.tid, itemId: inventoryItemsHash[key]._id }); } this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.CHARISMA, itemsToInsureCount * 0.01); @@ -604,7 +625,9 @@ export class InsuranceController this.logger.debug(`Item with id: ${itemId} missing from player inventory, skipping`); continue; } - items[inventoryItemsHash[itemId]._tpl] = Math.round(this.insuranceService.getPremium(pmcData, inventoryItemsHash[itemId], trader)); + items[inventoryItemsHash[itemId]._tpl] = Math.round( + this.insuranceService.getPremium(pmcData, inventoryItemsHash[itemId], trader), + ); } output[trader] = items; diff --git a/project/src/controllers/InventoryController.ts b/project/src/controllers/InventoryController.ts index 4d88c02b..ebbf3504 100644 --- a/project/src/controllers/InventoryController.ts +++ b/project/src/controllers/InventoryController.ts @@ -62,21 +62,25 @@ export class InventoryController @inject("LocalisationService") protected localisationService: LocalisationService, @inject("LootGenerator") protected lootGenerator: LootGenerator, @inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder, - @inject("HttpResponseUtil") protected httpResponseUtil: HttpResponseUtil + @inject("HttpResponseUtil") protected httpResponseUtil: HttpResponseUtil, ) {} /** - * Move Item - * change location of item with parentId and slotId - * transfers items from one profile to another if fromOwner/toOwner is set in the body. - * otherwise, move is contained within the same profile_f. + * Move Item + * change location of item with parentId and slotId + * transfers items from one profile to another if fromOwner/toOwner is set in the body. + * otherwise, move is contained within the same profile_f. * @param pmcData Profile * @param moveRequest Move request data * @param sessionID Session id * @returns IItemEventRouterResponse */ - public moveItem(pmcData: IPmcData, moveRequest: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse + public moveItem( + pmcData: IPmcData, + moveRequest: IInventoryMoveRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); @@ -96,7 +100,7 @@ export class InventoryController } // Check for item in inventory before allowing internal transfer - const originalItemLocation = ownerInventoryItems.from.find(x => x._id === moveRequest.item); + const originalItemLocation = ownerInventoryItems.from.find((x) => x._id === moveRequest.item); if (!originalItemLocation) { // Internal item move but item never existed, possible dupe glitch @@ -123,14 +127,23 @@ export class InventoryController */ protected getTraderExploitErrorResponse(output: IItemEventRouterResponse): IItemEventRouterResponse { - return this.httpResponseUtil.appendErrorToOutput(output, this.localisationService.getText("inventory-edit_trader_item"), 228); + return this.httpResponseUtil.appendErrorToOutput( + output, + this.localisationService.getText("inventory-edit_trader_item"), + 228, + ); } /** - * Remove Item from Profile - * Deep tree item deletion, also removes items from insurance list - */ - public removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output: IItemEventRouterResponse = undefined): IItemEventRouterResponse + * Remove Item from Profile + * Deep tree item deletion, also removes items from insurance list + */ + public removeItem( + pmcData: IPmcData, + itemId: string, + sessionID: string, + output: IItemEventRouterResponse = undefined, + ): IItemEventRouterResponse { return this.inventoryHelper.removeItem(pmcData, itemId, sessionID, output); } @@ -140,18 +153,31 @@ export class InventoryController * Implements functionality "Discard" from Main menu (Stash etc.) * Removes item from PMC Profile */ - public discardItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse + public discardItem( + pmcData: IPmcData, + body: IInventoryRemoveRequestData, + sessionID: string, + ): IItemEventRouterResponse { if (body.fromOwner?.type === "Mail") { - return this.inventoryHelper.removeItemAndChildrenFromMailRewards(sessionID, body, this.eventOutputHolder.getOutput(sessionID)); + return this.inventoryHelper.removeItemAndChildrenFromMailRewards( + sessionID, + body, + this.eventOutputHolder.getOutput(sessionID), + ); } - + const profileToRemoveItemFrom = (!body.fromOwner || body.fromOwner.id === pmcData._id) ? pmcData : this.profileHelper.getFullProfile(sessionID).characters.scav; - return this.inventoryHelper.removeItem(profileToRemoveItemFrom, body.item, sessionID, this.eventOutputHolder.getOutput(sessionID)); + return this.inventoryHelper.removeItem( + profileToRemoveItemFrom, + body.item, + sessionID, + this.eventOutputHolder.getOutput(sessionID), + ); } /** @@ -162,7 +188,11 @@ export class InventoryController * @param sessionID Session/player id * @returns IItemEventRouterResponse */ - public splitItem(pmcData: IPmcData, request: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse + public splitItem( + pmcData: IPmcData, + request: IInventorySplitRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); @@ -172,15 +202,15 @@ export class InventoryController // Handle cartridge edge-case if (!request.container.location && request.container.container === "cartridges") { - const matchingItems = inventoryItems.to.filter(x => x.parentId === request.container.id); + const matchingItems = inventoryItems.to.filter((x) => x.parentId === request.container.id); request.container.location = matchingItems.length; // Wrong location for first cartridge } // The item being merged has three possible sources: pmc, scav or mail, getOwnerInventoryItems() handles getting correct one - const itemToSplit = inventoryItems.from.find(x => x._id === request.splitItem); + const itemToSplit = inventoryItems.from.find((x) => x._id === request.splitItem); if (!itemToSplit) { - const errorMessage = (`Unable to split stack as source item: ${request.splitItem} cannot be found`); + const errorMessage = `Unable to split stack as source item: ${request.splitItem} cannot be found`; this.logger.error(errorMessage); return this.httpResponseUtil.appendErrorToOutput(output, errorMessage); @@ -197,7 +227,7 @@ export class InventoryController output.profileChanges[sessionID].items.new.push({ _id: request.newItem, _tpl: itemToSplit._tpl, - upd: updatedUpd + upd: updatedUpd, }); // Update player inventory @@ -207,7 +237,7 @@ export class InventoryController parentId: request.container.id, slotId: request.container.container, location: request.container.location, - upd: updatedUpd + upd: updatedUpd, }); return output; @@ -229,20 +259,20 @@ export class InventoryController const inventoryItems = this.inventoryHelper.getOwnerInventoryItems(body, sessionID); // Get source item (can be from player or trader or mail) - const sourceItem = inventoryItems.from.find(x => x._id === body.item); + const sourceItem = inventoryItems.from.find((x) => x._id === body.item); if (!sourceItem) { - const errorMessage = (`Unable to merge stacks as source item: ${body.with} cannot be found`); + const errorMessage = `Unable to merge stacks as source item: ${body.with} cannot be found`; this.logger.error(errorMessage); return this.httpResponseUtil.appendErrorToOutput(output, errorMessage); } // Get item being merged into - const destinationItem = inventoryItems.to.find(x => x._id === body.with); + const destinationItem = inventoryItems.to.find((x) => x._id === body.with); if (!destinationItem) { - const errorMessage = (`Unable to merge stacks as destination item: ${body.with} cannot be found`); + const errorMessage = `Unable to merge stacks as destination item: ${body.with} cannot be found`; this.logger.error(errorMessage); return this.httpResponseUtil.appendErrorToOutput(output, errorMessage); @@ -256,9 +286,7 @@ export class InventoryController if (!sourceItem.upd) { - sourceItem.upd = { - StackObjectsCount: 1 - }; + sourceItem.upd = { StackObjectsCount: 1 }; } else if (!sourceItem.upd.StackObjectsCount) { @@ -269,10 +297,10 @@ export class InventoryController destinationItem.upd.StackObjectsCount += sourceItem.upd.StackObjectsCount; // Add source stackcount to destination output.profileChanges[sessionID].items.del.push({ _id: sourceItem._id }); // Inform client source item being deleted - const indexOfItemToRemove = inventoryItems.from.findIndex(x => x._id === sourceItem._id); + const indexOfItemToRemove = inventoryItems.from.findIndex((x) => x._id === sourceItem._id); if (indexOfItemToRemove === -1) { - const errorMessage = (`Unable to find item: ${sourceItem._id} to remove from sender inventory`); + const errorMessage = `Unable to find item: ${sourceItem._id} to remove from sender inventory`; this.logger.error(errorMessage); return this.httpResponseUtil.appendErrorToOutput(output, errorMessage); @@ -292,7 +320,11 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse + public transferItem( + pmcData: IPmcData, + body: IInventoryTransferRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); @@ -314,7 +346,7 @@ export class InventoryController if (sourceItem !== null && destinationItem !== null) { // Both items found, exit loop - break; + break; } } @@ -337,7 +369,7 @@ export class InventoryController let sourceStackCount = 1; if (!sourceItem.upd) { - sourceItem.upd = {StackObjectsCount: 1}; + sourceItem.upd = { StackObjectsCount: 1 }; } sourceStackCount = sourceItem.upd.StackObjectsCount; @@ -368,19 +400,19 @@ export class InventoryController } /** - * Swap Item - * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment - * Also used to swap items using quick selection on character screen - */ + * Swap Item + * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment + * Also used to swap items using quick selection on character screen + */ public swapItem(pmcData: IPmcData, request: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse { - const itemOne = pmcData.Inventory.items.find(x => x._id === request.item); + const itemOne = pmcData.Inventory.items.find((x) => x._id === request.item); if (!itemOne) { this.logger.error(`Unable to find item: ${request.item} to swap positions with: ${request.item2}`); } - const itemTwo = pmcData.Inventory.items.find(x => x._id === request.item2); + const itemTwo = pmcData.Inventory.items.find((x) => x._id === request.item2); if (!itemTwo) { this.logger.error(`Unable to find item: ${request.item2} to swap positions with: ${request.item}`); @@ -388,7 +420,7 @@ export class InventoryController // to.id is the parentid itemOne.parentId = request.to.id; - + // to.container is the slotid itemOne.slotId = request.to.container; @@ -423,9 +455,7 @@ export class InventoryController public foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse { // Fix for folding weapons while on they're in the Scav inventory - if (body.fromOwner - && body.fromOwner.type === "Profile" - && body.fromOwner.id !== pmcData._id) + if (body.fromOwner && body.fromOwner.type === "Profile" && body.fromOwner.id !== pmcData._id) { pmcData = this.profileHelper.getScavProfile(sessionID); } @@ -434,15 +464,12 @@ export class InventoryController { if (item._id && item._id === body.item) { - item.upd.Foldable = { "Folded": body.value }; + item.upd.Foldable = { Folded: body.value }; return this.eventOutputHolder.getOutput(sessionID); } } - return { - warnings: [], - profileChanges: {} - }; + return { warnings: [], profileChanges: {} }; } /** @@ -460,12 +487,14 @@ export class InventoryController pmcData = this.profileHelper.getScavProfile(sessionID); } - const itemToToggle = pmcData.Inventory.items.find(x => x._id === body.item); + const itemToToggle = pmcData.Inventory.items.find((x) => x._id === body.item); if (itemToToggle) { if (!itemToToggle.upd) { - this.logger.warning(this.localisationService.getText("inventory-item_to_toggle_missing_upd", itemToToggle._id)); + this.logger.warning( + this.localisationService.getText("inventory-item_to_toggle_missing_upd", itemToToggle._id), + ); itemToToggle.upd = {}; } @@ -475,13 +504,12 @@ export class InventoryController } else { - this.logger.warning(this.localisationService.getText("inventory-unable_to_toggle_item_not_found", body.item)); + this.logger.warning( + this.localisationService.getText("inventory-unable_to_toggle_item_not_found", body.item), + ); } - return { - warnings: [], - profileChanges: {} - }; + return { warnings: [], profileChanges: {} }; } /** @@ -510,10 +538,7 @@ export class InventoryController } } - return { - warnings: [], - profileChanges: {} - }; + return { warnings: [], profileChanges: {} }; } /** @@ -524,7 +549,11 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public bindItem(pmcData: IPmcData, bindRequest: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse + public bindItem( + pmcData: IPmcData, + bindRequest: IInventoryBindRequestData, + sessionID: string, + ): IItemEventRouterResponse { for (const index in pmcData.Inventory.fastPanel) { @@ -551,7 +580,11 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public unbindItem(pmcData: IPmcData, request: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse + public unbindItem( + pmcData: IPmcData, + request: IInventoryBindRequestData, + sessionID: string, + ): IItemEventRouterResponse { // Remove kvp from requested fast panel index delete pmcData.Inventory.fastPanel[request.index]; @@ -559,7 +592,6 @@ export class InventoryController return this.eventOutputHolder.getOutput(sessionID); } - /** * Handles examining an item * @param pmcData player profile @@ -567,7 +599,11 @@ export class InventoryController * @param sessionID session id * @returns response */ - public examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse + public examineItem( + pmcData: IPmcData, + body: IInventoryExamineRequestData, + sessionID: string, + ): IItemEventRouterResponse { let itemId = ""; if ("fromOwner" in body) @@ -580,7 +616,7 @@ export class InventoryController { this.logger.error(this.localisationService.getText("inventory-examine_item_does_not_exist", body.item)); } - + // get hideout item if (body.fromOwner.type === "HideoutProduction") { @@ -640,12 +676,14 @@ export class InventoryController else if (body.fromOwner.id === Traders.FENCE) { // get tpl from fence assorts - return this.fenceService.getRawFenceAssorts().items.find(x => x._id === body.item)._tpl; + return this.fenceService.getRawFenceAssorts().items.find((x) => x._id === body.item)._tpl; } - else if (body.fromOwner.type === "Trader") // not fence - { + else if (body.fromOwner.type === "Trader") + { // not fence // get tpl from trader assort - return this.databaseServer.getTables().traders[body.fromOwner.id].assort.items.find(item => item._id === body.item)._tpl; + return this.databaseServer.getTables().traders[body.fromOwner.id].assort.items.find((item) => + item._id === body.item + )._tpl; } else if (body.fromOwner.type === "RagFair") { @@ -664,18 +702,22 @@ export class InventoryController } // try find examine item inside offer items array - const matchingItem = offer.items.find(x => x._id === body.item); + const matchingItem = offer.items.find((x) => x._id === body.item); if (matchingItem) { return matchingItem._tpl; - } + } // unable to find item in database or ragfair throw new Error(this.localisationService.getText("inventory-unable_to_find_item", body.item)); } } - public readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse + public readEncyclopedia( + pmcData: IPmcData, + body: IInventoryReadEncyclopediaRequestData, + sessionID: string, + ): IItemEventRouterResponse { for (const id of body.ids) { @@ -693,15 +735,20 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public sortInventory(pmcData: IPmcData, request: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse + public sortInventory( + pmcData: IPmcData, + request: IInventorySortRequestData, + sessionID: string, + ): IItemEventRouterResponse { - for (const change of request.changedItems) { - const inventoryItem = pmcData.Inventory.items.find(x => x._id === change._id); + const inventoryItem = pmcData.Inventory.items.find((x) => x._id === change._id); if (!inventoryItem) { - this.logger.error(`Unable to find inventory item: ${change._id} to auto-sort, YOU MUST RELOAD YOUR GAME`); + this.logger.error( + `Unable to find inventory item: ${change._id} to auto-sort, YOU MUST RELOAD YOUR GAME`, + ); continue; } @@ -728,10 +775,14 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public createMapMarker(pmcData: IPmcData, request: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse + public createMapMarker( + pmcData: IPmcData, + request: IInventoryCreateMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse { // Get map from inventory - const mapItem = pmcData.Inventory.items.find(i => i._id === request.item); + const mapItem = pmcData.Inventory.items.find((i) => i._id === request.item); // add marker mapItem.upd.Map = mapItem.upd.Map || { Markers: [] }; @@ -752,10 +803,14 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public deleteMapMarker(pmcData: IPmcData, request: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse + public deleteMapMarker( + pmcData: IPmcData, + request: IInventoryDeleteMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse { // Get map from inventory - const mapItem = pmcData.Inventory.items.find(i => i._id === request.item); + const mapItem = pmcData.Inventory.items.find((i) => i._id === request.item); // remove marker const markers = mapItem.upd.Map.Markers.filter((marker) => @@ -777,13 +832,17 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public editMapMarker(pmcData: IPmcData, request: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse + public editMapMarker( + pmcData: IPmcData, + request: IInventoryEditMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse { // Get map from inventory - const mapItem = pmcData.Inventory.items.find(i => i._id === request.item); + const mapItem = pmcData.Inventory.items.find((i) => i._id === request.item); // edit marker - const indexOfExistingNote = mapItem.upd.Map.Markers.findIndex(m => m.X === request.X && m.Y === request.Y); + const indexOfExistingNote = mapItem.upd.Map.Markers.findIndex((m) => m.X === request.X && m.Y === request.Y); request.mapMarker.Note = this.sanitiseMapMarkerText(request.mapMarker.Note); mapItem.upd.Map.Markers[indexOfExistingNote] = request.mapMarker; @@ -812,16 +871,17 @@ export class InventoryController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public openRandomLootContainer(pmcData: IPmcData, body: IOpenRandomLootContainerRequestData, sessionID: string): IItemEventRouterResponse + public openRandomLootContainer( + pmcData: IPmcData, + body: IOpenRandomLootContainerRequestData, + sessionID: string, + ): IItemEventRouterResponse { - const openedItem = pmcData.Inventory.items.find(x => x._id === body.item); + const openedItem = pmcData.Inventory.items.find((x) => x._id === body.item); const containerDetails = this.itemHelper.getItem(openedItem._tpl); const isSealedWeaponBox = containerDetails[1]._name.includes("event_container_airdrop"); - const newItemRequest: IAddItemRequestData = { - tid: "RandomLootContainer", - items: [] - }; + const newItemRequest: IAddItemRequestData = { tid: "RandomLootContainer", items: [] }; let foundInRaid = false; if (isSealedWeaponBox) @@ -850,4 +910,4 @@ export class InventoryController return output; } -} \ No newline at end of file +} diff --git a/project/src/controllers/LauncherController.ts b/project/src/controllers/LauncherController.ts index a181ace7..37ddea7e 100644 --- a/project/src/controllers/LauncherController.ts +++ b/project/src/controllers/LauncherController.ts @@ -32,7 +32,7 @@ export class LauncherController @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("PreAkiModLoader") protected preAkiModLoader: PreAkiModLoader, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.coreConfig = this.configServer.getConfig(ConfigTypes.CORE); @@ -44,7 +44,7 @@ export class LauncherController backendUrl: this.httpServerHelper.getBackendUrl(), name: this.coreConfig.serverName, editions: Object.keys(this.databaseServer.getTables().templates.profiles), - profileDescriptions: this.getProfileDescriptions() + profileDescriptions: this.getProfileDescriptions(), }; } @@ -117,7 +117,7 @@ export class LauncherController username: info.username, password: info.password, wipe: true, - edition: info.edition + edition: info.edition, }; this.saveServer.createProfile(newProfileDetails); diff --git a/project/src/controllers/LocationController.ts b/project/src/controllers/LocationController.ts index c46e6a43..949cb52b 100644 --- a/project/src/controllers/LocationController.ts +++ b/project/src/controllers/LocationController.ts @@ -41,7 +41,7 @@ export class LocationController @inject("LootGenerator") protected lootGenerator: LootGenerator, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("TimeUtil") protected timeUtil: TimeUtil, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.airdropConfig = this.configServer.getConfig(ConfigTypes.AIRDROP); @@ -88,17 +88,23 @@ export class LocationController // Create containers and add loot to them const staticLoot = this.locationGenerator.generateStaticContainers(location.base, staticAmmoDist); output.Loot.push(...staticLoot); - + // Add dyanmic loot to output loot const dynamicLootDist: ILooseLoot = this.jsonUtil.clone(location.looseLoot); - const dynamicSpawnPoints: SpawnpointTemplate[] = this.locationGenerator.generateDynamicLoot(dynamicLootDist, staticAmmoDist, name); + const dynamicSpawnPoints: SpawnpointTemplate[] = this.locationGenerator.generateDynamicLoot( + dynamicLootDist, + staticAmmoDist, + name, + ); for (const spawnPoint of dynamicSpawnPoints) { output.Loot.push(spawnPoint); } // Done generating, log results - this.logger.success(this.localisationService.getText("location-dynamic_items_spawned_success", dynamicSpawnPoints.length)); + this.logger.success( + this.localisationService.getText("location-dynamic_items_spawned_success", dynamicSpawnPoints.length), + ); this.logger.success(this.localisationService.getText("location-generated_success", name)); return output; @@ -130,10 +136,7 @@ export class LocationController locations[mapBase._Id] = mapBase; } - return { - locations: locations, - paths: locationsFromDb.base.paths - }; + return { locations: locations, paths: locationsFromDb.base.paths }; } /** @@ -150,7 +153,7 @@ export class LocationController const airdropConfig = this.getAirdropLootConfigByType(airdropType); - return {dropType: airdropType, loot: this.lootGenerator.createRandomLoot(airdropConfig)}; + return { dropType: airdropType, loot: this.lootGenerator.createRandomLoot(airdropConfig) }; } /** @@ -174,7 +177,9 @@ export class LocationController let lootSettingsByType = this.airdropConfig.loot[airdropType]; if (!lootSettingsByType) { - this.logger.error(this.localisationService.getText("location-unable_to_find_airdrop_drop_config_of_type", airdropType)); + this.logger.error( + this.localisationService.getText("location-unable_to_find_airdrop_drop_config_of_type", airdropType), + ); lootSettingsByType = this.airdropConfig.loot[AirdropTypeEnum.MIXED]; } @@ -187,7 +192,7 @@ export class LocationController itemLimits: lootSettingsByType.itemLimits, itemStackLimits: lootSettingsByType.itemStackLimits, armorLevelWhitelist: lootSettingsByType.armorLevelWhitelist, - allowBossItems: lootSettingsByType.allowBossItems + allowBossItems: lootSettingsByType.allowBossItems, }; } -} \ No newline at end of file +} diff --git a/project/src/controllers/MatchController.ts b/project/src/controllers/MatchController.ts index bd4fa79e..7b3bd2f0 100644 --- a/project/src/controllers/MatchController.ts +++ b/project/src/controllers/MatchController.ts @@ -56,7 +56,7 @@ export class MatchController @inject("BotGenerationCacheService") protected botGenerationCacheService: BotGenerationCacheService, @inject("MailSendService") protected mailSendService: MailSendService, @inject("LootGenerator") protected lootGenerator: LootGenerator, - @inject("ApplicationContext") protected applicationContext: ApplicationContext + @inject("ApplicationContext") protected applicationContext: ApplicationContext, ) { this.matchConfig = this.configServer.getConfig(ConfigTypes.MATCH); @@ -102,26 +102,23 @@ export class MatchController // eslint-disable-next-line @typescript-eslint/no-unused-vars public joinMatch(info: IJoinMatchRequestData, sessionId: string): IJoinMatchResult { - const output: IJoinMatchResult = { - maxPveCountExceeded: false, - profiles: [] - }; + const output: IJoinMatchResult = { maxPveCountExceeded: false, profiles: [] }; // get list of players joining into the match output.profiles.push({ - "profileid": "TODO", + profileid: "TODO", profileToken: "TODO", - "status": "MatchWait", - "sid": "", - "ip": "", - "port": 0, - "version": "live", - "location": "TODO get location", + status: "MatchWait", + sid: "", + ip: "", + port: 0, + version: "live", + location: "TODO get location", raidMode: "Online", - "mode": "deathmatch", - "shortid": null, + mode: "deathmatch", + shortid: null, // eslint-disable-next-line @typescript-eslint/naming-convention - additional_info: null + additional_info: null, }); return output; @@ -131,10 +128,7 @@ export class MatchController // eslint-disable-next-line @typescript-eslint/no-unused-vars public getGroupStatus(info: IGetGroupStatusRequestData): any { - return { - players: [], - maxPveCountExceeded: false - }; + return { players: [], maxPveCountExceeded: false }; } /** @@ -147,15 +141,17 @@ export class MatchController // Store request data for access during bot generation this.applicationContext.addValue(ContextVariableType.RAID_CONFIGURATION, request); - //TODO: add code to strip PMC of equipment now they've started the raid + // TODO: add code to strip PMC of equipment now they've started the raid // Set pmcs to difficulty set in pre-raid screen if override in bot config isnt enabled if (!this.pmcConfig.useDifficultyOverride) { - this.pmcConfig.difficulty = this.convertDifficultyDropdownIntoBotDifficulty(request.wavesSettings.botDifficulty); + this.pmcConfig.difficulty = this.convertDifficultyDropdownIntoBotDifficulty( + request.wavesSettings.botDifficulty, + ); } - // Store the profile as-is for later use on the post-raid exp screen + // Store the profile as-is for later use on the post-raid exp screen const currentProfile = this.saveServer.getProfile(sessionID); this.profileSnapshotService.storeProfileSnapshot(sessionID, currentProfile); } @@ -178,7 +174,7 @@ export class MatchController /** Handle client/match/offline/end */ public endOfflineRaid(info: IEndOfflineRaidRequestData, sessionId: string): void - { + { const pmcData: IPmcData = this.profileHelper.getPmcProfile(sessionId); const extractName = info.exitName; @@ -224,22 +220,17 @@ export class MatchController // Generate reward for taking coop extract const loot = this.lootGenerator.createRandomLoot(this.traderConfig.fence.coopExtractGift); const mailableLoot: Item[] = []; - + const parentId = this.hashUtil.generate(); for (const item of loot) { - mailableLoot.push( - { - _id: item.id, - _tpl: item.tpl, - slotId: "main", - parentId: parentId, - upd: { - StackObjectsCount: item.stackCount, - SpawnedInSession: true - } - } - ); + mailableLoot.push({ + _id: item.id, + _tpl: item.tpl, + slotId: "main", + parentId: parentId, + upd: { StackObjectsCount: item.stackCount, SpawnedInSession: true }, + }); } // Send message from fence giving player reward generated above @@ -249,7 +240,7 @@ export class MatchController MessageType.MESSAGE_WITH_ITEMS, this.randomUtil.getArrayValue(this.traderConfig.fence.coopExtractGift.messageLocaleIds), mailableLoot, - this.timeUtil.getHoursAsSeconds(this.traderConfig.fence.coopExtractGift.giftExpiryHours) + this.timeUtil.getHoursAsSeconds(this.traderConfig.fence.coopExtractGift.giftExpiryHours), ); } @@ -264,7 +255,7 @@ export class MatchController { pmcData.CoopExtractCounts = {}; } - + // Ensure key exists for extract if (!(extractName in pmcData.CoopExtractCounts)) { @@ -273,9 +264,13 @@ export class MatchController // Increment extract count value pmcData.CoopExtractCounts[extractName] += 1; - + // Get new fence standing value - const newFenceStanding = this.getFenceStandingAfterExtract(pmcData, this.inraidConfig.coopExtractBaseStandingGain, pmcData.CoopExtractCounts[extractName]); + const newFenceStanding = this.getFenceStandingAfterExtract( + pmcData, + this.inraidConfig.coopExtractBaseStandingGain, + pmcData.CoopExtractCounts[extractName], + ); const fenceId: string = Traders.FENCE; pmcData.TradersInfo[fenceId].standing = newFenceStanding; @@ -324,7 +319,11 @@ export class MatchController // Not exact replica of Live behaviour // Simplified for now, no real reason to do the whole (unconfirmed) extra 0.01 standing per day regeneration mechanic - const newFenceStanding = this.getFenceStandingAfterExtract(pmcData, this.inraidConfig.carExtractBaseStandingGain, pmcData.CarExtractCounts[extractName]); + const newFenceStanding = this.getFenceStandingAfterExtract( + pmcData, + this.inraidConfig.carExtractBaseStandingGain, + pmcData.CarExtractCounts[extractName], + ); const fenceId: string = Traders.FENCE; pmcData.TradersInfo[fenceId].standing = newFenceStanding; @@ -332,7 +331,9 @@ export class MatchController this.traderHelper.lvlUp(fenceId, pmcData); pmcData.TradersInfo[fenceId].loyaltyLevel = Math.max(pmcData.TradersInfo[fenceId].loyaltyLevel, 1); - this.logger.debug(`Car extract: ${extractName} used, total times taken: ${pmcData.CarExtractCounts[extractName]}`); + this.logger.debug( + `Car extract: ${extractName} used, total times taken: ${pmcData.CarExtractCounts[extractName]}`, + ); } /** @@ -357,4 +358,4 @@ export class MatchController return Number(newFenceStanding.toFixed(2)); } -} \ No newline at end of file +} diff --git a/project/src/controllers/NoteController.ts b/project/src/controllers/NoteController.ts index 8b0c37b1..d6689621 100644 --- a/project/src/controllers/NoteController.ts +++ b/project/src/controllers/NoteController.ts @@ -9,17 +9,12 @@ import { EventOutputHolder } from "@spt-aki/routers/EventOutputHolder"; @injectable() export class NoteController { - constructor( - @inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder - ) - { } + constructor(@inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder) + {} public addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse { - const newNote: Note = { - Time: body.note.Time, - Text: body.note.Text - }; + const newNote: Note = { Time: body.note.Time, Text: body.note.Text }; pmcData.Notes.Notes.push(newNote); return this.eventOutputHolder.getOutput(sessionID); @@ -39,4 +34,4 @@ export class NoteController pmcData.Notes.Notes.splice(body.index, 1); return this.eventOutputHolder.getOutput(sessionID); } -} \ No newline at end of file +} diff --git a/project/src/controllers/NotifierController.ts b/project/src/controllers/NotifierController.ts index ab4d9bdd..f4d16d36 100644 --- a/project/src/controllers/NotifierController.ts +++ b/project/src/controllers/NotifierController.ts @@ -14,7 +14,7 @@ export class NotifierController constructor( @inject("NotifierHelper") protected notifierHelper: NotifierHelper, @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper, - @inject("NotificationService") protected notificationService: NotificationService + @inject("NotificationService") protected notificationService: NotificationService, ) {} @@ -86,7 +86,7 @@ export class NotifierController channel_id: sessionID, url: "", notifierServer: this.getServer(sessionID), - ws: this.notifierHelper.getWebSocketServer(sessionID) + ws: this.notifierHelper.getWebSocketServer(sessionID), }; } } diff --git a/project/src/controllers/PresetBuildController.ts b/project/src/controllers/PresetBuildController.ts index e3f4ca9d..959e90f2 100644 --- a/project/src/controllers/PresetBuildController.ts +++ b/project/src/controllers/PresetBuildController.ts @@ -23,9 +23,9 @@ export class PresetBuildController @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("ItemHelper") protected itemHelper: ItemHelper, - @inject("SaveServer") protected saveServer: SaveServer + @inject("SaveServer") protected saveServer: SaveServer, ) - { } + {} /** Handle client/handbook/builds/my/list */ public getUserBuilds(sessionID: string): IUserBuilds @@ -33,23 +33,26 @@ export class PresetBuildController const profile = this.saveServer.getProfile(sessionID); if (!profile.userbuilds) { - profile.userbuilds = { - equipmentBuilds: [], - weaponBuilds: [] - }; + profile.userbuilds = { equipmentBuilds: [], weaponBuilds: [] }; } // Ensure the secure container in the default presets match what the player has equipped - const defaultEquipmentPresets = this.jsonUtil.clone(this.databaseServer.getTables().templates.defaultEquipmentPresets); - const playerSecureContainer = profile.characters.pmc.Inventory.items?.find(x => x.slotId === "SecuredContainer"); - const firstDefaultItemsSecureContainer = defaultEquipmentPresets[0]?.items?.find(x => x.slotId === "SecuredContainer"); + const defaultEquipmentPresets = this.jsonUtil.clone( + this.databaseServer.getTables().templates.defaultEquipmentPresets, + ); + const playerSecureContainer = profile.characters.pmc.Inventory.items?.find((x) => + x.slotId === "SecuredContainer" + ); + const firstDefaultItemsSecureContainer = defaultEquipmentPresets[0]?.items?.find((x) => + x.slotId === "SecuredContainer" + ); if (playerSecureContainer && playerSecureContainer?._tpl !== firstDefaultItemsSecureContainer?._tpl) { // Default equipment presets' secure container tpl doesnt match players secure container tpl for (const defaultPreset of defaultEquipmentPresets) { // Find presets secure container - const secureContainer = defaultPreset.items.find(x => x.slotId === "SecuredContainer"); + const secureContainer = defaultPreset.items.find((x) => x.slotId === "SecuredContainer"); if (secureContainer) { secureContainer._tpl = playerSecureContainer._tpl; @@ -65,7 +68,11 @@ export class PresetBuildController } /** Handle SaveWeaponBuild event */ - public saveWeaponBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionId: string): IItemEventRouterResponse + public saveWeaponBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionId: string, + ): IItemEventRouterResponse { // TODO - could be merged into saveBuild, maybe const output = this.eventOutputHolder.getOutput(sessionId); @@ -82,15 +89,19 @@ export class PresetBuildController name: body.name, root: body.root, items: body.items, - type: "weapon" + type: "weapon", }; const savedWeaponBuilds = this.saveServer.getProfile(sessionId).userbuilds.weaponBuilds; - const existingBuild = savedWeaponBuilds.find(x => x.id === body.id); + const existingBuild = savedWeaponBuilds.find((x) => x.id === body.id); if (existingBuild) { // exists, replace - this.saveServer.getProfile(sessionId).userbuilds.weaponBuilds.splice(savedWeaponBuilds.indexOf(existingBuild), 1, newBuild); + this.saveServer.getProfile(sessionId).userbuilds.weaponBuilds.splice( + savedWeaponBuilds.indexOf(existingBuild), + 1, + newBuild, + ); } else { @@ -105,12 +116,21 @@ export class PresetBuildController } /** Handle SaveEquipmentBuild event */ - public saveEquipmentBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse + public saveEquipmentBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.saveBuild(pmcData, body, sessionID, "equipmentBuilds"); } - protected saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string, buildType: string): IItemEventRouterResponse + protected saveBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + buildType: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); const existingSavedBuilds: any[] = this.saveServer.getProfile(sessionID).userbuilds[buildType]; @@ -125,14 +145,18 @@ export class PresetBuildController buildType: "Custom", root: body.root, fastPanel: [], - items: body.items + items: body.items, }; - const existingBuild = existingSavedBuilds.find(x => x.name === body.name); + const existingBuild = existingSavedBuilds.find((x) => x.name === body.name); if (existingBuild) { // Already exists, replace - this.saveServer.getProfile(sessionID).userbuilds[buildType].splice(existingSavedBuilds.indexOf(existingBuild), 1, newBuild); + this.saveServer.getProfile(sessionID).userbuilds[buildType].splice( + existingSavedBuilds.indexOf(existingBuild), + 1, + newBuild, + ); } else { @@ -152,26 +176,34 @@ export class PresetBuildController } /** Handle RemoveWeaponBuild event*/ - public removeWeaponBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse + public removeWeaponBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse { // todo - does this get called? return this.removePlayerBuild(pmcData, body.id, sessionID); } /** Handle RemoveEquipmentBuild event*/ - public removeEquipmentBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse + public removeEquipmentBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse { // todo - does this get called? return this.removePlayerBuild(pmcData, body.id, sessionID); } - + protected removePlayerBuild(pmcData: IPmcData, id: string, sessionID: string): IItemEventRouterResponse { const weaponBuilds = this.saveServer.getProfile(sessionID).userbuilds.weaponBuilds; const equipmentBuilds = this.saveServer.getProfile(sessionID).userbuilds.equipmentBuilds; // Check for id in weapon array first - const matchingWeaponBuild = weaponBuilds.find(x => x.id === id); + const matchingWeaponBuild = weaponBuilds.find((x) => x.id === id); if (matchingWeaponBuild) { weaponBuilds.splice(weaponBuilds.indexOf(matchingWeaponBuild), 1); @@ -180,7 +212,7 @@ export class PresetBuildController } // Id not found in weapons, try equipment - const matchingEquipmentBuild = equipmentBuilds.find(x => x.id === id); + const matchingEquipmentBuild = equipmentBuilds.find((x) => x.id === id); if (matchingEquipmentBuild) { equipmentBuilds.splice(equipmentBuilds.indexOf(matchingEquipmentBuild), 1); @@ -191,8 +223,7 @@ export class PresetBuildController { this.logger.error(`Unable to delete preset, cannot find ${id} in weapon or equipment presets`); } - return this.eventOutputHolder.getOutput(sessionID); } -} \ No newline at end of file +} diff --git a/project/src/controllers/PresetController.ts b/project/src/controllers/PresetController.ts index 0ab8f8ed..ceaa0b12 100644 --- a/project/src/controllers/PresetController.ts +++ b/project/src/controllers/PresetController.ts @@ -9,9 +9,9 @@ export class PresetController { constructor( @inject("PresetHelper") protected presetHelper: PresetHelper, - @inject("DatabaseServer") protected databaseServer: DatabaseServer + @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) - { } + {} public initialize(): void { diff --git a/project/src/controllers/ProfileController.ts b/project/src/controllers/ProfileController.ts index 7caf7fad..c9307bda 100644 --- a/project/src/controllers/ProfileController.ts +++ b/project/src/controllers/ProfileController.ts @@ -47,9 +47,9 @@ export class ProfileController @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("DialogueHelper") protected dialogueHelper: DialogueHelper, @inject("QuestHelper") protected questHelper: QuestHelper, - @inject("ProfileHelper") protected profileHelper: ProfileHelper + @inject("ProfileHelper") protected profileHelper: ProfileHelper, ) - { } + {} /** * Handle /launcher/profiles @@ -76,7 +76,7 @@ export class ProfileController const pmc = profile.characters.pmc; // make sure character completed creation - if (!((pmc?.Info?.Level))) + if (!(pmc?.Info?.Level)) { return { username: profile.info.username, @@ -87,7 +87,7 @@ export class ProfileController prevexp: 0, nextlvl: 0, maxlvl: maxlvl, - akiData: this.profileHelper.getDefaultAkiDataObject() + akiData: this.profileHelper.getDefaultAkiDataObject(), }; } @@ -102,7 +102,7 @@ export class ProfileController prevexp: (currlvl === 0) ? 0 : this.profileHelper.getExperience(currlvl), nextlvl: nextlvl, maxlvl: maxlvl, - akiData: profile.aki + akiData: profile.aki, }; return result; @@ -122,7 +122,8 @@ export class ProfileController public createProfile(info: IProfileCreateRequestData, sessionID: string): void { const account = this.saveServer.getProfile(sessionID).info; - const profile: TemplateSide = this.databaseServer.getTables().templates.profiles[account.edition][info.side.toLowerCase()]; + const profile: TemplateSide = + this.databaseServer.getTables().templates.profiles[account.edition][info.side.toLowerCase()]; const pmcData = profile.character; // Delete existing profile @@ -152,16 +153,18 @@ export class ProfileController } // Change item id's to be unique - pmcData.Inventory.items = this.itemHelper.replaceIDs(pmcData, pmcData.Inventory.items, null, pmcData.Inventory.fastPanel); + pmcData.Inventory.items = this.itemHelper.replaceIDs( + pmcData, + pmcData.Inventory.items, + null, + pmcData.Inventory.fastPanel, + ); pmcData.Inventory.hideoutAreaStashes = {}; // Create profile const profileDetails: IAkiProfile = { info: account, - characters: { - pmc: pmcData, - scav: {} as IPmcData - }, + characters: { pmc: pmcData, scav: {} as IPmcData }, suits: profile.suits, userbuilds: profile.userbuilds, dialogues: profile.dialogues, @@ -169,7 +172,7 @@ export class ProfileController vitality: {} as Vitality, inraid: {} as Inraid, insurance: [], - traderPurchases: {} + traderPurchases: {}, }; this.profileFixerService.checkForAndFixPmcProfileIssues(profileDetails.characters.pmc); @@ -185,7 +188,11 @@ export class ProfileController // Profile is flagged as wanting quests set to ready to hand in and collect rewards if (profile.trader.setQuestsAvailableForFinish) { - this.questHelper.addAllQuestsToProfile(profileDetails.characters.pmc, [QuestStatus.AvailableForStart, QuestStatus.Started, QuestStatus.AvailableForFinish]); + this.questHelper.addAllQuestsToProfile(profileDetails.characters.pmc, [ + QuestStatus.AvailableForStart, + QuestStatus.Started, + QuestStatus.AvailableForFinish, + ]); // Make unused response so applyQuestReward works const response = this.eventOutputHolder.getOutput(sessionID); @@ -219,7 +226,9 @@ export class ProfileController } else { - this.logger.warning(this.localisationService.getText("profile-unable_to_find_profile_by_id_cannot_delete", sessionID)); + this.logger.warning( + this.localisationService.getText("profile-unable_to_find_profile_by_id_cannot_delete", sessionID), + ); } } @@ -230,16 +239,29 @@ export class ProfileController * @param sessionID Session id * @param response Event router response */ - protected givePlayerStartingQuestRewards(profileDetails: IAkiProfile, sessionID: string, response: IItemEventRouterResponse): void + protected givePlayerStartingQuestRewards( + profileDetails: IAkiProfile, + sessionID: string, + response: IItemEventRouterResponse, + ): void { - for (const quest of profileDetails.characters.pmc.Quests) + for (const quest of profileDetails.characters.pmc.Quests) { const questFromDb = this.questHelper.getQuestFromDb(quest.qid, profileDetails.characters.pmc); // Get messageId of text to send to player as text message in game // Copy of code from QuestController.acceptQuest() - const messageId = this.questHelper.getMessageIdForQuestStart(questFromDb.startedMessageText, questFromDb.description); - const itemRewards = this.questHelper.applyQuestReward(profileDetails.characters.pmc, quest.qid, QuestStatus.Started, sessionID, response); + const messageId = this.questHelper.getMessageIdForQuestStart( + questFromDb.startedMessageText, + questFromDb.description, + ); + const itemRewards = this.questHelper.applyQuestReward( + profileDetails.characters.pmc, + quest.qid, + QuestStatus.Started, + sessionID, + response, + ); this.mailSendService.sendLocalisedNpcMessageToPlayer( sessionID, @@ -247,7 +269,8 @@ export class ProfileController MessageType.QUEST_START, messageId, itemRewards, - this.timeUtil.getHoursAsSeconds(100)); + this.timeUtil.getHoursAsSeconds(100), + ); } } @@ -266,7 +289,7 @@ export class ProfileController /** * Generate a player scav object * PMC profile MUST exist first before pscav can be generated - * @param sessionID + * @param sessionID * @returns IPmcData object */ public generatePlayerScav(sessionID: string): IPmcData @@ -326,15 +349,6 @@ export class ProfileController // eslint-disable-next-line @typescript-eslint/no-unused-vars public getFriends(info: ISearchFriendRequestData, sessionID: string): ISearchFriendResponse[] { - return [ - { - _id: this.hashUtil.generate(), - Info: { - Level: 1, - Side: "Bear", - Nickname: info.nickname - } - } - ]; + return [{ _id: this.hashUtil.generate(), Info: { Level: 1, Side: "Bear", Nickname: info.nickname } }]; } -} \ No newline at end of file +} diff --git a/project/src/controllers/QuestController.ts b/project/src/controllers/QuestController.ts index 49c41928..88070a74 100644 --- a/project/src/controllers/QuestController.ts +++ b/project/src/controllers/QuestController.ts @@ -57,7 +57,7 @@ export class QuestController @inject("LocaleService") protected localeService: LocaleService, @inject("SeasonalEventService") protected seasonalEventService: SeasonalEventService, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.questConfig = this.configServer.getConfig(ConfigTypes.QUEST); @@ -79,7 +79,7 @@ export class QuestController for (const quest of allQuests) { // Player already accepted the quest, show it regardless of status - const questInProfile = profile.Quests.find(x => x.qid === quest._id); + const questInProfile = profile.Quests.find((x) => x.qid === quest._id); if (questInProfile) { quest.sptStatus = questInProfile.status; @@ -105,8 +105,12 @@ export class QuestController } const questRequirements = this.questConditionHelper.getQuestConditions(quest.conditions.AvailableForStart); - const loyaltyRequirements = this.questConditionHelper.getLoyaltyConditions(quest.conditions.AvailableForStart); - const standingRequirements = this.questConditionHelper.getStandingConditions(quest.conditions.AvailableForStart); + const loyaltyRequirements = this.questConditionHelper.getLoyaltyConditions( + quest.conditions.AvailableForStart, + ); + const standingRequirements = this.questConditionHelper.getStandingConditions( + quest.conditions.AvailableForStart, + ); // Quest has no conditions, standing or loyalty conditions, add to visible quest list if (questRequirements.length === 0 && loyaltyRequirements.length === 0 && standingRequirements.length === 0) @@ -122,7 +126,7 @@ export class QuestController for (const conditionToFulfil of questRequirements) { // If the previous quest isn't in the user profile, it hasn't been completed or started - const prerequisiteQuest = profile.Quests.find(pq => pq.qid === conditionToFulfil._props.target); + const prerequisiteQuest = profile.Quests.find((pq) => pq.qid === conditionToFulfil._props.target); if (!prerequisiteQuest) { haveCompletedPreviousQuest = false; @@ -144,7 +148,11 @@ export class QuestController const unlockTime = previousQuestCompleteTime + conditionToFulfil._props.availableAfter; if (unlockTime > this.timeUtil.getTimestamp()) { - this.logger.debug(`Quest ${quest.QuestName} is locked for another ${unlockTime - this.timeUtil.getTimestamp()} seconds`); + this.logger.debug( + `Quest ${quest.QuestName} is locked for another ${ + unlockTime - this.timeUtil.getTimestamp() + } seconds`, + ); } } } @@ -207,7 +215,7 @@ export class QuestController } // All conditions passed / has no level requirement, valid - return true; + return true; } /** @@ -221,19 +229,28 @@ export class QuestController const isHalloweenEventActive = this.seasonalEventService.halloweenEventEnabled(); // Not christmas + quest is for christmas - if (!isChristmasEventActive && this.seasonalEventService.isQuestRelatedToEvent(questId, SeasonalEventType.CHRISTMAS)) + if ( + !isChristmasEventActive + && this.seasonalEventService.isQuestRelatedToEvent(questId, SeasonalEventType.CHRISTMAS) + ) { return false; } // Not halloween + quest is for halloween - if (!isHalloweenEventActive && this.seasonalEventService.isQuestRelatedToEvent(questId, SeasonalEventType.HALLOWEEN)) + if ( + !isHalloweenEventActive + && this.seasonalEventService.isQuestRelatedToEvent(questId, SeasonalEventType.HALLOWEEN) + ) { return false; } // Should non-season event quests be shown to player - if (!this.questConfig.showNonSeasonalEventQuests && this.seasonalEventService.isQuestRelatedToEvent(questId, SeasonalEventType.NONE)) + if ( + !this.questConfig.showNonSeasonalEventQuests + && this.seasonalEventService.isQuestRelatedToEvent(questId, SeasonalEventType.NONE) + ) { return false; } @@ -274,7 +291,11 @@ export class QuestController * @param sessionID Session id * @returns client response */ - public acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse + public acceptQuest( + pmcData: IPmcData, + acceptedQuest: IAcceptQuestRequestData, + sessionID: string, + ): IItemEventRouterResponse { const acceptQuestResponse = this.eventOutputHolder.getOutput(sessionID); @@ -282,7 +303,7 @@ export class QuestController const newQuest = this.questHelper.getQuestReadyForProfile(pmcData, startedState, acceptedQuest); // Does quest exist in profile - if (pmcData.Quests.find(x => x.qid === acceptedQuest.qid)) + if (pmcData.Quests.find((x) => x.qid === acceptedQuest.qid)) { // Update existing this.questHelper.updateQuestState(pmcData, QuestStatus.Started, acceptedQuest.qid); @@ -297,8 +318,17 @@ export class QuestController // Note that for starting quests, the correct locale field is "description", not "startedMessageText". const questFromDb = this.questHelper.getQuestFromDb(acceptedQuest.qid, pmcData); // Get messageId of text to send to player as text message in game - const messageId = this.questHelper.getMessageIdForQuestStart(questFromDb.startedMessageText, questFromDb.description); - const startedQuestRewards = this.questHelper.applyQuestReward(pmcData, acceptedQuest.qid, QuestStatus.Started, sessionID, acceptQuestResponse); + const messageId = this.questHelper.getMessageIdForQuestStart( + questFromDb.startedMessageText, + questFromDb.description, + ); + const startedQuestRewards = this.questHelper.applyQuestReward( + pmcData, + acceptedQuest.qid, + QuestStatus.Started, + sessionID, + acceptQuestResponse, + ); this.mailSendService.sendLocalisedNpcMessageToPlayer( sessionID, @@ -306,9 +336,11 @@ export class QuestController MessageType.QUEST_START, messageId, startedQuestRewards, - this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime)); + this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime), + ); - acceptQuestResponse.profileChanges[sessionID].quests = this.questHelper.getNewlyAccessibleQuestsWhenStartingQuest(acceptedQuest.qid, sessionID); + acceptQuestResponse.profileChanges[sessionID].quests = this.questHelper + .getNewlyAccessibleQuestsWhenStartingQuest(acceptedQuest.qid, sessionID); return acceptQuestResponse; } @@ -322,24 +354,36 @@ export class QuestController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public acceptRepeatableQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse + public acceptRepeatableQuest( + pmcData: IPmcData, + acceptedQuest: IAcceptQuestRequestData, + sessionID: string, + ): IItemEventRouterResponse { const acceptQuestResponse = this.eventOutputHolder.getOutput(sessionID); const desiredQuestState = QuestStatus.Started; const newQuest = this.questHelper.getQuestReadyForProfile(pmcData, desiredQuestState, acceptedQuest); pmcData.Quests.push(newQuest); - + const repeatableQuestProfile = this.getRepeatableQuestFromProfile(pmcData, acceptedQuest); if (!repeatableQuestProfile) { - this.logger.error(this.localisationService.getText("repeatable-accepted_repeatable_quest_not_found_in_active_quests", acceptedQuest.qid)); + this.logger.error( + this.localisationService.getText( + "repeatable-accepted_repeatable_quest_not_found_in_active_quests", + acceptedQuest.qid, + ), + ); throw new Error(this.localisationService.getText("repeatable-unable_to_accept_quest_see_log")); } // Some scav quests need to be added to scav profile for them to show up in-raid - if (repeatableQuestProfile.side === "Scav" && ["PickUp", "Exploration", "Elimination"].includes(repeatableQuestProfile.type)) + if ( + repeatableQuestProfile.side === "Scav" + && ["PickUp", "Exploration", "Elimination"].includes(repeatableQuestProfile.type) + ) { const fullProfile = this.profileHelper.getFullProfile(sessionID); if (!fullProfile.characters.scav.Quests) @@ -351,46 +395,67 @@ export class QuestController } const locale = this.localeService.getLocaleDb(); - const questStartedMessageKey = this.questHelper.getMessageIdForQuestStart(repeatableQuestProfile.startedMessageText, repeatableQuestProfile.description); + const questStartedMessageKey = this.questHelper.getMessageIdForQuestStart( + repeatableQuestProfile.startedMessageText, + repeatableQuestProfile.description, + ); // Can be started text or description text based on above function result let questStartedMessageText = locale[questStartedMessageKey]; // TODO: remove this whole if statement, possibly not required? if (!questStartedMessageText) { - this.logger.debug(`Unable to accept quest ${acceptedQuest.qid}, cannot find the quest started message text with id ${questStartedMessageKey}. attempting to find it in en locale instead`); + this.logger.debug( + `Unable to accept quest ${acceptedQuest.qid}, cannot find the quest started message text with id ${questStartedMessageKey}. attempting to find it in en locale instead`, + ); // For some reason non-en locales dont have repeatable quest ids, fall back to en and grab it if possible - const enLocale = this.databaseServer.getTables().locales.global["en"]; + const enLocale = this.databaseServer.getTables().locales.global.en; questStartedMessageText = enLocale[repeatableQuestProfile.startedMessageText]; if (!questStartedMessageText) { - this.logger.error(this.localisationService.getText("repeatable-unable_to_accept_quest_starting_message_not_found", {questId: acceptedQuest.qid, messageId: questStartedMessageKey})); + this.logger.error( + this.localisationService.getText("repeatable-unable_to_accept_quest_starting_message_not_found", { + questId: acceptedQuest.qid, + messageId: questStartedMessageKey, + }), + ); - return this.httpResponseUtil.appendErrorToOutput(acceptQuestResponse, this.localisationService.getText("repeatable-unable_to_accept_quest_see_log")); + return this.httpResponseUtil.appendErrorToOutput( + acceptQuestResponse, + this.localisationService.getText("repeatable-unable_to_accept_quest_see_log"), + ); } } - const questRewards = this.questHelper.getQuestRewardItems(repeatableQuestProfile, desiredQuestState); + const questRewards = this.questHelper.getQuestRewardItems( + repeatableQuestProfile, + desiredQuestState, + ); this.mailSendService.sendLocalisedNpcMessageToPlayer( sessionID, this.traderHelper.getTraderById(repeatableQuestProfile.traderId), MessageType.QUEST_START, questStartedMessageKey, questRewards, - this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime)); + this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime), + ); - const repeatableSettings = pmcData.RepeatableQuests.find(x => x.name === repeatableQuestProfile.sptRepatableGroupName); + const repeatableSettings = pmcData.RepeatableQuests.find((x) => + x.name === repeatableQuestProfile.sptRepatableGroupName + ); const change = {}; change[repeatableQuestProfile._id] = repeatableSettings.changeRequirement[repeatableQuestProfile._id]; const responseData: IPmcDataRepeatableQuest = { - id: repeatableSettings.id ?? this.questConfig.repeatableQuests.find(x => x.name === repeatableQuestProfile.sptRepatableGroupName).id, + id: repeatableSettings.id ?? this.questConfig.repeatableQuests.find((x) => + x.name === repeatableQuestProfile.sptRepatableGroupName + ).id, name: repeatableSettings.name, endTime: repeatableSettings.endTime, changeRequirement: change, activeQuests: [repeatableQuestProfile], - inactiveQuests: [] + inactiveQuests: [], }; acceptQuestResponse.profileChanges[sessionID].repeatableQuests = [responseData]; @@ -407,12 +472,12 @@ export class QuestController { for (const repeatableQuest of pmcData.RepeatableQuests) { - const matchingQuest = repeatableQuest.activeQuests.find(x => x._id === acceptedQuest.qid); + const matchingQuest = repeatableQuest.activeQuests.find((x) => x._id === acceptedQuest.qid); if (matchingQuest) { this.logger.debug(`Accepted repeatable quest ${acceptedQuest.qid} from ${repeatableQuest.name}`); matchingQuest.sptRepatableGroupName = repeatableQuest.name; - + return matchingQuest; } } @@ -430,7 +495,11 @@ export class QuestController * @param sessionID Session id * @returns ItemEvent client response */ - public completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse + public completeQuest( + pmcData: IPmcData, + body: ICompleteQuestRequestData, + sessionID: string, + ): IItemEventRouterResponse { const completeQuestResponse = this.eventOutputHolder.getOutput(sessionID); @@ -442,7 +511,13 @@ export class QuestController const newQuestState = QuestStatus.Success; this.questHelper.updateQuestState(pmcData, newQuestState, completedQuestId); - const questRewards = this.questHelper.applyQuestReward(pmcData, body.qid, newQuestState, sessionID, completeQuestResponse); + const questRewards = this.questHelper.applyQuestReward( + pmcData, + body.qid, + newQuestState, + sessionID, + completeQuestResponse, + ); // Check for linked failed + unrestartable quests const questsToFail = this.getQuestsFailedByCompletingQuest(completedQuestId); @@ -456,7 +531,7 @@ export class QuestController // Add diff of quests before completion vs after for client response const questDelta = this.questHelper.getDeltaQuests(beforeQuests, this.getClientQuests(sessionID)); - + // Check newly available + failed quests for timegates and add them to profile this.addTimeLockedQuestsToProfile(pmcData, [...questDelta, ...questsToFail], body.qid); @@ -466,10 +541,12 @@ export class QuestController // Check if it's a repeatable quest. If so, remove from Quests and repeatable.activeQuests list + move to repeatable.inactiveQuests for (const currentRepeatable of pmcData.RepeatableQuests) { - const repeatableQuest = currentRepeatable.activeQuests.find(x => x._id === completedQuestId); + const repeatableQuest = currentRepeatable.activeQuests.find((x) => x._id === completedQuestId); if (repeatableQuest) { - currentRepeatable.activeQuests = currentRepeatable.activeQuests.filter(x => x._id !== completedQuestId); + currentRepeatable.activeQuests = currentRepeatable.activeQuests.filter((x) => + x._id !== completedQuestId + ); currentRepeatable.inactiveQuests.push(repeatableQuest); // Need to remove redundant scav quest object as its no longer necessary, is tracked in pmc profile @@ -498,15 +575,20 @@ export class QuestController protected removeQuestFromScavProfile(sessionId: string, questIdToRemove: string): void { const fullProfile = this.profileHelper.getFullProfile(sessionId); - const repeatableInScavProfile = fullProfile.characters.scav.Quests?.find(x => x.qid === questIdToRemove); + const repeatableInScavProfile = fullProfile.characters.scav.Quests?.find((x) => x.qid === questIdToRemove); if (!repeatableInScavProfile) { - this.logger.warning(`Unable to remove quest: ${questIdToRemove} from profile as scav quest cannot be found`); + this.logger.warning( + `Unable to remove quest: ${questIdToRemove} from profile as scav quest cannot be found`, + ); return; } - fullProfile.characters.scav.Quests.splice(fullProfile.characters.scav.Quests.indexOf(repeatableInScavProfile), 1); + fullProfile.characters.scav.Quests.splice( + fullProfile.characters.scav.Quests.indexOf(repeatableInScavProfile), + 1, + ); } /** @@ -515,14 +597,17 @@ export class QuestController * @param postQuestStatuses Quests after * @returns QuestStatusChange array */ - protected getQuestsWithDifferentStatuses(preQuestStatusus: IQuestStatus[], postQuestStatuses: IQuestStatus[]): IQuestStatus[] + protected getQuestsWithDifferentStatuses( + preQuestStatusus: IQuestStatus[], + postQuestStatuses: IQuestStatus[], + ): IQuestStatus[] { const result: IQuestStatus[] = []; for (const quest of postQuestStatuses) { // Add quest if status differs or quest not found - const preQuest = preQuestStatusus.find(x => x.qid === quest.qid); + const preQuest = preQuestStatusus.find((x) => x.qid === quest.qid); if (!preQuest || preQuest.status !== quest.status) { result.push(quest); @@ -544,7 +629,12 @@ export class QuestController * @param completedQuestId Completed quest id * @param questRewards Rewards given to player */ - protected sendSuccessDialogMessageOnQuestComplete(sessionID: string, pmcData: IPmcData, completedQuestId: string, questRewards: Reward[]): void + protected sendSuccessDialogMessageOnQuestComplete( + sessionID: string, + pmcData: IPmcData, + completedQuestId: string, + questRewards: Reward[], + ): void { const quest = this.questHelper.getQuestFromDb(completedQuestId, pmcData); @@ -554,7 +644,8 @@ export class QuestController MessageType.QUEST_SUCCESS, quest.successMessageText, questRewards, - this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime)); + this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime), + ); } /** @@ -569,14 +660,17 @@ export class QuestController for (const quest of quests) { // If quest has prereq of completed quest + availableAfter value > 0 (quest has wait time) - const nextQuestWaitCondition = quest.conditions.AvailableForStart.find(x => x._props.target === completedQuestId && x._props.availableAfter > 0); + const nextQuestWaitCondition = quest.conditions.AvailableForStart.find((x) => + x._props.target === completedQuestId && x._props.availableAfter > 0 + ); if (nextQuestWaitCondition) { // Now + wait time - const availableAfterTimestamp = this.timeUtil.getTimestamp() + nextQuestWaitCondition._props.availableAfter; + const availableAfterTimestamp = this.timeUtil.getTimestamp() + + nextQuestWaitCondition._props.availableAfter; // Update quest in profile with status of AvailableAfter - const existingQuestInProfile = pmcData.Quests.find(x => x.qid === quest._id); + const existingQuestInProfile = pmcData.Quests.find((x) => x.qid === quest._id); if (existingQuestInProfile) { existingQuestInProfile.availableAfter = availableAfterTimestamp; @@ -593,9 +687,9 @@ export class QuestController status: QuestStatus.AvailableAfter, statusTimers: { // eslint-disable-next-line @typescript-eslint/naming-convention - "9": this.timeUtil.getTimestamp() + "9": this.timeUtil.getTimestamp(), }, - availableAfter: availableAfterTimestamp + availableAfter: availableAfterTimestamp, }); } } @@ -617,7 +711,7 @@ export class QuestController return false; } - return x.conditions.Fail.some(y => y._props.target === completedQuestId); + return x.conditions.Fail.some((y) => y._props.target === completedQuestId); }); } @@ -629,23 +723,28 @@ export class QuestController * @param questsToFail quests to fail * @param output Client output */ - protected failQuests(sessionID: string, pmcData: IPmcData, questsToFail: IQuest[], output: IItemEventRouterResponse): void + protected failQuests( + sessionID: string, + pmcData: IPmcData, + questsToFail: IQuest[], + output: IItemEventRouterResponse, + ): void { for (const questToFail of questsToFail) { // Skip failing a quest that has a fail status of something other than success - if (questToFail.conditions.Fail?.some(x => x._props.status?.some(y => y !== QuestStatus.Success))) + if (questToFail.conditions.Fail?.some((x) => x._props.status?.some((y) => y !== QuestStatus.Success))) { continue; } - const isActiveQuestInPlayerProfile = pmcData.Quests.find(y => y.qid === questToFail._id); + const isActiveQuestInPlayerProfile = pmcData.Quests.find((y) => y.qid === questToFail._id); if (isActiveQuestInPlayerProfile) { const failBody: IFailQuestRequestData = { Action: "QuestComplete", qid: questToFail._id, - removeExcessItems: true + removeExcessItems: true, }; this.questHelper.failQuest(pmcData, failBody, sessionID, output); } @@ -657,7 +756,7 @@ export class QuestController qid: questToFail._id, startTime: this.timeUtil.getTimestamp(), statusTimers: statusTimers, - status: QuestStatus.Fail + status: QuestStatus.Fail, }; pmcData.Quests.push(questData); } @@ -671,7 +770,11 @@ export class QuestController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public handoverQuest(pmcData: IPmcData, handoverQuestRequest: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse + public handoverQuest( + pmcData: IPmcData, + handoverQuestRequest: IHandoverQuestRequestData, + sessionID: string, + ): IItemEventRouterResponse { const quest = this.questHelper.getQuestFromDb(handoverQuestRequest.qid, pmcData); const handoverQuestTypes = ["HandoverItem", "WeaponAssembly"]; @@ -684,7 +787,10 @@ export class QuestController let handoverRequirements: AvailableForConditions; for (const condition of quest.conditions.AvailableForFinish) { - if (condition._props.id === handoverQuestRequest.conditionId && handoverQuestTypes.includes(condition._parent)) + if ( + condition._props.id === handoverQuestRequest.conditionId + && handoverQuestTypes.includes(condition._parent) + ) { handedInCount = Number.parseInt(condition._props.value); isItemHandoverQuest = condition._parent === handoverQuestTypes[0]; @@ -697,7 +803,17 @@ export class QuestController if (handedInCount <= 0) { - this.logger.error(this.localisationService.getText("repeatable-quest_handover_failed_condition_already_satisfied", {questId: handoverQuestRequest.qid, conditionId: handoverQuestRequest.conditionId, profileCounter: profileCounter, value: handedInCount})); + this.logger.error( + this.localisationService.getText( + "repeatable-quest_handover_failed_condition_already_satisfied", + { + questId: handoverQuestRequest.qid, + conditionId: handoverQuestRequest.conditionId, + profileCounter: profileCounter, + value: handedInCount, + }, + ), + ); return output; } @@ -710,15 +826,20 @@ export class QuestController { return this.showRepeatableQuestInvalidConditionError(handoverQuestRequest, output); } - + let totalItemCountToRemove = 0; for (const itemHandover of handoverQuestRequest.items) { - const matchingItemInProfile = pmcData.Inventory.items.find(x => x._id === itemHandover.id); + const matchingItemInProfile = pmcData.Inventory.items.find((x) => x._id === itemHandover.id); if (!handoverRequirements._props.target.includes(matchingItemInProfile._tpl)) { // Item handed in by player doesnt match what was requested - return this.showQuestItemHandoverMatchError(handoverQuestRequest, matchingItemInProfile, handoverRequirements, output); + return this.showQuestItemHandoverMatchError( + handoverQuestRequest, + matchingItemInProfile, + handoverRequirements, + output, + ); } // Remove the right quantity of given items @@ -727,7 +848,13 @@ export class QuestController if (itemHandover.count - itemCountToRemove > 0) { // Remove single item with no children - this.questHelper.changeItemStack(pmcData, itemHandover.id, itemHandover.count - itemCountToRemove, sessionID, output); + this.questHelper.changeItemStack( + pmcData, + itemHandover.id, + itemHandover.count - itemCountToRemove, + sessionID, + output, + ); if (totalItemCountToRemove === handedInCount) { break; @@ -740,7 +867,7 @@ export class QuestController let index = pmcData.Inventory.items.length; // Important: don't tell the client to remove the attachments, it will handle it - output.profileChanges[sessionID].items.del.push({ "_id": itemHandover.id }); + output.profileChanges[sessionID].items.del.push({ _id: itemHandover.id }); // Important: loop backward when removing items from the array we're looping on while (index-- > 0) @@ -753,7 +880,12 @@ export class QuestController } } - this.updateProfileBackendCounterValue(pmcData, handoverQuestRequest.conditionId, handoverQuestRequest.qid, totalItemCountToRemove); + this.updateProfileBackendCounterValue( + pmcData, + handoverQuestRequest.conditionId, + handoverQuestRequest.qid, + totalItemCountToRemove, + ); return output; } @@ -764,9 +896,15 @@ export class QuestController * @param output Response to send to user * @returns IItemEventRouterResponse */ - protected showRepeatableQuestInvalidConditionError(handoverQuestRequest: IHandoverQuestRequestData, output: IItemEventRouterResponse): IItemEventRouterResponse + protected showRepeatableQuestInvalidConditionError( + handoverQuestRequest: IHandoverQuestRequestData, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { - const errorMessage = this.localisationService.getText("repeatable-quest_handover_failed_condition_invalid", { questId: handoverQuestRequest.qid, conditionId: handoverQuestRequest.conditionId }); + const errorMessage = this.localisationService.getText("repeatable-quest_handover_failed_condition_invalid", { + questId: handoverQuestRequest.qid, + conditionId: handoverQuestRequest.conditionId, + }); this.logger.error(errorMessage); return this.httpResponseUtil.appendErrorToOutput(output, errorMessage); @@ -780,9 +918,18 @@ export class QuestController * @param output Response to send to user * @returns IItemEventRouterResponse */ - protected showQuestItemHandoverMatchError(handoverQuestRequest: IHandoverQuestRequestData, itemHandedOver: Item, handoverRequirements: AvailableForConditions, output: IItemEventRouterResponse): IItemEventRouterResponse + protected showQuestItemHandoverMatchError( + handoverQuestRequest: IHandoverQuestRequestData, + itemHandedOver: Item, + handoverRequirements: AvailableForConditions, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { - const errorMessage = this.localisationService.getText("quest-handover_wrong_item", { questId: handoverQuestRequest.qid, handedInTpl: itemHandedOver._tpl, requiredTpl: handoverRequirements._props.target[0] }); + const errorMessage = this.localisationService.getText("quest-handover_wrong_item", { + questId: handoverQuestRequest.qid, + handedInTpl: itemHandedOver._tpl, + requiredTpl: handoverRequirements._props.target[0], + }); this.logger.error(errorMessage); return this.httpResponseUtil.appendErrorToOutput(output, errorMessage); @@ -796,7 +943,12 @@ export class QuestController * @param questId quest id counter is associated with * @param counterValue value to increment the backend counter with */ - protected updateProfileBackendCounterValue(pmcData: IPmcData, conditionId: string, questId: string, counterValue: number): void + protected updateProfileBackendCounterValue( + pmcData: IPmcData, + conditionId: string, + questId: string, + counterValue: number, + ): void { if (pmcData.BackendCounters[conditionId] !== undefined) { @@ -804,9 +956,6 @@ export class QuestController return; } - pmcData.BackendCounters[conditionId] = { - "id": conditionId, - "qid": questId, - "value": counterValue }; + pmcData.BackendCounters[conditionId] = { id: conditionId, qid: questId, value: counterValue }; } -} \ No newline at end of file +} diff --git a/project/src/controllers/RagfairController.ts b/project/src/controllers/RagfairController.ts index 0fd7c298..67be1ed4 100644 --- a/project/src/controllers/RagfairController.ts +++ b/project/src/controllers/RagfairController.ts @@ -76,7 +76,7 @@ export class RagfairController @inject("RagfairRequiredItemsService") protected ragfairRequiredItemsService: RagfairRequiredItemsService, @inject("RagfairOfferGenerator") protected ragfairOfferGenerator: RagfairOfferGenerator, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -89,7 +89,7 @@ export class RagfairController const result: IGetOffersResult = { offers: [], offersCount: searchRequest.limit, - selectedCategory: searchRequest.handbookId + selectedCategory: searchRequest.handbookId, }; const pmcProfile = this.profileHelper.getPmcProfile(sessionID); @@ -106,7 +106,11 @@ export class RagfairController this.addIndexValueToOffers(result.offers); // Sort offers - result.offers = this.ragfairSortHelper.sortOffers(result.offers, searchRequest.sortType, searchRequest.sortDirection); + result.offers = this.ragfairSortHelper.sortOffers( + result.offers, + searchRequest.sortType, + searchRequest.sortDirection, + ); // Match offers with quests and lock unfinished quests const profile = this.profileHelper.getFullProfile(sessionID); @@ -120,7 +124,7 @@ export class RagfairController { offer.locked = true; } - + // Update offers BuyRestrictionCurrent/BuyRestrictionMax values this.setTraderOfferPurchaseLimits(offer, profile); this.setTraderOfferStackSize(offer); @@ -132,10 +136,10 @@ export class RagfairController result.offersCount = result.offers.length; // Handle paging before returning results only if searching for general items, not preset items - if (searchRequest.buildCount === 0) + if (searchRequest.buildCount === 0) { const start = searchRequest.page * searchRequest.limit; - const end = Math.min(((searchRequest.page + 1) * searchRequest.limit), result.offers.length); + const end = Math.min((searchRequest.page + 1) * searchRequest.limit, result.offers.length); result.offers = result.offers.slice(start, end); } return result; @@ -149,7 +153,12 @@ export class RagfairController * @param pmcProfile Player profile * @returns array of offers */ - protected getOffersForSearchType(searchRequest: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record, pmcProfile: IPmcData): IRagfairOffer[] + protected getOffersForSearchType( + searchRequest: ISearchRequestData, + itemsToAdd: string[], + traderAssorts: Record, + pmcProfile: IPmcData, + ): IRagfairOffer[] { // Searching for items in preset menu if (searchRequest.buildCount) @@ -172,7 +181,7 @@ export class RagfairController // Linked/required search categories if (this.isLinkedSearch(searchRequest) || this.isRequiredSearch(searchRequest)) { - return this.ragfairServer.getBespokeCategories(offers); + return this.ragfairServer.getBespokeCategories(offers); } // Get all categories @@ -187,11 +196,16 @@ export class RagfairController /** * Add Required offers to offers result * @param searchRequest Client search request data - * @param assorts + * @param assorts * @param pmcProfile Player profile * @param result Result object being sent back to client */ - protected addRequiredOffersToResult(searchRequest: ISearchRequestData, assorts: Record, pmcProfile: IPmcData, result: IGetOffersResult): void + protected addRequiredOffersToResult( + searchRequest: ISearchRequestData, + assorts: Record, + pmcProfile: IPmcData, + result: IGetOffersResult, + ): void { const requiredOffers = this.ragfairRequiredItemsService.getRequiredItemsById(searchRequest.neededSearchId); for (const requiredOffer of requiredOffers) @@ -214,7 +228,7 @@ export class RagfairController for (const offer of offers) { offer.intId = ++counter; - offer.items[0].parentId = ""; //without this it causes error: "Item deserialization error: No parent with id hideout found for item x" + offer.items[0].parentId = ""; // without this it causes error: "Item deserialization error: No parent with id hideout found for item x" } } @@ -239,7 +253,7 @@ export class RagfairController const traderAssorts = this.traderHelper.getTraderAssortsByTraderId(offer.user.id).items; const assortId = offer.items[0]._id; - const assortData = traderAssorts.find(x => x._id === assortId); + const assortData = traderAssorts.find((x) => x._id === assortId); // Use value stored in profile, otherwise use value directly from in-memory trader assort data offer.buyRestrictionCurrent = profile.traderPurchases[offer.user.id][assortId] @@ -258,10 +272,15 @@ export class RagfairController const firstItem = offer.items[0]; const traderAssorts = this.traderHelper.getTraderAssortsByTraderId(offer.user.id).items; - const assortPurchased = traderAssorts.find(x => x._id === offer.items[0]._id); + const assortPurchased = traderAssorts.find((x) => x._id === offer.items[0]._id); if (!assortPurchased) { - this.logger.warning(this.localisationService.getText("ragfair-unable_to_adjust_stack_count_assort_not_found", {offerId: offer.items[0]._id, traderId: offer.user.id})); + this.logger.warning( + this.localisationService.getText("ragfair-unable_to_adjust_stack_count_assort_not_found", { + offerId: offer.items[0]._id, + traderId: offer.user.id, + }), + ); return; } @@ -292,7 +311,7 @@ export class RagfairController /** * Called when creating an offer on flea, fills values in top right corner - * @param getPriceRequest + * @param getPriceRequest * @returns min/avg/max values for an item based on flea offers available */ public getItemMinAvgMaxFleaPriceValues(getPriceRequest: IGetMarketPriceRequestData): IGetItemPriceResult @@ -301,19 +320,16 @@ export class RagfairController let offers = this.ragfairOfferService.getOffersOfType(getPriceRequest.templateId); // Offers exist for item, get averages of what's listed - if (typeof(offers) === "object" && offers.length > 0) + if (typeof offers === "object" && offers.length > 0) { offers = this.ragfairSortHelper.sortOffers(offers, RagfairSort.PRICE); const min = offers[0].requirementsCost; // Get first item from array as its pre-sorted const max = offers.at(-1).requirementsCost; // Get last item from array as its pre-sorted - return { - avg: (min + max) / 2, - min: min, - max: max - }; + return { avg: (min + max) / 2, min: min, max: max }; } - else // No offers listed, get price from live ragfair price list prices.json + // No offers listed, get price from live ragfair price list prices.json + else { const templatesDb = this.databaseServer.getTables().templates; @@ -324,11 +340,7 @@ export class RagfairController tplPrice = this.handbookHelper.getTemplatePrice(getPriceRequest.templateId); } - return { - avg: tplPrice, - min: tplPrice, - max: tplPrice - }; + return { avg: tplPrice, min: tplPrice, max: tplPrice }; } } @@ -339,7 +351,11 @@ export class RagfairController * @param sessionID Session id * @returns IItemEventRouterResponse */ - public addPlayerOffer(pmcData: IPmcData, offerRequest: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse + public addPlayerOffer( + pmcData: IPmcData, + offerRequest: IAddOfferRequestData, + sessionID: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); @@ -351,7 +367,11 @@ export class RagfairController // Get an array of items from player inventory to list on flea const getItemsFromInventoryErrorMessage = ""; - const itemsInInventoryToList = this.getItemsToListOnFleaFromInventory(pmcData, offerRequest.items, getItemsFromInventoryErrorMessage); + const itemsInInventoryToList = this.getItemsToListOnFleaFromInventory( + pmcData, + offerRequest.items, + getItemsFromInventoryErrorMessage, + ); if (!itemsInInventoryToList) { this.httpResponse.appendErrorToOutput(output, getItemsFromInventoryErrorMessage); @@ -360,32 +380,49 @@ export class RagfairController // Checks are done, create the offer const playerListedPriceInRub = this.calculateRequirementsPriceInRub(offerRequest.requirements); const fullProfile = this.saveServer.getProfile(sessionID); - const offer = this.createPlayerOffer(fullProfile, offerRequest.requirements, this.ragfairHelper.mergeStackable(itemsInInventoryToList), offerRequest.sellInOnePiece, playerListedPriceInRub); + const offer = this.createPlayerOffer( + fullProfile, + offerRequest.requirements, + this.ragfairHelper.mergeStackable(itemsInInventoryToList), + offerRequest.sellInOnePiece, + playerListedPriceInRub, + ); const rootItem = offer.items[0]; const qualityMultiplier = this.itemHelper.getItemQualityModifier(rootItem); - const averageOfferPrice = this.ragfairPriceService.getFleaPriceForItem(rootItem._tpl) * rootItem.upd.StackObjectsCount * qualityMultiplier; - const itemStackCount = (offerRequest.sellInOnePiece) - ? 1 - : rootItem.upd.StackObjectsCount; + const averageOfferPrice = this.ragfairPriceService.getFleaPriceForItem(rootItem._tpl) + * rootItem.upd.StackObjectsCount * qualityMultiplier; + const itemStackCount = (offerRequest.sellInOnePiece) ? 1 : rootItem.upd.StackObjectsCount; // Get averaged price of a single item being listed const averageSingleItemPrice = (offerRequest.sellInOnePiece) ? averageOfferPrice / rootItem.upd.StackObjectsCount // Packs are a single offer made of many items : averageOfferPrice / itemStackCount; - + // Get averaged price of listing const averagePlayerListedPriceInRub = (offerRequest.sellInOnePiece) ? playerListedPriceInRub / rootItem.upd.StackObjectsCount : playerListedPriceInRub; // Packs are reduced to the average price of a single item in the pack vs the averaged single price of an item - const sellChancePercent = this.ragfairSellHelper.calculateSellChance(averageSingleItemPrice, averagePlayerListedPriceInRub, qualityMultiplier); + const sellChancePercent = this.ragfairSellHelper.calculateSellChance( + averageSingleItemPrice, + averagePlayerListedPriceInRub, + qualityMultiplier, + ); offer.sellResult = this.ragfairSellHelper.rollForSale(sellChancePercent, itemStackCount); // Subtract flea market fee from stash if (this.ragfairConfig.sell.fees) { - const taxFeeChargeFailed = this.chargePlayerTaxFee(sessionID, rootItem, pmcData, playerListedPriceInRub, itemStackCount, offerRequest, output); + const taxFeeChargeFailed = this.chargePlayerTaxFee( + sessionID, + rootItem, + pmcData, + playerListedPriceInRub, + itemStackCount, + offerRequest, + output, + ); if (taxFeeChargeFailed) { return output; @@ -415,24 +452,41 @@ export class RagfairController * @param output IItemEventRouterResponse * @returns True if charging tax to player failed */ - protected chargePlayerTaxFee(sessionID: string, rootItem: Item, pmcData: IPmcData, requirementsPriceInRub: number, itemStackCount: number, offerRequest: IAddOfferRequestData, output: IItemEventRouterResponse): boolean + protected chargePlayerTaxFee( + sessionID: string, + rootItem: Item, + pmcData: IPmcData, + requirementsPriceInRub: number, + itemStackCount: number, + offerRequest: IAddOfferRequestData, + output: IItemEventRouterResponse, + ): boolean { // Get tax from cache hydrated earlier by client, if that's missing fall back to server calculation (inaccurate) const storedClientTaxValue = this.ragfairTaxService.getStoredClientOfferTaxValueById(offerRequest.items[0]); const tax = storedClientTaxValue ? storedClientTaxValue.fee - : this.ragfairTaxService.calculateTax(rootItem, pmcData, requirementsPriceInRub, itemStackCount, offerRequest.sellInOnePiece); + : this.ragfairTaxService.calculateTax( + rootItem, + pmcData, + requirementsPriceInRub, + itemStackCount, + offerRequest.sellInOnePiece, + ); this.logger.debug(`Offer tax to charge: ${tax}, pulled from client: ${(!!storedClientTaxValue)}`); - //cleanup of cache now we've used the tax value from it + // cleanup of cache now we've used the tax value from it this.ragfairTaxService.clearStoredOfferTaxById(offerRequest.items[0]); const buyTradeRequest = this.createBuyTradeRequestObject("RUB", tax); output = this.paymentService.payMoney(pmcData, buyTradeRequest, sessionID, output); if (output.warnings.length > 0) { - output = this.httpResponse.appendErrorToOutput(output, this.localisationService.getText("ragfair-unable_to_pay_commission_fee", tax)); + output = this.httpResponse.appendErrorToOutput( + output, + this.localisationService.getText("ragfair-unable_to_pay_commission_fee", tax), + ); return true; } @@ -454,7 +508,7 @@ export class RagfairController return false; } - + if (!offerRequest.requirements) { errorMessage = this.localisationService.getText("ragfair-unable_to_place_offer_with_no_requirements"); @@ -462,13 +516,13 @@ export class RagfairController return false; } - + return true; } /** * Get the handbook price in roubles for the items being listed - * @param requirements + * @param requirements * @returns Rouble price */ protected calculateRequirementsPriceInRub(requirements: Requirement[]): number @@ -477,17 +531,18 @@ export class RagfairController for (const item of requirements) { const requestedItemTpl = item._tpl; - + if (this.paymentHelper.isMoneyTpl(requestedItemTpl)) { requirementsPriceInRub += this.handbookHelper.inRUB(item.count, requestedItemTpl); } else { - requirementsPriceInRub += this.ragfairPriceService.getDynamicPriceForItem(requestedItemTpl) * item.count; + requirementsPriceInRub += this.ragfairPriceService.getDynamicPriceForItem(requestedItemTpl) + * item.count; } } - + return requirementsPriceInRub; } @@ -498,16 +553,22 @@ export class RagfairController * @param errorMessage if item is not found, add error message to this parameter * @returns Array of items from player inventory */ - protected getItemsToListOnFleaFromInventory(pmcData: IPmcData, itemIdsFromFleaOfferRequest: string[], errorMessage: string): Item[] + protected getItemsToListOnFleaFromInventory( + pmcData: IPmcData, + itemIdsFromFleaOfferRequest: string[], + errorMessage: string, + ): Item[] { const itemsToReturn = []; // Count how many items are being sold and multiply the requested amount accordingly for (const itemId of itemIdsFromFleaOfferRequest) { - let item = pmcData.Inventory.items.find(i => i._id === itemId); + let item = pmcData.Inventory.items.find((i) => i._id === itemId); if (!item) { - errorMessage = this.localisationService.getText("ragfair-unable_to_find_item_in_inventory", {id: itemId}); + errorMessage = this.localisationService.getText("ragfair-unable_to_find_item_in_inventory", { + id: itemId, + }); this.logger.error(errorMessage); return null; @@ -528,29 +589,31 @@ export class RagfairController return itemsToReturn; } - public createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer + public createPlayerOffer( + profile: IAkiProfile, + requirements: Requirement[], + items: Item[], + sellInOnePiece: boolean, + amountToSend: number, + ): IRagfairOffer { const loyalLevel = 1; - const formattedItems: Item[] = items.map(item => + const formattedItems: Item[] = items.map((item) => { - const isChild = items.find(it => it._id === item.parentId); + const isChild = items.find((it) => it._id === item.parentId); return { _id: item._id, _tpl: item._tpl, - parentId: (isChild) ? item.parentId : "hideout", - slotId: (isChild) ? item.slotId : "hideout", - upd: item.upd + parentId: isChild ? item.parentId : "hideout", + slotId: isChild ? item.slotId : "hideout", + upd: item.upd, }; }); - const formattedRequirements: IBarterScheme[] = requirements.map(item => + const formattedRequirements: IBarterScheme[] = requirements.map((item) => { - return { - _tpl: item._tpl, - count: item.count, - onlyFunctional: item.onlyFunctional - }; + return { _tpl: item._tpl, count: item.count, onlyFunctional: item.onlyFunctional }; }); return this.ragfairOfferGenerator.createFleaOffer( @@ -559,7 +622,7 @@ export class RagfairController formattedItems, formattedRequirements, loyalLevel, - sellInOnePiece + sellInOnePiece, ); } @@ -586,21 +649,31 @@ export class RagfairController const offers = pmcData.RagfairInfo.offers; if (!offers) { - this.logger.warning(this.localisationService.getText("ragfair-unable_to_remove_offer_not_found_in_profile", {profileId: sessionID, offerId: offerId})); + this.logger.warning( + this.localisationService.getText("ragfair-unable_to_remove_offer_not_found_in_profile", { + profileId: sessionID, + offerId: offerId, + }), + ); pmcData.RagfairInfo.offers = []; } - const index = offers.findIndex(offer => offer._id === offerId); + const index = offers.findIndex((offer) => offer._id === offerId); if (index === -1) { - this.logger.error(this.localisationService.getText("ragfair-offer_not_found_in_profile", {offerId: offerId})); - return this.httpResponse.appendErrorToOutput(this.eventOutputHolder.getOutput(sessionID), this.localisationService.getText("ragfair-offer_not_found_in_profile_short")); + this.logger.error( + this.localisationService.getText("ragfair-offer_not_found_in_profile", { offerId: offerId }), + ); + return this.httpResponse.appendErrorToOutput( + this.eventOutputHolder.getOutput(sessionID), + this.localisationService.getText("ragfair-offer_not_found_in_profile_short"), + ); } - const differenceInSeconds = (offers[index].endTime - this.timeUtil.getTimestamp()); - if (differenceInSeconds > this.ragfairConfig.sell.expireSeconds)// expireSeconds Default is 71 seconds - { + const differenceInSeconds = offers[index].endTime - this.timeUtil.getTimestamp(); + if (differenceInSeconds > this.ragfairConfig.sell.expireSeconds) + { // expireSeconds Default is 71 seconds const newEndTime = this.ragfairConfig.sell.expireSeconds + this.timeUtil.getTimestamp(); offers[index].endTime = Math.round(newEndTime); } @@ -613,26 +686,42 @@ export class RagfairController let output = this.eventOutputHolder.getOutput(sessionID); const pmcData = this.saveServer.getProfile(sessionID).characters.pmc; const offers = pmcData.RagfairInfo.offers; - const index = offers.findIndex(offer => offer._id === info.offerId); + const index = offers.findIndex((offer) => offer._id === info.offerId); const secondsToAdd = info.renewalTime * TimeUtil.oneHourAsSeconds; if (index === -1) { - this.logger.warning(this.localisationService.getText("ragfair-offer_not_found_in_profile", {offerId: info.offerId})); - return this.httpResponse.appendErrorToOutput(this.eventOutputHolder.getOutput(sessionID), this.localisationService.getText("ragfair-offer_not_found_in_profile_short")); + this.logger.warning( + this.localisationService.getText("ragfair-offer_not_found_in_profile", { offerId: info.offerId }), + ); + return this.httpResponse.appendErrorToOutput( + this.eventOutputHolder.getOutput(sessionID), + this.localisationService.getText("ragfair-offer_not_found_in_profile_short"), + ); } // MOD: Pay flea market fee if (this.ragfairConfig.sell.fees) { - const count = offers[index].sellInOnePiece ? 1 : offers[index].items.reduce((sum, item) => sum += item.upd.StackObjectsCount, 0); - const tax = this.ragfairTaxService.calculateTax(offers[index].items[0], this.profileHelper.getPmcProfile(sessionID), offers[index].requirementsCost, count, offers[index].sellInOnePiece); + const count = offers[index].sellInOnePiece + ? 1 + : offers[index].items.reduce((sum, item) => sum += item.upd.StackObjectsCount, 0); + const tax = this.ragfairTaxService.calculateTax( + offers[index].items[0], + this.profileHelper.getPmcProfile(sessionID), + offers[index].requirementsCost, + count, + offers[index].sellInOnePiece, + ); const request = this.createBuyTradeRequestObject("RUB", tax); output = this.paymentService.payMoney(pmcData, request, sessionID, output); if (output.warnings.length > 0) { - return this.httpResponse.appendErrorToOutput(output, this.localisationService.getText("ragfair-unable_to_pay_commission_fee")); + return this.httpResponse.appendErrorToOutput( + output, + this.localisationService.getText("ragfair-unable_to_pay_commission_fee"), + ); } } @@ -653,18 +742,13 @@ export class RagfairController tid: "ragfair", Action: "TradingConfirm", // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_items: [ - { - id: this.paymentHelper.getCurrency(currency), - count: Math.round(value) - } - ], + scheme_items: [{ id: this.paymentHelper.getCurrency(currency), count: Math.round(value) }], type: "", // eslint-disable-next-line @typescript-eslint/naming-convention item_id: "", count: 0, // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_id: 0 + scheme_id: 0, }; } -} \ No newline at end of file +} diff --git a/project/src/controllers/RepairController.ts b/project/src/controllers/RepairController.ts index 37fc25a6..0c5607f0 100644 --- a/project/src/controllers/RepairController.ts +++ b/project/src/controllers/RepairController.ts @@ -27,9 +27,9 @@ export class RepairController @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("PaymentService") protected paymentService: PaymentService, @inject("RepairHelper") protected repairHelper: RepairHelper, - @inject("RepairService") protected repairService: RepairService + @inject("RepairService") protected repairService: RepairService, ) - { } + {} /** * Handle TraderRepair event @@ -39,16 +39,27 @@ export class RepairController * @param pmcData player profile * @returns item event router action */ - public traderRepair(sessionID: string, body: ITraderRepairActionDataRequest, pmcData: IPmcData): IItemEventRouterResponse + public traderRepair( + sessionID: string, + body: ITraderRepairActionDataRequest, + pmcData: IPmcData, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionID); - + // find the item to repair for (const repairItem of body.repairItems) { const repairDetails = this.repairService.repairItemByTrader(sessionID, pmcData, repairItem, body.tid); - this.repairService.payForRepair(sessionID, pmcData, repairItem._id, repairDetails.repairCost, body.tid, output); + this.repairService.payForRepair( + sessionID, + pmcData, + repairItem._id, + repairDetails.repairCost, + body.tid, + output, + ); if (output.warnings.length > 0) { @@ -78,7 +89,13 @@ export class RepairController const output = this.eventOutputHolder.getOutput(sessionID); // repair item - const repairDetails = this.repairService.repairItemByKit(sessionID, pmcData, body.repairKitsInfo, body.target, output); + const repairDetails = this.repairService.repairItemByKit( + sessionID, + pmcData, + body.repairKitsInfo, + body.target, + output, + ); this.repairService.addBuffToItem(repairDetails, pmcData); @@ -90,4 +107,4 @@ export class RepairController return output; } -} \ No newline at end of file +} diff --git a/project/src/controllers/RepeatableQuestController.ts b/project/src/controllers/RepeatableQuestController.ts index e9337c0a..8c119a03 100644 --- a/project/src/controllers/RepeatableQuestController.ts +++ b/project/src/controllers/RepeatableQuestController.ts @@ -7,7 +7,11 @@ import { RagfairServerHelper } from "@spt-aki/helpers/RagfairServerHelper"; import { RepeatableQuestHelper } from "@spt-aki/helpers/RepeatableQuestHelper"; import { IEmptyRequestData } from "@spt-aki/models/eft/common/IEmptyRequestData"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; -import { IChangeRequirement, IPmcDataRepeatableQuest, IRepeatableQuest } from "@spt-aki/models/eft/common/tables/IRepeatableQuests"; +import { + IChangeRequirement, + IPmcDataRepeatableQuest, + IRepeatableQuest, +} from "@spt-aki/models/eft/common/tables/IRepeatableQuests"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; import { IRepeatableQuestChangeRequest } from "@spt-aki/models/eft/quests/IRepeatableQuestChangeRequest"; import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; @@ -50,13 +54,12 @@ export class RepeatableQuestController @inject("RepeatableQuestGenerator") protected repeatableQuestGenerator: RepeatableQuestGenerator, @inject("RepeatableQuestHelper") protected repeatableQuestHelper: RepeatableQuestHelper, @inject("QuestHelper") protected questHelper: QuestHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.questConfig = this.configServer.getConfig(ConfigTypes.QUEST); } - /** * Handle client/repeatalbeQuests/activityPeriods * Returns an array of objects in the format of repeatable quests to the client. @@ -78,7 +81,6 @@ export class RepeatableQuestController * (if the are on "Succeed" but not "Completed" we keep them, to allow the player to complete them and get the rewards) * The new quests generated are again persisted in profile.RepeatableQuests * - * * @param {string} sessionId Player's session id * @returns {array} array of "repeatableQuestObjects" as descibed above */ @@ -87,17 +89,19 @@ export class RepeatableQuestController const returnData: Array = []; const pmcData = this.profileHelper.getPmcProfile(sessionID); const time = this.timeUtil.getTimestamp(); - const scavQuestUnlocked = pmcData?.Hideout?.Areas?.find(hideoutArea => hideoutArea.type === HideoutAreas.INTEL_CENTER)?.level >= 1; - + const scavQuestUnlocked = + pmcData?.Hideout?.Areas?.find((hideoutArea) => hideoutArea.type === HideoutAreas.INTEL_CENTER)?.level >= 1; + // Daily / weekly / Daily_Savage for (const repeatableConfig of this.questConfig.repeatableQuests) { // get daily/weekly data from profile, add empty object if missing const currentRepeatableQuestType = this.getRepeatableQuestSubTypeFromProfile(repeatableConfig, pmcData); - - if (repeatableConfig.side === "Pmc" - && pmcData.Info.Level >= repeatableConfig.minPlayerLevel - || repeatableConfig.side === "Scav" && scavQuestUnlocked) + + if ( + repeatableConfig.side === "Pmc" && pmcData.Info.Level >= repeatableConfig.minPlayerLevel + || repeatableConfig.side === "Scav" && scavQuestUnlocked + ) { if (time > currentRepeatableQuestType.endTime - 1) { @@ -110,22 +114,24 @@ export class RepeatableQuestController // after a raid (the client seems to keep quests internally and we want to get rid of old repeatable quests) // and remove them from the PMC's Quests and RepeatableQuests[i].activeQuests const questsToKeep = []; - //for (let i = 0; i < currentRepeatable.activeQuests.length; i++) + // for (let i = 0; i < currentRepeatable.activeQuests.length; i++) for (const activeQuest of currentRepeatableQuestType.activeQuests) { // check if the quest is ready to be completed, if so, don't remove it - const quest = pmcData.Quests.filter(q => q.qid === activeQuest._id); + const quest = pmcData.Quests.filter((q) => q.qid === activeQuest._id); if (quest.length > 0) { if (quest[0].status === QuestStatus.AvailableForFinish) { questsToKeep.push(activeQuest); - this.logger.debug(`Keeping repeatable quest ${activeQuest._id} in activeQuests since it is available to AvailableForFinish`); + this.logger.debug( + `Keeping repeatable quest ${activeQuest._id} in activeQuests since it is available to AvailableForFinish`, + ); continue; } } this.profileFixerService.removeDanglingConditionCounters(pmcData); - pmcData.Quests = pmcData.Quests.filter(q => q.qid !== activeQuest._id); + pmcData.Quests = pmcData.Quests.filter((q) => q.qid !== activeQuest._id); currentRepeatableQuestType.inactiveQuests.push(activeQuest); } currentRepeatableQuestType.activeQuests = questsToKeep; @@ -144,12 +150,14 @@ export class RepeatableQuestController pmcData.Info.Level, pmcData.TradersInfo, questTypePool, - repeatableConfig + repeatableConfig, ); lifeline++; if (lifeline > 10) { - this.logger.debug("We were stuck in repeatable quest generation. This should never happen. Please report"); + this.logger.debug( + "We were stuck in repeatable quest generation. This should never happen. Please report", + ); break; } } @@ -174,7 +182,7 @@ export class RepeatableQuestController { currentRepeatableQuestType.changeRequirement[quest._id] = { changeCost: quest.changeCost, - changeStandingCost: this.randomUtil.getArrayValue([0, 0.01]) + changeStandingCost: this.randomUtil.getArrayValue([0, 0.01]), }; } @@ -184,7 +192,7 @@ export class RepeatableQuestController endTime: currentRepeatableQuestType.endTime, activeQuests: currentRepeatableQuestType.activeQuests, inactiveQuests: currentRepeatableQuestType.inactiveQuests, - changeRequirement: currentRepeatableQuestType.changeRequirement + changeRequirement: currentRepeatableQuestType.changeRequirement, }); } @@ -199,10 +207,15 @@ export class RepeatableQuestController */ protected getQuestCount(repeatableConfig: IRepeatableQuestConfig, pmcData: IPmcData): number { - if (repeatableConfig.name.toLowerCase() === "daily" && this.profileHelper.hasEliteSkillLevel(SkillTypes.CHARISMA, pmcData)) + if ( + repeatableConfig.name.toLowerCase() === "daily" + && this.profileHelper.hasEliteSkillLevel(SkillTypes.CHARISMA, pmcData) + ) { // Elite charisma skill gives extra daily quest(s) - return repeatableConfig.numQuests + this.databaseServer.getTables().globals.config.SkillsSettings.Charisma.BonusSettings.EliteBonusSettings.RepeatableQuestExtraCount; + return repeatableConfig.numQuests + + this.databaseServer.getTables().globals.config.SkillsSettings.Charisma.BonusSettings + .EliteBonusSettings.RepeatableQuestExtraCount; } return repeatableConfig.numQuests; @@ -214,10 +227,13 @@ export class RepeatableQuestController * @param pmcData Profile to search * @returns IPmcDataRepeatableQuest */ - protected getRepeatableQuestSubTypeFromProfile(repeatableConfig: IRepeatableQuestConfig, pmcData: IPmcData): IPmcDataRepeatableQuest + protected getRepeatableQuestSubTypeFromProfile( + repeatableConfig: IRepeatableQuestConfig, + pmcData: IPmcData, + ): IPmcDataRepeatableQuest { // Get from profile, add if missing - let repeatableQuestDetails = pmcData.RepeatableQuests.find(x => x.name === repeatableConfig.name); + let repeatableQuestDetails = pmcData.RepeatableQuests.find((x) => x.name === repeatableConfig.name); if (!repeatableQuestDetails) { repeatableQuestDetails = { @@ -226,7 +242,7 @@ export class RepeatableQuestController activeQuests: [], inactiveQuests: [], endTime: 0, - changeRequirement: {} + changeRequirement: {}, }; // Add base object that holds repeatable data to profile @@ -288,7 +304,7 @@ export class RepeatableQuestController } // Add "any" to pickup quest pool - questPool.pool.Pickup.locations["any"] = ["any"]; + questPool.pool.Pickup.locations.any = ["any"]; const eliminationConfig = this.repeatableQuestHelper.getEliminationConfigByPmcLevel(pmcLevel, repeatableConfig); const targetsConfig = this.repeatableQuestHelper.probabilityObjectArray(eliminationConfig.targets); @@ -305,7 +321,7 @@ export class RepeatableQuestController // Set possible locations for elimination task, ift arget is savage, exclude labs from locations questPool.pool.Elimination.targets[probabilityObject.key] = (probabilityObject.key === "Savage") - ? { locations: possibleLocations.filter(x => x !== "laboratory")} + ? { locations: possibleLocations.filter((x) => x !== "laboratory") } : { locations: possibleLocations }; } } @@ -317,17 +333,7 @@ export class RepeatableQuestController { return { types: repeatableConfig.types.slice(), - pool: { - Exploration: { - locations: {} - }, - Elimination: { - targets: {} - }, - Pickup: { - locations: {} - } - } + pool: { Exploration: { locations: {} }, Elimination: { targets: {} }, Pickup: { locations: {} } }, }; } @@ -355,7 +361,11 @@ export class RepeatableQuestController /** * Handle RepeatableQuestChange event */ - public changeRepeatableQuest(pmcData: IPmcData, changeRequest: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse + public changeRepeatableQuest( + pmcData: IPmcData, + changeRequest: IRepeatableQuestChangeRequest, + sessionID: string, + ): IItemEventRouterResponse { let repeatableToChange: IPmcDataRepeatableQuest; let changeRequirement: IChangeRequirement; @@ -367,24 +377,28 @@ export class RepeatableQuestController for (const currentRepeatablePool of pmcData.RepeatableQuests) { // Check for existing quest in (daily/weekly/scav arrays) - const questToReplace = currentRepeatablePool.activeQuests.find(x => x._id === changeRequest.qid); + const questToReplace = currentRepeatablePool.activeQuests.find((x) => x._id === changeRequest.qid); if (!questToReplace) { continue; } - + // Save for later standing loss calculation replacedQuestTraderId = questToReplace.traderId; // Update active quests to exclude the quest we're replacing - currentRepeatablePool.activeQuests = currentRepeatablePool.activeQuests.filter(x => x._id !== changeRequest.qid); + currentRepeatablePool.activeQuests = currentRepeatablePool.activeQuests.filter((x) => + x._id !== changeRequest.qid + ); // Get cost to replace existing quest changeRequirement = this.jsonUtil.clone(currentRepeatablePool.changeRequirement[changeRequest.qid]); delete currentRepeatablePool.changeRequirement[changeRequest.qid]; // TODO: somehow we need to reduce the questPool by the currently active quests (for all repeatables) - - const repeatableConfig = this.questConfig.repeatableQuests.find(x => x.name === currentRepeatablePool.name); + + const repeatableConfig = this.questConfig.repeatableQuests.find((x) => + x.name === currentRepeatablePool.name + ); const questTypePool = this.generateQuestPool(repeatableConfig, pmcData.Info.Level); const newRepeatableQuest = this.attemptToGenerateRepeatableQuest(pmcData, questTypePool, repeatableConfig); if (newRepeatableQuest) @@ -394,16 +408,19 @@ export class RepeatableQuestController currentRepeatablePool.activeQuests.push(newRepeatableQuest); currentRepeatablePool.changeRequirement[newRepeatableQuest._id] = { changeCost: newRepeatableQuest.changeCost, - changeStandingCost: this.randomUtil.getArrayValue([0, 0.01]) + changeStandingCost: this.randomUtil.getArrayValue([0, 0.01]), }; const fullProfile = this.profileHelper.getFullProfile(sessionID); // Find quest we're replacing in pmc profile quests array and remove it this.questHelper.findAndRemoveQuestFromArrayIfExists(questToReplace._id, pmcData.Quests); - + // Find quest we're replacing in scav profile quests array and remove it - this.questHelper.findAndRemoveQuestFromArrayIfExists(questToReplace._id, fullProfile.characters.scav?.Quests ?? []); + this.questHelper.findAndRemoveQuestFromArrayIfExists( + questToReplace._id, + fullProfile.characters.scav?.Quests ?? [], + ); } // Found and replaced the quest in current repeatable @@ -442,7 +459,11 @@ export class RepeatableQuestController return output; } - protected attemptToGenerateRepeatableQuest(pmcData: IPmcData, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest + protected attemptToGenerateRepeatableQuest( + pmcData: IPmcData, + questTypePool: IQuestTypePool, + repeatableConfig: IRepeatableQuestConfig, + ): IRepeatableQuest { let newRepeatableQuest: IRepeatableQuest = null; let attemptsToGenerateQuest = 0; @@ -452,12 +473,14 @@ export class RepeatableQuestController pmcData.Info.Level, pmcData.TradersInfo, questTypePool, - repeatableConfig + repeatableConfig, ); attemptsToGenerateQuest++; if (attemptsToGenerateQuest > 10) { - this.logger.debug("We were stuck in repeatable quest generation. This should never happen. Please report"); + this.logger.debug( + "We were stuck in repeatable quest generation. This should never happen. Please report", + ); break; } } diff --git a/project/src/controllers/TradeController.ts b/project/src/controllers/TradeController.ts index c891fd97..0f2e5a90 100644 --- a/project/src/controllers/TradeController.ts +++ b/project/src/controllers/TradeController.ts @@ -46,7 +46,7 @@ class TradeController @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("RagfairPriceService") protected ragfairPriceService: RagfairPriceService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -54,34 +54,56 @@ class TradeController } /** Handle TradingConfirm event */ - public confirmTrading(pmcData: IPmcData, request: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse + public confirmTrading( + pmcData: IPmcData, + request: IProcessBaseTradeRequestData, + sessionID: string, + ): IItemEventRouterResponse { return this.confirmTradingInternal(pmcData, request, sessionID, this.traderConfig.purchasesAreFoundInRaid); } /** Handle RagFairBuyOffer event */ - public confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse + public confirmRagfairTrading( + pmcData: IPmcData, + body: IProcessRagfairTradeRequestData, + sessionID: string, + ): IItemEventRouterResponse { let output = this.eventOutputHolder.getOutput(sessionID); for (const offer of body.offers) { const fleaOffer = this.ragfairServer.getOffer(offer.id); - if (!fleaOffer) + if (!fleaOffer) { - return this.httpResponse.appendErrorToOutput(output, `Offer with ID ${offer.id} not found`, BackendErrorCodes.OFFERNOTFOUND); + return this.httpResponse.appendErrorToOutput( + output, + `Offer with ID ${offer.id} not found`, + BackendErrorCodes.OFFERNOTFOUND, + ); } if (offer.count === 0) { - const errorMessage = this.localisationService.getText("ragfair-unable_to_purchase_0_count_item", this.itemHelper.getItem(fleaOffer.items[0]._tpl)[1]._name); + const errorMessage = this.localisationService.getText( + "ragfair-unable_to_purchase_0_count_item", + this.itemHelper.getItem(fleaOffer.items[0]._tpl)[1]._name, + ); return this.httpResponse.appendErrorToOutput(output, errorMessage, BackendErrorCodes.OFFEROUTOFSTOCK); } // Skip buying items when player doesn't have necessary loyalty - if (fleaOffer.user.memberType === MemberCategory.TRADER && fleaOffer.loyaltyLevel > pmcData.TradersInfo[fleaOffer.user.id].loyaltyLevel) + if ( + fleaOffer.user.memberType === MemberCategory.TRADER + && fleaOffer.loyaltyLevel > pmcData.TradersInfo[fleaOffer.user.id].loyaltyLevel + ) { - this.logger.debug(`Unable to buy item: ${fleaOffer.items[0]._tpl} from trader: ${fleaOffer.user.id} as loyalty level too low, skipping`); + this.logger.debug( + `Unable to buy item: ${ + fleaOffer.items[0]._tpl + } from trader: ${fleaOffer.user.id} as loyalty level too low, skipping`, + ); continue; } @@ -97,11 +119,17 @@ class TradeController // eslint-disable-next-line @typescript-eslint/naming-convention scheme_id: 0, // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_items: offer.items + scheme_items: offer.items, }; // confirmTrading() must occur prior to removing the offer stack, otherwise item inside offer doesn't exist for confirmTrading() to use - output = this.confirmTradingInternal(pmcData, buyData, sessionID, this.ragfairConfig.dynamic.purchasesAreFoundInRaid, fleaOffer.items[0].upd); + output = this.confirmTradingInternal( + pmcData, + buyData, + sessionID, + this.ragfairConfig.dynamic.purchasesAreFoundInRaid, + fleaOffer.items[0].upd, + ); if (fleaOffer.user.memberType !== MemberCategory.TRADER) { // remove player item offer stack @@ -113,12 +141,19 @@ class TradeController } /** Handle SellAllFromSavage event */ - public sellScavItemsToFence(pmcData: IPmcData, body: ISellScavItemsToFenceRequestData, sessionId: string): IItemEventRouterResponse + public sellScavItemsToFence( + pmcData: IPmcData, + body: ISellScavItemsToFenceRequestData, + sessionId: string, + ): IItemEventRouterResponse { const scavProfile = this.profileHelper.getFullProfile(sessionId)?.characters?.scav; if (!scavProfile) { - return this.httpResponse.appendErrorToOutput(this.eventOutputHolder.getOutput(sessionId), `Profile ${body.fromOwner.id} has no scav account`); + return this.httpResponse.appendErrorToOutput( + this.eventOutputHolder.getOutput(sessionId), + `Profile ${body.fromOwner.id} has no scav account`, + ); } return this.sellInventoryToTrader(sessionId, scavProfile, pmcData, Traders.FENCE); @@ -128,12 +163,17 @@ class TradeController * Sell all sellable items to a trader from inventory * WILL DELETE ITEMS FROM INVENTORY + CHILDREN OF ITEMS SOLD * @param sessionId Session id - * @param profileWithItemsToSell Profile with items to be sold to trader + * @param profileWithItemsToSell Profile with items to be sold to trader * @param profileThatGetsMoney Profile that gets the money after selling items * @param trader Trader to sell items to * @returns IItemEventRouterResponse */ - protected sellInventoryToTrader(sessionId: string, profileWithItemsToSell: IPmcData, profileThatGetsMoney: IPmcData, trader: Traders): IItemEventRouterResponse + protected sellInventoryToTrader( + sessionId: string, + profileWithItemsToSell: IPmcData, + profileThatGetsMoney: IPmcData, + trader: Traders, + ): IItemEventRouterResponse { const handbookPrices = this.ragfairPriceService.getAllStaticPrices(); // TODO, apply trader sell bonuses? @@ -145,20 +185,31 @@ class TradeController type: "sell_to_trader", tid: trader, price: 0, - items: [] + items: [], }; // Get all base items that scav has (primaryweapon/backpack/pockets etc) // Add items that trader will buy (only sell items that have the container as parent) to request object - const containerAndEquipmentItems = profileWithItemsToSell.Inventory.items.filter(x => x.parentId === profileWithItemsToSell.Inventory.equipment); + const containerAndEquipmentItems = profileWithItemsToSell.Inventory.items.filter((x) => + x.parentId === profileWithItemsToSell.Inventory.equipment + ); for (const itemToSell of containerAndEquipmentItems) { // Increment sell price in request - sellRequest.price += this.getPriceOfItemAndChildren(itemToSell._id, profileWithItemsToSell.Inventory.items, handbookPrices, traderDetails); + sellRequest.price += this.getPriceOfItemAndChildren( + itemToSell._id, + profileWithItemsToSell.Inventory.items, + handbookPrices, + traderDetails, + ); // Add item details to request // eslint-disable-next-line @typescript-eslint/naming-convention - sellRequest.items.push({id: itemToSell._id, count: itemToSell?.upd?.StackObjectsCount ?? 1, scheme_id: 0}); + sellRequest.items.push({ + id: itemToSell._id, + count: itemToSell?.upd?.StackObjectsCount ?? 1, + scheme_id: 0, + }); } this.logger.debug(`Selling scav items to fence for ${sellRequest.price} roubles`); return this.tradeHelper.sellItem(profileWithItemsToSell, profileThatGetsMoney, sellRequest, sessionId); @@ -172,7 +223,12 @@ class TradeController * @param traderDetails Trader being sold to to perform buy category check against * @returns Rouble price */ - protected getPriceOfItemAndChildren(parentItemId: string, items: Item[], handbookPrices: Record, traderDetails: ITraderBase): number + protected getPriceOfItemAndChildren( + parentItemId: string, + items: Item[], + handbookPrices: Record, + traderDetails: ITraderBase, + ): number { const itemWithChildren = this.itemHelper.findAndReturnChildrenAsItems(items, parentItemId); @@ -180,7 +236,10 @@ class TradeController for (const itemToSell of itemWithChildren) { const itemDetails = this.itemHelper.getItem(itemToSell._tpl); - if (!(itemDetails[0] && this.itemHelper.isOfBaseclasses(itemDetails[1]._id, traderDetails.items_buy.category))) + if ( + !(itemDetails[0] + && this.itemHelper.isOfBaseclasses(itemDetails[1]._id, traderDetails.items_buy.category)) + ) { // Skip if tpl isnt item OR item doesn't fulfill match traders buy categories continue; @@ -193,7 +252,13 @@ class TradeController return totalPrice; } - protected confirmTradingInternal(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid = false, upd: Upd = null): IItemEventRouterResponse + protected confirmTradingInternal( + pmcData: IPmcData, + body: IProcessBaseTradeRequestData, + sessionID: string, + foundInRaid = false, + upd: Upd = null, + ): IItemEventRouterResponse { // buying if (body.type === "buy_from_trader") @@ -213,5 +278,4 @@ class TradeController } } -export { TradeController }; - +export {TradeController}; diff --git a/project/src/controllers/TraderController.ts b/project/src/controllers/TraderController.ts index de7fc77d..29301929 100644 --- a/project/src/controllers/TraderController.ts +++ b/project/src/controllers/TraderController.ts @@ -23,12 +23,13 @@ export class TraderController @inject("ProfileHelper") protected profileHelper: ProfileHelper, @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("TraderAssortService") protected traderAssortService: TraderAssortService, - @inject("TraderPurchasePersisterService") protected traderPurchasePersisterService: TraderPurchasePersisterService, + @inject("TraderPurchasePersisterService") protected traderPurchasePersisterService: + TraderPurchasePersisterService, @inject("FenceService") protected fenceService: FenceService, @inject("FenceBaseAssortGenerator") protected fenceBaseAssortGenerator: FenceBaseAssortGenerator, - @inject("JsonUtil") protected jsonUtil: JsonUtil + @inject("JsonUtil") protected jsonUtil: JsonUtil, ) - { } + {} /** * Runs when onLoad event is fired @@ -93,7 +94,7 @@ export class TraderController } const trader = this.databaseServer.getTables().traders[traderId]; - + // trader needs to be refreshed if (this.traderAssortHelper.traderAssortsHaveExpired(traderId)) { @@ -132,7 +133,7 @@ export class TraderController } } - return traders.sort((a, b) => this.sortByTraderId(a,b)); + return traders.sort((a, b) => this.sortByTraderId(a, b)); } /** @@ -167,4 +168,4 @@ export class TraderController { return this.traderAssortHelper.getAssort(sessionId, traderId); } -} \ No newline at end of file +} diff --git a/project/src/controllers/WeatherController.ts b/project/src/controllers/WeatherController.ts index 216424f6..7c695b91 100644 --- a/project/src/controllers/WeatherController.ts +++ b/project/src/controllers/WeatherController.ts @@ -15,7 +15,7 @@ export class WeatherController constructor( @inject("WeatherGenerator") protected weatherGenerator: WeatherGenerator, @inject("WinstonLogger") protected logger: ILogger, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.weatherConfig = this.configServer.getConfig(ConfigTypes.WEATHER); @@ -24,12 +24,7 @@ export class WeatherController /** Handle client/weather */ public generate(): IWeatherData { - let result: IWeatherData = { - acceleration: 0, - time: "", - date: "", - weather: null - }; + let result: IWeatherData = { acceleration: 0, time: "", date: "", weather: null }; result = this.weatherGenerator.calculateGameTime(result); result.weather = this.weatherGenerator.generateWeather(); @@ -45,4 +40,4 @@ export class WeatherController { return this.weatherGenerator.getInRaidTime(new Date()); } -} \ No newline at end of file +} diff --git a/project/src/controllers/WishlistController.ts b/project/src/controllers/WishlistController.ts index eaa7d8e4..e6ef50d4 100644 --- a/project/src/controllers/WishlistController.ts +++ b/project/src/controllers/WishlistController.ts @@ -8,10 +8,8 @@ import { EventOutputHolder } from "@spt-aki/routers/EventOutputHolder"; @injectable() export class WishlistController { - constructor( - @inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder - ) - { } + constructor(@inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder) + {} /** Handle AddToWishList */ public addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse @@ -43,4 +41,4 @@ export class WishlistController return this.eventOutputHolder.getOutput(sessionID); } -} \ No newline at end of file +} diff --git a/project/src/di/Container.ts b/project/src/di/Container.ts index 2e0beef5..a9be6006 100644 --- a/project/src/di/Container.ts +++ b/project/src/di/Container.ts @@ -249,16 +249,15 @@ import { WinstonRequestLogger } from "@spt-aki/utils/logging/WinstonRequestLogge /** * Handle the registration of classes to be used by the Dependency Injection code */ -export class Container +export class Container { - - public static registerPostLoadTypes(container: DependencyContainer, childContainer: DependencyContainer):void + public static registerPostLoadTypes(container: DependencyContainer, childContainer: DependencyContainer): void { - container.register("AkiHttpListener", AkiHttpListener, {lifecycle: Lifecycle.Singleton}); + container.register("AkiHttpListener", AkiHttpListener, { lifecycle: Lifecycle.Singleton }); childContainer.registerType("HttpListener", "AkiHttpListener"); } - public static registerTypes(depContainer: DependencyContainer): void + public static registerTypes(depContainer: DependencyContainer): void { depContainer.register("ApplicationContext", ApplicationContext, { lifecycle: Lifecycle.Singleton }); Container.registerUtils(depContainer); @@ -274,13 +273,13 @@ export class Container Container.registerCallbacks(depContainer); Container.registerServers(depContainer); - + Container.registerServices(depContainer); Container.registerControllers(depContainer); } - public static registerListTypes(depContainer: DependencyContainer): void + public static registerListTypes(depContainer: DependencyContainer): void { depContainer.register("OnLoadModService", { useValue: new OnLoadModService(depContainer) }); depContainer.register("HttpListenerModService", { useValue: new HttpListenerModService(depContainer) }); @@ -359,18 +358,24 @@ export class Container depContainer.registerType("SaveLoadRouter", "ProfileSaveLoadRouter"); } - private static registerUtils(depContainer: DependencyContainer): void + private static registerUtils(depContainer: DependencyContainer): void { // Utils depContainer.register("App", App, { lifecycle: Lifecycle.Singleton }); - depContainer.register("DatabaseImporter", DatabaseImporter, { lifecycle: Lifecycle.Singleton }); + depContainer.register("DatabaseImporter", DatabaseImporter, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("HashUtil", HashUtil, { lifecycle: Lifecycle.Singleton }); depContainer.register("ImporterUtil", ImporterUtil, { lifecycle: Lifecycle.Singleton }); depContainer.register("HttpResponseUtil", HttpResponseUtil); depContainer.register("EncodingUtil", EncodingUtil, { lifecycle: Lifecycle.Singleton }); depContainer.register("JsonUtil", JsonUtil); - depContainer.register("WinstonLogger", WinstonMainLogger, { lifecycle: Lifecycle.Singleton }); - depContainer.register("RequestsLogger", WinstonRequestLogger, { lifecycle: Lifecycle.Singleton }); + depContainer.register("WinstonLogger", WinstonMainLogger, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("RequestsLogger", WinstonRequestLogger, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("MathUtil", MathUtil, { lifecycle: Lifecycle.Singleton }); depContainer.register("ObjectId", ObjectId); depContainer.register("RandomUtil", RandomUtil, { lifecycle: Lifecycle.Singleton }); @@ -385,18 +390,22 @@ export class Container depContainer.register("ModTypeCheck", ModTypeCheck, { lifecycle: Lifecycle.Singleton }); } - private static registerRouters(depContainer: DependencyContainer): void + private static registerRouters(depContainer: DependencyContainer): void { // Routers depContainer.register("HttpRouter", HttpRouter, { lifecycle: Lifecycle.Singleton }); depContainer.register("ImageRouter", ImageRouter); - depContainer.register("EventOutputHolder", EventOutputHolder, { lifecycle: Lifecycle.Singleton }); + depContainer.register("EventOutputHolder", EventOutputHolder, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("ItemEventRouter", ItemEventRouter); // Dynamic routes depContainer.register("BotDynamicRouter", { useClass: BotDynamicRouter }); depContainer.register("BundleDynamicRouter", { useClass: BundleDynamicRouter }); - depContainer.register("CustomizationDynamicRouter", { useClass: CustomizationDynamicRouter }); + depContainer.register("CustomizationDynamicRouter", { + useClass: CustomizationDynamicRouter, + }); depContainer.register("DataDynamicRouter", { useClass: DataDynamicRouter }); depContainer.register("HttpDynamicRouter", { useClass: HttpDynamicRouter }); depContainer.register("InraidDynamicRouter", { useClass: InraidDynamicRouter }); @@ -405,23 +414,35 @@ export class Container depContainer.register("TraderDynamicRouter", { useClass: TraderDynamicRouter }); // Item event routes - depContainer.register("CustomizationItemEventRouter", { useClass: CustomizationItemEventRouter }); + depContainer.register("CustomizationItemEventRouter", { + useClass: CustomizationItemEventRouter, + }); depContainer.register("HealthItemEventRouter", { useClass: HealthItemEventRouter }); depContainer.register("HideoutItemEventRouter", { useClass: HideoutItemEventRouter }); - depContainer.register("InsuranceItemEventRouter", { useClass: InsuranceItemEventRouter }); - depContainer.register("InventoryItemEventRouter", { useClass: InventoryItemEventRouter }); + depContainer.register("InsuranceItemEventRouter", { + useClass: InsuranceItemEventRouter, + }); + depContainer.register("InventoryItemEventRouter", { + useClass: InventoryItemEventRouter, + }); depContainer.register("NoteItemEventRouter", { useClass: NoteItemEventRouter }); - depContainer.register("PresetBuildItemEventRouter", { useClass: PresetBuildItemEventRouter }); + depContainer.register("PresetBuildItemEventRouter", { + useClass: PresetBuildItemEventRouter, + }); depContainer.register("QuestItemEventRouter", { useClass: QuestItemEventRouter }); depContainer.register("RagfairItemEventRouter", { useClass: RagfairItemEventRouter }); depContainer.register("RepairItemEventRouter", { useClass: RepairItemEventRouter }); depContainer.register("TradeItemEventRouter", { useClass: TradeItemEventRouter }); - depContainer.register("WishlistItemEventRouter", { useClass: WishlistItemEventRouter }); + depContainer.register("WishlistItemEventRouter", { + useClass: WishlistItemEventRouter, + }); // save load routes depContainer.register("HealthSaveLoadRouter", { useClass: HealthSaveLoadRouter }); depContainer.register("InraidSaveLoadRouter", { useClass: InraidSaveLoadRouter }); - depContainer.register("InsuranceSaveLoadRouter", { useClass: InsuranceSaveLoadRouter }); + depContainer.register("InsuranceSaveLoadRouter", { + useClass: InsuranceSaveLoadRouter, + }); depContainer.register("ProfileSaveLoadRouter", { useClass: ProfileSaveLoadRouter }); // Route serializers @@ -433,7 +454,9 @@ export class Container depContainer.register("BotStaticRouter", { useClass: BotStaticRouter }); depContainer.register("BundleStaticRouter", { useClass: BundleStaticRouter }); depContainer.register("ClientLogStaticRouter", { useClass: ClientLogStaticRouter }); - depContainer.register("CustomizationStaticRouter", { useClass: CustomizationStaticRouter }); + depContainer.register("CustomizationStaticRouter", { + useClass: CustomizationStaticRouter, + }); depContainer.register("DataStaticRouter", { useClass: DataStaticRouter }); depContainer.register("DialogStaticRouter", { useClass: DialogStaticRouter }); depContainer.register("GameStaticRouter", { useClass: GameStaticRouter }); @@ -453,7 +476,7 @@ export class Container depContainer.register("WeatherStaticRouter", { useClass: WeatherStaticRouter }); } - private static registerGenerators(depContainer: DependencyContainer): void + private static registerGenerators(depContainer: DependencyContainer): void { // Generators depContainer.register("BotGenerator", BotGenerator); @@ -461,33 +484,44 @@ export class Container depContainer.register("BotLootGenerator", BotLootGenerator); depContainer.register("BotInventoryGenerator", BotInventoryGenerator); depContainer.register("LocationGenerator", { useClass: LocationGenerator }); - depContainer.register("PMCLootGenerator", PMCLootGenerator, { lifecycle: Lifecycle.Singleton }); - depContainer.register("ScavCaseRewardGenerator", ScavCaseRewardGenerator, { lifecycle: Lifecycle.Singleton }); + depContainer.register("PMCLootGenerator", PMCLootGenerator, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("ScavCaseRewardGenerator", ScavCaseRewardGenerator, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("RagfairAssortGenerator", { useClass: RagfairAssortGenerator }); depContainer.register("RagfairOfferGenerator", { useClass: RagfairOfferGenerator }); depContainer.register("WeatherGenerator", { useClass: WeatherGenerator }); depContainer.register("PlayerScavGenerator", { useClass: PlayerScavGenerator }); depContainer.register("LootGenerator", { useClass: LootGenerator }); - depContainer.register("FenceBaseAssortGenerator", { useClass: FenceBaseAssortGenerator }); + depContainer.register("FenceBaseAssortGenerator", { + useClass: FenceBaseAssortGenerator, + }); depContainer.register("BotLevelGenerator", { useClass: BotLevelGenerator }); - depContainer.register("BotEquipmentModGenerator", { useClass: BotEquipmentModGenerator }); - depContainer.register("RepeatableQuestGenerator", { useClass: RepeatableQuestGenerator }); - - + depContainer.register("BotEquipmentModGenerator", { + useClass: BotEquipmentModGenerator, + }); + depContainer.register("RepeatableQuestGenerator", { + useClass: RepeatableQuestGenerator, + }); + depContainer.register("BarrelInventoryMagGen", { useClass: BarrelInventoryMagGen }); - depContainer.register("ExternalInventoryMagGen", { useClass: ExternalInventoryMagGen }); - depContainer.register("InternalMagazineInventoryMagGen", { useClass: InternalMagazineInventoryMagGen }); + depContainer.register("ExternalInventoryMagGen", { + useClass: ExternalInventoryMagGen, + }); + depContainer.register("InternalMagazineInventoryMagGen", { + useClass: InternalMagazineInventoryMagGen, + }); depContainer.register("UbglExternalMagGen", { useClass: UbglExternalMagGen }); depContainer.registerType("InventoryMagGen", "BarrelInventoryMagGen"); depContainer.registerType("InventoryMagGen", "ExternalInventoryMagGen"); depContainer.registerType("InventoryMagGen", "InternalMagazineInventoryMagGen"); depContainer.registerType("InventoryMagGen", "UbglExternalMagGen"); - - } - private static registerHelpers(depContainer: DependencyContainer): void + private static registerHelpers(depContainer: DependencyContainer): void { // Helpers depContainer.register("AssortHelper", { useClass: AssortHelper }); @@ -515,7 +549,9 @@ export class Container depContainer.register("RagfairServerHelper", { useClass: RagfairServerHelper }); depContainer.register("RepairHelper", { useClass: RepairHelper }); depContainer.register("TraderHelper", TraderHelper); - depContainer.register("TraderAssortHelper", TraderAssortHelper, { lifecycle: Lifecycle.Singleton }); + depContainer.register("TraderAssortHelper", TraderAssortHelper, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("TradeHelper", { useClass: TradeHelper }); depContainer.register("NotifierHelper", { useClass: NotifierHelper }); depContainer.register("UtilityHelper", UtilityHelper); @@ -524,20 +560,24 @@ export class Container depContainer.register("NotificationSendHelper", { useClass: NotificationSendHelper }); depContainer.register("SecureContainerHelper", { useClass: SecureContainerHelper }); depContainer.register("ProbabilityHelper", { useClass: ProbabilityHelper }); - depContainer.register("BotWeaponGeneratorHelper", { useClass: BotWeaponGeneratorHelper }); + depContainer.register("BotWeaponGeneratorHelper", { + useClass: BotWeaponGeneratorHelper, + }); depContainer.register("BotDifficultyHelper", { useClass: BotDifficultyHelper }); depContainer.register("RepeatableQuestHelper", { useClass: RepeatableQuestHelper }); } - private static registerLoaders(depContainer: DependencyContainer): void + private static registerLoaders(depContainer: DependencyContainer): void { // Loaders depContainer.register("BundleLoader", BundleLoader, { lifecycle: Lifecycle.Singleton }); depContainer.register("PreAkiModLoader", PreAkiModLoader, { lifecycle: Lifecycle.Singleton }); - depContainer.register("PostAkiModLoader", PostAkiModLoader, { lifecycle: Lifecycle.Singleton }); + depContainer.register("PostAkiModLoader", PostAkiModLoader, { + lifecycle: Lifecycle.Singleton, + }); } - private static registerCallbacks(depContainer: DependencyContainer): void + private static registerCallbacks(depContainer: DependencyContainer): void { // Callbacks depContainer.register("BotCallbacks", { useClass: BotCallbacks }); @@ -575,52 +615,101 @@ export class Container depContainer.register("WishlistCallbacks", { useClass: WishlistCallbacks }); } - private static registerServices(depContainer: DependencyContainer): void + private static registerServices(depContainer: DependencyContainer): void { // Services - depContainer.register("ImageRouteService", ImageRouteService, { lifecycle: Lifecycle.Singleton }); + depContainer.register("ImageRouteService", ImageRouteService, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("FenceService", FenceService, { lifecycle: Lifecycle.Singleton }); depContainer.register("PlayerService", { useClass: PlayerService }); depContainer.register("PaymentService", { useClass: PaymentService }); - depContainer.register("InsuranceService", InsuranceService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("TraderAssortService", TraderAssortService, { lifecycle: Lifecycle.Singleton }); + depContainer.register("InsuranceService", InsuranceService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("TraderAssortService", TraderAssortService, { + lifecycle: Lifecycle.Singleton, + }); - depContainer.register("RagfairPriceService", RagfairPriceService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("RagfairCategoriesService", RagfairCategoriesService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("RagfairOfferService", RagfairOfferService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("RagfairLinkedItemService", RagfairLinkedItemService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("RagfairRequiredItemsService", RagfairRequiredItemsService, { lifecycle: Lifecycle.Singleton }); + depContainer.register("RagfairPriceService", RagfairPriceService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("RagfairCategoriesService", RagfairCategoriesService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("RagfairOfferService", RagfairOfferService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("RagfairLinkedItemService", RagfairLinkedItemService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("RagfairRequiredItemsService", RagfairRequiredItemsService, { + lifecycle: Lifecycle.Singleton, + }); - depContainer.register("NotificationService", NotificationService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("MatchLocationService", MatchLocationService, { lifecycle: Lifecycle.Singleton }); + depContainer.register("NotificationService", NotificationService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("MatchLocationService", MatchLocationService, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("ModCompilerService", ModCompilerService); - depContainer.register("HashCacheService", HashCacheService, { lifecycle: Lifecycle.Singleton }); + depContainer.register("HashCacheService", HashCacheService, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("LocaleService", LocaleService, { lifecycle: Lifecycle.Singleton }); depContainer.register("ProfileFixerService", ProfileFixerService); depContainer.register("RepairService", RepairService); - depContainer.register("BotLootCacheService", BotLootCacheService, { lifecycle: Lifecycle.Singleton }); + depContainer.register("BotLootCacheService", BotLootCacheService, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("CustomItemService", CustomItemService); depContainer.register("BotEquipmentFilterService", BotEquipmentFilterService); - depContainer.register("ProfileSnapshotService", ProfileSnapshotService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("ItemFilterService", ItemFilterService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("BotGenerationCacheService", BotGenerationCacheService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("LocalisationService", LocalisationService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("CustomLocationWaveService", CustomLocationWaveService, { lifecycle: Lifecycle.Singleton }); + depContainer.register("ProfileSnapshotService", ProfileSnapshotService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("ItemFilterService", ItemFilterService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("BotGenerationCacheService", BotGenerationCacheService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("LocalisationService", LocalisationService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("CustomLocationWaveService", CustomLocationWaveService, { + lifecycle: Lifecycle.Singleton, + }); depContainer.register("OpenZoneService", OpenZoneService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("ItemBaseClassService", ItemBaseClassService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("BotEquipmentModPoolService", BotEquipmentModPoolService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("BotWeaponModLimitService", BotWeaponModLimitService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("SeasonalEventService", SeasonalEventService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("MatchBotDetailsCacheService", MatchBotDetailsCacheService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("RagfairTaxService", RagfairTaxService, { lifecycle: Lifecycle.Singleton }); - depContainer.register("TraderPurchasePersisterService", TraderPurchasePersisterService); + depContainer.register("ItemBaseClassService", ItemBaseClassService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("BotEquipmentModPoolService", BotEquipmentModPoolService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("BotWeaponModLimitService", BotWeaponModLimitService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("SeasonalEventService", SeasonalEventService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("MatchBotDetailsCacheService", MatchBotDetailsCacheService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register("RagfairTaxService", RagfairTaxService, { + lifecycle: Lifecycle.Singleton, + }); + depContainer.register( + "TraderPurchasePersisterService", + TraderPurchasePersisterService, + ); depContainer.register("PmcChatResponseService", PmcChatResponseService); depContainer.register("GiftService", GiftService); depContainer.register("MailSendService", MailSendService); } - private static registerServers(depContainer: DependencyContainer): void + private static registerServers(depContainer: DependencyContainer): void { // Servers depContainer.register("DatabaseServer", DatabaseServer, { lifecycle: Lifecycle.Singleton }); @@ -631,12 +720,14 @@ export class Container depContainer.register("ConfigServer", ConfigServer, { lifecycle: Lifecycle.Singleton }); } - private static registerControllers(depContainer: DependencyContainer): void + private static registerControllers(depContainer: DependencyContainer): void { // Controllers depContainer.register("BotController", { useClass: BotController }); depContainer.register("ClientLogController", { useClass: ClientLogController }); - depContainer.register("CustomizationController", { useClass: CustomizationController }); + depContainer.register("CustomizationController", { + useClass: CustomizationController, + }); depContainer.register("DialogueController", { useClass: DialogueController }); depContainer.register("GameController", { useClass: GameController }); depContainer.register("HandbookController", { useClass: HandbookController }); @@ -656,10 +747,12 @@ export class Container depContainer.register("QuestController", { useClass: QuestController }); depContainer.register("RagfairController", { useClass: RagfairController }); depContainer.register("RepairController", { useClass: RepairController }); - depContainer.register("RepeatableQuestController", { useClass: RepeatableQuestController }); + depContainer.register("RepeatableQuestController", { + useClass: RepeatableQuestController, + }); depContainer.register("TradeController", { useClass: TradeController }); depContainer.register("TraderController", { useClass: TraderController }); depContainer.register("WeatherController", { useClass: WeatherController }); depContainer.register("WishlistController", WishlistController); } -} \ No newline at end of file +} diff --git a/project/src/di/OnLoad.ts b/project/src/di/OnLoad.ts index 55631f4f..139f89b3 100644 --- a/project/src/di/OnLoad.ts +++ b/project/src/di/OnLoad.ts @@ -1,5 +1,5 @@ -export interface OnLoad +export interface OnLoad { onLoad(): Promise; getRoute(): string; -} \ No newline at end of file +} diff --git a/project/src/di/OnUpdate.ts b/project/src/di/OnUpdate.ts index 24dcdab9..95681f7b 100644 --- a/project/src/di/OnUpdate.ts +++ b/project/src/di/OnUpdate.ts @@ -1,7 +1,7 @@ -export interface OnUpdate +export interface OnUpdate { // eslint-disable-next-line @typescript-eslint/no-unused-vars onUpdate(timeSinceLastRun: number): Promise; getRoute(): string; -} \ No newline at end of file +} diff --git a/project/src/di/Router.ts b/project/src/di/Router.ts index 3db0e32d..15274744 100644 --- a/project/src/di/Router.ts +++ b/project/src/di/Router.ts @@ -2,12 +2,11 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile"; -export class Router +export class Router { - protected handledRoutes: HandledRoute[] = []; - public getTopLevelRoute(): string + public getTopLevelRoute(): string { return "aki"; } @@ -17,72 +16,68 @@ export class Router throw new Error("This method needs to be overrode by the router classes"); } - protected getInternalHandledRoutes(): HandledRoute[] + protected getInternalHandledRoutes(): HandledRoute[] { - if (this.handledRoutes.length === 0) + if (this.handledRoutes.length === 0) { this.handledRoutes = this.getHandledRoutes(); } return this.handledRoutes; } - public canHandle(url: string, partialMatch = false): boolean + public canHandle(url: string, partialMatch = false): boolean { if (partialMatch) { - return this.getInternalHandledRoutes().filter(r => r.dynamic).some(r => url.includes(r.route)); + return this.getInternalHandledRoutes().filter((r) => r.dynamic).some((r) => url.includes(r.route)); } - else + else { - return this.getInternalHandledRoutes().filter(r => !r.dynamic).some(r => r.route === url); + return this.getInternalHandledRoutes().filter((r) => !r.dynamic).some((r) => r.route === url); } } } -export class StaticRouter extends Router +export class StaticRouter extends Router { - constructor(private routes: RouteAction[]) + constructor(private routes: RouteAction[]) { super(); } - public handleStatic(url: string, info: any, sessionID: string, output: string): any + public handleStatic(url: string, info: any, sessionID: string, output: string): any { - return this.routes.find(route => route.url === url).action(url, info, sessionID, output); + return this.routes.find((route) => route.url === url).action(url, info, sessionID, output); } - public override getHandledRoutes(): HandledRoute[] - { - return this.routes.map(route => new HandledRoute(route.url, false)); + public override getHandledRoutes(): HandledRoute[] + { + return this.routes.map((route) => new HandledRoute(route.url, false)); } } -export class DynamicRouter extends Router +export class DynamicRouter extends Router { - constructor(private routes: RouteAction[]) + constructor(private routes: RouteAction[]) { super(); } - public handleDynamic(url: string, info: any, sessionID: string, output: string): any + public handleDynamic(url: string, info: any, sessionID: string, output: string): any { - return this.routes.find(r => url.includes(r.url)).action(url, info, sessionID, output); + return this.routes.find((r) => url.includes(r.url)).action(url, info, sessionID, output); } - public override getHandledRoutes(): HandledRoute[] - { - return this.routes.map(route => new HandledRoute(route.url, true)); + public override getHandledRoutes(): HandledRoute[] + { + return this.routes.map((route) => new HandledRoute(route.url, true)); } } // The name of this class should be ItemEventRouter, but that name is taken, // So instead I added the definition -export class ItemEventRouterDefinition extends Router +export class ItemEventRouterDefinition extends Router { - constructor() - { - super(); - } // eslint-disable-next-line @typescript-eslint/no-unused-vars public handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse { @@ -90,12 +85,8 @@ export class ItemEventRouterDefinition extends Router } } -export class SaveLoadRouter extends Router +export class SaveLoadRouter extends Router { - constructor() - { - super(); - } // eslint-disable-next-line @typescript-eslint/no-unused-vars public handleLoad(profile: IAkiProfile): IAkiProfile { @@ -103,20 +94,14 @@ export class SaveLoadRouter extends Router } } -export class HandledRoute +export class HandledRoute { - constructor( - public route: string, - public dynamic: boolean - ) + constructor(public route: string, public dynamic: boolean) {} } -export class RouteAction +export class RouteAction { - constructor( - public url: string, - public action: (url: string, info: any, sessionID: string, output: string) => any - ) + constructor(public url: string, public action: (url: string, info: any, sessionID: string, output: string) => any) {} -} \ No newline at end of file +} diff --git a/project/src/di/Serializer.ts b/project/src/di/Serializer.ts index 38b2fe5c..fb3081f9 100644 --- a/project/src/di/Serializer.ts +++ b/project/src/di/Serializer.ts @@ -1,6 +1,6 @@ import { IncomingMessage, ServerResponse } from "node:http"; -export class Serializer +export class Serializer { // eslint-disable-next-line @typescript-eslint/no-unused-vars public serialize(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any): void @@ -13,4 +13,4 @@ export class Serializer { throw new Error("Should be extended and overrode"); } -} \ No newline at end of file +} diff --git a/project/src/generators/BotEquipmentModGenerator.ts b/project/src/generators/BotEquipmentModGenerator.ts index eaffe1e6..4426ce4c 100644 --- a/project/src/generators/BotEquipmentModGenerator.ts +++ b/project/src/generators/BotEquipmentModGenerator.ts @@ -46,12 +46,12 @@ export class BotEquipmentModGenerator @inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("BotEquipmentModPoolService") protected botEquipmentModPoolService: BotEquipmentModPoolService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); } - + /** * Check mods are compatible and add to array * @param equipment Equipment item to add mods to @@ -63,7 +63,15 @@ export class BotEquipmentModGenerator * @param forceSpawn should this mod be forced to spawn * @returns Item + compatible mods as an array */ - public generateModsForEquipment(equipment: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, botRole: string, forceSpawn = false): Item[] + public generateModsForEquipment( + equipment: Item[], + modPool: Mods, + parentId: string, + parentTemplate: ITemplateItem, + modSpawnChances: ModsChances, + botRole: string, + forceSpawn = false, + ): Item[] { const compatibleModsPool = modPool[parentTemplate._id]; @@ -73,7 +81,13 @@ export class BotEquipmentModGenerator const itemSlot = this.getModItemSlot(modSlot, parentTemplate); if (!itemSlot) { - this.logger.error(this.localisationService.getText("bot-mod_slot_missing_from_item", {modSlot: modSlot, parentId: parentTemplate._id, parentName: parentTemplate._name})); + this.logger.error( + this.localisationService.getText("bot-mod_slot_missing_from_item", { + modSlot: modSlot, + parentId: parentTemplate._id, + parentName: parentTemplate._name, + }), + ); continue; } @@ -83,19 +97,23 @@ export class BotEquipmentModGenerator } // Ensure submods for nvgs all spawn together - forceSpawn = (modSlot === "mod_nvg") - ? true - : false; + forceSpawn = (modSlot === "mod_nvg") ? true : false; let modTpl: string; let found = false; - + // Find random mod and check its compatible - const exhaustableModPool = new ExhaustableArray(compatibleModsPool[modSlot], this.randomUtil, this.jsonUtil); + const exhaustableModPool = new ExhaustableArray( + compatibleModsPool[modSlot], + this.randomUtil, + this.jsonUtil, + ); while (exhaustableModPool.hasValues()) { modTpl = exhaustableModPool.getRandomValue(); - if (!this.botGeneratorHelper.isItemIncompatibleWithCurrentItems(equipment, modTpl, modSlot).incompatible) + if ( + !this.botGeneratorHelper.isItemIncompatibleWithCurrentItems(equipment, modTpl, modSlot).incompatible + ) { found = true; break; @@ -103,7 +121,7 @@ export class BotEquipmentModGenerator } // Combatible item not found but slot REQUIRES item, get random item from db - const parentSlot = parentTemplate._props.Slots.find(i => i._name === modSlot); + const parentSlot = parentTemplate._props.Slots.find((i) => i._name === modSlot); if (!found && parentSlot !== undefined && parentSlot._required) { modTpl = this.getModTplFromItemDb(modTpl, parentSlot, modSlot, equipment); @@ -129,7 +147,15 @@ export class BotEquipmentModGenerator if (Object.keys(modPool).includes(modTpl)) { // Call self recursivly - this.generateModsForEquipment(equipment, modPool, modId, modTemplate[1], modSpawnChances, botRole, forceSpawn); + this.generateModsForEquipment( + equipment, + modPool, + modId, + modTemplate[1], + modSpawnChances, + botRole, + forceSpawn, + ); } } @@ -162,26 +188,35 @@ export class BotEquipmentModGenerator botRole: string, botLevel: number, modLimits: BotModLimits, - botEquipmentRole: string): Item[] + botEquipmentRole: string, + ): Item[] { const pmcProfile = this.profileHelper.getPmcProfile(sessionId); // Get pool of mods that fit weapon const compatibleModsPool = modPool[parentTemplate._id]; - // Null guard against bad input weapon - // rome-ignore lint/complexity/useSimplifiedLogicExpression: - if (!parentTemplate._props.Slots.length - && !parentTemplate._props.Cartridges?.length - && !parentTemplate._props.Chambers?.length) + // biome-ignore lint/complexity/useSimplifiedLogicExpression: + if ( + !((parentTemplate._props.Slots.length || parentTemplate._props.Cartridges?.length) + || parentTemplate._props.Chambers?.length) + ) { - this.logger.error(this.localisationService.getText("bot-unable_to_add_mods_to_weapon_missing_ammo_slot", {weaponName: parentTemplate._name, weaponId: parentTemplate._id})); + this.logger.error( + this.localisationService.getText("bot-unable_to_add_mods_to_weapon_missing_ammo_slot", { + weaponName: parentTemplate._name, + weaponId: parentTemplate._id, + }), + ); return weapon; } const botEquipConfig = this.botConfig.equipment[botEquipmentRole]; - const botEquipBlacklist = this.botEquipmentFilterService.getBotEquipmentBlacklist(botEquipmentRole, pmcProfile.Info.Level); + const botEquipBlacklist = this.botEquipmentFilterService.getBotEquipmentBlacklist( + botEquipmentRole, + pmcProfile.Info.Level, + ); const botWeaponSightWhitelist = this.botEquipmentFilterService.getBotWeaponSightWhitelist(botEquipmentRole); const randomisationSettings = this.botHelper.getBotRandomizationDetails(botLevel, botEquipConfig); @@ -193,7 +228,14 @@ export class BotEquipmentModGenerator const modsParentSlot = this.getModItemSlot(modSlot, parentTemplate); if (!modsParentSlot) { - this.logger.error(this.localisationService.getText("bot-weapon_missing_mod_slot", {modSlot: modSlot, weaponId: parentTemplate._id, weaponName: parentTemplate._name, botRole: botRole})); + this.logger.error( + this.localisationService.getText("bot-weapon_missing_mod_slot", { + modSlot: modSlot, + weaponId: parentTemplate._id, + weaponName: parentTemplate._name, + botRole: botRole, + }), + ); continue; } @@ -205,10 +247,19 @@ export class BotEquipmentModGenerator } const isRandomisableSlot = randomisationSettings?.randomisedWeaponModSlots?.includes(modSlot) ?? false; - const modToAdd = this.chooseModToPutIntoSlot(modSlot, isRandomisableSlot, botWeaponSightWhitelist, botEquipBlacklist, compatibleModsPool, weapon, ammoTpl, parentTemplate); + const modToAdd = this.chooseModToPutIntoSlot( + modSlot, + isRandomisableSlot, + botWeaponSightWhitelist, + botEquipBlacklist, + compatibleModsPool, + weapon, + ammoTpl, + parentTemplate, + ); // Compatible mod not found - if (!modToAdd || typeof (modToAdd) === "undefined") + if (!modToAdd || typeof modToAdd === "undefined") { continue; } @@ -220,7 +271,15 @@ export class BotEquipmentModGenerator const modToAddTemplate = modToAdd[1]; // Skip adding mod to weapon if type limit reached - if (this.botWeaponModLimitService.weaponModHasReachedLimit(botEquipmentRole, modToAddTemplate, modLimits, parentTemplate, weapon)) + if ( + this.botWeaponModLimitService.weaponModHasReachedLimit( + botEquipmentRole, + modToAddTemplate, + modLimits, + parentTemplate, + weapon, + ) + ) { continue; } @@ -229,13 +288,7 @@ export class BotEquipmentModGenerator if (this.modSlotCanHoldScope(modSlot, modToAddTemplate._parent)) { // mod_mount was picked to be added to weapon, force scope chance to ensure its filled - const scopeSlots = [ - "mod_scope", - "mod_scope_000", - "mod_scope_001", - "mod_scope_002", - "mod_scope_003" - ]; + const scopeSlots = ["mod_scope", "mod_scope_000", "mod_scope_001", "mod_scope_002", "mod_scope_003"]; this.adjustSlotSpawnChances(modSpawnChances, scopeSlots, 100); // Hydrate pool of mods that fit into mount as its a randomisable slot @@ -249,11 +302,7 @@ export class BotEquipmentModGenerator // If picked item is muzzle adapter that can hold a child, adjust spawn chance if (this.modSlotCanHoldMuzzleDevices(modSlot, modToAddTemplate._parent)) { - const muzzleSlots = [ - "mod_muzzle", - "mod_muzzle_000", - "mod_muzzle_001" - ]; + const muzzleSlots = ["mod_muzzle", "mod_muzzle_000", "mod_muzzle_001"]; // Make chance of muzzle devices 95%, nearly certain but not guaranteed this.adjustSlotSpawnChances(modSpawnChances, muzzleSlots, 95); } @@ -267,7 +316,10 @@ export class BotEquipmentModGenerator // Handguard mod can take a sub handguard mod + weapon has no UBGL (takes same slot) // Force spawn chance to be 100% to ensure it gets added - if (modSlot === "mod_handguard" && modToAddTemplate._props.Slots.find(x => x._name === "mod_handguard") && !weapon.find(x => x.slotId === "mod_launcher")) + if ( + modSlot === "mod_handguard" && modToAddTemplate._props.Slots.find((x) => x._name === "mod_handguard") + && !weapon.find((x) => x.slotId === "mod_launcher") + ) { // Needed for handguards with lower modSpawnChances.mod_handguard = 100; @@ -275,7 +327,11 @@ export class BotEquipmentModGenerator // If stock mod can take a sub stock mod, force spawn chance to be 100% to ensure sub-stock gets added // Or if mod_stock is configured to be forced on - if (modSlot === "mod_stock" && (modToAddTemplate._props.Slots.find(x => x._name.includes("mod_stock") || botEquipConfig.forceStock))) + if ( + modSlot === "mod_stock" && (modToAddTemplate._props.Slots.find((x) => + x._name.includes("mod_stock") || botEquipConfig.forceStock + )) + ) { // Stock mod can take additional stocks, could be a locking device, force 100% chance const stockSlots = ["mod_stock", "mod_stock_000", "mod_stock_akms"]; @@ -283,8 +339,10 @@ export class BotEquipmentModGenerator } const modId = this.hashUtil.generate(); - weapon.push(this.createModItem(modId, modToAddTemplate._id, weaponParentId, modSlot, modToAddTemplate, botRole)); - + weapon.push( + this.createModItem(modId, modToAddTemplate._id, weaponParentId, modSlot, modToAddTemplate, botRole), + ); + // I first thought we could use the recursive generateModsForItems as previously for cylinder magazines. // However, the recursion doesnt go over the slots of the parent mod but over the modPool which is given by the bot config // where we decided to keep cartridges instead of camoras. And since a CylinderMagazine only has one cartridge entry and @@ -313,7 +371,19 @@ export class BotEquipmentModGenerator if (containsModInPool) { // Call self recursivly to add mods to this mod - this.generateModsForWeapon(sessionId, weapon, modPool, modId, modToAddTemplate, modSpawnChances, ammoTpl, botRole, botLevel, modLimits, botEquipmentRole); + this.generateModsForWeapon( + sessionId, + weapon, + modPool, + modId, + modToAddTemplate, + modSpawnChances, + ammoTpl, + botRole, + botLevel, + modLimits, + botEquipmentRole, + ); } } } @@ -328,8 +398,8 @@ export class BotEquipmentModGenerator */ protected modIsFrontOrRearSight(modSlot: string, tpl: string): boolean { - if (modSlot === "mod_gas_block" && tpl === "5ae30e795acfc408fb139a0b") // M4A1 front sight with gas block - { + if (modSlot === "mod_gas_block" && tpl === "5ae30e795acfc408fb139a0b") + { // M4A1 front sight with gas block return true; } @@ -344,15 +414,26 @@ export class BotEquipmentModGenerator */ protected modSlotCanHoldScope(modSlot: string, modsParentId: string): boolean { - return ["mod_scope", "mod_mount", "mod_mount_000", "mod_scope_000", "mod_scope_001", "mod_scope_002", "mod_scope_003"].includes(modSlot.toLowerCase()) - && modsParentId === BaseClasses.MOUNT; + return [ + "mod_scope", + "mod_mount", + "mod_mount_000", + "mod_scope_000", + "mod_scope_001", + "mod_scope_002", + "mod_scope_003", + ].includes(modSlot.toLowerCase()) && modsParentId === BaseClasses.MOUNT; } /** * Set mod spawn chances to defined amount * @param modSpawnChances Chance dictionary to update */ - protected adjustSlotSpawnChances(modSpawnChances: ModsChances, modSlotsToAdjust: string[], newChancePercent: number): void + protected adjustSlotSpawnChances( + modSpawnChances: ModsChances, + modSlotsToAdjust: string[], + newChancePercent: number, + ): void { if (!modSpawnChances) { @@ -418,7 +499,7 @@ export class BotEquipmentModGenerator sortedKeys.push(modRecieverKey); unsortedKeys.splice(unsortedKeys.indexOf(modRecieverKey), 1); } - + if (unsortedKeys.includes(modPistolGrip)) { sortedKeys.push(modPistolGrip); @@ -467,11 +548,11 @@ export class BotEquipmentModGenerator case "patron_in_weapon": case "patron_in_weapon_000": case "patron_in_weapon_001": - return parentTemplate._props.Chambers.find(c => c._name.includes(modSlot)); + return parentTemplate._props.Chambers.find((c) => c._name.includes(modSlot)); case "cartridges": - return parentTemplate._props.Cartridges.find(c => c._name === modSlot); + return parentTemplate._props.Cartridges.find((c) => c._name === modSlot); default: - return parentTemplate._props.Slots.find(s => s._name === modSlot); + return parentTemplate._props.Slots.find((s) => s._name === modSlot); } } @@ -498,7 +579,6 @@ export class BotEquipmentModGenerator } /** - * * @param modSlot Slot mod will fit into * @param isRandomisableSlot Will generate a randomised mod pool if true * @param modsParent Parent slot the item will be a part of @@ -517,12 +597,13 @@ export class BotEquipmentModGenerator itemModPool: Record, weapon: Item[], ammoTpl: string, - parentTemplate: ITemplateItem): [boolean, ITemplateItem] + parentTemplate: ITemplateItem, + ): [boolean, ITemplateItem] { let modTpl: string; let found = false; - const parentSlot = parentTemplate._props.Slots.find(i => i._name === modSlot); - + const parentSlot = parentTemplate._props.Slots.find((i) => i._name === modSlot); + // It's ammo, use predefined ammo parameter if (this.getAmmoContainers().includes(modSlot) && modSlot !== "mod_magazine") { @@ -539,27 +620,40 @@ export class BotEquipmentModGenerator // Ensure there's a pool of mods to pick from if (!(itemModPool[modSlot] || parentSlot._required)) { - this.logger.debug(`Mod pool for slot: ${modSlot} on item: ${parentTemplate._name} was empty, skipping mod`); + this.logger.debug( + `Mod pool for slot: ${modSlot} on item: ${parentTemplate._name} was empty, skipping mod`, + ); return null; } // Filter out non-whitelisted scopes, use full modpool if filtered pool would have no elements - if (modSlot.includes("mod_scope") && botWeaponSightWhitelist) + if (modSlot.includes("mod_scope") && botWeaponSightWhitelist) { // scope pool has more than one scope if (itemModPool[modSlot].length > 1) { - itemModPool[modSlot] = this.filterSightsByWeaponType(weapon[0], itemModPool[modSlot], botWeaponSightWhitelist); + itemModPool[modSlot] = this.filterSightsByWeaponType( + weapon[0], + itemModPool[modSlot], + botWeaponSightWhitelist, + ); } } - + // Pick random mod and check it's compatible const exhaustableModPool = new ExhaustableArray(itemModPool[modSlot], this.randomUtil, this.jsonUtil); - let modCompatibilityResult: {incompatible: boolean, reason: string} = {incompatible: false, reason: ""}; + let modCompatibilityResult: { incompatible: boolean; reason: string; } = { + incompatible: false, + reason: "", + }; while (exhaustableModPool.hasValues()) { modTpl = exhaustableModPool.getRandomValue(); - modCompatibilityResult = this.botGeneratorHelper.isItemIncompatibleWithCurrentItems(weapon, modTpl, modSlot); + modCompatibilityResult = this.botGeneratorHelper.isItemIncompatibleWithCurrentItems( + weapon, + modTpl, + modSlot, + ); if (!modCompatibilityResult.incompatible) { found = true; @@ -592,7 +686,11 @@ export class BotEquipmentModGenerator { if (parentSlot._required) { - this.logger.warning(`Required slot unable to be filled, ${modSlot} on ${parentTemplate._name} ${parentTemplate._id} for weapon: ${weapon[0]._tpl}`); + this.logger.warning( + `Required slot unable to be filled, ${modSlot} on ${parentTemplate._name} ${parentTemplate._id} for weapon: ${ + weapon[0]._tpl + }`, + ); } return null; @@ -610,18 +708,24 @@ export class BotEquipmentModGenerator * @param modTemplate Used to add additional properites in the upd object * @returns Item object */ - protected createModItem(modId: string, modTpl: string, parentId: string, modSlot: string, modTemplate: ITemplateItem, botRole: string): Item + protected createModItem( + modId: string, + modTpl: string, + parentId: string, + modSlot: string, + modTemplate: ITemplateItem, + botRole: string, + ): Item { return { - "_id": modId, - "_tpl": modTpl, - "parentId": parentId, - "slotId": modSlot, - ...this.botGeneratorHelper.generateExtraPropertiesForItem(modTemplate, botRole) + _id: modId, + _tpl: modTpl, + parentId: parentId, + slotId: modSlot, + ...this.botGeneratorHelper.generateExtraPropertiesForItem(modTemplate, botRole), }; } - /** * Get a list of containers that hold ammo * e.g. mod_magazine / patron_in_weapon_000 @@ -669,12 +773,22 @@ export class BotEquipmentModGenerator * @param parentTemplate template of the mods parent item * @returns true if valid */ - protected isModValidForSlot(modToAdd: [boolean, ITemplateItem], itemSlot: Slot, modSlot: string, parentTemplate: ITemplateItem): boolean + protected isModValidForSlot( + modToAdd: [boolean, ITemplateItem], + itemSlot: Slot, + modSlot: string, + parentTemplate: ITemplateItem, + ): boolean { // Mod lacks template item if (!modToAdd[1]) { - this.logger.error(this.localisationService.getText("bot-no_item_template_found_when_adding_mod", {modId: modToAdd[1]._id, modSlot: modSlot})); + this.logger.error( + this.localisationService.getText("bot-no_item_template_found_when_adding_mod", { + modId: modToAdd[1]._id, + modSlot: modSlot, + }), + ); this.logger.debug(`Item -> ${parentTemplate._id}; Slot -> ${modSlot}`); return false; @@ -686,16 +800,31 @@ export class BotEquipmentModGenerator // Slot must be filled, show warning if (itemSlot._required) { - this.logger.warning(this.localisationService.getText("bot-unable_to_add_mod_item_invalid", {itemName: modToAdd[1]._name, modSlot: modSlot, parentItemName: parentTemplate._name})); + this.logger.warning( + this.localisationService.getText("bot-unable_to_add_mod_item_invalid", { + itemName: modToAdd[1]._name, + modSlot: modSlot, + parentItemName: parentTemplate._name, + }), + ); } return false; } // If mod id doesnt exist in slots filter list and mod id doesnt have any of the slots filters as a base class, mod isn't valid for the slot - if (!(itemSlot._props.filters[0].Filter.includes(modToAdd[1]._id) || this.itemHelper.isOfBaseclasses(modToAdd[1]._id, itemSlot._props.filters[0].Filter))) + if ( + !(itemSlot._props.filters[0].Filter.includes(modToAdd[1]._id) + || this.itemHelper.isOfBaseclasses(modToAdd[1]._id, itemSlot._props.filters[0].Filter)) + ) { - this.logger.warning(this.localisationService.getText("bot-mod_not_in_slot_filter_list", {modId: modToAdd[1]._id, modSlot: modSlot, parentName: parentTemplate._name})); + this.logger.warning( + this.localisationService.getText("bot-mod_not_in_slot_filter_list", { + modId: modToAdd[1]._id, + modSlot: modSlot, + parentName: parentTemplate._name, + }), + ); return false; } @@ -703,26 +832,39 @@ export class BotEquipmentModGenerator return true; } - /** * Find mod tpls of a provided type and add to modPool * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) * @param modTemplate db object for modItem we get compatible mods from * @param modPool Pool of mods we are adding to */ - protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void + protected addCompatibleModsForProvidedMod( + desiredSlotName: string, + modTemplate: ITemplateItem, + modPool: Mods, + botEquipBlacklist: EquipmentFilterDetails, + ): void { - const desiredSlotObject = modTemplate._props.Slots.find(x => x._name.includes(desiredSlotName)); + const desiredSlotObject = modTemplate._props.Slots.find((x) => x._name.includes(desiredSlotName)); if (desiredSlotObject) { const supportedSubMods = desiredSlotObject._props.filters[0].Filter; if (supportedSubMods) { // Filter mods - let filteredMods = this.filterWeaponModsByBlacklist(supportedSubMods, botEquipBlacklist, desiredSlotName); + let filteredMods = this.filterWeaponModsByBlacklist( + supportedSubMods, + botEquipBlacklist, + desiredSlotName, + ); if (filteredMods.length === 0) { - this.logger.warning(this.localisationService.getText("bot-unable_to_filter_mods_all_blacklisted", {slotName: desiredSlotObject._name, itemName: modTemplate._name})); + this.logger.warning( + this.localisationService.getText("bot-unable_to_filter_mods_all_blacklisted", { + slotName: desiredSlotObject._name, + itemName: modTemplate._name, + }), + ); filteredMods = supportedSubMods; } @@ -736,7 +878,6 @@ export class BotEquipmentModGenerator } } - /** * Get the possible items that fit a slot * @param parentItemId item tpl to get compatible items for @@ -744,14 +885,22 @@ export class BotEquipmentModGenerator * @param botEquipBlacklist equipment that should not be picked * @returns array of compatible items for that slot */ - protected getDynamicModPool(parentItemId: string, modSlot: string, botEquipBlacklist: EquipmentFilterDetails): string[] + protected getDynamicModPool( + parentItemId: string, + modSlot: string, + botEquipBlacklist: EquipmentFilterDetails, + ): string[] { - const modsFromDynamicPool = this.jsonUtil.clone(this.botEquipmentModPoolService.getCompatibleModsForWeaponSlot(parentItemId, modSlot)); + const modsFromDynamicPool = this.jsonUtil.clone( + this.botEquipmentModPoolService.getCompatibleModsForWeaponSlot(parentItemId, modSlot), + ); const filteredMods = this.filterWeaponModsByBlacklist(modsFromDynamicPool, botEquipBlacklist, modSlot); if (filteredMods.length === 0) { - this.logger.warning(this.localisationService.getText("bot-unable_to_filter_mod_slot_all_blacklisted", modSlot)); + this.logger.warning( + this.localisationService.getText("bot-unable_to_filter_mod_slot_all_blacklisted", modSlot), + ); return modsFromDynamicPool; } @@ -765,18 +914,24 @@ export class BotEquipmentModGenerator * @param modSlot slot mods belong to * @returns Filtered array of mod tpls */ - protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[] + protected filterWeaponModsByBlacklist( + allowedMods: string[], + botEquipBlacklist: EquipmentFilterDetails, + modSlot: string, + ): string[] { if (!botEquipBlacklist) { return allowedMods; } - + let result: string[] = []; // Get item blacklist and mod equipmet blackist as one array - const blacklist = this.itemFilterService.getBlacklistedItems().concat(botEquipBlacklist.equipment[modSlot] || []); - result = allowedMods.filter(x => !blacklist.includes(x)); + const blacklist = this.itemFilterService.getBlacklistedItems().concat( + botEquipBlacklist.equipment[modSlot] || [], + ); + result = allowedMods.filter((x) => !blacklist.includes(x)); return result; } @@ -796,8 +951,13 @@ export class BotEquipmentModGenerator let itemModPool = modPool[parentTemplate._id]; if (!itemModPool) { - this.logger.warning(this.localisationService.getText("bot-unable_to_fill_camora_slot_mod_pool_empty", {weaponId: parentTemplate._id, weaponName: parentTemplate._name})); - const camoraSlots = parentTemplate._props.Slots.filter(x => x._name.startsWith("camora")); + this.logger.warning( + this.localisationService.getText("bot-unable_to_fill_camora_slot_mod_pool_empty", { + weaponId: parentTemplate._id, + weaponName: parentTemplate._name, + }), + ); + const camoraSlots = parentTemplate._props.Slots.filter((x) => x._name.startsWith("camora")); // Attempt to generate camora slots for item modPool[parentTemplate._id] = {}; @@ -818,7 +978,11 @@ export class BotEquipmentModGenerator else if (camoraFirstSlot in itemModPool) { modSlot = camoraFirstSlot; - exhaustableModPool = new ExhaustableArray(this.mergeCamoraPoolsTogether(itemModPool), this.randomUtil, this.jsonUtil); + exhaustableModPool = new ExhaustableArray( + this.mergeCamoraPoolsTogether(itemModPool), + this.randomUtil, + this.jsonUtil, + ); } else { @@ -850,12 +1014,7 @@ export class BotEquipmentModGenerator { const modSlotId = slot._name; const modId = this.hashUtil.generate(); - items.push({ - _id: modId, - _tpl: modTpl, - parentId: parentId, - slotId: modSlotId - }); + items.push({ _id: modId, _tpl: modTpl, parentId: parentId, slotId: modSlotId }); } } @@ -864,7 +1023,7 @@ export class BotEquipmentModGenerator * @param camorasWithShells camoras we want to merge into one array * @returns string array of shells fro luitple camora sources */ - protected mergeCamoraPoolsTogether(camorasWithShells: Record ): string[] + protected mergeCamoraPoolsTogether(camorasWithShells: Record): string[] { const poolResult: string[] = []; for (const camoraKey in camorasWithShells) @@ -889,10 +1048,14 @@ export class BotEquipmentModGenerator * e.g. filter out rifle scopes from SMGs * @param weapon Weapon scopes will be added to * @param scopes Full scope pool - * @param botWeaponSightWhitelist Whitelist of scope types by weapon base type + * @param botWeaponSightWhitelist Whitelist of scope types by weapon base type * @returns Array of scope tpls that have been filtered to just ones allowed for that weapon type */ - protected filterSightsByWeaponType(weapon: Item, scopes: string[], botWeaponSightWhitelist: Record): string[] + protected filterSightsByWeaponType( + weapon: Item, + scopes: string[], + botWeaponSightWhitelist: Record, + ): string[] { const weaponDetails = this.itemHelper.getItem(weapon._tpl); @@ -900,7 +1063,11 @@ export class BotEquipmentModGenerator const whitelistedSightTypes = botWeaponSightWhitelist[weaponDetails[1]._parent]; if (!whitelistedSightTypes) { - this.logger.debug(`Unable to find whitelist for weapon type: ${weaponDetails[1]._parent} ${weaponDetails[1]._name}, skipping sight filtering`); + this.logger.debug( + `Unable to find whitelist for weapon type: ${weaponDetails[1]._parent} ${ + weaponDetails[1]._name + }, skipping sight filtering`, + ); return scopes; } @@ -920,14 +1087,23 @@ export class BotEquipmentModGenerator // Edge case, what if item is a mount for a scope and not directly a scope? // Check item is mount + has child items const itemDetails = this.itemHelper.getItem(item)[1]; - if (this.itemHelper.isOfBaseclass(item, BaseClasses.MOUNT) && itemDetails._props.Slots.length > 0 ) + if (this.itemHelper.isOfBaseclass(item, BaseClasses.MOUNT) && itemDetails._props.Slots.length > 0) { // Check to see if mount has a scope slot (only include primary slot, ignore the rest like the backup sight slots) // Should only find 1 as there's currently no items with a mod_scope AND a mod_scope_000 - const scopeSlot = itemDetails._props.Slots.filter(x => ["mod_scope", "mod_scope_000"].includes(x._name)); + const scopeSlot = itemDetails._props.Slots.filter((x) => + ["mod_scope", "mod_scope_000"].includes(x._name) + ); // Mods scope slot found must allow ALL whitelisted scope types OR be a mount - if (scopeSlot?.every(x => x._props.filters[0].Filter.every(x => this.itemHelper.isOfBaseclasses(x, whitelistedSightTypes) || this.itemHelper.isOfBaseclass(x, BaseClasses.MOUNT)))) + if ( + scopeSlot?.every((x) => + x._props.filters[0].Filter.every((x) => + this.itemHelper.isOfBaseclasses(x, whitelistedSightTypes) + || this.itemHelper.isOfBaseclass(x, BaseClasses.MOUNT) + ) + ) + ) { // Add mod to allowed list filteredScopesAndMods.push(item); @@ -938,11 +1114,13 @@ export class BotEquipmentModGenerator // No mods added to return list after filtering has occured, send back the original mod list if (!filteredScopesAndMods || filteredScopesAndMods.length === 0) { - this.logger.debug(`Scope whitelist too restrictive for: ${weapon._tpl} ${weaponDetails[1]._name}, skipping filter`); + this.logger.debug( + `Scope whitelist too restrictive for: ${weapon._tpl} ${weaponDetails[1]._name}, skipping filter`, + ); return scopes; } return filteredScopesAndMods; } -} \ No newline at end of file +} diff --git a/project/src/generators/BotGenerator.ts b/project/src/generators/BotGenerator.ts index 15f99a65..c13c2271 100644 --- a/project/src/generators/BotGenerator.ts +++ b/project/src/generators/BotGenerator.ts @@ -8,9 +8,12 @@ import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper"; import { WeightedRandomHelper } from "@spt-aki/helpers/WeightedRandomHelper"; import { Common, - IBaseJsonSkills, IBaseSkill, IBotBase, Info, Health as PmcHealth, - Skills as botSkills + IBaseJsonSkills, + IBaseSkill, + IBotBase, + Info, + Skills as botSkills, } from "@spt-aki/models/eft/common/tables/IBotBase"; import { Appearance, Health, IBotType } from "@spt-aki/models/eft/common/tables/IBotType"; import { Item, Upd } from "@spt-aki/models/eft/common/tables/IItem"; @@ -53,7 +56,7 @@ export class BotGenerator @inject("BotDifficultyHelper") protected botDifficultyHelper: BotDifficultyHelper, @inject("SeasonalEventService") protected seasonalEventService: SeasonalEventService, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -65,7 +68,7 @@ export class BotGenerator * @param role e.g. assault / pmcbot * @param difficulty easy/normal/hard/impossible * @param botTemplate base bot template to use (e.g. assault/pmcbot) - * @returns + * @returns */ public generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase { @@ -82,7 +85,7 @@ export class BotGenerator botRelativeLevelDeltaMax: 0, botCountToGenerate: 1, botDifficulty: difficulty, - isPlayerScav: true + isPlayerScav: true, }; bot = this.generateBot(sessionId, bot, botTemplate, botGenDetails); @@ -93,12 +96,10 @@ export class BotGenerator /** * Create x number of bots of the type/side/difficulty defined in botGenerationDetails * @param sessionId Session id - * @param botGenerationDetails details on how to generate bots + * @param botGenerationDetails details on how to generate bots * @returns array of bots */ - public prepareAndGenerateBots( - sessionId: string, - botGenerationDetails: BotGenerationDetails): IBotBase[] + public prepareAndGenerateBots(sessionId: string, botGenerationDetails: BotGenerationDetails): IBotBase[] { const output: IBotBase[] = []; for (let i = 0; i < botGenerationDetails.botCountToGenerate; i++) @@ -108,15 +109,14 @@ export class BotGenerator bot.Info.Settings.Role = botGenerationDetails.role; bot.Info.Side = botGenerationDetails.side; bot.Info.Settings.BotDifficulty = botGenerationDetails.botDifficulty; - + // Get raw json data for bot (Cloned) - const botJsonTemplate = this.jsonUtil.clone(this.botHelper.getBotTemplate( - (botGenerationDetails.isPmc) - ? bot.Info.Side - : botGenerationDetails.role)); + const botJsonTemplate = this.jsonUtil.clone( + this.botHelper.getBotTemplate((botGenerationDetails.isPmc) ? bot.Info.Side : botGenerationDetails.role), + ); bot = this.generateBot(sessionId, bot, botJsonTemplate, botGenerationDetails); - + output.push(bot); } @@ -140,22 +140,44 @@ export class BotGenerator * @param botGenerationDetails details on how to generate the bot * @returns IBotBase object */ - protected generateBot(sessionId: string, bot: IBotBase, botJsonTemplate: IBotType, botGenerationDetails: BotGenerationDetails): IBotBase + protected generateBot( + sessionId: string, + bot: IBotBase, + botJsonTemplate: IBotType, + botGenerationDetails: BotGenerationDetails, + ): IBotBase { const botRole = botGenerationDetails.role.toLowerCase(); - const botLevel = this.botLevelGenerator.generateBotLevel(botJsonTemplate.experience.level, botGenerationDetails, bot); + const botLevel = this.botLevelGenerator.generateBotLevel( + botJsonTemplate.experience.level, + botGenerationDetails, + bot, + ); if (!botGenerationDetails.isPlayerScav) { - this.botEquipmentFilterService.filterBotEquipment(sessionId, botJsonTemplate, botLevel.level, botGenerationDetails); + this.botEquipmentFilterService.filterBotEquipment( + sessionId, + botJsonTemplate, + botLevel.level, + botGenerationDetails, + ); } - bot.Info.Nickname = this.generateBotNickname(botJsonTemplate, botGenerationDetails.isPlayerScav, botRole, sessionId); + bot.Info.Nickname = this.generateBotNickname( + botJsonTemplate, + botGenerationDetails.isPlayerScav, + botRole, + sessionId, + ); const skipChristmasItems = !this.seasonalEventService.christmasEventEnabled(); if (skipChristmasItems) { - this.seasonalEventService.removeChristmasItemsFromBotInventory(botJsonTemplate.inventory, botGenerationDetails.role); + this.seasonalEventService.removeChristmasItemsFromBotInventory( + botJsonTemplate.inventory, + botGenerationDetails.role, + ); } // Remove hideout data if bot is not a PMC or pscav @@ -166,7 +188,10 @@ export class BotGenerator bot.Info.Experience = botLevel.exp; bot.Info.Level = botLevel.level; - bot.Info.Settings.Experience = this.randomUtil.getInt(botJsonTemplate.experience.reward.min, botJsonTemplate.experience.reward.max); + bot.Info.Settings.Experience = this.randomUtil.getInt( + botJsonTemplate.experience.reward.min, + botJsonTemplate.experience.reward.max, + ); bot.Info.Settings.StandingForKill = botJsonTemplate.experience.standingForKill; bot.Info.Voice = this.randomUtil.getArrayValue(botJsonTemplate.appearance.voice); bot.Health = this.generateHealth(botJsonTemplate.health, bot.Info.Side === "Savage"); @@ -174,7 +199,13 @@ export class BotGenerator this.setBotAppearance(bot, botJsonTemplate.appearance, botGenerationDetails); - bot.Inventory = this.botInventoryGenerator.generateInventory(sessionId, botJsonTemplate, botRole, botGenerationDetails.isPmc, botLevel.level); + bot.Inventory = this.botInventoryGenerator.generateInventory( + sessionId, + botJsonTemplate, + botRole, + botGenerationDetails.isPmc, + botLevel.level, + ); if (this.botHelper.isBotPmc(botRole)) { @@ -209,17 +240,24 @@ export class BotGenerator /** * Create a bot nickname - * @param botJsonTemplate x.json from database + * @param botJsonTemplate x.json from database * @param isPlayerScav Will bot be player scav * @param botRole role of bot e.g. assault * @returns Nickname for bot */ - protected generateBotNickname(botJsonTemplate: IBotType, isPlayerScav: boolean, botRole: string, sessionId: string): string + protected generateBotNickname( + botJsonTemplate: IBotType, + isPlayerScav: boolean, + botRole: string, + sessionId: string, + ): string { - let name = `${this.randomUtil.getArrayValue(botJsonTemplate.firstName)} ${this.randomUtil.getArrayValue(botJsonTemplate.lastName) || ""}`; + let name = `${this.randomUtil.getArrayValue(botJsonTemplate.firstName)} ${ + this.randomUtil.getArrayValue(botJsonTemplate.lastName) || "" + }`; name = name.trim(); const playerProfile = this.profileHelper.getPmcProfile(sessionId); - + // Simulate bot looking like a Player scav with the pmc name in brackets if (botRole === "assault" && this.randomUtil.getChance100(this.botConfig.chanceAssaultScavHasPlayerScavName)) { @@ -229,8 +267,8 @@ export class BotGenerator } const pmcNames = [ - ...this.databaseServer.getTables().bots.types["usec"].firstName, - ...this.databaseServer.getTables().bots.types["bear"].firstName + ...this.databaseServer.getTables().bots.types.usec.firstName, + ...this.databaseServer.getTables().bots.types.bear.firstName, ]; return `${name} (${this.randomUtil.getArrayValue(pmcNames)})`; @@ -246,7 +284,6 @@ export class BotGenerator { if (this.randomUtil.getChance100(this.pmcConfig.addPrefixToSameNamePMCAsPlayerChance)) { - const prefix = this.localisationService.getRandomTextThatMatchesPartialKey("pmc-name_prefix_"); name = `${prefix} ${name}`; } @@ -261,7 +298,10 @@ export class BotGenerator */ protected logPmcGeneratedCount(output: IBotBase[]): void { - const pmcCount = output.reduce((acc, cur) => cur.Info.Side === "Bear" || cur.Info.Side === "Usec" ? ++acc : acc, 0); + const pmcCount = output.reduce( + (acc, cur) => cur.Info.Side === "Bear" || cur.Info.Side === "Usec" ? ++acc : acc, + 0, + ); this.logger.debug(`Generated ${output.length} total bots. Replaced ${pmcCount} with PMCs`); } @@ -273,68 +313,66 @@ export class BotGenerator */ protected generateHealth(healthObj: Health, playerScav = false): PmcHealth { - const bodyParts = (playerScav) - ? healthObj.BodyParts[0] - : this.randomUtil.getArrayValue(healthObj.BodyParts); + const bodyParts = playerScav ? healthObj.BodyParts[0] : this.randomUtil.getArrayValue(healthObj.BodyParts); const newHealth: PmcHealth = { Hydration: { Current: this.randomUtil.getInt(healthObj.Hydration.min, healthObj.Hydration.max), - Maximum: healthObj.Hydration.max + Maximum: healthObj.Hydration.max, }, Energy: { Current: this.randomUtil.getInt(healthObj.Energy.min, healthObj.Energy.max), - Maximum: healthObj.Energy.max + Maximum: healthObj.Energy.max, }, Temperature: { Current: this.randomUtil.getInt(healthObj.Temperature.min, healthObj.Temperature.max), - Maximum: healthObj.Temperature.max + Maximum: healthObj.Temperature.max, }, BodyParts: { Head: { Health: { Current: this.randomUtil.getInt(bodyParts.Head.min, bodyParts.Head.max), - Maximum: Math.round(bodyParts.Head.max) - } + Maximum: Math.round(bodyParts.Head.max), + }, }, Chest: { Health: { Current: this.randomUtil.getInt(bodyParts.Chest.min, bodyParts.Chest.max), - Maximum: Math.round(bodyParts.Chest.max) - } + Maximum: Math.round(bodyParts.Chest.max), + }, }, Stomach: { Health: { Current: this.randomUtil.getInt(bodyParts.Stomach.min, bodyParts.Stomach.max), - Maximum: Math.round(bodyParts.Stomach.max) - } + Maximum: Math.round(bodyParts.Stomach.max), + }, }, LeftArm: { Health: { Current: this.randomUtil.getInt(bodyParts.LeftArm.min, bodyParts.LeftArm.max), - Maximum: Math.round(bodyParts.LeftArm.max) - } + Maximum: Math.round(bodyParts.LeftArm.max), + }, }, RightArm: { Health: { Current: this.randomUtil.getInt(bodyParts.RightArm.min, bodyParts.RightArm.max), - Maximum: Math.round(bodyParts.RightArm.max) - } + Maximum: Math.round(bodyParts.RightArm.max), + }, }, LeftLeg: { Health: { Current: this.randomUtil.getInt(bodyParts.LeftLeg.min, bodyParts.LeftLeg.max), - Maximum: Math.round(bodyParts.LeftLeg.max) - } + Maximum: Math.round(bodyParts.LeftLeg.max), + }, }, RightLeg: { Health: { Current: this.randomUtil.getInt(bodyParts.RightLeg.min, bodyParts.RightLeg.max), - Maximum: Math.round(bodyParts.RightLeg.max) - } - } + Maximum: Math.round(bodyParts.RightLeg.max), + }, + }, }, - UpdateTime: this.timeUtil.getTimestamp() + UpdateTime: this.timeUtil.getTimestamp(), }; return newHealth; @@ -343,14 +381,14 @@ export class BotGenerator /** * Get a bots skills with randomsied progress value between the min and max values * @param botSkills Skills that should have their progress value randomised - * @returns + * @returns */ protected generateSkills(botSkills: IBaseJsonSkills): botSkills { const skillsToReturn: botSkills = { Common: this.getSkillsWithRandomisedProgressValue(botSkills.Common, true), Mastering: this.getSkillsWithRandomisedProgressValue(botSkills.Mastering, false), - Points: 0 + Points: 0, }; return skillsToReturn; @@ -362,7 +400,10 @@ export class BotGenerator * @param isCommonSkills Are the skills 'common' skills * @returns Skills with randomised progress values as an array */ - protected getSkillsWithRandomisedProgressValue(skills: Record, isCommonSkills: boolean): IBaseSkill[] + protected getSkillsWithRandomisedProgressValue( + skills: Record, + isCommonSkills: boolean, + ): IBaseSkill[] { if (Object.keys(skills ?? []).length === 0) { @@ -377,22 +418,19 @@ export class BotGenerator { return null; } - + // All skills have id and progress props - const skillToAdd: IBaseSkill = { - Id: skillKey, - Progress: this.randomUtil.getInt(skill.min, skill.max) - }; - + const skillToAdd: IBaseSkill = { Id: skillKey, Progress: this.randomUtil.getInt(skill.min, skill.max) }; + // Common skills have additional props if (isCommonSkills) { (skillToAdd as Common).PointsEarnedDuringSession = 0; (skillToAdd as Common).LastAccess = 0; } - + return skillToAdd; - }).filter(x => x !== null); + }).filter((x) => x !== null); } /** @@ -415,7 +453,7 @@ export class BotGenerator const defaultInventory = "55d7217a4bdc2d86028b456d"; const itemsByParentHash: Record = {}; const inventoryItemHash: Record = {}; - + // Generate inventoryItem list let inventoryId = ""; for (const item of profile.Inventory.items) @@ -475,7 +513,9 @@ export class BotGenerator } botInfo.GameVersion = this.weightedRandomHelper.getWeightedValue(this.pmcConfig.gameVersionWeight); - botInfo.MemberCategory = Number.parseInt(this.weightedRandomHelper.getWeightedValue(this.pmcConfig.accountTypeWeight)); + botInfo.MemberCategory = Number.parseInt( + this.weightedRandomHelper.getWeightedValue(this.pmcConfig.accountTypeWeight), + ); } /** @@ -498,8 +538,8 @@ export class BotGenerator KillerAccountId: "Unknown", KillerProfileId: "Unknown", KillerName: "Unknown", - WeaponName: "Unknown" - } + WeaponName: "Unknown", + }, }; const inventoryItem: Item = { @@ -508,11 +548,11 @@ export class BotGenerator parentId: bot.Inventory.equipment, slotId: "Dogtag", location: undefined, - upd: upd + upd: upd, }; bot.Inventory.items.push(inventoryItem); return bot; } -} \ No newline at end of file +} diff --git a/project/src/generators/BotInventoryGenerator.ts b/project/src/generators/BotInventoryGenerator.ts index 7ff178ba..592d9d67 100644 --- a/project/src/generators/BotInventoryGenerator.ts +++ b/project/src/generators/BotInventoryGenerator.ts @@ -39,7 +39,7 @@ export class BotInventoryGenerator @inject("LocalisationService") protected localisationService: LocalisationService, @inject("BotEquipmentModPoolService") protected botEquipmentModPoolService: BotEquipmentModPoolService, @inject("BotEquipmentModGenerator") protected botEquipmentModGenerator: BotEquipmentModGenerator, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -54,7 +54,13 @@ export class BotInventoryGenerator * @param botLevel Level of bot being generated * @returns PmcInventory object with equipment/weapons/loot */ - public generateInventory(sessionId: string, botJsonTemplate: IBotType, botRole: string, isPmc: boolean, botLevel: number): PmcInventory + public generateInventory( + sessionId: string, + botJsonTemplate: IBotType, + botRole: string, + isPmc: boolean, + botLevel: number, + ): PmcInventory { const templateInventory = botJsonTemplate.inventory; const equipmentChances = botJsonTemplate.chances; @@ -66,7 +72,16 @@ export class BotInventoryGenerator this.generateAndAddEquipmentToBot(templateInventory, equipmentChances, botRole, botInventory, botLevel); // Roll weapon spawns (primary/secondary/holster) and generate a weapon for each roll that passed - this.generateAndAddWeaponsToBot(templateInventory, equipmentChances, sessionId, botInventory, botRole, isPmc, itemGenerationLimitsMinMax, botLevel); + this.generateAndAddWeaponsToBot( + templateInventory, + equipmentChances, + sessionId, + botInventory, + botRole, + isPmc, + itemGenerationLimitsMinMax, + botLevel, + ); // Pick loot and add to bots containers (rig/backpack/pockets/secure) this.botLootGenerator.generateLoot(sessionId, botJsonTemplate, isPmc, botRole, botInventory, botLevel); @@ -97,26 +112,11 @@ export class BotInventoryGenerator return { items: [ - { - "_id": equipmentId, - "_tpl": equipmentTpl - }, - { - "_id": stashId, - "_tpl": stashTpl - }, - { - "_id": questRaidItemsId, - "_tpl": questRaidItemsTpl - }, - { - "_id": questStashItemsId, - "_tpl": questStashItemsTpl - }, - { - "_id": sortingTableId, - "_tpl": sortingTableTpl - } + { _id: equipmentId, _tpl: equipmentTpl }, + { _id: stashId, _tpl: stashTpl }, + { _id: questRaidItemsId, _tpl: questRaidItemsTpl }, + { _id: questStashItemsId, _tpl: questStashItemsTpl }, + { _id: sortingTableId, _tpl: sortingTableTpl }, ], equipment: equipmentId, stash: stashId, @@ -124,7 +124,7 @@ export class BotInventoryGenerator questStashItems: questStashItemsId, sortingTable: sortingTableId, hideoutAreaStashes: {}, - fastPanel: {} + fastPanel: {}, }; } @@ -136,7 +136,13 @@ export class BotInventoryGenerator * @param botInventory Inventory to add equipment to * @param botLevel Level of bot */ - protected generateAndAddEquipmentToBot(templateInventory: Inventory, equipmentChances: Chances, botRole: string, botInventory: PmcInventory, botLevel: number): void + protected generateAndAddEquipmentToBot( + templateInventory: Inventory, + equipmentChances: Chances, + botRole: string, + botInventory: PmcInventory, + botLevel: number, + ): void { // These will be handled later const excludedSlots: string[] = [ @@ -147,7 +153,7 @@ export class BotInventoryGenerator EquipmentSlots.TACTICAL_VEST, EquipmentSlots.FACE_COVER, EquipmentSlots.HEADWEAR, - EquipmentSlots.EARPIECE + EquipmentSlots.EARPIECE, ]; const botEquipConfig = this.botConfig.equipment[this.botGeneratorHelper.getBotEquipmentRole(botRole)]; @@ -161,15 +167,63 @@ export class BotInventoryGenerator continue; } - this.generateEquipment(equipmentSlot, templateInventory.equipment[equipmentSlot], templateInventory.mods, equipmentChances, botRole, botInventory, randomistionDetails); + this.generateEquipment( + equipmentSlot, + templateInventory.equipment[equipmentSlot], + templateInventory.mods, + equipmentChances, + botRole, + botInventory, + randomistionDetails, + ); } // Generate below in specific order - this.generateEquipment(EquipmentSlots.FACE_COVER, templateInventory.equipment.FaceCover, templateInventory.mods, equipmentChances, botRole, botInventory, randomistionDetails); - this.generateEquipment(EquipmentSlots.HEADWEAR, templateInventory.equipment.Headwear, templateInventory.mods, equipmentChances, botRole, botInventory, randomistionDetails); - this.generateEquipment(EquipmentSlots.EARPIECE, templateInventory.equipment.Earpiece, templateInventory.mods, equipmentChances, botRole, botInventory, randomistionDetails); - this.generateEquipment(EquipmentSlots.TACTICAL_VEST, templateInventory.equipment.TacticalVest, templateInventory.mods, equipmentChances, botRole, botInventory, randomistionDetails); - this.generateEquipment(EquipmentSlots.ARMOR_VEST, templateInventory.equipment.ArmorVest, templateInventory.mods, equipmentChances, botRole, botInventory, randomistionDetails); + this.generateEquipment( + EquipmentSlots.FACE_COVER, + templateInventory.equipment.FaceCover, + templateInventory.mods, + equipmentChances, + botRole, + botInventory, + randomistionDetails, + ); + this.generateEquipment( + EquipmentSlots.HEADWEAR, + templateInventory.equipment.Headwear, + templateInventory.mods, + equipmentChances, + botRole, + botInventory, + randomistionDetails, + ); + this.generateEquipment( + EquipmentSlots.EARPIECE, + templateInventory.equipment.Earpiece, + templateInventory.mods, + equipmentChances, + botRole, + botInventory, + randomistionDetails, + ); + this.generateEquipment( + EquipmentSlots.TACTICAL_VEST, + templateInventory.equipment.TacticalVest, + templateInventory.mods, + equipmentChances, + botRole, + botInventory, + randomistionDetails, + ); + this.generateEquipment( + EquipmentSlots.ARMOR_VEST, + templateInventory.equipment.ArmorVest, + templateInventory.mods, + equipmentChances, + botRole, + botInventory, + randomistionDetails, + ); } /** @@ -189,14 +243,18 @@ export class BotInventoryGenerator spawnChances: Chances, botRole: string, inventory: PmcInventory, - randomisationDetails: RandomisationDetails): void + randomisationDetails: RandomisationDetails, + ): void { - const spawnChance = ([EquipmentSlots.POCKETS, EquipmentSlots.SECURED_CONTAINER] as string[]).includes(equipmentSlot) - ? 100 - : spawnChances.equipment[equipmentSlot]; + const spawnChance = + ([EquipmentSlots.POCKETS, EquipmentSlots.SECURED_CONTAINER] as string[]).includes(equipmentSlot) + ? 100 + : spawnChances.equipment[equipmentSlot]; if (typeof spawnChance === "undefined") { - this.logger.warning(this.localisationService.getText("bot-no_spawn_chance_defined_for_equipment_slot", equipmentSlot)); + this.logger.warning( + this.localisationService.getText("bot-no_spawn_chance_defined_for_equipment_slot", equipmentSlot), + ); return; } @@ -216,30 +274,52 @@ export class BotInventoryGenerator return; } - if (this.botGeneratorHelper.isItemIncompatibleWithCurrentItems(inventory.items, equipmentItemTpl, equipmentSlot).incompatible) + if ( + this.botGeneratorHelper.isItemIncompatibleWithCurrentItems( + inventory.items, + equipmentItemTpl, + equipmentSlot, + ).incompatible + ) { // Bad luck - randomly picked item was not compatible with current gear return; } const item = { - "_id": id, - "_tpl": equipmentItemTpl, - "parentId": inventory.equipment, - "slotId": equipmentSlot, - ...this.botGeneratorHelper.generateExtraPropertiesForItem(itemTemplate[1], botRole) + _id: id, + _tpl: equipmentItemTpl, + parentId: inventory.equipment, + slotId: equipmentSlot, + ...this.botGeneratorHelper.generateExtraPropertiesForItem(itemTemplate[1], botRole), }; // use dynamic mod pool if enabled in config const botEquipmentRole = this.botGeneratorHelper.getBotEquipmentRole(botRole); - if (this.botConfig.equipment[botEquipmentRole] && randomisationDetails?.randomisedArmorSlots?.includes(equipmentSlot)) + if ( + this.botConfig.equipment[botEquipmentRole] + && randomisationDetails?.randomisedArmorSlots?.includes(equipmentSlot) + ) { - modPool[equipmentItemTpl] = this.getFilteredDynamicModsForItem(equipmentItemTpl, this.botConfig.equipment[botEquipmentRole].blacklist); + modPool[equipmentItemTpl] = this.getFilteredDynamicModsForItem( + equipmentItemTpl, + this.botConfig.equipment[botEquipmentRole].blacklist, + ); } - if (typeof(modPool[equipmentItemTpl]) !== "undefined" || Object.keys(modPool[equipmentItemTpl] || {}).length > 0) + if ( + typeof (modPool[equipmentItemTpl]) !== "undefined" + || Object.keys(modPool[equipmentItemTpl] || {}).length > 0 + ) { - const items = this.botEquipmentModGenerator.generateModsForEquipment([item], modPool, id, itemTemplate[1], spawnChances.mods, botRole); + const items = this.botEquipmentModGenerator.generateModsForEquipment( + [item], + modPool, + id, + itemTemplate[1], + spawnChances.mods, + botRole, + ); inventory.items.push(...items); } else @@ -255,13 +335,16 @@ export class BotInventoryGenerator * @param equipmentBlacklist blacklist to filter mod pool with * @returns Filtered pool of mods */ - protected getFilteredDynamicModsForItem(itemTpl: string, equipmentBlacklist: EquipmentFilterDetails[]): Record + protected getFilteredDynamicModsForItem( + itemTpl: string, + equipmentBlacklist: EquipmentFilterDetails[], + ): Record { const modPool = this.botEquipmentModPoolService.getModsForGearSlot(itemTpl); for (const modSlot of Object.keys(modPool ?? [])) { const blacklistedMods = equipmentBlacklist[0]?.equipment[modSlot] || []; - const filteredMods = modPool[modSlot].filter(x => !blacklistedMods.includes(x)); + const filteredMods = modPool[modSlot].filter((x) => !blacklistedMods.includes(x)); if (filteredMods.length > 0) { @@ -283,7 +366,16 @@ export class BotInventoryGenerator * @param botLevel level of bot having weapon generated * @param itemGenerationLimitsMinMax Limits for items the bot can have */ - protected generateAndAddWeaponsToBot(templateInventory: Inventory, equipmentChances: Chances, sessionId: string, botInventory: PmcInventory, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation, botLevel: number): void + protected generateAndAddWeaponsToBot( + templateInventory: Inventory, + equipmentChances: Chances, + sessionId: string, + botInventory: PmcInventory, + botRole: string, + isPmc: boolean, + itemGenerationLimitsMinMax: Generation, + botLevel: number, + ): void { const weaponSlotsToFill = this.getDesiredWeaponsForBot(equipmentChances); for (const weaponSlot of weaponSlotsToFill) @@ -291,7 +383,17 @@ export class BotInventoryGenerator // Add weapon to bot if true and bot json has something to put into the slot if (weaponSlot.shouldSpawn && Object.keys(templateInventory.equipment[weaponSlot.slot]).length) { - this.addWeaponAndMagazinesToInventory(sessionId, weaponSlot, templateInventory, botInventory, equipmentChances, botRole, isPmc, itemGenerationLimitsMinMax, botLevel); + this.addWeaponAndMagazinesToInventory( + sessionId, + weaponSlot, + templateInventory, + botInventory, + equipmentChances, + botRole, + isPmc, + itemGenerationLimitsMinMax, + botLevel, + ); } } } @@ -304,24 +406,17 @@ export class BotInventoryGenerator protected getDesiredWeaponsForBot(equipmentChances: Chances): { slot: EquipmentSlots; shouldSpawn: boolean; }[] { const shouldSpawnPrimary = this.randomUtil.getChance100(equipmentChances.equipment.FirstPrimaryWeapon); - return [ - { - slot: EquipmentSlots.FIRST_PRIMARY_WEAPON, - shouldSpawn: shouldSpawnPrimary - }, - { - slot: EquipmentSlots.SECOND_PRIMARY_WEAPON, - shouldSpawn: shouldSpawnPrimary - ? this.randomUtil.getChance100(equipmentChances.equipment.SecondPrimaryWeapon) - : false - }, - { - slot: EquipmentSlots.HOLSTER, - shouldSpawn: shouldSpawnPrimary - ? this.randomUtil.getChance100(equipmentChances.equipment.Holster) // Primary weapon = roll for chance at pistol - : true // No primary = force pistol - } - ]; + return [{ slot: EquipmentSlots.FIRST_PRIMARY_WEAPON, shouldSpawn: shouldSpawnPrimary }, { + slot: EquipmentSlots.SECOND_PRIMARY_WEAPON, + shouldSpawn: shouldSpawnPrimary + ? this.randomUtil.getChance100(equipmentChances.equipment.SecondPrimaryWeapon) + : false, + }, { + slot: EquipmentSlots.HOLSTER, + shouldSpawn: shouldSpawnPrimary + ? this.randomUtil.getChance100(equipmentChances.equipment.Holster) // Primary weapon = roll for chance at pistol + : true, // No primary = force pistol + }]; } /** @@ -333,7 +428,7 @@ export class BotInventoryGenerator * @param equipmentChances Chances bot can have equipment equipped * @param botRole assault/pmcBot/bossTagilla etc * @param isPmc Is the bot being generated as a pmc - * @param itemGenerationWeights + * @param itemGenerationWeights */ protected addWeaponAndMagazinesToInventory( sessionId: string, @@ -344,7 +439,8 @@ export class BotInventoryGenerator botRole: string, isPmc: boolean, itemGenerationWeights: Generation, - botLevel: number): void + botLevel: number, + ): void { const generatedWeapon = this.botWeaponGenerator.generateRandomWeapon( sessionId, @@ -354,10 +450,16 @@ export class BotInventoryGenerator equipmentChances.mods, botRole, isPmc, - botLevel); + botLevel, + ); botInventory.items.push(...generatedWeapon.weapon); - this.botWeaponGenerator.addExtraMagazinesToInventory(generatedWeapon, itemGenerationWeights.items.magazines, botInventory, botRole); + this.botWeaponGenerator.addExtraMagazinesToInventory( + generatedWeapon, + itemGenerationWeights.items.magazines, + botInventory, + botRole, + ); } -} \ No newline at end of file +} diff --git a/project/src/generators/BotLevelGenerator.ts b/project/src/generators/BotLevelGenerator.ts index cc205912..2b4d8835 100644 --- a/project/src/generators/BotLevelGenerator.ts +++ b/project/src/generators/BotLevelGenerator.ts @@ -15,9 +15,9 @@ export class BotLevelGenerator constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("RandomUtil") protected randomUtil: RandomUtil, - @inject("DatabaseServer") protected databaseServer: DatabaseServer + @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) - { } + {} /** * Return a randomised bot level and exp value @@ -27,11 +27,20 @@ export class BotLevelGenerator * @returns IRandomisedBotLevelResult object */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public generateBotLevel(levelDetails: MinMax, botGenerationDetails: BotGenerationDetails, bot: IBotBase): IRandomisedBotLevelResult + public generateBotLevel( + levelDetails: MinMax, + botGenerationDetails: BotGenerationDetails, + bot: IBotBase, + ): IRandomisedBotLevelResult { const expTable = this.databaseServer.getTables().globals.config.exp.level.exp_table; - const highestLevel = this.getHighestRelativeBotLevel(botGenerationDetails.playerLevel, botGenerationDetails.botRelativeLevelDeltaMax, levelDetails, expTable); - + const highestLevel = this.getHighestRelativeBotLevel( + botGenerationDetails.playerLevel, + botGenerationDetails.botRelativeLevelDeltaMax, + levelDetails, + expTable, + ); + // Get random level based on the exp table. let exp = 0; const level = this.randomUtil.getInt(1, highestLevel); @@ -56,7 +65,12 @@ export class BotLevelGenerator * @param relativeDeltaMax max delta above player level to go * @returns highest level possible for bot */ - protected getHighestRelativeBotLevel(playerLevel: number, relativeDeltaMax: number, levelDetails: MinMax, expTable: IExpTable[]): number + protected getHighestRelativeBotLevel( + playerLevel: number, + relativeDeltaMax: number, + levelDetails: MinMax, + expTable: IExpTable[], + ): number { const maxPossibleLevel = Math.min(levelDetails.max, expTable.length); @@ -68,4 +82,4 @@ export class BotLevelGenerator return level; } -} \ No newline at end of file +} diff --git a/project/src/generators/BotLootGenerator.ts b/project/src/generators/BotLootGenerator.ts index e3b6594f..8bd4d68f 100644 --- a/project/src/generators/BotLootGenerator.ts +++ b/project/src/generators/BotLootGenerator.ts @@ -30,7 +30,7 @@ export class BotLootGenerator { protected botConfig: IBotConfig; protected pmcConfig: IPmcConfig; - + constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("HashUtil") protected hashUtil: HashUtil, @@ -44,7 +44,7 @@ export class BotLootGenerator @inject("WeightedRandomHelper") protected weightedRandomHelper: WeightedRandomHelper, @inject("BotLootCacheService") protected botLootCacheService: BotLootCacheService, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -60,15 +60,24 @@ export class BotLootGenerator * @param botInventory Inventory to add loot to * @param botLevel Level of bot */ - public generateLoot(sessionId: string, botJsonTemplate: IBotType, isPmc: boolean, botRole: string, botInventory: PmcInventory, botLevel: number): void + public generateLoot( + sessionId: string, + botJsonTemplate: IBotType, + isPmc: boolean, + botRole: string, + botInventory: PmcInventory, + botLevel: number, + ): void { // Limits on item types to be added as loot const itemCounts = botJsonTemplate.generation.items; - + const backpackLootCount = this.weightedRandomHelper.getWeightedValue(itemCounts.backpackLoot.weights); const pocketLootCount = this.weightedRandomHelper.getWeightedValue(itemCounts.pocketLoot.weights); const vestLootCount = this.weightedRandomHelper.getWeightedValue(itemCounts.vestLoot.weights); - const specialLootItemCount = this.weightedRandomHelper.getWeightedValue(itemCounts.specialItems.weights); + const specialLootItemCount = this.weightedRandomHelper.getWeightedValue( + itemCounts.specialItems.weights, + ); const healingItemCount = this.weightedRandomHelper.getWeightedValue(itemCounts.healing.weights); const drugItemCount = this.weightedRandomHelper.getWeightedValue(itemCounts.drugs.weights); const stimItemCount = this.weightedRandomHelper.getWeightedValue(itemCounts.stims.weights); @@ -88,7 +97,8 @@ export class BotLootGenerator containersBotHasAvailable, specialLootItemCount, botInventory, - botRole); + botRole, + ); // Healing items / Meds this.addLootFromPool( @@ -99,7 +109,8 @@ export class BotLootGenerator botRole, false, 0, - isPmc); + isPmc, + ); // Drugs this.addLootFromPool( @@ -110,7 +121,8 @@ export class BotLootGenerator botRole, false, 0, - isPmc); + isPmc, + ); // Stims this.addLootFromPool( @@ -121,7 +133,8 @@ export class BotLootGenerator botRole, true, 0, - isPmc); + isPmc, + ); // Grenades this.addLootFromPool( @@ -132,8 +145,8 @@ export class BotLootGenerator botRole, false, 0, - isPmc); - + isPmc, + ); // Backpack - generate loot if they have one if (containersBotHasAvailable.includes(EquipmentSlots.BACKPACK)) @@ -141,7 +154,16 @@ export class BotLootGenerator // Add randomly generated weapon to PMC backpacks if (isPmc && this.randomUtil.getChance100(this.pmcConfig.looseWeaponInBackpackChancePercent)) { - this.addLooseWeaponsToInventorySlot(sessionId, botInventory, EquipmentSlots.BACKPACK, botJsonTemplate.inventory, botJsonTemplate.chances.mods, botRole, isPmc, botLevel); + this.addLooseWeaponsToInventorySlot( + sessionId, + botInventory, + EquipmentSlots.BACKPACK, + botJsonTemplate.inventory, + botJsonTemplate.chances.mods, + botRole, + isPmc, + botLevel, + ); } this.addLootFromPool( @@ -152,9 +174,10 @@ export class BotLootGenerator botRole, true, this.pmcConfig.maxBackpackLootTotalRub, - isPmc); + isPmc, + ); } - + // TacticalVest - generate loot if they have one if (containersBotHasAvailable.includes(EquipmentSlots.TACTICAL_VEST)) { @@ -167,10 +190,10 @@ export class BotLootGenerator botRole, true, this.pmcConfig.maxVestLootTotalRub, - isPmc); + isPmc, + ); } - // Pockets this.addLootFromPool( this.botLootCacheService.getLootFromCache(botRole, isPmc, LootCacheType.POCKET, botJsonTemplate), @@ -180,7 +203,8 @@ export class BotLootGenerator botRole, true, this.pmcConfig.maxPocketLootTotalRub, - isPmc); + isPmc, + ); } /** @@ -192,13 +216,12 @@ export class BotLootGenerator { const result = [EquipmentSlots.POCKETS]; - if (botInventory.items.find(x => x.slotId === EquipmentSlots.TACTICAL_VEST)) + if (botInventory.items.find((x) => x.slotId === EquipmentSlots.TACTICAL_VEST)) { - result.push(EquipmentSlots.TACTICAL_VEST); } - if (botInventory.items.find(x => x.slotId === EquipmentSlots.BACKPACK)) + if (botInventory.items.find((x) => x.slotId === EquipmentSlots.BACKPACK)) { result.push(EquipmentSlots.BACKPACK); } @@ -214,48 +237,16 @@ export class BotLootGenerator protected addForcedMedicalItemsToPmcSecure(botInventory: PmcInventory, botRole: string): void { const grizzly = this.itemHelper.getItem("590c657e86f77412b013051d")[1]; - this.addLootFromPool( - [grizzly], - [EquipmentSlots.SECURED_CONTAINER], - 2, - botInventory, - botRole, - false, - 0, - true); + this.addLootFromPool([grizzly], [EquipmentSlots.SECURED_CONTAINER], 2, botInventory, botRole, false, 0, true); const surv12 = this.itemHelper.getItem("5d02797c86f774203f38e30a")[1]; - this.addLootFromPool( - [surv12], - [EquipmentSlots.SECURED_CONTAINER], - 1, - botInventory, - botRole, - false, - 0, - true); + this.addLootFromPool([surv12], [EquipmentSlots.SECURED_CONTAINER], 1, botInventory, botRole, false, 0, true); const morphine = this.itemHelper.getItem("544fb3f34bdc2d03748b456a")[1]; - this.addLootFromPool( - [morphine], - [EquipmentSlots.SECURED_CONTAINER], - 3, - botInventory, - botRole, - false, - 0, - true); + this.addLootFromPool([morphine], [EquipmentSlots.SECURED_CONTAINER], 3, botInventory, botRole, false, 0, true); const afak = this.itemHelper.getItem("60098ad7c2240c0fe85c570a")[1]; - this.addLootFromPool( - [afak], - [EquipmentSlots.SECURED_CONTAINER], - 2, - botInventory, - botRole, - false, - 0, - true); + this.addLootFromPool([afak], [EquipmentSlots.SECURED_CONTAINER], 2, botInventory, botRole, false, 0, true); } /** @@ -290,14 +281,15 @@ export class BotLootGenerator botRole: string, useLimits = false, totalValueLimitRub = 0, - isPmc = false): void + isPmc = false, + ): void { // Loot pool has items if (pool.length) { let currentTotalRub = 0; const itemLimits: Record = {}; - const itemSpawnLimits: Record> = {}; + const itemSpawnLimits: Record> = {}; let fitItemIntoContainerAttempts = 0; for (let i = 0; i < totalItemCount; i++) { @@ -306,7 +298,7 @@ export class BotLootGenerator const itemsToAdd: Item[] = [{ _id: id, _tpl: itemToAddTemplate._id, - ...this.botGeneratorHelper.generateExtraPropertiesForItem(itemToAddTemplate, botRole) + ...this.botGeneratorHelper.generateExtraPropertiesForItem(itemToAddTemplate, botRole), }]; if (useLimits) @@ -321,11 +313,19 @@ export class BotLootGenerator itemSpawnLimits[botRole] = this.getItemSpawnLimitsForBotType(isPmc, botRole); } - if (this.itemHasReachedSpawnLimit(itemToAddTemplate, botRole, isPmc, itemLimits, itemSpawnLimits[botRole])) + if ( + this.itemHasReachedSpawnLimit( + itemToAddTemplate, + botRole, + isPmc, + itemLimits, + itemSpawnLimits[botRole], + ) + ) { i--; continue; - } + } } // Fill ammo box @@ -345,13 +345,21 @@ export class BotLootGenerator } // Attempt to add item to container(s) - const itemAddedResult = this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot(equipmentSlots, id, itemToAddTemplate._id, itemsToAdd, inventoryToAddItemsTo); + const itemAddedResult = this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot( + equipmentSlots, + id, + itemToAddTemplate._id, + itemsToAdd, + inventoryToAddItemsTo, + ); if (itemAddedResult === ItemAddedResult.NO_SPACE) { fitItemIntoContainerAttempts++; if (fitItemIntoContainerAttempts >= 4) { - this.logger.debug(`Failed to place item ${i} of ${totalItemCount} item into ${botRole} container: ${equipmentSlots}, ${fitItemIntoContainerAttempts} times, skipping`); + this.logger.debug( + `Failed to place item ${i} of ${totalItemCount} item into ${botRole} container: ${equipmentSlots}, ${fitItemIntoContainerAttempts} times, skipping`, + ); break; } @@ -383,16 +391,48 @@ export class BotLootGenerator * @param botRole bots role .e.g. pmcBot * @param isPmc are we generating for a pmc */ - protected addLooseWeaponsToInventorySlot(sessionId: string, botInventory: PmcInventory, equipmentSlot: string, templateInventory: Inventory, modChances: ModsChances, botRole: string, isPmc: boolean, botLevel: number): void + protected addLooseWeaponsToInventorySlot( + sessionId: string, + botInventory: PmcInventory, + equipmentSlot: string, + templateInventory: Inventory, + modChances: ModsChances, + botRole: string, + isPmc: boolean, + botLevel: number, + ): void { - const chosenWeaponType = this.randomUtil.getArrayValue([EquipmentSlots.FIRST_PRIMARY_WEAPON, EquipmentSlots.FIRST_PRIMARY_WEAPON, EquipmentSlots.FIRST_PRIMARY_WEAPON, EquipmentSlots.HOLSTER]); - const randomisedWeaponCount = this.randomUtil.getInt(this.pmcConfig.looseWeaponInBackpackLootMinMax.min, this.pmcConfig.looseWeaponInBackpackLootMinMax.max); + const chosenWeaponType = this.randomUtil.getArrayValue([ + EquipmentSlots.FIRST_PRIMARY_WEAPON, + EquipmentSlots.FIRST_PRIMARY_WEAPON, + EquipmentSlots.FIRST_PRIMARY_WEAPON, + EquipmentSlots.HOLSTER, + ]); + const randomisedWeaponCount = this.randomUtil.getInt( + this.pmcConfig.looseWeaponInBackpackLootMinMax.min, + this.pmcConfig.looseWeaponInBackpackLootMinMax.max, + ); if (randomisedWeaponCount > 0) { for (let i = 0; i < randomisedWeaponCount; i++) { - const generatedWeapon = this.botWeaponGenerator.generateRandomWeapon(sessionId, chosenWeaponType, templateInventory, botInventory.equipment, modChances, botRole, isPmc, botLevel); - this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot([equipmentSlot], generatedWeapon.weapon[0]._id, generatedWeapon.weapon[0]._tpl, [...generatedWeapon.weapon], botInventory); + const generatedWeapon = this.botWeaponGenerator.generateRandomWeapon( + sessionId, + chosenWeaponType, + templateInventory, + botInventory.equipment, + modChances, + botRole, + isPmc, + botLevel, + ); + this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot( + [equipmentSlot], + generatedWeapon.weapon[0]._id, + generatedWeapon.weapon[0]._tpl, + [...generatedWeapon.weapon], + botInventory, + ); } } } @@ -405,7 +445,12 @@ export class BotLootGenerator */ protected getRandomItemFromPoolByRole(pool: ITemplateItem[], botRole: string): ITemplateItem { - const itemIndex = this.randomUtil.getBiasedRandomNumber(0, pool.length - 1, pool.length - 1, this.getBotLootNValueByRole(botRole)); + const itemIndex = this.randomUtil.getBiasedRandomNumber( + 0, + pool.length - 1, + pool.length - 1, + this.getBotLootNValueByRole(botRole), + ); return pool[itemIndex]; } @@ -421,7 +466,7 @@ export class BotLootGenerator { this.logger.warning(this.localisationService.getText("bot-unable_to_find_loot_n_value_for_bot", botRole)); - return this.botConfig.lootNValue["scav"]; + return this.botConfig.lootNValue.scav; } return result; @@ -432,7 +477,7 @@ export class BotLootGenerator * All values are set to 0 * @param isPmc Is the bot a pmc * @param botRole Role the bot has - * @param limitCount + * @param limitCount */ protected initItemLimitArray(isPmc: boolean, botRole: string, limitCount: Record): void { @@ -443,7 +488,7 @@ export class BotLootGenerator limitCount[limit] = 0; } } - + /** * Check if an item has reached its bot-specific spawn limit * @param itemTemplate Item we check to see if its reached spawn limit @@ -453,7 +498,13 @@ export class BotLootGenerator * @param itemSpawnLimits The limits this bot is allowed to have * @returns true if item has reached spawn limit */ - protected itemHasReachedSpawnLimit(itemTemplate: ITemplateItem, botRole: string, isPmc: boolean, limitCount: Record, itemSpawnLimits: Record): boolean + protected itemHasReachedSpawnLimit( + itemTemplate: ITemplateItem, + botRole: string, + isPmc: boolean, + limitCount: Record, + itemSpawnLimits: Record, + ): boolean { // PMCs and scavs have different sections of bot config for spawn limits if (!!itemSpawnLimits && itemSpawnLimits.length === 0) @@ -484,7 +535,13 @@ export class BotLootGenerator // Prevent edge-case of small loot pools + code trying to add limited item over and over infinitely if (limitCount[idToCheckFor] > itemSpawnLimits[idToCheckFor] * 10) { - this.logger.debug(this.localisationService.getText("bot-item_spawn_limit_reached_skipping_item", {botRole: botRole, itemName: itemTemplate._name, attempts: limitCount[idToCheckFor]})); + this.logger.debug( + this.localisationService.getText("bot-item_spawn_limit_reached_skipping_item", { + botRole: botRole, + itemName: itemTemplate._name, + attempts: limitCount[idToCheckFor], + }), + ); return false; } @@ -505,7 +562,7 @@ export class BotLootGenerator { // PMCs have a different stack max size const minStackSize = itemTemplate._props.StackMinRandom; - const maxStackSize = (isPmc) + const maxStackSize = isPmc ? this.pmcConfig.dynamicLoot.moneyStackLimits[itemTemplate._id] : itemTemplate._props.StackMaxRandom; const randomSize = this.randomUtil.getInt(minStackSize, maxStackSize); @@ -515,7 +572,7 @@ export class BotLootGenerator moneyItem.upd = {}; } - moneyItem.upd.StackObjectsCount = randomSize; + moneyItem.upd.StackObjectsCount = randomSize; } /** @@ -535,7 +592,7 @@ export class BotLootGenerator ammoItem.upd = {}; } - ammoItem.upd.StackObjectsCount = randomSize ; + ammoItem.upd.StackObjectsCount = randomSize; } /** @@ -549,7 +606,7 @@ export class BotLootGenerator { if (isPmc) { - return this.botConfig.itemSpawnLimits["pmc"]; + return this.botConfig.itemSpawnLimits.pmc; } if (this.botConfig.itemSpawnLimits[botRole.toLowerCase()]) @@ -557,9 +614,11 @@ export class BotLootGenerator return this.botConfig.itemSpawnLimits[botRole.toLowerCase()]; } - this.logger.warning(this.localisationService.getText("bot-unable_to_find_spawn_limits_fallback_to_defaults", botRole)); + this.logger.warning( + this.localisationService.getText("bot-unable_to_find_spawn_limits_fallback_to_defaults", botRole), + ); - return this.botConfig.itemSpawnLimits["default"]; + return this.botConfig.itemSpawnLimits.default; } /** @@ -570,7 +629,6 @@ export class BotLootGenerator */ protected getMatchingIdFromSpawnLimits(itemTemplate: ITemplateItem, spawnLimits: Record): string { - if (itemTemplate._id in spawnLimits) { return itemTemplate._id; @@ -585,4 +643,4 @@ export class BotLootGenerator // parentId and tplid not found return undefined; } -} \ No newline at end of file +} diff --git a/project/src/generators/BotWeaponGenerator.ts b/project/src/generators/BotWeaponGenerator.ts index 0708c56f..bda5b435 100644 --- a/project/src/generators/BotWeaponGenerator.ts +++ b/project/src/generators/BotWeaponGenerator.ts @@ -1,4 +1,4 @@ -import { inject, injectable, injectAll } from "tsyringe"; +import { inject, injectAll, injectable } from "tsyringe"; import { BotEquipmentModGenerator } from "@spt-aki/generators/BotEquipmentModGenerator"; import { IInventoryMagGen } from "@spt-aki/generators/weapongen/IInventoryMagGen"; @@ -51,7 +51,7 @@ export class BotWeaponGenerator @inject("BotEquipmentModGenerator") protected botEquipmentModGenerator: BotEquipmentModGenerator, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("RepairService") protected repairService: RepairService, - @injectAll("InventoryMagGen") protected inventoryMagGenComponents: IInventoryMagGen[] + @injectAll("InventoryMagGen") protected inventoryMagGenComponents: IInventoryMagGen[], ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -64,16 +64,35 @@ export class BotWeaponGenerator * Pick a random weapon based on weightings and generate a functional weapon * @param equipmentSlot Primary/secondary/holster * @param botTemplateInventory e.g. assault.json - * @param weaponParentId - * @param modChances + * @param weaponParentId + * @param modChances * @param botRole role of bot, e.g. assault/followerBully * @param isPmc Is weapon generated for a pmc * @returns GenerateWeaponResult object */ - public generateRandomWeapon(sessionId: string, equipmentSlot: string, botTemplateInventory: Inventory, weaponParentId: string, modChances: ModsChances, botRole: string, isPmc: boolean, botLevel: number): GenerateWeaponResult + public generateRandomWeapon( + sessionId: string, + equipmentSlot: string, + botTemplateInventory: Inventory, + weaponParentId: string, + modChances: ModsChances, + botRole: string, + isPmc: boolean, + botLevel: number, + ): GenerateWeaponResult { const weaponTpl = this.pickWeightedWeaponTplFromPool(equipmentSlot, botTemplateInventory); - return this.generateWeaponByTpl(sessionId, weaponTpl, equipmentSlot, botTemplateInventory, weaponParentId, modChances, botRole, isPmc, botLevel); + return this.generateWeaponByTpl( + sessionId, + weaponTpl, + equipmentSlot, + botTemplateInventory, + weaponParentId, + modChances, + botRole, + isPmc, + botLevel, + ); } /** @@ -100,7 +119,17 @@ export class BotWeaponGenerator * @returns GenerateWeaponResult object */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public generateWeaponByTpl(sessionId: string, weaponTpl: string, equipmentSlot: string, botTemplateInventory: Inventory, weaponParentId: string, modChances: ModsChances, botRole: string, isPmc: boolean, botLevel: number): GenerateWeaponResult + public generateWeaponByTpl( + sessionId: string, + weaponTpl: string, + equipmentSlot: string, + botTemplateInventory: Inventory, + weaponParentId: string, + modChances: ModsChances, + botRole: string, + isPmc: boolean, + botLevel: number, + ): GenerateWeaponResult { const modPool = botTemplateInventory.mods; const weaponItemTemplate = this.itemHelper.getItem(weaponTpl)[1]; @@ -123,7 +152,13 @@ export class BotWeaponGenerator const ammoTpl = this.getWeightedCompatibleAmmo(botTemplateInventory.Ammo, weaponItemTemplate); // Create with just base weapon item - let weaponWithModsArray = this.constructWeaponBaseArray(weaponTpl, weaponParentId, equipmentSlot, weaponItemTemplate, botRole); + let weaponWithModsArray = this.constructWeaponBaseArray( + weaponTpl, + weaponParentId, + equipmentSlot, + weaponItemTemplate, + botRole, + ); // Chance to add randomised weapon enhancement if (isPmc && this.randomUtil.getChance100(this.pmcConfig.weaponHasEnhancementChancePercent)) @@ -137,32 +172,52 @@ export class BotWeaponGenerator { const botEquipmentRole = this.botGeneratorHelper.getBotEquipmentRole(botRole); const modLimits = this.botWeaponModLimitService.getWeaponModLimits(botEquipmentRole); - weaponWithModsArray = this.botEquipmentModGenerator.generateModsForWeapon(sessionId, weaponWithModsArray, modPool, weaponWithModsArray[0]._id, weaponItemTemplate, modChances, ammoTpl, botRole, botLevel, modLimits, botEquipmentRole); + weaponWithModsArray = this.botEquipmentModGenerator.generateModsForWeapon( + sessionId, + weaponWithModsArray, + modPool, + weaponWithModsArray[0]._id, + weaponItemTemplate, + modChances, + ammoTpl, + botRole, + botLevel, + modLimits, + botEquipmentRole, + ); } // Use weapon preset from globals.json if weapon isnt valid if (!this.isWeaponValid(weaponWithModsArray, botRole)) { // Weapon is bad, fall back to weapons preset - weaponWithModsArray = this.getPresetWeaponMods(weaponTpl, equipmentSlot, weaponParentId, weaponItemTemplate, botRole); + weaponWithModsArray = this.getPresetWeaponMods( + weaponTpl, + equipmentSlot, + weaponParentId, + weaponItemTemplate, + botRole, + ); } // Fill existing magazines to full and sync ammo type - for (const magazine of weaponWithModsArray.filter(x => x.slotId === this.modMagazineSlotId)) + for (const magazine of weaponWithModsArray.filter((x) => x.slotId === this.modMagazineSlotId)) { this.fillExistingMagazines(weaponWithModsArray, magazine, ammoTpl); } // Add cartridge to gun chamber if weapon has slot for it - if (weaponItemTemplate._props.Chambers?.length === 1 - && weaponItemTemplate._props.Chambers[0]?._name === "patron_in_weapon" - && weaponItemTemplate._props.Chambers[0]?._props?.filters[0]?.Filter?.includes(ammoTpl)) + if ( + weaponItemTemplate._props.Chambers?.length === 1 + && weaponItemTemplate._props.Chambers[0]?._name === "patron_in_weapon" + && weaponItemTemplate._props.Chambers[0]?._props?.filters[0]?.Filter?.includes(ammoTpl) + ) { this.addCartridgeToChamber(weaponWithModsArray, ammoTpl, "patron_in_weapon"); } // Fill UBGL if found - const ubglMod = weaponWithModsArray.find(x => x.slotId === "mod_launcher"); + const ubglMod = weaponWithModsArray.find((x) => x.slotId === "mod_launcher"); let ubglAmmoTpl: string = undefined; if (ubglMod) { @@ -176,7 +231,7 @@ export class BotWeaponGenerator chosenAmmoTpl: ammoTpl, chosenUbglAmmoTpl: ubglAmmoTpl, weaponMods: modPool, - weaponTemplate: weaponItemTemplate + weaponTemplate: weaponItemTemplate, }; } @@ -189,7 +244,7 @@ export class BotWeaponGenerator protected addCartridgeToChamber(weaponWithModsArray: Item[], ammoTpl: string, desiredSlotId: string): void { // Check for slot first - const existingItemWithSlot = weaponWithModsArray.find(x => x.slotId === desiredSlotId); + const existingItemWithSlot = weaponWithModsArray.find((x) => x.slotId === desiredSlotId); if (!existingItemWithSlot) { // Not found, add fresh @@ -198,15 +253,13 @@ export class BotWeaponGenerator _tpl: ammoTpl, parentId: weaponWithModsArray[0]._id, slotId: desiredSlotId, - upd: {StackObjectsCount: 1} + upd: { StackObjectsCount: 1 }, }); } else { // Already exists, update values - existingItemWithSlot.upd = { - StackObjectsCount: 1 - }; + existingItemWithSlot.upd = { StackObjectsCount: 1 }; existingItemWithSlot._tpl = ammoTpl; } } @@ -216,19 +269,25 @@ export class BotWeaponGenerator * add additional properties based on weapon type * @param weaponTpl Weapon tpl to create item with * @param weaponParentId Weapons parent id - * @param equipmentSlot e.g. primary/secondary/holster + * @param equipmentSlot e.g. primary/secondary/holster * @param weaponItemTemplate db template for weapon * @param botRole for durability values * @returns Base weapon item in array */ - protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[] + protected constructWeaponBaseArray( + weaponTpl: string, + weaponParentId: string, + equipmentSlot: string, + weaponItemTemplate: ITemplateItem, + botRole: string, + ): Item[] { return [{ _id: this.hashUtil.generate(), _tpl: weaponTpl, parentId: weaponParentId, slotId: equipmentSlot, - ...this.botGeneratorHelper.generateExtraPropertiesForItem(weaponItemTemplate, botRole) + ...this.botGeneratorHelper.generateExtraPropertiesForItem(weaponItemTemplate, botRole), }]; } @@ -239,10 +298,18 @@ export class BotWeaponGenerator * @param weaponParentId Value used for the parentid * @returns array of weapon mods */ - protected getPresetWeaponMods(weaponTpl: string, equipmentSlot: string, weaponParentId: string, itemTemplate: ITemplateItem, botRole: string): Item[] + protected getPresetWeaponMods( + weaponTpl: string, + equipmentSlot: string, + weaponParentId: string, + itemTemplate: ITemplateItem, + botRole: string, + ): Item[] { // Invalid weapon generated, fallback to preset - this.logger.warning(this.localisationService.getText("bot-weapon_generated_incorrect_using_default", weaponTpl)); + this.logger.warning( + this.localisationService.getText("bot-weapon_generated_incorrect_using_default", weaponTpl), + ); const weaponMods = []; // TODO: Right now, preset weapons trigger a lot of warnings regarding missing ammo in magazines & such @@ -260,11 +327,12 @@ export class BotWeaponGenerator { const parentItem = preset._items[0]; preset._items[0] = { - ...parentItem, ...{ - "parentId": weaponParentId, - "slotId": equipmentSlot, - ...this.botGeneratorHelper.generateExtraPropertiesForItem(itemTemplate, botRole) - } + ...parentItem, + ...{ + parentId: weaponParentId, + slotId: equipmentSlot, + ...this.botGeneratorHelper.generateExtraPropertiesForItem(itemTemplate, botRole), + }, }; weaponMods.push(...preset._items); } @@ -304,17 +372,30 @@ export class BotWeaponGenerator const allowedTpls = modSlot._props.filters[0].Filter; const slotName = modSlot._name; - const weaponSlotItem = weaponItemArray.find(x => x.parentId === mod._id && x.slotId === slotName); + const weaponSlotItem = weaponItemArray.find((x) => x.parentId === mod._id && x.slotId === slotName); if (!weaponSlotItem) { - this.logger.warning(this.localisationService.getText("bot-weapons_required_slot_missing_item", {modSlot: modSlot._name, modName: modDbTemplate._name, slotId: mod.slotId, botRole: botRole})); + this.logger.warning( + this.localisationService.getText("bot-weapons_required_slot_missing_item", { + modSlot: modSlot._name, + modName: modDbTemplate._name, + slotId: mod.slotId, + botRole: botRole, + }), + ); return false; } if (!allowedTpls.includes(weaponSlotItem._tpl)) { - this.logger.warning(this.localisationService.getText("bot-weapon_contains_invalid_item", {modSlot: modSlot._name, modName: modDbTemplate._name, weaponTpl: weaponSlotItem._tpl})); + this.logger.warning( + this.localisationService.getText("bot-weapon_contains_invalid_item", { + modSlot: modSlot._name, + modName: modDbTemplate._name, + weaponTpl: weaponSlotItem._tpl, + }), + ); return false; } @@ -332,12 +413,17 @@ export class BotWeaponGenerator * @param inventory Inventory to add magazines to * @param botRole The bot type we're getting generating extra mags for */ - public addExtraMagazinesToInventory(generatedWeaponResult: GenerateWeaponResult, magWeights: GenerationData, inventory: PmcInventory, botRole: string): void + public addExtraMagazinesToInventory( + generatedWeaponResult: GenerateWeaponResult, + magWeights: GenerationData, + inventory: PmcInventory, + botRole: string, + ): void { const weaponAndMods = generatedWeaponResult.weapon; const weaponTemplate = generatedWeaponResult.weaponTemplate; const magazineTpl = this.getMagazineTplFromWeaponTemplate(weaponAndMods, weaponTemplate, botRole); - + const magTemplate = this.itemHelper.getItem(magazineTpl)[1]; if (!magTemplate) { @@ -349,7 +435,9 @@ export class BotWeaponGenerator const ammoTemplate = this.itemHelper.getItem(generatedWeaponResult.chosenAmmoTpl)[1]; if (!ammoTemplate) { - this.logger.error(this.localisationService.getText("bot-unable_to_find_ammo_item", generatedWeaponResult.chosenAmmoTpl)); + this.logger.error( + this.localisationService.getText("bot-unable_to_find_ammo_item", generatedWeaponResult.chosenAmmoTpl), + ); return; } @@ -360,11 +448,24 @@ export class BotWeaponGenerator this.addUbglGrenadesToBotInventory(weaponAndMods, generatedWeaponResult, inventory); } - const inventoryMagGenModel = new InventoryMagGen(magWeights, magTemplate, weaponTemplate, ammoTemplate, inventory); - this.inventoryMagGenComponents.find(v => v.canHandleInventoryMagGen(inventoryMagGenModel)).process(inventoryMagGenModel); + const inventoryMagGenModel = new InventoryMagGen( + magWeights, + magTemplate, + weaponTemplate, + ammoTemplate, + inventory, + ); + this.inventoryMagGenComponents.find((v) => v.canHandleInventoryMagGen(inventoryMagGenModel)).process( + inventoryMagGenModel, + ); // Add x stacks of bullets to SecuredContainer (bots use a magic mag packing skill to reload instantly) - this.addAmmoToSecureContainer(this.botConfig.secureContainerAmmoStackCount, generatedWeaponResult.chosenAmmoTpl, ammoTemplate._props.StackMaxSize, inventory); + this.addAmmoToSecureContainer( + this.botConfig.secureContainerAmmoStackCount, + generatedWeaponResult.chosenAmmoTpl, + ammoTemplate._props.StackMaxSize, + inventory, + ); } /** @@ -373,25 +474,37 @@ export class BotWeaponGenerator * @param generatedWeaponResult result of weapon generation * @param inventory bot inventory to add grenades to */ - protected addUbglGrenadesToBotInventory(weaponMods: Item[], generatedWeaponResult: GenerateWeaponResult, inventory: PmcInventory): void + protected addUbglGrenadesToBotInventory( + weaponMods: Item[], + generatedWeaponResult: GenerateWeaponResult, + inventory: PmcInventory, + ): void { // Find ubgl mod item + get details of it from db - const ubglMod = weaponMods.find(x => x.slotId === "mod_launcher"); + const ubglMod = weaponMods.find((x) => x.slotId === "mod_launcher"); const ubglDbTemplate = this.itemHelper.getItem(ubglMod._tpl)[1]; // Define min/max of how many grenades bot will have - const ubglMinMax:GenerationData = { + const ubglMinMax: GenerationData = { // eslint-disable-next-line @typescript-eslint/naming-convention - weights: {"1": 1, "2": 1}, - whitelist: [] + weights: { "1": 1, "2": 1 }, + whitelist: [], }; // get ammo template from db const ubglAmmoDbTemplate = this.itemHelper.getItem(generatedWeaponResult.chosenUbglAmmoTpl)[1]; // Add greandes to bot inventory - const ubglAmmoGenModel = new InventoryMagGen(ubglMinMax, ubglDbTemplate, ubglDbTemplate, ubglAmmoDbTemplate, inventory); - this.inventoryMagGenComponents.find(v => v.canHandleInventoryMagGen(ubglAmmoGenModel)).process(ubglAmmoGenModel); + const ubglAmmoGenModel = new InventoryMagGen( + ubglMinMax, + ubglDbTemplate, + ubglDbTemplate, + ubglAmmoDbTemplate, + inventory, + ); + this.inventoryMagGenComponents.find((v) => v.canHandleInventoryMagGen(ubglAmmoGenModel)).process( + ubglAmmoGenModel, + ); // Store extra grenades in secure container this.addAmmoToSecureContainer(5, generatedWeaponResult.chosenUbglAmmoTpl, 20, inventory); @@ -404,17 +517,23 @@ export class BotWeaponGenerator * @param stackSize Size of the ammo stack to add * @param inventory Player inventory */ - protected addAmmoToSecureContainer(stackCount: number, ammoTpl: string, stackSize: number, inventory: PmcInventory): void + protected addAmmoToSecureContainer( + stackCount: number, + ammoTpl: string, + stackSize: number, + inventory: PmcInventory, + ): void { for (let i = 0; i < stackCount; i++) { const id = this.hashUtil.generate(); - this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot([EquipmentSlots.SECURED_CONTAINER], id, ammoTpl, [{ - _id: id, - _tpl: ammoTpl, - upd: { StackObjectsCount: stackSize } - }], - inventory); + this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot( + [EquipmentSlots.SECURED_CONTAINER], + id, + ammoTpl, + [{ _id: id, _tpl: ammoTpl, upd: { StackObjectsCount: stackSize } }], + inventory, + ); } } @@ -425,9 +544,13 @@ export class BotWeaponGenerator * @param botRole the bot type we are getting the magazine for * @returns magazine tpl string */ - protected getMagazineTplFromWeaponTemplate(weaponMods: Item[], weaponTemplate: ITemplateItem, botRole: string): string + protected getMagazineTplFromWeaponTemplate( + weaponMods: Item[], + weaponTemplate: ITemplateItem, + botRole: string, + ): string { - const magazine = weaponMods.find(m => m.slotId === this.modMagazineSlotId); + const magazine = weaponMods.find((m) => m.slotId === this.modMagazineSlotId); if (!magazine) { // Edge case - magazineless chamber loaded weapons dont have magazines, e.g. mp18 @@ -441,11 +564,15 @@ export class BotWeaponGenerator if (!weaponTemplate._props.isChamberLoad) { // Shouldn't happen - this.logger.warning(this.localisationService.getText("bot-weapon_missing_magazine_or_chamber", weaponTemplate._id)); + this.logger.warning( + this.localisationService.getText("bot-weapon_missing_magazine_or_chamber", weaponTemplate._id), + ); } const defaultMagTplId = this.botWeaponGeneratorHelper.getWeaponsDefaultMagazineTpl(weaponTemplate); - this.logger.debug(`[${botRole}] Unable to find magazine for weapon ${weaponTemplate._id} ${weaponTemplate._name}, using mag template default ${defaultMagTplId}.`); + this.logger.debug( + `[${botRole}] Unable to find magazine for weapon ${weaponTemplate._id} ${weaponTemplate._name}, using mag template default ${defaultMagTplId}.`, + ); return defaultMagTplId; } @@ -459,23 +586,42 @@ export class BotWeaponGenerator * @param weaponTemplate the weapon we want to pick ammo for * @returns an ammo tpl that works with the desired gun */ - protected getWeightedCompatibleAmmo(ammo: Record>, weaponTemplate: ITemplateItem): string + protected getWeightedCompatibleAmmo( + ammo: Record>, + weaponTemplate: ITemplateItem, + ): string { const desiredCaliber = this.getWeaponCaliber(weaponTemplate); const compatibleCartridges = ammo[desiredCaliber]; if (!compatibleCartridges || compatibleCartridges?.length === 0) { - this.logger.debug(this.localisationService.getText("bot-no_caliber_data_for_weapon_falling_back_to_default", {weaponId: weaponTemplate._id, weaponName: weaponTemplate._name, defaultAmmo: weaponTemplate._props.defAmmo})); + this.logger.debug( + this.localisationService.getText("bot-no_caliber_data_for_weapon_falling_back_to_default", { + weaponId: weaponTemplate._id, + weaponName: weaponTemplate._name, + defaultAmmo: weaponTemplate._props.defAmmo, + }), + ); // Immediately returns, as default ammo is guaranteed to be compatible return weaponTemplate._props.defAmmo; } const chosenAmmoTpl = this.weightedRandomHelper.getWeightedValue(compatibleCartridges); - if (weaponTemplate._props.Chambers[0] && !weaponTemplate._props.Chambers[0]._props.filters[0].Filter.includes(chosenAmmoTpl)) + if ( + weaponTemplate._props.Chambers[0] + && !weaponTemplate._props.Chambers[0]._props.filters[0].Filter.includes(chosenAmmoTpl) + ) { - this.logger.debug(this.localisationService.getText("bot-incompatible_ammo_for_weapon_falling_back_to_default", {chosenAmmo: chosenAmmoTpl, weaponId: weaponTemplate._id, weaponName: weaponTemplate._name, defaultAmmo: weaponTemplate._props.defAmmo})); + this.logger.debug( + this.localisationService.getText("bot-incompatible_ammo_for_weapon_falling_back_to_default", { + chosenAmmo: chosenAmmoTpl, + weaponId: weaponTemplate._id, + weaponName: weaponTemplate._name, + defaultAmmo: weaponTemplate._props.defAmmo, + }), + ); // Incompatible ammo found, return default (can happen with .366 and 7.62x39 weapons) return weaponTemplate._props.defAmmo; @@ -503,7 +649,9 @@ export class BotWeaponGenerator if (weaponTemplate._props.LinkedWeapon) { - const ammoInChamber = this.itemHelper.getItem(weaponTemplate._props.Chambers[0]._props.filters[0].Filter[0]); + const ammoInChamber = this.itemHelper.getItem( + weaponTemplate._props.Chambers[0]._props.filters[0].Filter[0], + ); if (!ammoInChamber[0]) { return; @@ -552,17 +700,13 @@ export class BotWeaponGenerator */ protected fillUbgl(weaponMods: Item[], ubglMod: Item, ubglAmmoTpl: string): void { - weaponMods.push( - { - _id: this.hashUtil.generate(), - _tpl: ubglAmmoTpl, - parentId: ubglMod._id, - slotId: "patron_in_weapon", - upd: { - StackObjectsCount: 1 - } - } - ); + weaponMods.push({ + _id: this.hashUtil.generate(), + _tpl: ubglAmmoTpl, + parentId: ubglMod._id, + slotId: "patron_in_weapon", + upd: { StackObjectsCount: 1 }, + }); } /** @@ -573,9 +717,16 @@ export class BotWeaponGenerator * @param newStackSize how many cartridges should go into the magazine * @param magazineTemplate magazines db template */ - protected addOrUpdateMagazinesChildWithAmmo(weaponWithMods: Item[], magazine: Item, chosenAmmoTpl: string, magazineTemplate: ITemplateItem): void + protected addOrUpdateMagazinesChildWithAmmo( + weaponWithMods: Item[], + magazine: Item, + chosenAmmoTpl: string, + magazineTemplate: ITemplateItem, + ): void { - const magazineCartridgeChildItem = weaponWithMods.find(m => m.parentId === magazine._id && m.slotId === "cartridges"); + const magazineCartridgeChildItem = weaponWithMods.find((m) => + m.parentId === magazine._id && m.slotId === "cartridges" + ); if (magazineCartridgeChildItem) { // Delete the existing cartridge object and create fresh below @@ -603,7 +754,7 @@ export class BotWeaponGenerator // for CylinderMagazine we exchange the ammo in the "camoras". // This might not be necessary since we already filled the camoras with a random whitelisted and compatible ammo type, // but I'm not sure whether this is also used elsewhere - const camoras = weaponMods.filter(x => x.parentId === magazineId && x.slotId.startsWith("camora")); + const camoras = weaponMods.filter((x) => x.parentId === magazineId && x.slotId.startsWith("camora")); for (const camora of camoras) { camora._tpl = ammoTpl; @@ -617,4 +768,4 @@ export class BotWeaponGenerator } } } -} \ No newline at end of file +} diff --git a/project/src/generators/FenceBaseAssortGenerator.ts b/project/src/generators/FenceBaseAssortGenerator.ts index 8a3b4810..cdeb99e5 100644 --- a/project/src/generators/FenceBaseAssortGenerator.ts +++ b/project/src/generators/FenceBaseAssortGenerator.ts @@ -27,7 +27,7 @@ export class FenceBaseAssortGenerator @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, @inject("SeasonalEventService") protected seasonalEventService: SeasonalEventService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.traderConfig = this.configServer.getConfig(ConfigTypes.TRADER); @@ -43,7 +43,7 @@ export class FenceBaseAssortGenerator const baseFenceAssort = this.databaseServer.getTables().traders[Traders.FENCE].assort; const dbItems = Object.values(this.databaseServer.getTables().templates.items); - for (const item of dbItems.filter(x => this.isValidFenceItem(x))) + for (const item of dbItems.filter((x) => this.isValidFenceItem(x))) { // Skip blacklisted items if (this.itemFilterService.isItemBlacklisted(item._id)) @@ -65,8 +65,10 @@ export class FenceBaseAssortGenerator // Skip items on fence ignore list if (this.traderConfig.fence.blacklist.length > 0) { - if (this.traderConfig.fence.blacklist.includes(item._id) - || this.itemHelper.isOfBaseclasses(item._id, this.traderConfig.fence.blacklist)) + if ( + this.traderConfig.fence.blacklist.includes(item._id) + || this.itemHelper.isOfBaseclasses(item._id, this.traderConfig.fence.blacklist) + ) { continue; } @@ -80,8 +82,10 @@ export class FenceBaseAssortGenerator // Create barter scheme object const barterSchemeToAdd: IBarterScheme = { - count: Math.round(this.handbookHelper.getTemplatePrice(item._id) * this.traderConfig.fence.itemPriceMult), - _tpl: Money.ROUBLES + count: Math.round( + this.handbookHelper.getTemplatePrice(item._id) * this.traderConfig.fence.itemPriceMult, + ), + _tpl: Money.ROUBLES, }; // Add barter data to base @@ -93,10 +97,7 @@ export class FenceBaseAssortGenerator _tpl: item._id, parentId: "hideout", slotId: "hideout", - upd: { - StackObjectsCount: 9999999, - UnlimitedCount: true - } + upd: { StackObjectsCount: 9999999, UnlimitedCount: true }, }; // Add item to base @@ -121,4 +122,4 @@ export class FenceBaseAssortGenerator return false; } -} \ No newline at end of file +} diff --git a/project/src/generators/LocationGenerator.ts b/project/src/generators/LocationGenerator.ts index 8dfab184..fd007758 100644 --- a/project/src/generators/LocationGenerator.ts +++ b/project/src/generators/LocationGenerator.ts @@ -8,7 +8,12 @@ import { IContainerMinMax, IStaticContainer } from "@spt-aki/models/eft/common/I import { ILocationBase } from "@spt-aki/models/eft/common/ILocationBase"; import { ILooseLoot, Spawnpoint, SpawnpointTemplate, SpawnpointsForced } from "@spt-aki/models/eft/common/ILooseLoot"; import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -import { IStaticAmmoDetails, IStaticContainerData, IStaticForcedProps, IStaticLootDetails } from "@spt-aki/models/eft/common/tables/ILootBase"; +import { + IStaticAmmoDetails, + IStaticContainerData, + IStaticForcedProps, + IStaticLootDetails, +} from "@spt-aki/models/eft/common/tables/ILootBase"; import { BaseClasses } from "@spt-aki/models/enums/BaseClasses"; import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; import { Money } from "@spt-aki/models/enums/Money"; @@ -25,17 +30,17 @@ import { ProbabilityObject, ProbabilityObjectArray, RandomUtil } from "@spt-aki/ export interface IContainerItem { - items: Item[] - width: number - height: number + items: Item[]; + width: number; + height: number; } export interface IContainerGroupCount { /** Containers this group has + probabilty to spawn */ - containerIdsWithProbability: Record + containerIdsWithProbability: Record; /** How many containers the map should spawn with this group id */ - chosenCount: number + chosenCount: number; } @injectable() @@ -56,7 +61,7 @@ export class LocationGenerator @inject("ContainerHelper") protected containerHelper: ContainerHelper, @inject("PresetHelper") protected presetHelper: PresetHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.locationConfig = this.configServer.getConfig(ConfigTypes.LOCATION); @@ -68,7 +73,10 @@ export class LocationGenerator * @param staticAmmoDist Static ammo distribution - database.loot.staticAmmo * @returns Array of container objects */ - public generateStaticContainers(locationBase: ILocationBase, staticAmmoDist: Record): SpawnpointTemplate[] + public generateStaticContainers( + locationBase: ILocationBase, + staticAmmoDist: Record, + ): SpawnpointTemplate[] { const result: SpawnpointTemplate[] = []; const locationId = locationBase.Id.toLowerCase(); @@ -84,7 +92,9 @@ export class LocationGenerator // Add mounted weapons to output loot result.push(...staticWeaponsOnMap ?? []); - const allStaticContainersOnMap = this.jsonUtil.clone(db.loot.staticContainers[locationBase.Name]?.staticContainers); + const allStaticContainersOnMap = this.jsonUtil.clone( + db.loot.staticContainers[locationBase.Name]?.staticContainers, + ); if (!allStaticContainersOnMap) { this.logger.error(`Unable to find static container data for map: ${locationBase.Name}`); @@ -105,23 +115,40 @@ export class LocationGenerator const staticLootDist = db.loot.staticLoot; const guaranteedContainers = this.getGuaranteedContainers(allStaticContainersOnMap); staticContainerCount += guaranteedContainers.length; - + // Add loot to guaranteed containers and add to result for (const container of guaranteedContainers) { - const containerWithLoot = this.addLootToContainer(container, staticForcedOnMap, staticLootDist, staticAmmoDist, locationId); + const containerWithLoot = this.addLootToContainer( + container, + staticForcedOnMap, + staticLootDist, + staticAmmoDist, + locationId, + ); result.push(containerWithLoot.template); } this.logger.success(`Added ${guaranteedContainers.length} guaranteed containers`); // randomisation is turned off globally or just turned off for this map - if (!this.locationConfig.containerRandomisationSettings.enabled || !this.locationConfig.containerRandomisationSettings.maps[locationId]) + if ( + !(this.locationConfig.containerRandomisationSettings.enabled + && this.locationConfig.containerRandomisationSettings.maps[locationId]) + ) { - this.logger.debug(`Container randomisation disabled, Adding ${staticRandomisableContainersOnMap.length} containers to ${locationBase.Name}`); + this.logger.debug( + `Container randomisation disabled, Adding ${staticRandomisableContainersOnMap.length} containers to ${locationBase.Name}`, + ); for (const container of staticRandomisableContainersOnMap) { - const containerWithLoot = this.addLootToContainer(container, staticForcedOnMap, staticLootDist, staticAmmoDist, locationId); + const containerWithLoot = this.addLootToContainer( + container, + staticForcedOnMap, + staticLootDist, + staticAmmoDist, + locationId, + ); result.push(containerWithLoot.template); } @@ -129,7 +156,7 @@ export class LocationGenerator } // Group containers by their groupId - const staticContainerGroupData: IStaticContainer = db.locations[locationId].statics; + const staticContainerGroupData: IStaticContainer = db.locations[locationId].statics; const mapping = this.getGroupIdToContainerMappings(staticContainerGroupData, staticRandomisableContainersOnMap); // For each of the container groups, choose from the pool of containers, hydrate container with loot and add to result array @@ -145,7 +172,9 @@ export class LocationGenerator if (Object.keys(data.containerIdsWithProbability).length === 0) { - this.logger.debug(`Group: ${groupId} has no containers with < 100% spawn chance to choose from, skipping`); + this.logger.debug( + `Group: ${groupId} has no containers with < 100% spawn chance to choose from, skipping`, + ); continue; } @@ -178,44 +207,67 @@ export class LocationGenerator for (const chosenContainerId of chosenContainerIds) { // Look up container object from full list of containers on map - const containerObject = staticRandomisableContainersOnMap.find(x => x.template.Id === chosenContainerId); + const containerObject = staticRandomisableContainersOnMap.find((x) => + x.template.Id === chosenContainerId + ); if (!containerObject) { - this.logger.debug(`Container: ${chosenContainerIds[chosenContainerId]} not found in staticRandomisableContainersOnMap, this is bad`); + this.logger.debug( + `Container: ${ + chosenContainerIds[chosenContainerId] + } not found in staticRandomisableContainersOnMap, this is bad`, + ); continue; } // Add loot to container and push into result object - const containerWithLoot = this.addLootToContainer(containerObject, staticForcedOnMap, staticLootDist, staticAmmoDist, locationId); + const containerWithLoot = this.addLootToContainer( + containerObject, + staticForcedOnMap, + staticLootDist, + staticAmmoDist, + locationId, + ); result.push(containerWithLoot.template); staticContainerCount++; } } - this.logger.success(this.localisationService.getText("location-containers_generated_success", staticContainerCount)); + this.logger.success( + this.localisationService.getText("location-containers_generated_success", staticContainerCount), + ); return result; } /** * Get containers with a non-100% chance to spawn OR are NOT on the container type randomistion blacklist - * @param staticContainers + * @param staticContainers * @returns IStaticContainerData array */ protected getRandomisableContainersOnMap(staticContainers: IStaticContainerData[]): IStaticContainerData[] { - return staticContainers - .filter(x => x.probability !== 1 && !x.template.IsAlwaysSpawn && !this.locationConfig.containerRandomisationSettings.containerTypesToNotRandomise.includes(x.template.Items[0]._tpl)); + return staticContainers.filter((x) => + x.probability !== 1 && !x.template.IsAlwaysSpawn + && !this.locationConfig.containerRandomisationSettings.containerTypesToNotRandomise.includes( + x.template.Items[0]._tpl, + ) + ); } /** * Get containers with 100% spawn rate or have a type on the randomistion ignore list - * @param staticContainersOnMap + * @param staticContainersOnMap * @returns IStaticContainerData array */ protected getGuaranteedContainers(staticContainersOnMap: IStaticContainerData[]): IStaticContainerData[] { - return staticContainersOnMap.filter(x => x.probability === 1 || x.template.IsAlwaysSpawn || this.locationConfig.containerRandomisationSettings.containerTypesToNotRandomise.includes(x.template.Items[0]._tpl)); + return staticContainersOnMap.filter((x) => + x.probability === 1 || x.template.IsAlwaysSpawn + || this.locationConfig.containerRandomisationSettings.containerTypesToNotRandomise.includes( + x.template.Items[0]._tpl, + ) + ); } /** @@ -231,13 +283,17 @@ export class LocationGenerator const containerIds = Object.keys(containerData.containerIdsWithProbability); if (containerData.chosenCount > containerIds.length) { - this.logger.debug(`Group: ${groupId} wants ${containerData.chosenCount} containers but pool only has ${containerIds.length}, add what's available`); + this.logger.debug( + `Group: ${groupId} wants ${containerData.chosenCount} containers but pool only has ${containerIds.length}, add what's available`, + ); return containerIds; } // Create probability array with all possible container ids in this group and their relataive probability of spawning const containerDistribution = new ProbabilityObjectArray(this.mathUtil, this.jsonUtil); - containerIds.forEach(x => containerDistribution.push(new ProbabilityObject(x, containerData.containerIdsWithProbability[x]))); + containerIds.forEach((x) => + containerDistribution.push(new ProbabilityObject(x, containerData.containerIdsWithProbability[x])) + ); chosenContainerIds.push(...containerDistribution.draw(containerData.chosenCount)); @@ -251,7 +307,8 @@ export class LocationGenerator */ protected getGroupIdToContainerMappings( staticContainerGroupData: IStaticContainer | Record, - staticContainersOnMap: IStaticContainerData[]): Record + staticContainersOnMap: IStaticContainerData[], + ): Record { // Create dictionary of all group ids and choose a count of containers the map will spawn of that group const mapping: Record = {}; @@ -263,16 +320,22 @@ export class LocationGenerator mapping[groupId] = { containerIdsWithProbability: {}, chosenCount: this.randomUtil.getInt( - Math.round(groupData.minContainers * this.locationConfig.containerRandomisationSettings.containerGroupMinSizeMultiplier), - Math.round(groupData.maxContainers * this.locationConfig.containerRandomisationSettings.containerGroupMaxSizeMultiplier) - ) + Math.round( + groupData.minContainers + * this.locationConfig.containerRandomisationSettings.containerGroupMinSizeMultiplier, + ), + Math.round( + groupData.maxContainers + * this.locationConfig.containerRandomisationSettings.containerGroupMaxSizeMultiplier, + ), + ), }; } } // Add an empty group for containers without a group id but still have a < 100% chance to spawn // Likely bad BSG data, will be fixed...eventually, example of the groupids: `NEED_TO_BE_FIXED1`,`NEED_TO_BE_FIXED_SE02`, `NEED_TO_BE_FIXED_NW_01` - mapping[""] = {containerIdsWithProbability: {}, chosenCount: -1}; + mapping[""] = { containerIdsWithProbability: {}, chosenCount: -1 }; // Iterate over all containers and add to group keyed by groupId // Containers without a group go into a group with empty key "" @@ -287,7 +350,9 @@ export class LocationGenerator if (container.probability === 1) { - this.logger.debug(`Container ${container.template.Id} with group ${groupData.groupId} had 100% chance to spawn was picked as random container, skipping`); + this.logger.debug( + `Container ${container.template.Id} with group ${groupData.groupId} had 100% chance to spawn was picked as random container, skipping`, + ); continue; } mapping[groupData.groupId].containerIdsWithProbability[container.template.Id] = container.probability; @@ -311,7 +376,8 @@ export class LocationGenerator staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, - locationName: string): IStaticContainerData + locationName: string, + ): IStaticContainerData { const container = this.jsonUtil.clone(staticContainer); const containerTpl = container.template.Items[0]._tpl; @@ -330,7 +396,7 @@ export class LocationGenerator const containerLootPool = this.getPossibleLootItemsForContainer(containerTpl, staticLootDist); // Some containers need to have items forced into it (quest keys etc) - const tplsForced = staticForced.filter(x => x.containerId === container.template.Id).map(x => x.itemTpl); + const tplsForced = staticForced.filter((x) => x.containerId === container.template.Id).map((x) => x.itemTpl); // Draw random loot // Money spawn more than once in container @@ -338,7 +404,11 @@ export class LocationGenerator const locklist = [Money.ROUBLES, Money.DOLLARS, Money.EUROS]; // Choose items to add to container, factor in weighting + lock money down - const chosenTpls = containerLootPool.draw(itemCountToAdd, this.locationConfig.allowDuplicateItemsInStaticContainers, locklist); + const chosenTpls = containerLootPool.draw( + itemCountToAdd, + this.locationConfig.allowDuplicateItemsInStaticContainers, + locklist, + ); // Add forced loot to chosen item pool const tplsToAddToContainer = tplsForced.concat(chosenTpls); @@ -365,11 +435,18 @@ export class LocationGenerator continue; } - containerMap = this.containerHelper.fillContainerMapWithItem(containerMap, result.x, result.y, width, height, result.rotation); + containerMap = this.containerHelper.fillContainerMapWithItem( + containerMap, + result.x, + result.y, + width, + height, + result.rotation, + ); const rotation = result.rotation ? 1 : 0; items[0].slotId = "main"; - items[0].location = { "x": result.x, "y": result.y, "r": rotation }; + items[0].location = { x: result.x, y: result.y, r: rotation }; // Add loot to container before returning for (const item of items) @@ -406,7 +483,11 @@ export class LocationGenerator * @param locationName Map name (to get per-map multiplier for from config) * @returns item count */ - protected getWeightedCountOfContainerItems(containerTypeId: string, staticLootDist: Record, locationName: string): number + protected getWeightedCountOfContainerItems( + containerTypeId: string, + staticLootDist: Record, + locationName: string, + ): number { // Create probability array to calcualte the total count of lootable items inside container const itemCountArray = new ProbabilityObjectArray(this.mathUtil, this.jsonUtil); @@ -414,7 +495,7 @@ export class LocationGenerator { // Add each count of items into array itemCountArray.push( - new ProbabilityObject(itemCountDistribution.count, itemCountDistribution.relativeProbability) + new ProbabilityObject(itemCountDistribution.count, itemCountDistribution.relativeProbability), ); } @@ -428,7 +509,10 @@ export class LocationGenerator * @param staticLootDist staticLoot.json * @returns ProbabilityObjectArray of item tpls + probabilty */ - protected getPossibleLootItemsForContainer(containerTypeId: string, staticLootDist: Record): ProbabilityObjectArray + protected getPossibleLootItemsForContainer( + containerTypeId: string, + staticLootDist: Record, + ): ProbabilityObjectArray { const seasonalEventActive = this.seasonalEventService.seasonalEventEnabled(); const seasonalItemTplBlacklist = this.seasonalEventService.getAllSeasonalEventItems(); @@ -442,9 +526,7 @@ export class LocationGenerator continue; } - itemDistribution.push( - new ProbabilityObject(icd.tpl, icd.relativeProbability) - ); + itemDistribution.push(new ProbabilityObject(icd.tpl, icd.relativeProbability)); } return itemDistribution; @@ -462,12 +544,16 @@ export class LocationGenerator /** * Create array of loose + forced loot using probability system - * @param dynamicLootDist - * @param staticAmmoDist + * @param dynamicLootDist + * @param staticAmmoDist * @param locationName Location to generate loot for * @returns Array of spawn points with loot in them */ - public generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[] + public generateDynamicLoot( + dynamicLootDist: ILooseLoot, + staticAmmoDist: Record, + locationName: string, + ): SpawnpointTemplate[] { const loot: SpawnpointTemplate[] = []; @@ -475,14 +561,11 @@ export class LocationGenerator this.addForcedLoot(loot, dynamicLootDist.spawnpointsForced, locationName); const allDynamicSpawnpoints = dynamicLootDist.spawnpoints; - - //Draw from random distribution + + // Draw from random distribution const desiredSpawnpointCount = Math.round( - this.getLooseLootMultiplerForLocation(locationName) * - this.randomUtil.randn( - dynamicLootDist.spawnpointCount.mean, - dynamicLootDist.spawnpointCount.std - ) + this.getLooseLootMultiplerForLocation(locationName) + * this.randomUtil.randn(dynamicLootDist.spawnpointCount.mean, dynamicLootDist.spawnpointCount.std), ); // Positions not in forced but have 100% chance to spawn @@ -506,9 +589,7 @@ export class LocationGenerator continue; } - spawnpointArray.push( - new ProbabilityObject(spawnpoint.template.Id, spawnpoint.probability, spawnpoint) - ); + spawnpointArray.push(new ProbabilityObject(spawnpoint.template.Id, spawnpoint.probability, spawnpoint)); } // Select a number of spawn points to add loot to @@ -522,13 +603,19 @@ export class LocationGenerator } // Filter out duplicate locationIds - chosenSpawnpoints = [...new Map(chosenSpawnpoints.map(x => [x.locationId, x])).values()]; + chosenSpawnpoints = [...new Map(chosenSpawnpoints.map((x) => [x.locationId, x])).values()]; // Do we have enough items in pool to fulfill requirement const tooManySpawnPointsRequested = (desiredSpawnpointCount - chosenSpawnpoints.length) > 0; if (tooManySpawnPointsRequested) { - this.logger.debug(this.localisationService.getText("location-spawn_point_count_requested_vs_found", {requested: desiredSpawnpointCount+guaranteedLoosePoints.length, found: chosenSpawnpoints.length, mapName: locationName})); + this.logger.debug( + this.localisationService.getText("location-spawn_point_count_requested_vs_found", { + requested: desiredSpawnpointCount + guaranteedLoosePoints.length, + found: chosenSpawnpoints.length, + mapName: locationName, + }), + ); } // Iterate over spawnpoints @@ -538,30 +625,36 @@ export class LocationGenerator { if (!spawnPoint.template) { - this.logger.warning(this.localisationService.getText("location-missing_dynamic_template", spawnPoint.locationId)); + this.logger.warning( + this.localisationService.getText("location-missing_dynamic_template", spawnPoint.locationId), + ); continue; } if (!spawnPoint.template.Items || spawnPoint.template.Items.length === 0) { - this.logger.error(this.localisationService.getText("location-spawnpoint_missing_items", spawnPoint.template.Id)); - + this.logger.error( + this.localisationService.getText("location-spawnpoint_missing_items", spawnPoint.template.Id), + ); + continue; } const itemArray = new ProbabilityObjectArray(this.mathUtil, this.jsonUtil); for (const itemDist of spawnPoint.itemDistribution) { - if (!seasonalEventActive && seasonalItemTplBlacklist.includes(spawnPoint.template.Items.find(x => x._id === itemDist.composedKey.key)._tpl)) + if ( + !seasonalEventActive && seasonalItemTplBlacklist.includes( + spawnPoint.template.Items.find((x) => x._id === itemDist.composedKey.key)._tpl, + ) + ) { // Skip seasonal event items if they're not enabled continue; } - itemArray.push( - new ProbabilityObject(itemDist.composedKey.key, itemDist.relativeProbability) - ); + itemArray.push(new ProbabilityObject(itemDist.composedKey.key, itemDist.relativeProbability)); } // Draw a random item from spawn points possible items @@ -584,7 +677,11 @@ export class LocationGenerator * @param forcedSpawnPoints forced loot to add * @param name of map currently generating forced loot for */ - protected addForcedLoot(loot: SpawnpointTemplate[], forcedSpawnPoints: SpawnpointsForced[], locationName: string): void + protected addForcedLoot( + loot: SpawnpointTemplate[], + forcedSpawnPoints: SpawnpointsForced[], + locationName: string, + ): void { const lootToForceSingleAmountOnMap = this.locationConfig.forcedLootSingleSpawnById[locationName]; if (lootToForceSingleAmountOnMap) @@ -593,27 +690,30 @@ export class LocationGenerator for (const itemTpl of lootToForceSingleAmountOnMap) { // Get all spawn positions for item tpl in forced loot array - const items = forcedSpawnPoints.filter(x => x.template.Items[0]._tpl === itemTpl); + const items = forcedSpawnPoints.filter((x) => x.template.Items[0]._tpl === itemTpl); if (!items || items.length === 0) { - this.logger.debug(`Unable to adjust loot item ${itemTpl} as it does not exist inside ${locationName} forced loot.`); + this.logger.debug( + `Unable to adjust loot item ${itemTpl} as it does not exist inside ${locationName} forced loot.`, + ); continue; } // Create probability array of all spawn positions for this spawn id - const spawnpointArray = new ProbabilityObjectArray(this.mathUtil, this.jsonUtil); + const spawnpointArray = new ProbabilityObjectArray( + this.mathUtil, + this.jsonUtil, + ); for (const si of items) { // use locationId as template.Id is the same across all items - spawnpointArray.push( - new ProbabilityObject(si.locationId, si.probability, si) - ); + spawnpointArray.push(new ProbabilityObject(si.locationId, si.probability, si)); } - + // Choose 1 out of all found spawn positions for spawn id and add to loot array for (const spawnPointLocationId of spawnpointArray.draw(1, false)) { - const itemToAdd = items.find(x => x.locationId === spawnPointLocationId); + const itemToAdd = items.find((x) => x.locationId === spawnPointLocationId); const lootItem = itemToAdd.template; lootItem.Root = this.objectId.generate(); lootItem.Items[0]._id = lootItem.Root; @@ -653,16 +753,23 @@ export class LocationGenerator * @param staticAmmoDist ammo distributions * @returns IContainerItem */ - protected createDynamicLootItem(chosenComposedKey: string, spawnPoint: Spawnpoint, staticAmmoDist: Record): IContainerItem + protected createDynamicLootItem( + chosenComposedKey: string, + spawnPoint: Spawnpoint, + staticAmmoDist: Record, + ): IContainerItem { - const chosenItem = spawnPoint.template.Items.find(x => x._id === chosenComposedKey); + const chosenItem = spawnPoint.template.Items.find((x) => x._id === chosenComposedKey); const chosenTpl = chosenItem._tpl; // Item array to return const itemWithMods: Item[] = []; // Money/Ammo - don't rely on items in spawnPoint.template.Items so we can randomise it ourselves - if (this.itemHelper.isOfBaseclass(chosenTpl, BaseClasses.MONEY) || this.itemHelper.isOfBaseclass(chosenTpl, BaseClasses.AMMO)) + if ( + this.itemHelper.isOfBaseclass(chosenTpl, BaseClasses.MONEY) + || this.itemHelper.isOfBaseclass(chosenTpl, BaseClasses.AMMO) + ) { const itemTemplate = this.itemHelper.getItem(chosenTpl)[1]; @@ -670,22 +777,17 @@ export class LocationGenerator ? 1 : this.randomUtil.getInt(itemTemplate._props.StackMinRandom, itemTemplate._props.StackMaxRandom); - itemWithMods.push( - { - _id: this.objectId.generate(), - _tpl: chosenTpl, - upd: { StackObjectsCount: stackCount } - } - ); + itemWithMods.push({ + _id: this.objectId.generate(), + _tpl: chosenTpl, + upd: { StackObjectsCount: stackCount }, + }); } else if (this.itemHelper.isOfBaseclass(chosenTpl, BaseClasses.AMMO_BOX)) { // Fill with cartrdiges const ammoBoxTemplate = this.itemHelper.getItem(chosenTpl)[1]; - const ammoBoxItem: Item[] = [{ - _id: this.objectId.generate(), - _tpl: chosenTpl - }]; + const ammoBoxItem: Item[] = [{ _id: this.objectId.generate(), _tpl: chosenTpl }]; this.itemHelper.addCartridgesToAmmoBox(ammoBoxItem, ammoBoxTemplate); itemWithMods.push(...ammoBoxItem); } @@ -693,17 +795,23 @@ export class LocationGenerator { // Create array with just magazine + randomised amount of cartridges const magazineTemplate = this.itemHelper.getItem(chosenTpl)[1]; - const magazineItem: Item[] = [{ - _id: this.objectId.generate(), - _tpl: chosenTpl - }]; - this.itemHelper.fillMagazineWithRandomCartridge(magazineItem, magazineTemplate, staticAmmoDist, null, this.locationConfig.minFillLooseMagazinePercent / 100); + const magazineItem: Item[] = [{ _id: this.objectId.generate(), _tpl: chosenTpl }]; + this.itemHelper.fillMagazineWithRandomCartridge( + magazineItem, + magazineTemplate, + staticAmmoDist, + null, + this.locationConfig.minFillLooseMagazinePercent / 100, + ); itemWithMods.push(...magazineItem); } else { // Get item + children and add into array we return - const itemWithChildren = this.itemHelper.findAndReturnChildrenAsItems(spawnPoint.template.Items, chosenItem._id); + const itemWithChildren = this.itemHelper.findAndReturnChildrenAsItems( + spawnPoint.template.Items, + chosenItem._id, + ); // We need to reparent to ensure ids are unique this.reparentItemAndChildren(itemWithChildren); @@ -714,11 +822,7 @@ export class LocationGenerator // Get inventory size of item const size = this.itemHelper.getItemSize(itemWithMods, itemWithMods[0]._id); - return { - items: itemWithMods, - width: size.width, - height: size.height - }; + return { items: itemWithMods, width: size.width, height: size.height }; } /** @@ -754,24 +858,23 @@ export class LocationGenerator { if (this.itemHelper.isOfBaseclass(chosenTpl, BaseClasses.WEAPON)) { - return items.find(v => v._tpl === chosenTpl && v.parentId === undefined); + return items.find((v) => v._tpl === chosenTpl && v.parentId === undefined); } - return items.find(x => x._tpl === chosenTpl); + return items.find((x) => x._tpl === chosenTpl); } // TODO: rewrite, BIG yikes - protected createStaticLootItem(tpl: string, staticAmmoDist: Record, parentId: string = undefined): IContainerItem + protected createStaticLootItem( + tpl: string, + staticAmmoDist: Record, + parentId: string = undefined, + ): IContainerItem { const itemTemplate = this.itemHelper.getItem(tpl)[1]; let width = itemTemplate._props.Width; let height = itemTemplate._props.Height; - let items: Item[] = [ - { - _id: this.objectId.generate(), - _tpl: tpl - } - ]; + let items: Item[] = [{ _id: this.objectId.generate(), _tpl: tpl }]; // Use passed in parentId as override for new item if (parentId) @@ -779,7 +882,10 @@ export class LocationGenerator items[0].parentId = parentId; } - if (this.itemHelper.isOfBaseclass(tpl, BaseClasses.MONEY) || this.itemHelper.isOfBaseclass(tpl, BaseClasses.AMMO)) + if ( + this.itemHelper.isOfBaseclass(tpl, BaseClasses.MONEY) + || this.itemHelper.isOfBaseclass(tpl, BaseClasses.AMMO) + ) { // Edge case - some ammos e.g. flares or M406 grenades shouldn't be stacked const stackCount = itemTemplate._props.StackMaxSize === 1 @@ -803,7 +909,14 @@ export class LocationGenerator // this item already broke it once without being reproducible tpl = "5839a40f24597726f856b511"; AKS-74UB Default // 5ea03f7400685063ec28bfa8 // ppsh default // 5ba26383d4351e00334c93d9 //mp7_devgru - this.logger.warning(this.localisationService.getText("location-preset_not_found", {tpl: tpl, defaultId: defaultPreset._id, defaultName: defaultPreset._name, parentId: parentId})); + this.logger.warning( + this.localisationService.getText("location-preset_not_found", { + tpl: tpl, + defaultId: defaultPreset._id, + defaultName: defaultPreset._name, + parentId: parentId, + }), + ); throw error; } @@ -817,7 +930,9 @@ export class LocationGenerator const rootItem = items[0]; if (!rootItem) { - this.logger.error(this.localisationService.getText("location-missing_root_item", {tpl: tpl, parentId: parentId})); + this.logger.error( + this.localisationService.getText("location-missing_root_item", { tpl: tpl, parentId: parentId }), + ); throw new Error(this.localisationService.getText("location-critical_error_see_log")); } @@ -827,21 +942,25 @@ export class LocationGenerator if (children?.length > 0) { items = this.ragfairServerHelper.reparentPresets(rootItem, children); - } + } } catch (error) { - this.logger.error(this.localisationService.getText("location-unable_to_reparent_item", {tpl: tpl, parentId: parentId})); + this.logger.error( + this.localisationService.getText("location-unable_to_reparent_item", { + tpl: tpl, + parentId: parentId, + }), + ); throw error; } - // Here we should use generalized BotGenerators functions e.g. fillExistingMagazines in the future since // it can handle revolver ammo (it's not restructured to be used here yet.) // General: Make a WeaponController for Ragfair preset stuff and the generating weapons and ammo stuff from // BotGenerator - const magazine = items.filter(x => x.slotId === "mod_magazine")[0]; + const magazine = items.filter((x) => x.slotId === "mod_magazine")[0]; // some weapon presets come without magazine; only fill the mag if it exists if (magazine) { @@ -850,7 +969,12 @@ export class LocationGenerator // Create array with just magazine const magazineWithCartridges = [magazine]; - this.itemHelper.fillMagazineWithRandomCartridge(magazineWithCartridges, magTemplate, staticAmmoDist, weaponTemplate._props.ammoCaliber); + this.itemHelper.fillMagazineWithRandomCartridge( + magazineWithCartridges, + magTemplate, + staticAmmoDist, + weaponTemplate._props.ammoCaliber, + ); // Replace existing magazine with above array items.splice(items.indexOf(magazine), 1, ...magazineWithCartridges); @@ -869,16 +993,18 @@ export class LocationGenerator { // Create array with just magazine const magazineWithCartridges = [items[0]]; - this.itemHelper.fillMagazineWithRandomCartridge(magazineWithCartridges, itemTemplate, staticAmmoDist, null, this.locationConfig.minFillStaticMagazinePercent / 100); + this.itemHelper.fillMagazineWithRandomCartridge( + magazineWithCartridges, + itemTemplate, + staticAmmoDist, + null, + this.locationConfig.minFillStaticMagazinePercent / 100, + ); // Replace existing magazine with above array items.splice(items.indexOf(items[0]), 1, ...magazineWithCartridges); } - return { - items: items, - width: width, - height: height - }; + return { items: items, width: width, height: height }; } -} \ No newline at end of file +} diff --git a/project/src/generators/LootGenerator.ts b/project/src/generators/LootGenerator.ts index f013c7d9..b94df6c8 100644 --- a/project/src/generators/LootGenerator.ts +++ b/project/src/generators/LootGenerator.ts @@ -19,10 +19,7 @@ import { RagfairLinkedItemService } from "@spt-aki/services/RagfairLinkedItemSer import { HashUtil } from "@spt-aki/utils/HashUtil"; import { RandomUtil } from "@spt-aki/utils/RandomUtil"; -type ItemLimit = { - current: number, - max: number -}; +type ItemLimit = { current: number; max: number; }; @injectable() export class LootGenerator @@ -38,7 +35,7 @@ export class LootGenerator @inject("WeightedRandomHelper") protected weightedRandomHelper: WeightedRandomHelper, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("RagfairLinkedItemService") protected ragfairLinkedItemService: RagfairLinkedItemService, - @inject("ItemFilterService") protected itemFilterService: ItemFilterService + @inject("ItemFilterService") protected itemFilterService: ItemFilterService, ) {} @@ -55,7 +52,7 @@ export class LootGenerator const tables = this.databaseServer.getTables(); const itemBlacklist = new Set(this.itemFilterService.getBlacklistedItems()); - + options.itemBlacklist.forEach(itemBlacklist.add, itemBlacklist); if (!options.allowBossItems) @@ -64,12 +61,17 @@ export class LootGenerator } // Handle sealed weapon containers - const desiredWeaponCrateCount = this.randomUtil.getInt(options.weaponCrateCount.min, options.weaponCrateCount.max); + const desiredWeaponCrateCount = this.randomUtil.getInt( + options.weaponCrateCount.min, + options.weaponCrateCount.max, + ); if (desiredWeaponCrateCount > 0) { // Get list of all sealed containers from db - const sealedWeaponContainerPool = Object.values(tables.templates.items).filter(x => x._name.includes("event_container_airdrop")); - + const sealedWeaponContainerPool = Object.values(tables.templates.items).filter((x) => + x._name.includes("event_container_airdrop") + ); + for (let index = 0; index < desiredWeaponCrateCount; index++) { // Choose one at random + add to results array @@ -78,16 +80,18 @@ export class LootGenerator id: this.hashUtil.generate(), tpl: chosenSealedContainer._id, isPreset: false, - stackCount: 1 + stackCount: 1, }); } } // Get items from items.json that have a type of item + not in global blacklist + basetype is in whitelist - const items = Object.entries(tables.templates.items).filter(x => !itemBlacklist.has(x[1]._id) - && x[1]._type.toLowerCase() === "item" + const items = Object.entries(tables.templates.items).filter((x) => + !itemBlacklist.has(x[1]._id) + && x[1]._type.toLowerCase() === "item" && !x[1]._props.QuestItem - && options.itemTypeWhitelist.includes(x[1]._parent)); + && options.itemTypeWhitelist.includes(x[1]._parent) + ); const randomisedItemCount = this.randomUtil.getInt(options.itemCount.min, options.itemCount.max); for (let index = 0; index < randomisedItemCount; index++) @@ -95,10 +99,12 @@ export class LootGenerator if (!this.findAndAddRandomItemToLoot(items, itemTypeCounts, options, result)) { index--; - } + } } - const globalDefaultPresets = Object.entries(tables.globals.ItemPresets).filter(x => x[1]._encyclopedia !== undefined); + const globalDefaultPresets = Object.entries(tables.globals.ItemPresets).filter((x) => + x[1]._encyclopedia !== undefined + ); const randomisedPresetCount = this.randomUtil.getInt(options.presetCount.min, options.presetCount.max); const itemBlacklistArray = Array.from(itemBlacklist); for (let index = 0; index < randomisedPresetCount; index++) @@ -122,10 +128,7 @@ export class LootGenerator const itemTypeCounts: Record = {}; for (const itemTypeId in limits) { - itemTypeCounts[itemTypeId] = { - current: 0, - max: limits[itemTypeId] - }; + itemTypeCounts[itemTypeId] = { current: 0, max: limits[itemTypeId] }; } return itemTypeCounts; @@ -143,7 +146,8 @@ export class LootGenerator items: [string, ITemplateItem][], itemTypeCounts: Record, options: LootRequest, - result: LootItem[]): boolean + result: LootItem[], + ): boolean { const randomItem = this.randomUtil.getArrayValue(items)[1]; @@ -157,16 +161,15 @@ export class LootGenerator id: this.hashUtil.generate(), tpl: randomItem._id, isPreset: false, - stackCount: 1 + stackCount: 1, }; // Check if armor has level in allowed whitelist - if (randomItem._parent === BaseClasses.ARMOR - || randomItem._parent === BaseClasses.VEST) + if (randomItem._parent === BaseClasses.ARMOR || randomItem._parent === BaseClasses.VEST) { if (!options.armorLevelWhitelist.includes(Number(randomItem._props.armorClass))) { - return false; + return false; } } @@ -175,7 +178,7 @@ export class LootGenerator { newLootItem.stackCount = this.getRandomisedStackCount(randomItem, options); } - + newLootItem.tpl = randomItem._id; result.push(newLootItem); @@ -221,7 +224,8 @@ export class LootGenerator globalDefaultPresets: [string, IPreset][], itemTypeCounts: Record, itemBlacklist: string[], - result: LootItem[]): boolean + result: LootItem[], + ): boolean { // Choose random preset and get details from item.json using encyclopedia value (encyclopedia === tplId) const randomPreset = this.randomUtil.getArrayValue(globalDefaultPresets)[1]; @@ -261,12 +265,8 @@ export class LootGenerator return false; } - const newLootItem: LootItem = { - tpl: randomPreset._items[0]._tpl, - isPreset: true, - stackCount: 1 - }; - + const newLootItem: LootItem = { tpl: randomPreset._items[0]._tpl, isPreset: true, stackCount: 1 }; + result.push(newLootItem); if (itemLimitCount) @@ -274,7 +274,7 @@ export class LootGenerator // increment item count as its in limit array itemLimitCount.current++; } - + // item added okay return true; } @@ -289,15 +289,19 @@ export class LootGenerator const itemsToReturn: AddItem[] = []; // choose a weapon to give to the player (weighted) - const chosenWeaponTpl = this.weightedRandomHelper.getWeightedValue(containerSettings.weaponRewardWeight); + const chosenWeaponTpl = this.weightedRandomHelper.getWeightedValue( + containerSettings.weaponRewardWeight, + ); const weaponDetailsDb = this.itemHelper.getItem(chosenWeaponTpl); if (!weaponDetailsDb[0]) { - this.logger.error(this.localisationService.getText("loot-non_item_picked_as_sealed_weapon_crate_reward", chosenWeaponTpl)); + this.logger.error( + this.localisationService.getText("loot-non_item_picked_as_sealed_weapon_crate_reward", chosenWeaponTpl), + ); return itemsToReturn; } - + // Get weapon preset - default or choose a random one from all possible let chosenWeaponPreset = containerSettings.defaultPresetsOnly ? this.presetHelper.getDefaultPreset(chosenWeaponTpl) @@ -314,12 +318,14 @@ export class LootGenerator count: 1, // eslint-disable-next-line @typescript-eslint/naming-convention item_id: chosenWeaponPreset._id, - isPreset: true + isPreset: true, }); // Get items related to chosen weapon const linkedItemsToWeapon = this.ragfairLinkedItemService.getLinkedDbItems(chosenWeaponTpl); - itemsToReturn.push(...this.getSealedContainerWeaponModRewards(containerSettings, linkedItemsToWeapon, chosenWeaponPreset)); + itemsToReturn.push( + ...this.getSealedContainerWeaponModRewards(containerSettings, linkedItemsToWeapon, chosenWeaponPreset), + ); // Handle non-weapon mod reward types itemsToReturn.push(...this.getSealedContainerNonWeaponModRewards(containerSettings, weaponDetailsDb[1])); @@ -333,7 +339,10 @@ export class LootGenerator * @param weaponDetailsDb Details for the weapon to reward player * @returns AddItem array */ - protected getSealedContainerNonWeaponModRewards(containerSettings: ISealedAirdropContainerSettings, weaponDetailsDb: ITemplateItem): AddItem[] + protected getSealedContainerNonWeaponModRewards( + containerSettings: ISealedAirdropContainerSettings, + weaponDetailsDb: ITemplateItem, + ): AddItem[] { const rewards: AddItem[] = []; @@ -351,15 +360,15 @@ export class LootGenerator if (rewardTypeId === BaseClasses.AMMO_BOX) { // Get ammoboxes from db - const ammoBoxesDetails = containerSettings.ammoBoxWhitelist.map(x => + const ammoBoxesDetails = containerSettings.ammoBoxWhitelist.map((x) => { const itemDetails = this.itemHelper.getItem(x); return itemDetails[1]; }); - + // Need to find boxes that matches weapons caliber const weaponCaliber = weaponDetailsDb._props.ammoCaliber; - const ammoBoxesMatchingCaliber = ammoBoxesDetails.filter(x => x._props.ammoCaliber === weaponCaliber); + const ammoBoxesMatchingCaliber = ammoBoxesDetails.filter((x) => x._props.ammoCaliber === weaponCaliber); if (ammoBoxesMatchingCaliber.length === 0) { this.logger.debug(`No ammo box with caliber ${weaponCaliber} found, skipping`); @@ -373,19 +382,20 @@ export class LootGenerator count: rewardCount, // eslint-disable-next-line @typescript-eslint/naming-convention item_id: chosenAmmoBox._id, - isPreset: false + isPreset: false, }); continue; } // Get all items of the desired type + not quest items + not globally blacklisted - const rewardItemPool = Object.values(this.databaseServer.getTables().templates.items) - .filter(x => x._parent === rewardTypeId - && x._type.toLowerCase() === "item" - && !this.itemFilterService.isItemBlacklisted(x._id) - && (!containerSettings.allowBossItems && !this.itemFilterService.isBossItem(x._id)) - && !x._props.QuestItem); + const rewardItemPool = Object.values(this.databaseServer.getTables().templates.items).filter((x) => + x._parent === rewardTypeId + && x._type.toLowerCase() === "item" + && !this.itemFilterService.isItemBlacklisted(x._id) + && (!(containerSettings.allowBossItems || this.itemFilterService.isBossItem(x._id))) + && !x._props.QuestItem + ); if (rewardItemPool.length === 0) { @@ -398,7 +408,7 @@ export class LootGenerator { // choose a random item from pool const chosenRewardItem = this.randomUtil.getArrayValue(rewardItemPool); - this.addOrIncrementItemToArray(chosenRewardItem._id, rewards); + this.addOrIncrementItemToArray(chosenRewardItem._id, rewards); } } @@ -412,7 +422,11 @@ export class LootGenerator * @param chosenWeaponPreset The weapon preset given to player as reward * @returns AddItem array */ - protected getSealedContainerWeaponModRewards(containerSettings: ISealedAirdropContainerSettings, linkedItemsToWeapon: ITemplateItem[], chosenWeaponPreset: IPreset): AddItem[] + protected getSealedContainerWeaponModRewards( + containerSettings: ISealedAirdropContainerSettings, + linkedItemsToWeapon: ITemplateItem[], + chosenWeaponPreset: IPreset, + ): AddItem[] { const modRewards: AddItem[] = []; for (const rewardTypeId in containerSettings.weaponModRewardLimits) @@ -427,15 +441,19 @@ export class LootGenerator } // Get items that fulfil reward type critera from items that fit on gun - const relatedItems = linkedItemsToWeapon.filter(x => x._parent === rewardTypeId && !this.itemFilterService.isItemBlacklisted(x._id)); + const relatedItems = linkedItemsToWeapon.filter((x) => + x._parent === rewardTypeId && !this.itemFilterService.isItemBlacklisted(x._id) + ); if (!relatedItems || relatedItems.length === 0) { - this.logger.debug(`No items found to fulfil reward type ${rewardTypeId} for weapon: ${chosenWeaponPreset._name}, skipping type`); + this.logger.debug( + `No items found to fulfil reward type ${rewardTypeId} for weapon: ${chosenWeaponPreset._name}, skipping type`, + ); continue; } // Find a random item of the desired type and add as reward - for (let index = 0; index < rewardCount; index++) + for (let index = 0; index < rewardCount; index++) { const chosenItem = this.randomUtil.drawRandomFromList(relatedItems); this.addOrIncrementItemToArray(chosenItem[0]._id, modRewards); @@ -447,7 +465,7 @@ export class LootGenerator /** * Handle event-related loot containers - currently just the halloween jack-o-lanterns that give food rewards - * @param rewardContainerDetails + * @param rewardContainerDetails * @returns AddItem array */ public getRandomLootContainerLoot(rewardContainerDetails: RewardDetails): AddItem[] @@ -458,7 +476,9 @@ export class LootGenerator for (let index = 0; index < rewardContainerDetails.rewardCount; index++) { // Pick random reward from pool, add to request object - const chosenRewardItemTpl = this.weightedRandomHelper.getWeightedValue(rewardContainerDetails.rewardTplPool); + const chosenRewardItemTpl = this.weightedRandomHelper.getWeightedValue( + rewardContainerDetails.rewardTplPool, + ); this.addOrIncrementItemToArray(chosenRewardItemTpl, itemsToReturn); } @@ -473,7 +493,7 @@ export class LootGenerator */ protected addOrIncrementItemToArray(itemTplToAdd: string, resultsArray: AddItem[]): void { - const existingItemIndex = resultsArray.findIndex(x => x.item_id === itemTplToAdd); + const existingItemIndex = resultsArray.findIndex((x) => x.item_id === itemTplToAdd); if (existingItemIndex > -1) { // Exists in array already, increment count @@ -482,7 +502,7 @@ export class LootGenerator else { // eslint-disable-next-line @typescript-eslint/naming-convention - resultsArray.push({item_id: itemTplToAdd, count: 1, isPreset: false}); + resultsArray.push({ item_id: itemTplToAdd, count: 1, isPreset: false }); } } -} \ No newline at end of file +} diff --git a/project/src/generators/PMCLootGenerator.ts b/project/src/generators/PMCLootGenerator.ts index 52b48f40..03fc1eb0 100644 --- a/project/src/generators/PMCLootGenerator.ts +++ b/project/src/generators/PMCLootGenerator.ts @@ -10,11 +10,10 @@ import { ItemFilterService } from "@spt-aki/services/ItemFilterService"; import { SeasonalEventService } from "@spt-aki/services/SeasonalEventService"; /** - * Handle the generation of dynamic PMC loot in pockets and backpacks + * Handle the generation of dynamic PMC loot in pockets and backpacks * and the removal of blacklisted items */ @injectable() - export class PMCLootGenerator { protected pocketLootPool: string[] = []; @@ -27,7 +26,7 @@ export class PMCLootGenerator @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("ConfigServer") protected configServer: ConfigServer, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, - @inject("SeasonalEventService") protected seasonalEventService: SeasonalEventService + @inject("SeasonalEventService") protected seasonalEventService: SeasonalEventService, ) { this.pmcConfig = this.configServer.getConfig(ConfigTypes.PMC); @@ -47,7 +46,7 @@ export class PMCLootGenerator const allowedItemTypes = this.pmcConfig.pocketLoot.whitelist; const pmcItemBlacklist = this.pmcConfig.pocketLoot.blacklist; const itemBlacklist = this.itemFilterService.getBlacklistedItems(); - + // Blacklist seasonal items if not inside seasonal event // Blacklist seasonal items if not inside seasonal event if (!this.seasonalEventService.seasonalEventEnabled()) @@ -56,14 +55,16 @@ export class PMCLootGenerator itemBlacklist.push(...this.seasonalEventService.getAllSeasonalEventItems()); } - const itemsToAdd = Object.values(items).filter(item => allowedItemTypes.includes(item._parent) - && this.itemHelper.isValidItem(item._id) - && !pmcItemBlacklist.includes(item._id) - && !itemBlacklist.includes(item._id) - && item._props.Width === 1 - && item._props.Height === 1); + const itemsToAdd = Object.values(items).filter((item) => + allowedItemTypes.includes(item._parent) + && this.itemHelper.isValidItem(item._id) + && !pmcItemBlacklist.includes(item._id) + && !itemBlacklist.includes(item._id) + && item._props.Width === 1 + && item._props.Height === 1 + ); - this.pocketLootPool = itemsToAdd.map(x => x._id); + this.pocketLootPool = itemsToAdd.map((x) => x._id); } return this.pocketLootPool; @@ -83,7 +84,7 @@ export class PMCLootGenerator const allowedItemTypes = this.pmcConfig.vestLoot.whitelist; const pmcItemBlacklist = this.pmcConfig.vestLoot.blacklist; const itemBlacklist = this.itemFilterService.getBlacklistedItems(); - + // Blacklist seasonal items if not inside seasonal event // Blacklist seasonal items if not inside seasonal event if (!this.seasonalEventService.seasonalEventEnabled()) @@ -92,13 +93,15 @@ export class PMCLootGenerator itemBlacklist.push(...this.seasonalEventService.getAllSeasonalEventItems()); } - const itemsToAdd = Object.values(items).filter(item => allowedItemTypes.includes(item._parent) - && this.itemHelper.isValidItem(item._id) - && !pmcItemBlacklist.includes(item._id) - && !itemBlacklist.includes(item._id) - && this.itemFitsInto2By2Slot(item)); + const itemsToAdd = Object.values(items).filter((item) => + allowedItemTypes.includes(item._parent) + && this.itemHelper.isValidItem(item._id) + && !pmcItemBlacklist.includes(item._id) + && !itemBlacklist.includes(item._id) + && this.itemFitsInto2By2Slot(item) + ); - this.vestLootPool = itemsToAdd.map(x => x._id); + this.vestLootPool = itemsToAdd.map((x) => x._id); } return this.vestLootPool; @@ -129,7 +132,7 @@ export class PMCLootGenerator const allowedItemTypes = this.pmcConfig.backpackLoot.whitelist; const pmcItemBlacklist = this.pmcConfig.backpackLoot.blacklist; const itemBlacklist = this.itemFilterService.getBlacklistedItems(); - + // blacklist event items if not inside seasonal event if (!this.seasonalEventService.seasonalEventEnabled()) { @@ -137,14 +140,16 @@ export class PMCLootGenerator itemBlacklist.push(...this.seasonalEventService.getAllSeasonalEventItems()); } - const itemsToAdd = Object.values(items).filter(item => allowedItemTypes.includes(item._parent) - && this.itemHelper.isValidItem(item._id) - && !pmcItemBlacklist.includes(item._id) - && !itemBlacklist.includes(item._id)); + const itemsToAdd = Object.values(items).filter((item) => + allowedItemTypes.includes(item._parent) + && this.itemHelper.isValidItem(item._id) + && !pmcItemBlacklist.includes(item._id) + && !itemBlacklist.includes(item._id) + ); - this.backpackLootPool = itemsToAdd.map(x => x._id); + this.backpackLootPool = itemsToAdd.map((x) => x._id); } return this.backpackLootPool; } -} \ No newline at end of file +} diff --git a/project/src/generators/PlayerScavGenerator.ts b/project/src/generators/PlayerScavGenerator.ts index 3e870523..ce557c24 100644 --- a/project/src/generators/PlayerScavGenerator.ts +++ b/project/src/generators/PlayerScavGenerator.ts @@ -47,7 +47,7 @@ export class PlayerScavGenerator @inject("BotLootCacheService") protected botLootCacheService: BotLootCacheService, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("BotGenerator") protected botGenerator: BotGenerator, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.playerScavConfig = this.configServer.getConfig(ConfigTypes.PLAYERSCAV); @@ -66,9 +66,7 @@ export class PlayerScavGenerator const existingScavData = this.jsonUtil.clone(profile.characters.scav); // scav profile can be empty on first profile creation - const scavKarmaLevel = ((Object.keys(existingScavData).length === 0)) - ? 0 - : this.getScavKarmaLevel(pmcData); + const scavKarmaLevel = (Object.keys(existingScavData).length === 0) ? 0 : this.getScavKarmaLevel(pmcData); // use karma level to get correct karmaSettings const playerScavKarmaSettings = this.playerScavConfig.karmaLevel[scavKarmaLevel]; @@ -83,7 +81,12 @@ export class PlayerScavGenerator const baseBotNode: IBotType = this.constructBotBaseTemplate(playerScavKarmaSettings.botTypeForLoot); this.adjustBotTemplateWithKarmaSpecificSettings(playerScavKarmaSettings, baseBotNode); - let scavData = this.botGenerator.generatePlayerScav(sessionID, playerScavKarmaSettings.botTypeForLoot.toLowerCase(), "easy", baseBotNode); + let scavData = this.botGenerator.generatePlayerScav( + sessionID, + playerScavKarmaSettings.botTypeForLoot.toLowerCase(), + "easy", + baseBotNode, + ); // Remove cached bot data after scav was generated this.botLootCacheService.clearCache(); @@ -109,11 +112,10 @@ export class PlayerScavGenerator scavData.Info.Level = this.getScavLevel(existingScavData); scavData.Info.Experience = this.getScavExperience(existingScavData); scavData.Quests = existingScavData.Quests ?? []; - scavData.ConditionCounters = existingScavData.ConditionCounters ?? {Counters: []}; - scavData.Notes = existingScavData.Notes ?? {Notes: []}; + scavData.ConditionCounters = existingScavData.ConditionCounters ?? { Counters: [] }; + scavData.Notes = existingScavData.Notes ?? { Notes: [] }; scavData.WishList = existingScavData.WishList ?? []; - // Add an extra labs card to pscav backpack based on config chance if (this.randomUtil.getChance100(playerScavKarmaSettings.labsAccessCardChancePercent)) { @@ -121,9 +123,15 @@ export class PlayerScavGenerator const itemsToAdd: Item[] = [{ _id: this.hashUtil.generate(), _tpl: labsCard._id, - ...this.botGeneratorHelper.generateExtraPropertiesForItem(labsCard) + ...this.botGeneratorHelper.generateExtraPropertiesForItem(labsCard), }]; - this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot(["TacticalVest", "Pockets", "Backpack"], itemsToAdd[0]._id, labsCard._id, itemsToAdd, scavData.Inventory); + this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot( + ["TacticalVest", "Pockets", "Backpack"], + itemsToAdd[0]._id, + labsCard._id, + itemsToAdd, + scavData.Inventory, + ); } // Remove secure container @@ -248,11 +256,7 @@ export class PlayerScavGenerator protected getDefaultScavSkills(): Skills { - return { - Common: [], - Mastering: [], - Points: 0 - }; + return { Common: [], Mastering: [], Points: 0 }; } protected getScavStats(scavProfile: IPmcData): Stats @@ -292,7 +296,7 @@ export class PlayerScavGenerator * take into account scav cooldown bonus * @param scavData scav profile * @param pmcData pmc profile - * @returns + * @returns */ protected setScavCooldownTimer(scavData: IPmcData, pmcData: IPmcData): IPmcData { @@ -314,7 +318,7 @@ export class PlayerScavGenerator const fenceInfo = this.fenceService.getFenceInfo(pmcData); modifier *= fenceInfo.SavageCooldownModifier; scavLockDuration *= modifier; - + const fullProfile = this.profileHelper.getFullProfile(pmcData?.sessionId); if (fullProfile?.info?.edition?.toLowerCase?.().startsWith?.(AccountTypes.SPT_DEVELOPER)) { @@ -323,7 +327,7 @@ export class PlayerScavGenerator } scavData.Info.SavageLockTime = (Date.now() / 1000) + scavLockDuration; - + return scavData; } -} \ No newline at end of file +} diff --git a/project/src/generators/RagfairAssortGenerator.ts b/project/src/generators/RagfairAssortGenerator.ts index 19855ebb..da525e8f 100644 --- a/project/src/generators/RagfairAssortGenerator.ts +++ b/project/src/generators/RagfairAssortGenerator.ts @@ -24,7 +24,7 @@ export class RagfairAssortGenerator @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("SeasonalEventService") protected seasonalEventService: SeasonalEventService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -72,7 +72,7 @@ export class RagfairAssortGenerator BaseClasses.SORTING_TABLE, BaseClasses.INVENTORY, BaseClasses.STATIONARY_CONTAINER, - BaseClasses.POCKETS + BaseClasses.POCKETS, ]; const seasonalEventActive = this.seasonalEventService.seasonalEventEnabled(); @@ -84,7 +84,10 @@ export class RagfairAssortGenerator continue; } - if (this.ragfairConfig.dynamic.removeSeasonalItemsWhenNotInEvent && !seasonalEventActive && seasonalItemTplBlacklist.includes(item._id)) + if ( + this.ragfairConfig.dynamic.removeSeasonalItemsWhenNotInEvent && !seasonalEventActive + && seasonalItemTplBlacklist.includes(item._id) + ) { continue; } @@ -99,7 +102,7 @@ export class RagfairAssortGenerator return results; } - + /** * Get presets from globals.json * @returns Preset object array @@ -116,9 +119,9 @@ export class RagfairAssortGenerator */ protected getDefaultPresets(): IPreset[] { - return this.getPresets().filter(x => x._encyclopedia); + return this.getPresets().filter((x) => x._encyclopedia); } - + /** * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true * @param tplId tplid to add to item @@ -132,10 +135,7 @@ export class RagfairAssortGenerator _tpl: tplId, parentId: "hideout", slotId: "hideout", - upd: { - StackObjectsCount: 99999999, - UnlimitedCount: true - } + upd: { StackObjectsCount: 99999999, UnlimitedCount: true }, }; } -} \ No newline at end of file +} diff --git a/project/src/generators/RagfairOfferGenerator.ts b/project/src/generators/RagfairOfferGenerator.ts index 6cf20278..3fba7154 100644 --- a/project/src/generators/RagfairOfferGenerator.ts +++ b/project/src/generators/RagfairOfferGenerator.ts @@ -54,7 +54,7 @@ export class RagfairOfferGenerator @inject("RagfairCategoriesService") protected ragfairCategoriesService: RagfairCategoriesService, @inject("FenceService") protected fenceService: FenceService, @inject("ItemHelper") protected itemHelper: ItemHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -70,7 +70,14 @@ export class RagfairOfferGenerator * @param sellInOnePiece Flags sellInOnePiece to be true * @returns IRagfairOffer */ - public createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, sellInOnePiece = false): IRagfairOffer + public createFleaOffer( + userID: string, + time: number, + items: Item[], + barterScheme: IBarterScheme[], + loyalLevel: number, + sellInOnePiece = false, + ): IRagfairOffer { const offer = this.createOffer(userID, time, items, barterScheme, loyalLevel, sellInOnePiece); this.ragfairOfferService.addOffer(offer); @@ -88,7 +95,14 @@ export class RagfairOfferGenerator * @param sellInOnePiece Set StackObjectsCount to 1 * @returns IRagfairOffer */ - protected createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, sellInOnePiece = false): IRagfairOffer + protected createOffer( + userID: string, + time: number, + items: Item[], + barterScheme: IBarterScheme[], + loyalLevel: number, + sellInOnePiece = false, + ): IRagfairOffer { const isTrader = this.ragfairServerHelper.isTrader(userID); @@ -98,13 +112,13 @@ export class RagfairOfferGenerator const requirement: OfferRequirement = { _tpl: barter._tpl, count: +barter.count.toFixed(2), - onlyFunctional: barter.onlyFunctional ?? false + onlyFunctional: barter.onlyFunctional ?? false, }; offerRequirements.push(requirement); } - const itemCount = items.filter(x => x.slotId === "hideout").length; + const itemCount = items.filter((x) => x.slotId === "hideout").length; const roublePrice = Math.round(this.convertOfferRequirementsIntoRoubles(offerRequirements)); const offer: IRagfairOffer = { @@ -118,7 +132,7 @@ export class RagfairOfferGenerator nickname: this.ragfairServerHelper.getNickname(userID), rating: this.getRating(userID), isRatingGrowing: this.getRatingGrowing(userID), - avatar: this.getAvatarUrl(isTrader, userID) + avatar: this.getAvatarUrl(isTrader, userID), }, root: items[0]._id, items: this.jsonUtil.clone(items), @@ -134,7 +148,7 @@ export class RagfairOfferGenerator locked: false, unlimitedCount: false, notAvailable: false, - CurrentItemCount: itemCount + CurrentItemCount: itemCount, }; return offer; @@ -249,7 +263,7 @@ export class RagfairOfferGenerator return true; } - // generated offer + // generated offer // 50/50 growing/falling return this.randomUtil.getBool(); } @@ -275,7 +289,13 @@ export class RagfairOfferGenerator } // Generated fake-player offer - return Math.round(time + this.randomUtil.getInt(this.ragfairConfig.dynamic.endTimeSeconds.min, this.ragfairConfig.dynamic.endTimeSeconds.max)); + return Math.round( + time + + this.randomUtil.getInt( + this.ragfairConfig.dynamic.endTimeSeconds.min, + this.ragfairConfig.dynamic.endTimeSeconds.max, + ), + ); } /** @@ -287,7 +307,7 @@ export class RagfairOfferGenerator const config = this.ragfairConfig.dynamic; // get assort items from param if they exist, otherwise grab freshly generated assorts - const assortItemsToProcess: Item[] = (expiredOffers) + const assortItemsToProcess: Item[] = expiredOffers ? expiredOffers : this.ragfairAssortGenerator.getAssortItems(); @@ -295,20 +315,26 @@ export class RagfairOfferGenerator const assorOffersForItemsProcesses = []; for (const assortItemIndex in assortItemsToProcess) { - assorOffersForItemsProcesses.push(this.createOffersForItems(assortItemIndex, assortItemsToProcess, expiredOffers, config)); + assorOffersForItemsProcesses.push( + this.createOffersForItems(assortItemIndex, assortItemsToProcess, expiredOffers, config), + ); } await Promise.all(assorOffersForItemsProcesses); } /** - * * @param assortItemIndex Index of assort item * @param assortItemsToProcess Item array containing index * @param expiredOffers Currently expired offers on flea * @param config Ragfair dynamic config */ - protected async createOffersForItems(assortItemIndex: string, assortItemsToProcess: Item[], expiredOffers: Item[], config: Dynamic): Promise + protected async createOffersForItems( + assortItemIndex: string, + assortItemsToProcess: Item[], + expiredOffers: Item[], + config: Dynamic, + ): Promise { const assortItem = assortItemsToProcess[assortItemIndex]; const itemDetails = this.itemHelper.getItem(assortItem._tpl); @@ -322,13 +348,19 @@ export class RagfairOfferGenerator } // Get item + sub-items if preset, otherwise just get item - const items: Item[] = (isPreset) + const items: Item[] = isPreset ? this.ragfairServerHelper.getPresetItems(assortItem) - : [...[assortItem], ...this.itemHelper.findAndReturnChildrenByAssort(assortItem._id, this.ragfairAssortGenerator.getAssortItems())]; + : [ + ...[assortItem], + ...this.itemHelper.findAndReturnChildrenByAssort( + assortItem._id, + this.ragfairAssortGenerator.getAssortItems(), + ), + ]; // Get number of offers to create // Limit to 1 offer when processing expired - const offerCount = (expiredOffers) + const offerCount = expiredOffers ? 1 : Math.round(this.randomUtil.getInt(config.offerItemCount.min, config.offerItemCount.max)); @@ -342,7 +374,6 @@ export class RagfairOfferGenerator await Promise.all(assortSingleOfferProcesses); } - /** * Create one flea offer for a specific item * @param items Item to create offer for @@ -350,13 +381,17 @@ export class RagfairOfferGenerator * @param itemDetails raw db item details * @returns Item array */ - protected async createSingleOfferForItem(items: Item[], isPreset: boolean, itemDetails: [boolean, ITemplateItem]): Promise + protected async createSingleOfferForItem( + items: Item[], + isPreset: boolean, + itemDetails: [boolean, ITemplateItem], + ): Promise { // Set stack size to random value items[0].upd.StackObjectsCount = this.ragfairServerHelper.calculateDynamicStackCount(items[0]._tpl, isPreset); - + const isBarterOffer = this.randomUtil.getChance100(this.ragfairConfig.dynamic.barter.chancePercent); - const isPackOffer = this.randomUtil.getChance100(this.ragfairConfig.dynamic.pack.chancePercent) + const isPackOffer = this.randomUtil.getChance100(this.ragfairConfig.dynamic.pack.chancePercent) && !isBarterOffer && items.length === 1 && this.itemHelper.isOfBaseclasses(items[0]._tpl, this.ragfairConfig.dynamic.pack.itemTypeWhitelist); @@ -366,7 +401,10 @@ export class RagfairOfferGenerator if (isPackOffer) { // Set pack size - const stackSize = this.randomUtil.getInt(this.ragfairConfig.dynamic.pack.itemCountMin, this.ragfairConfig.dynamic.pack.itemCountMax); + const stackSize = this.randomUtil.getInt( + this.ragfairConfig.dynamic.pack.itemCountMin, + this.ragfairConfig.dynamic.pack.itemCountMax, + ); items[0].upd.StackObjectsCount = stackSize; // Don't randomise pack items @@ -391,7 +429,8 @@ export class RagfairOfferGenerator items, barterScheme, 1, - isPreset || isPackOffer); // sellAsOnePiece + isPreset || isPackOffer, + ); // sellAsOnePiece this.ragfairCategoriesService.incrementCategory(offer); } @@ -413,7 +452,12 @@ export class RagfairOfferGenerator // Trader assorts / assort items are missing if (!assorts?.items?.length) { - this.logger.error(this.localisationService.getText("ragfair-no_trader_assorts_cant_generate_flea_offers", trader.base.nickname)); + this.logger.error( + this.localisationService.getText( + "ragfair-no_trader_assorts_cant_generate_flea_offers", + trader.base.nickname, + ), + ); return; } @@ -444,14 +488,20 @@ export class RagfairOfferGenerator } const isPreset = this.presetHelper.isPreset(item._id); - const items: Item[] = (isPreset) + const items: Item[] = isPreset ? this.ragfairServerHelper.getPresetItems(item) : [...[item], ...this.itemHelper.findAndReturnChildrenByAssort(item._id, assorts.items)]; const barterScheme = assorts.barter_scheme[item._id]; if (!barterScheme) { - this.logger.warning(this.localisationService.getText("ragfair-missing_barter_scheme", {itemId: item._id, tpl: item._tpl, name: trader.base.nickname})); + this.logger.warning( + this.localisationService.getText("ragfair-missing_barter_scheme", { + itemId: item._id, + tpl: item._tpl, + name: trader.base.nickname, + }), + ); continue; } @@ -473,11 +523,11 @@ export class RagfairOfferGenerator * @param userID id of owner of item * @param itemWithMods Item and mods, get condition of first item (only first array item is used) * @param itemDetails db details of first item - * @returns + * @returns */ protected randomiseItemUpdProperties(userID: string, itemWithMods: Item[], itemDetails: ITemplateItem): Item[] { - // Add any missing properties to first item in array + // Add any missing properties to first item in array itemWithMods[0] = this.addMissingConditions(itemWithMods[0]); if (!(this.ragfairServerHelper.isPlayer(userID) || this.ragfairServerHelper.isTrader(userID))) @@ -508,9 +558,9 @@ export class RagfairOfferGenerator { // Get keys from condition config dictionary const configConditions = Object.keys(this.ragfairConfig.dynamic.condition); - for (const baseClass of configConditions) + for (const baseClass of configConditions) { - if (this.itemHelper.isOfBaseclass(tpl, baseClass)) + if (this.itemHelper.isOfBaseclass(tpl, baseClass)) { return baseClass; } @@ -527,7 +577,10 @@ export class RagfairOfferGenerator */ protected randomiseItemCondition(conditionSettingsId: string, item: Item, itemDetails: ITemplateItem): void { - const multiplier = this.randomUtil.getFloat(this.ragfairConfig.dynamic.condition[conditionSettingsId].min, this.ragfairConfig.dynamic.condition[conditionSettingsId].max); + const multiplier = this.randomUtil.getFloat( + this.ragfairConfig.dynamic.condition[conditionSettingsId].min, + this.ragfairConfig.dynamic.condition[conditionSettingsId].max, + ); // Armor or weapons if (item.upd.Repairable) @@ -571,7 +624,7 @@ export class RagfairOfferGenerator return; } - if (item.upd.RepairKit) + if (item.upd.RepairKit) { // randomize repair kit (armor/weapon) uses item.upd.RepairKit.Resource = Math.round(itemDetails._props.MaxRepairResource * multiplier) || 1; @@ -583,10 +636,7 @@ export class RagfairOfferGenerator { const totalCapacity = itemDetails._props.MaxResource; const remainingFuel = Math.round(totalCapacity * multiplier); - item.upd.Resource = { - UnitsConsumed: totalCapacity - remainingFuel, - Value: remainingFuel - }; + item.upd.Resource = { UnitsConsumed: totalCapacity - remainingFuel, Value: remainingFuel }; } } @@ -600,7 +650,10 @@ export class RagfairOfferGenerator item.upd.Repairable.Durability = Math.round(item.upd.Repairable.Durability * multiplier) || 1; // randomize max durability, store to a temporary value so we can still compare the max durability - let tempMaxDurability = Math.round(this.randomUtil.getFloat(item.upd.Repairable.Durability - 5, item.upd.Repairable.MaxDurability + 5)) || item.upd.Repairable.Durability; + let tempMaxDurability = + Math.round( + this.randomUtil.getFloat(item.upd.Repairable.Durability - 5, item.upd.Repairable.MaxDurability + 5), + ) || item.upd.Repairable.Durability; // clamp values to max/current if (tempMaxDurability >= item.upd.Repairable.MaxDurability) @@ -626,46 +679,35 @@ export class RagfairOfferGenerator protected addMissingConditions(item: Item): Item { const props = this.itemHelper.getItem(item._tpl)[1]._props; - const isRepairable = ("Durability" in props); - const isMedkit = ("MaxHpResource" in props); - const isKey = ("MaximumNumberOfUsage" in props); - const isConsumable = (props.MaxResource > 1 && "foodUseTime" in props); - const isRepairKit = ("MaxRepairResource" in props); + const isRepairable = "Durability" in props; + const isMedkit = "MaxHpResource" in props; + const isKey = "MaximumNumberOfUsage" in props; + const isConsumable = props.MaxResource > 1 && "foodUseTime" in props; + const isRepairKit = "MaxRepairResource" in props; if (isRepairable && props.Durability > 0) { - item.upd.Repairable = { - "Durability": props.Durability, - "MaxDurability": props.Durability - }; + item.upd.Repairable = { Durability: props.Durability, MaxDurability: props.Durability }; } if (isMedkit && props.MaxHpResource > 0) { - item.upd.MedKit = { - "HpResource": props.MaxHpResource - }; + item.upd.MedKit = { HpResource: props.MaxHpResource }; } - if (isKey) + if (isKey) { - item.upd.Key = { - "NumberOfUsages": 0 - }; + item.upd.Key = { NumberOfUsages: 0 }; } - if (isConsumable) + if (isConsumable) { - item.upd.FoodDrink = { - "HpPercent": props.MaxResource - }; + item.upd.FoodDrink = { HpPercent: props.MaxResource }; } - if (isRepairKit) + if (isRepairKit) { - item.upd.RepairKit = { - "Resource": props.MaxRepairResource - }; + item.upd.RepairKit = { Resource: props.MaxRepairResource }; } return item; @@ -679,7 +721,11 @@ export class RagfairOfferGenerator protected createBarterBarterScheme(offerItems: Item[]): IBarterScheme[] { // get flea price of item being sold - const priceOfItemOffer = this.ragfairPriceService.getDynamicOfferPriceForOffer(offerItems, Money.ROUBLES, false); + const priceOfItemOffer = this.ragfairPriceService.getDynamicOfferPriceForOffer( + offerItems, + Money.ROUBLES, + false, + ); // Dont make items under a designated rouble value into barter offers if (priceOfItemOffer < this.ragfairConfig.dynamic.barter.minRoubleCostToBecomeBarter) @@ -688,7 +734,10 @@ export class RagfairOfferGenerator } // Get a randomised number of barter items to list offer for - const barterItemCount = this.randomUtil.getInt(this.ragfairConfig.dynamic.barter.itemCountMin, this.ragfairConfig.dynamic.barter.itemCountMax); + const barterItemCount = this.randomUtil.getInt( + this.ragfairConfig.dynamic.barter.itemCountMin, + this.ragfairConfig.dynamic.barter.itemCountMax, + ); // Get desired cost of individual item offer will be listed for e.g. offer = 15k, item count = 3, desired item cost = 5k const desiredItemCost = Math.round(priceOfItemOffer / barterItemCount); @@ -699,7 +748,10 @@ export class RagfairOfferGenerator const fleaPrices = this.getFleaPricesAsArray(); // Filter possible barters to items that match the price range + not itself - const filtered = fleaPrices.filter(x => x.price >= desiredItemCost - offerCostVariance && x.price <= desiredItemCost + offerCostVariance && x.tpl !== offerItems[0]._tpl); + const filtered = fleaPrices.filter((x) => + x.price >= desiredItemCost - offerCostVariance && x.price <= desiredItemCost + offerCostVariance + && x.tpl !== offerItems[0]._tpl + ); // No items on flea have a matching price, fall back to currency if (filtered.length === 0) @@ -710,12 +762,7 @@ export class RagfairOfferGenerator // Choose random item from price-filtered flea items const randomItem = this.randomUtil.getArrayValue(filtered); - return [ - { - count: barterItemCount, - _tpl: randomItem.tpl - } - ]; + return [{ count: barterItemCount, _tpl: randomItem.tpl }]; } /** @@ -731,9 +778,11 @@ export class RagfairOfferGenerator const fleaArray = Object.entries(fleaPrices).map(([tpl, price]) => ({ tpl: tpl, price: price })); // Only get item prices for items that also exist in items.json - const filteredItems = fleaArray.filter(x => this.itemHelper.getItem(x.tpl)[0]); + const filteredItems = fleaArray.filter((x) => this.itemHelper.getItem(x.tpl)[0]); - this.allowedFleaPriceItemsForBarter = filteredItems.filter(x => !this.itemHelper.isOfBaseclasses(x.tpl, this.ragfairConfig.dynamic.barter.itemTypeBlacklist)); + this.allowedFleaPriceItemsForBarter = filteredItems.filter((x) => + !this.itemHelper.isOfBaseclasses(x.tpl, this.ragfairConfig.dynamic.barter.itemTypeBlacklist) + ); } return this.allowedFleaPriceItemsForBarter; @@ -749,13 +798,9 @@ export class RagfairOfferGenerator protected createCurrencyBarterScheme(offerItems: Item[], isPackOffer: boolean, multipler = 1): IBarterScheme[] { const currency = this.ragfairServerHelper.getDynamicOfferCurrency(); - const price = this.ragfairPriceService.getDynamicOfferPriceForOffer(offerItems, currency, isPackOffer) * multipler; + const price = this.ragfairPriceService.getDynamicOfferPriceForOffer(offerItems, currency, isPackOffer) + * multipler; - return [ - { - count: price, - _tpl: currency - } - ]; + return [{ count: price, _tpl: currency }]; } -} \ No newline at end of file +} diff --git a/project/src/generators/RepeatableQuestGenerator.ts b/project/src/generators/RepeatableQuestGenerator.ts index dd3ea169..97a73fdc 100644 --- a/project/src/generators/RepeatableQuestGenerator.ts +++ b/project/src/generators/RepeatableQuestGenerator.ts @@ -16,16 +16,25 @@ import { IEliminationCondition, IEquipmentConditionProps, IExploration, - IExplorationCondition, IKillConditionProps, + IExplorationCondition, + IKillConditionProps, IPickup, - IRepeatableQuest, IReward, IRewards + IRepeatableQuest, + IReward, + IRewards, } from "@spt-aki/models/eft/common/tables/IRepeatableQuests"; import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem"; import { BaseClasses } from "@spt-aki/models/enums/BaseClasses"; import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; import { Money } from "@spt-aki/models/enums/Money"; import { Traders } from "@spt-aki/models/enums/Traders"; -import { IBaseQuestConfig, IBossInfo, IEliminationConfig, IQuestConfig, IRepeatableQuestConfig } from "@spt-aki/models/spt/config/IQuestConfig"; +import { + IBaseQuestConfig, + IBossInfo, + IEliminationConfig, + IQuestConfig, + IRepeatableQuestConfig, +} from "@spt-aki/models/spt/config/IQuestConfig"; import { IQuestTypePool } from "@spt-aki/models/spt/repeatable/IQuestTypePool"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { EventOutputHolder } from "@spt-aki/routers/EventOutputHolder"; @@ -67,7 +76,7 @@ export class RepeatableQuestGenerator @inject("ObjectId") protected objectId: ObjectId, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, @inject("RepeatableQuestHelper") protected repeatableQuestHelper: RepeatableQuestHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.questConfig = this.configServer.getConfig(ConfigTypes.QUEST); @@ -86,15 +95,17 @@ export class RepeatableQuestGenerator pmcLevel: number, pmcTraderInfo: Record, questTypePool: IQuestTypePool, - repeatableConfig: IRepeatableQuestConfig + repeatableConfig: IRepeatableQuestConfig, ): IRepeatableQuest { const questType = this.randomUtil.drawRandomFromList(questTypePool.types)[0]; // get traders from whitelist and filter by quest type availability - let traders = repeatableConfig.traderWhitelist.filter(x => x.questTypes.includes(questType)).map(x => x.traderId); + let traders = repeatableConfig.traderWhitelist.filter((x) => x.questTypes.includes(questType)).map((x) => + x.traderId + ); // filter out locked traders - traders = traders.filter(x => pmcTraderInfo[x].unlocked); + traders = traders.filter((x) => pmcTraderInfo[x].unlocked); const traderId = this.randomUtil.drawRandomFromList(traders)[0]; switch (questType) @@ -124,15 +135,19 @@ export class RepeatableQuestGenerator pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, - repeatableConfig: IRepeatableQuestConfig + repeatableConfig: IRepeatableQuestConfig, ): IElimination { const eliminationConfig = this.repeatableQuestHelper.getEliminationConfigByPmcLevel(pmcLevel, repeatableConfig); const locationsConfig = repeatableConfig.locations; let targetsConfig = this.repeatableQuestHelper.probabilityObjectArray(eliminationConfig.targets); const bodypartsConfig = this.repeatableQuestHelper.probabilityObjectArray(eliminationConfig.bodyParts); - const weaponCategoryRequirementConfig = this.repeatableQuestHelper.probabilityObjectArray(eliminationConfig.weaponCategoryRequirements); - const weaponRequirementConfig = this.repeatableQuestHelper.probabilityObjectArray(eliminationConfig.weaponRequirements); + const weaponCategoryRequirementConfig = this.repeatableQuestHelper.probabilityObjectArray( + eliminationConfig.weaponCategoryRequirements, + ); + const weaponRequirementConfig = this.repeatableQuestHelper.probabilityObjectArray( + eliminationConfig.weaponRequirements, + ); // the difficulty of the quest varies in difficulty depending on the condition // possible conditions are @@ -147,7 +162,7 @@ export class RepeatableQuestGenerator // "Savage": 7, // "AnyPmc": 2, // "bossBully": 0.5 - //} + // } // higher is more likely. We define the difficulty to be the inverse of the relative probability. // We want to generate a reward which is scaled by the difficulty of this mission. To get a upper bound with which we scale @@ -166,18 +181,26 @@ export class RepeatableQuestGenerator const maxKillDifficulty = eliminationConfig.maxKills; - function difficultyWeighing(target: number, bodyPart: number, dist: number, kill: number, weaponRequirement: number): number + function difficultyWeighing( + target: number, + bodyPart: number, + dist: number, + kill: number, + weaponRequirement: number, + ): number { return Math.sqrt(Math.sqrt(target) + bodyPart + dist + weaponRequirement) * kill; } - targetsConfig = targetsConfig.filter(x => Object.keys(questTypePool.pool.Elimination.targets).includes(x.key)); - if (targetsConfig.length === 0 || targetsConfig.every(x => x.data.isBoss)) + targetsConfig = targetsConfig.filter((x) => + Object.keys(questTypePool.pool.Elimination.targets).includes(x.key) + ); + if (targetsConfig.length === 0 || targetsConfig.every((x) => x.data.isBoss)) { // There are no more targets left for elimination; delete it as a possible quest type // also if only bosses are left we need to leave otherwise it's a guaranteed boss elimination // -> then it would not be a quest with low probability anymore - questTypePool.types = questTypePool.types.filter(t => t !== "Elimination"); + questTypePool.types = questTypePool.types.filter((t) => t !== "Elimination"); return null; } @@ -189,18 +212,23 @@ export class RepeatableQuestGenerator // we use any as location if "any" is in the pool and we do not hit the specific location random // we use any also if the random condition is not met in case only "any" was in the pool let locationKey = "any"; - if (locations.includes("any") && (eliminationConfig.specificLocationProb < Math.random() || locations.length <= 1)) + if ( + locations.includes("any") + && (eliminationConfig.specificLocationProb < Math.random() || locations.length <= 1) + ) { locationKey = "any"; delete questTypePool.pool.Elimination.targets[targetKey]; } else { - locations = locations.filter(l => l !== "any"); + locations = locations.filter((l) => l !== "any"); if (locations.length > 0) { locationKey = this.randomUtil.drawRandomFromList(locations)[0]; - questTypePool.pool.Elimination.targets[targetKey].locations = locations.filter(l => l !== locationKey); + questTypePool.pool.Elimination.targets[targetKey].locations = locations.filter((l) => + l !== locationKey + ); if (questTypePool.pool.Elimination.targets[targetKey].locations.length === 0) { delete questTypePool.pool.Elimination.targets[targetKey]; @@ -244,15 +272,16 @@ export class RepeatableQuestGenerator if (targetsConfig.data(targetKey).isBoss) { // get all boss spawn information - const bossSpawns = Object.values(this.databaseServer.getTables().locations).filter(x => "base" in x && "Id" in x.base).map( - (x) => ({ Id: x.base.Id, BossSpawn: x.base.BossLocationSpawn }) - ); + const bossSpawns = Object.values(this.databaseServer.getTables().locations).filter((x) => + "base" in x && "Id" in x.base + ).map((x) => ({ Id: x.base.Id, BossSpawn: x.base.BossLocationSpawn })); // filter for the current boss to spawn on map - const thisBossSpawns = bossSpawns.map( - (x) => ({ Id: x.Id, BossSpawn: x.BossSpawn.filter(e => e.BossName === targetKey) }) - ).filter(x => x.BossSpawn.length > 0); + const thisBossSpawns = bossSpawns.map((x) => ({ + Id: x.Id, + BossSpawn: x.BossSpawn.filter((e) => e.BossName === targetKey), + })).filter((x) => x.BossSpawn.length > 0); // remove blacklisted locations - const allowedSpawns = thisBossSpawns.filter(x => !eliminationConfig.distLocationBlacklist.includes(x.Id)); + const allowedSpawns = thisBossSpawns.filter((x) => !eliminationConfig.distLocationBlacklist.includes(x.Id)); // if the boss spawns on nom-blacklisted locations and the current location is allowed we can generate a distance kill requirement isDistanceRequirementAllowed = isDistanceRequirementAllowed && (allowedSpawns.length > 0); } @@ -260,7 +289,10 @@ export class RepeatableQuestGenerator if (eliminationConfig.distProb > Math.random() && isDistanceRequirementAllowed) { // random distance with lower values more likely; simple distribution for starters... - distance = Math.floor(Math.abs(Math.random() - Math.random()) * (1 + eliminationConfig.maxDist - eliminationConfig.minDist) + eliminationConfig.minDist); + distance = Math.floor( + Math.abs(Math.random() - Math.random()) * (1 + eliminationConfig.maxDist - eliminationConfig.minDist) + + eliminationConfig.minDist, + ); distance = Math.ceil(distance / 5) * 5; distanceDifficulty = maxDistDifficulty * distance / eliminationConfig.maxDist; } @@ -297,7 +329,7 @@ export class RepeatableQuestGenerator bodyPartDifficulty / maxBodyPartsDifficulty, distanceDifficulty / maxDistDifficulty, killDifficulty / maxKillDifficulty, - (allowedWeaponsCategory || allowedWeapon) ? 1 : 0 + (allowedWeaponsCategory || allowedWeapon) ? 1 : 0, ); // Aforementioned issue makes it a bit crazy since now all easier quests give significantly lower rewards than Completion / Exploration @@ -306,7 +338,7 @@ export class RepeatableQuestGenerator const difficulty = this.mathUtil.mapToRange(curDifficulty, minDifficulty, maxDifficulty, 0.5, 2); const quest = this.generateRepeatableTemplate("Elimination", traderId, repeatableConfig.side) as IElimination; - + // ASSUMPTION: All fence quests are for scavs if (traderId === Traders.FENCE) { @@ -320,14 +352,30 @@ export class RepeatableQuestGenerator // Only add specific location condition if specific map selected if (locationKey !== "any") { - availableForFinishCondition._props.counter.conditions.push(this.generateEliminationLocation(locationsConfig[locationKey])); + availableForFinishCondition._props.counter.conditions.push( + this.generateEliminationLocation(locationsConfig[locationKey]), + ); } - availableForFinishCondition._props.counter.conditions.push(this.generateEliminationCondition(targetKey, bodyPartsToClient, distance, allowedWeapon, allowedWeaponsCategory)); + availableForFinishCondition._props.counter.conditions.push( + this.generateEliminationCondition( + targetKey, + bodyPartsToClient, + distance, + allowedWeapon, + allowedWeaponsCategory, + ), + ); availableForFinishCondition._props.value = desiredKillCount; availableForFinishCondition._props.id = this.objectId.generate(); quest.location = this.getQuestLocationByMapId(locationKey); - quest.rewards = this.generateReward(pmcLevel, Math.min(difficulty, 1), traderId, repeatableConfig, eliminationConfig); + quest.rewards = this.generateReward( + pmcLevel, + Math.min(difficulty, 1), + traderId, + repeatableConfig, + eliminationConfig, + ); return quest; } @@ -339,7 +387,11 @@ export class RepeatableQuestGenerator * @param eliminationConfig Config * @returns Number of AI to kill */ - protected getEliminationKillCount(targetKey: string, targetsConfig: ProbabilityObjectArray, eliminationConfig: IEliminationConfig): number + protected getEliminationKillCount( + targetKey: string, + targetsConfig: ProbabilityObjectArray, + eliminationConfig: IEliminationConfig, + ): number { if (targetsConfig.data(targetKey).isBoss) { @@ -364,14 +416,10 @@ export class RepeatableQuestGenerator protected generateEliminationLocation(location: string[]): IEliminationCondition { const propsObject: IEliminationCondition = { - _props: { - target: location, - id: this.objectId.generate(), - dynamicLocale: true - }, - _parent: "Location" + _props: { target: location, id: this.objectId.generate(), dynamicLocale: true }, + _parent: "Location", }; - + return propsObject; } @@ -384,13 +432,19 @@ export class RepeatableQuestGenerator * @param allowedWeaponCategory What category of weapon must be used - undefined = any * @returns IEliminationCondition object */ - protected generateEliminationCondition(target: string, targetedBodyParts: string[], distance: number, allowedWeapon: string, allowedWeaponCategory: string): IEliminationCondition + protected generateEliminationCondition( + target: string, + targetedBodyParts: string[], + distance: number, + allowedWeapon: string, + allowedWeaponCategory: string, + ): IEliminationCondition { const killConditionProps: IKillConditionProps = { target: target, value: 1, id: this.objectId.generate(), - dynamicLocale: true + dynamicLocale: true, }; if (target.startsWith("boss")) @@ -408,10 +462,7 @@ export class RepeatableQuestGenerator // Dont allow distance + melee requirement if (distance && allowedWeaponCategory !== "5b5f7a0886f77409407a7f96") { - killConditionProps.distance = { - compareMethod: ">=", - value: distance - }; + killConditionProps.distance = { compareMethod: ">=", value: distance }; } // Has specific weapon requirement @@ -426,10 +477,7 @@ export class RepeatableQuestGenerator killConditionProps.weaponCategories = [allowedWeaponCategory]; } - return { - _props: killConditionProps, - _parent: "Kills" - }; + return { _props: killConditionProps, _parent: "Kills" }; } /** @@ -443,7 +491,7 @@ export class RepeatableQuestGenerator protected generateCompletionQuest( pmcLevel: number, traderId: string, - repeatableConfig: IRepeatableQuestConfig + repeatableConfig: IRepeatableQuestConfig, ): ICompletion { const completionConfig = repeatableConfig.questConfig.Completion; @@ -457,48 +505,66 @@ export class RepeatableQuestGenerator numberDistinctItems = 2; } - const quest = this.generateRepeatableTemplate("Completion", traderId,repeatableConfig.side) as ICompletion; + const quest = this.generateRepeatableTemplate("Completion", traderId, repeatableConfig.side) as ICompletion; // Filter the items.json items to items the player must retrieve to complete quest: shouldn't be a quest item or "non-existant" const possibleItemsToRetrievePool = this.getRewardableItems(repeatableConfig, traderId); // Be fair, don't let the items be more expensive than the reward - let roublesBudget = Math.floor(this.mathUtil.interp1(pmcLevel, levelsConfig, roublesConfig) * this.randomUtil.getFloat(0.5, 1)); + let roublesBudget = Math.floor( + this.mathUtil.interp1(pmcLevel, levelsConfig, roublesConfig) * this.randomUtil.getFloat(0.5, 1), + ); roublesBudget = Math.max(roublesBudget, 5000); - let itemSelection = possibleItemsToRetrievePool.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget); + let itemSelection = possibleItemsToRetrievePool.filter((x) => + this.itemHelper.getItemPrice(x[0]) < roublesBudget + ); // We also have the option to use whitelist and/or blacklist which is defined in repeatableQuests.json as // [{"minPlayerLevel": 1, "itemIds": ["id1",...]}, {"minPlayerLevel": 15, "itemIds": ["id3",...]}] if (repeatableConfig.questConfig.Completion.useWhitelist) { - const itemWhitelist = this.databaseServer.getTables().templates.repeatableQuests.data.Completion.itemsWhitelist; + const itemWhitelist = + this.databaseServer.getTables().templates.repeatableQuests.data.Completion.itemsWhitelist; // Filter and concatenate the arrays according to current player level - const itemIdsWhitelisted = itemWhitelist.filter(p => p.minPlayerLevel <= pmcLevel).reduce((a, p) => a.concat(p.itemIds), []); - itemSelection = itemSelection.filter(x => + const itemIdsWhitelisted = itemWhitelist.filter((p) => p.minPlayerLevel <= pmcLevel).reduce( + (a, p) => a.concat(p.itemIds), + [], + ); + itemSelection = itemSelection.filter((x) => { // Whitelist can contain item tpls and item base type ids - return (itemIdsWhitelisted.some(v => this.itemHelper.isOfBaseclass(x[0], v)) || itemIdsWhitelisted.includes(x[0])); + return (itemIdsWhitelisted.some((v) => this.itemHelper.isOfBaseclass(x[0], v)) + || itemIdsWhitelisted.includes(x[0])); }); // check if items are missing - //const flatList = itemSelection.reduce((a, il) => a.concat(il[0]), []); - //const missing = itemIdsWhitelisted.filter(l => !flatList.includes(l)); + // const flatList = itemSelection.reduce((a, il) => a.concat(il[0]), []); + // const missing = itemIdsWhitelisted.filter(l => !flatList.includes(l)); } if (repeatableConfig.questConfig.Completion.useBlacklist) { - const itemBlacklist = this.databaseServer.getTables().templates.repeatableQuests.data.Completion.itemsBlacklist; + const itemBlacklist = + this.databaseServer.getTables().templates.repeatableQuests.data.Completion.itemsBlacklist; // we filter and concatenate the arrays according to current player level - const itemIdsBlacklisted = itemBlacklist.filter(p => p.minPlayerLevel <= pmcLevel).reduce((a, p) => a.concat(p.itemIds), []); - itemSelection = itemSelection.filter(x => + const itemIdsBlacklisted = itemBlacklist.filter((p) => p.minPlayerLevel <= pmcLevel).reduce( + (a, p) => a.concat(p.itemIds), + [], + ); + itemSelection = itemSelection.filter((x) => { - return itemIdsBlacklisted.every(v => !this.itemHelper.isOfBaseclass(x[0], v)) || !itemIdsBlacklisted.includes(x[0]); + return itemIdsBlacklisted.every((v) => !this.itemHelper.isOfBaseclass(x[0], v)) + || !itemIdsBlacklisted.includes(x[0]); }); } if (itemSelection.length === 0) { - this.logger.error(this.localisationService.getText("repeatable-completion_quest_whitelist_too_small_or_blacklist_too_restrictive")); + this.logger.error( + this.localisationService.getText( + "repeatable-completion_quest_whitelist_too_small_or_blacklist_too_restrictive", + ), + ); return null; } @@ -533,7 +599,7 @@ export class RepeatableQuestGenerator if (roublesBudget > 0) { // reduce the list possible items to fulfill the new budget constraint - itemSelection = itemSelection.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget); + itemSelection = itemSelection.filter((x) => this.itemHelper.getItemPrice(x[0]) < roublesBudget); if (itemSelection.length === 0) { break; @@ -562,12 +628,18 @@ export class RepeatableQuestGenerator { let minDurability = 0; let onlyFoundInRaid = true; - if (this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.WEAPON) || this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.ARMOR)) + if ( + this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.WEAPON) + || this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.ARMOR) + ) { minDurability = 80; } - if (this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.DOG_TAG_USEC) || this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.DOG_TAG_BEAR)) + if ( + this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.DOG_TAG_USEC) + || this.itemHelper.isOfBaseclass(targetItemId, BaseClasses.DOG_TAG_BEAR) + ) { onlyFoundInRaid = false; } @@ -584,10 +656,10 @@ export class RepeatableQuestGenerator minDurability: minDurability, maxDurability: 100, dogtagLevel: 0, - onlyFoundInRaid: onlyFoundInRaid + onlyFoundInRaid: onlyFoundInRaid, }, _parent: "HandoverItem", - dynamicLocale: true + dynamicLocale: true, }; } @@ -604,7 +676,7 @@ export class RepeatableQuestGenerator pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, - repeatableConfig: IRepeatableQuestConfig + repeatableConfig: IRepeatableQuestConfig, ): IExploration { const explorationConfig = repeatableConfig.questConfig.Exploration; @@ -612,7 +684,7 @@ export class RepeatableQuestGenerator if (Object.keys(questTypePool.pool.Exploration.locations).length === 0) { // there are no more locations left for exploration; delete it as a possible quest type - questTypePool.types = questTypePool.types.filter(t => t !== "Exploration"); + questTypePool.types = questTypePool.types.filter((t) => t !== "Exploration"); return null; } @@ -626,32 +698,19 @@ export class RepeatableQuestGenerator const numExtracts = this.randomUtil.randInt(1, explorationConfig.maxExtracts + 1); - const quest = this.generateRepeatableTemplate("Exploration", traderId,repeatableConfig.side) as IExploration; + const quest = this.generateRepeatableTemplate("Exploration", traderId, repeatableConfig.side) as IExploration; const exitStatusCondition: IExplorationCondition = { _parent: "ExitStatus", - _props: { - id: this.objectId.generate(), - dynamicLocale: true, - status: [ - "Survived" - ] - } + _props: { id: this.objectId.generate(), dynamicLocale: true, status: ["Survived"] }, }; const locationCondition: IExplorationCondition = { _parent: "Location", - _props: { - id: this.objectId.generate(), - dynamicLocale: true, - target: locationTarget - } + _props: { id: this.objectId.generate(), dynamicLocale: true, target: locationTarget }, }; quest.conditions.AvailableForFinish[0]._props.counter.id = this.objectId.generate(); - quest.conditions.AvailableForFinish[0]._props.counter.conditions = [ - exitStatusCondition, - locationCondition - ]; + quest.conditions.AvailableForFinish[0]._props.counter.conditions = [exitStatusCondition, locationCondition]; quest.conditions.AvailableForFinish[0]._props.value = numExtracts; quest.conditions.AvailableForFinish[0]._props.id = this.objectId.generate(); quest.location = this.getQuestLocationByMapId(locationKey); @@ -660,11 +719,13 @@ export class RepeatableQuestGenerator { // Filter by whitelist, it's also possible that the field "PassageRequirement" does not exist (e.g. Shoreline) // Scav exits are not listed at all in locations.base currently. If that changes at some point, additional filtering will be required - const mapExits = (this.databaseServer.getTables().locations[locationKey.toLowerCase()].base as ILocationBase).exits; - const possibleExists = mapExits.filter( - x => (!("PassageRequirement" in x) - || repeatableConfig.questConfig.Exploration.specificExits.passageRequirementWhitelist.includes(x.PassageRequirement)) - && x.Chance > 0 + const mapExits = + (this.databaseServer.getTables().locations[locationKey.toLowerCase()].base as ILocationBase).exits; + const possibleExists = mapExits.filter((x) => + (!("PassageRequirement" in x) + || repeatableConfig.questConfig.Exploration.specificExits.passageRequirementWhitelist.includes( + x.PassageRequirement, + )) && x.Chance > 0 ); const exit = this.randomUtil.drawRandomFromList(possibleExists, 1)[0]; const exitCondition = this.generateExplorationExitCondition(exit); @@ -683,7 +744,7 @@ export class RepeatableQuestGenerator pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, - repeatableConfig: IRepeatableQuestConfig + repeatableConfig: IRepeatableQuestConfig, ): IPickup { const pickupConfig = repeatableConfig.questConfig.Pickup; @@ -691,21 +752,28 @@ export class RepeatableQuestGenerator const quest = this.generateRepeatableTemplate("Pickup", traderId, repeatableConfig.side) as IPickup; const itemTypeToFetchWithCount = this.randomUtil.getArrayValue(pickupConfig.ItemTypeToFetchWithMaxCount); - const itemCountToFetch = this.randomUtil.randInt(itemTypeToFetchWithCount.minPickupCount, itemTypeToFetchWithCount.maxPickupCount + 1); + const itemCountToFetch = this.randomUtil.randInt( + itemTypeToFetchWithCount.minPickupCount, + itemTypeToFetchWithCount.maxPickupCount + 1, + ); // Choose location - doesnt seem to work for anything other than 'any' - //const locationKey: string = this.randomUtil.drawRandomFromDict(questTypePool.pool.Pickup.locations)[0]; - //const locationTarget = questTypePool.pool.Pickup.locations[locationKey]; + // const locationKey: string = this.randomUtil.drawRandomFromDict(questTypePool.pool.Pickup.locations)[0]; + // const locationTarget = questTypePool.pool.Pickup.locations[locationKey]; - const findCondition = quest.conditions.AvailableForFinish.find(x => x._parent === "FindItem"); + const findCondition = quest.conditions.AvailableForFinish.find((x) => x._parent === "FindItem"); findCondition._props.target = [itemTypeToFetchWithCount.itemType]; findCondition._props.value = itemCountToFetch; - const counterCreatorCondition = quest.conditions.AvailableForFinish.find(x => x._parent === "CounterCreator"); - //const locationCondition = counterCreatorCondition._props.counter.conditions.find(x => x._parent === "Location"); - //(locationCondition._props as ILocationConditionProps).target = [...locationTarget]; + const counterCreatorCondition = quest.conditions.AvailableForFinish.find((x) => x._parent === "CounterCreator"); + // const locationCondition = counterCreatorCondition._props.counter.conditions.find(x => x._parent === "Location"); + // (locationCondition._props as ILocationConditionProps).target = [...locationTarget]; - const equipmentCondition = counterCreatorCondition._props.counter.conditions.find(x => x._parent === "Equipment"); - (equipmentCondition._props as IEquipmentConditionProps).equipmentInclusive = [[itemTypeToFetchWithCount.itemType]]; + const equipmentCondition = counterCreatorCondition._props.counter.conditions.find((x) => + x._parent === "Equipment" + ); + (equipmentCondition._props as IEquipmentConditionProps).equipmentInclusive = [[ + itemTypeToFetchWithCount.itemType, + ]]; // Add rewards quest.rewards = this.generateReward(pmcLevel, 1, traderId, repeatableConfig, pickupConfig); @@ -734,11 +802,7 @@ export class RepeatableQuestGenerator { return { _parent: "ExitName", - _props: { - exitName: exit.Name, - id: this.objectId.generate(), - dynamicLocale: true - } + _props: { exitName: exit.Name, id: this.objectId.generate(), dynamicLocale: true }, }; } @@ -767,7 +831,7 @@ export class RepeatableQuestGenerator difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig, - questConfig: IBaseQuestConfig + questConfig: IBaseQuestConfig, ): IRewards { // difficulty could go from 0.2 ... -> for lowest diffuculty receive 0.2*nominal reward @@ -787,11 +851,23 @@ export class RepeatableQuestGenerator } // rewards are generated based on pmcLevel, difficulty and a random spread - const rewardXP = Math.floor(difficulty * this.mathUtil.interp1(pmcLevel, levelsConfig, xpConfig) * this.randomUtil.getFloat(1 - rewardSpreadConfig, 1 + rewardSpreadConfig)); - const rewardRoubles = Math.floor(difficulty * this.mathUtil.interp1(pmcLevel, levelsConfig, roublesConfig) * this.randomUtil.getFloat(1 - rewardSpreadConfig, 1 + rewardSpreadConfig)); - const rewardNumItems = this.randomUtil.randInt(1, Math.round(this.mathUtil.interp1(pmcLevel, levelsConfig, itemsConfig)) + 1); - const rewardReputation = Math.round(100 * difficulty * this.mathUtil.interp1(pmcLevel, levelsConfig, reputationConfig) - * this.randomUtil.getFloat(1 - rewardSpreadConfig, 1 + rewardSpreadConfig)) / 100; + const rewardXP = Math.floor( + difficulty * this.mathUtil.interp1(pmcLevel, levelsConfig, xpConfig) + * this.randomUtil.getFloat(1 - rewardSpreadConfig, 1 + rewardSpreadConfig), + ); + const rewardRoubles = Math.floor( + difficulty * this.mathUtil.interp1(pmcLevel, levelsConfig, roublesConfig) + * this.randomUtil.getFloat(1 - rewardSpreadConfig, 1 + rewardSpreadConfig), + ); + const rewardNumItems = this.randomUtil.randInt( + 1, + Math.round(this.mathUtil.interp1(pmcLevel, levelsConfig, itemsConfig)) + 1, + ); + const rewardReputation = + Math.round( + 100 * difficulty * this.mathUtil.interp1(pmcLevel, levelsConfig, reputationConfig) + * this.randomUtil.getFloat(1 - rewardSpreadConfig, 1 + rewardSpreadConfig), + ) / 100; const skillRewardChance = this.mathUtil.interp1(pmcLevel, levelsConfig, skillRewardChanceConfig); const skillPointReward = this.mathUtil.interp1(pmcLevel, levelsConfig, skillPointRewardConfig); @@ -802,21 +878,17 @@ export class RepeatableQuestGenerator // Add xp reward const rewards: IRewards = { Started: [], - Success: [ - { - value: rewardXP, - type: "Experience", - index: 0 - } - ], - Fail: [] + Success: [{ value: rewardXP, type: "Experience", index: 0 }], + Fail: [], }; // Add money reward if (traderId === Traders.PEACEKEEPER) { // convert to equivalent dollars - rewards.Success.push(this.generateRewardItem(Money.EUROS, this.handbookHelper.fromRUB(rewardRoubles, Money.EUROS), 1)); + rewards.Success.push( + this.generateRewardItem(Money.EUROS, this.handbookHelper.fromRUB(rewardRoubles, Money.EUROS), 1), + ); } else { @@ -841,14 +913,19 @@ export class RepeatableQuestGenerator } // Randomise the cartridge count returned - itemCount = this.randomUtil.randInt(repeatableConfig.rewardAmmoStackMinSize, itemSelected._props.StackMaxSize); + itemCount = this.randomUtil.randInt( + repeatableConfig.rewardAmmoStackMinSize, + itemSelected._props.StackMaxSize, + ); } else if (this.itemHelper.isOfBaseclass(itemSelected._id, BaseClasses.WEAPON)) { if (weaponRewardCount >= 1) { // Limit weapon rewards to 1 per daily - rewardItemPool = rewardItemPool.filter(x => !this.itemHelper.isOfBaseclass(x._id, BaseClasses.WEAPON)); + rewardItemPool = rewardItemPool.filter((x) => + !this.itemHelper.isOfBaseclass(x._id, BaseClasses.WEAPON) + ); continue; } let defaultPreset = this.presetHelper.getDefaultPreset(itemSelected._id); @@ -860,7 +937,7 @@ export class RepeatableQuestGenerator } children = this.ragfairServerHelper.reparentPresets(defaultPreset._items[0], defaultPreset._items); - weaponRewardCount ++; + weaponRewardCount++; } // 25% chance to double reward stack (item should be stackable and not weapon) @@ -880,7 +957,9 @@ export class RepeatableQuestGenerator if (roublesBudget > 0) { // Filter possible reward items to only items with a price below the remaining budget - rewardItemPool = rewardItemPool.filter(x => this.itemHelper.getStaticItemPrice(x._id) < roublesBudget); + rewardItemPool = rewardItemPool.filter((x) => + this.itemHelper.getStaticItemPrice(x._id) < roublesBudget + ); if (rewardItemPool.length === 0) { break; // No reward items left, exit @@ -896,12 +975,7 @@ export class RepeatableQuestGenerator // Add rep reward to rewards array if (rewardReputation > 0) { - const reward: IReward = { - target: traderId, - value: rewardReputation, - type: "TraderStanding", - index: index - }; + const reward: IReward = { target: traderId, value: rewardReputation, type: "TraderStanding", index: index }; rewards.Success.push(reward); } @@ -912,7 +986,7 @@ export class RepeatableQuestGenerator target: this.randomUtil.getArrayValue(questConfig.possibleSkillRewards), value: skillPointReward, type: "Skill", - index: index + index: index, }; rewards.Success.push(reward); } @@ -938,18 +1012,31 @@ export class RepeatableQuestGenerator * @param roublesBudget Total value of items to return * @returns Array of reward items that fit budget */ - protected chooseRewardItemsWithinBudget(repeatableConfig: IRepeatableQuestConfig, roublesBudget: number, traderId: string): ITemplateItem[] + protected chooseRewardItemsWithinBudget( + repeatableConfig: IRepeatableQuestConfig, + roublesBudget: number, + traderId: string, + ): ITemplateItem[] { // First filter for type and baseclass to avoid lookup in handbook for non-available items const rewardableItemPool = this.getRewardableItems(repeatableConfig, traderId); const minPrice = Math.min(25000, 0.5 * roublesBudget); - let rewardableItemPoolWithinBudget = rewardableItemPool.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget && this.itemHelper.getItemPrice(x[0]) > minPrice).map(x => x[1]); + let rewardableItemPoolWithinBudget = rewardableItemPool.filter((x) => + this.itemHelper.getItemPrice(x[0]) < roublesBudget && this.itemHelper.getItemPrice(x[0]) > minPrice + ).map((x) => x[1]); if (rewardableItemPoolWithinBudget.length === 0) { - this.logger.warning(this.localisationService.getText("repeatable-no_reward_item_found_in_price_range", {minPrice: minPrice, roublesBudget: roublesBudget})); + this.logger.warning( + this.localisationService.getText("repeatable-no_reward_item_found_in_price_range", { + minPrice: minPrice, + roublesBudget: roublesBudget, + }), + ); // In case we don't find any items in the price range - rewardableItemPoolWithinBudget = rewardableItemPool.filter(x => this.itemHelper.getItemPrice(x[0]) < roublesBudget).map(x => x[1]); + rewardableItemPoolWithinBudget = rewardableItemPool.filter((x) => + this.itemHelper.getItemPrice(x[0]) < roublesBudget + ).map((x) => x[1]); } return rewardableItemPoolWithinBudget; @@ -966,21 +1053,9 @@ export class RepeatableQuestGenerator protected generateRewardItem(tpl: string, value: number, index: number, preset = null): IReward { const id = this.objectId.generate(); - const rewardItem: IReward = { - target: id, - value: value, - type: "Item", - index: index - }; + const rewardItem: IReward = { target: id, value: value, type: "Item", index: index }; - const rootItem = { - _id: id, - _tpl: tpl, - upd: { - StackObjectsCount: value, - SpawnedInSession: true - } - }; + const rootItem = { _id: id, _tpl: tpl, upd: { StackObjectsCount: value, SpawnedInSession: true } }; if (preset) { @@ -994,11 +1069,14 @@ export class RepeatableQuestGenerator } /** - * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) + * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) * @param repeatableQuestConfig Config file * @returns List of rewardable items [[_tpl, itemTemplate],...] */ - protected getRewardableItems(repeatableQuestConfig: IRepeatableQuestConfig, traderId: string): [string, ITemplateItem][] + protected getRewardableItems( + repeatableQuestConfig: IRepeatableQuestConfig, + traderId: string, + ): [string, ITemplateItem][] { // check for specific baseclasses which don't make sense as reward item // also check if the price is greater than 0; there are some items whose price can not be found @@ -1013,9 +1091,9 @@ export class RepeatableQuestGenerator return false; } - const traderWhitelist = repeatableQuestConfig.traderWhitelist.find(x => x.traderId === traderId); + const traderWhitelist = repeatableQuestConfig.traderWhitelist.find((x) => x.traderId === traderId); return this.isValidRewardItem(tpl, repeatableQuestConfig, traderWhitelist?.rewardBaseWhitelist); - } + }, ); } @@ -1025,7 +1103,11 @@ export class RepeatableQuestGenerator * @param {string} tpl template id of item to check * @returns True if item is valid reward */ - protected isValidRewardItem(tpl: string, repeatableQuestConfig: IRepeatableQuestConfig, itemBaseWhitelist: string[]): boolean + protected isValidRewardItem( + tpl: string, + repeatableQuestConfig: IRepeatableQuestConfig, + itemBaseWhitelist: string[], + ): boolean { if (!this.itemHelper.isValidItem(tpl)) { @@ -1039,8 +1121,7 @@ export class RepeatableQuestGenerator } // Item is on repeatable or global blacklist - if (repeatableQuestConfig.rewardBlacklist.includes(tpl) - || this.itemFilterService.isItemBlacklisted(tpl)) + if (repeatableQuestConfig.rewardBlacklist.includes(tpl) || this.itemFilterService.isItemBlacklisted(tpl)) { return false; } @@ -1075,36 +1156,59 @@ export class RepeatableQuestGenerator * * @param {string} type Quest type: "Elimination", "Completion" or "Extraction" * @param {string} traderId Trader from which the quest will be provided - * @param {string} side Scav daily or pmc daily/weekly quest + * @param {string} side Scav daily or pmc daily/weekly quest * @returns {object} Object which contains the base elements for repeatable quests of the requests type * (needs to be filled with reward and conditions by called to make a valid quest) */ // @Incomplete: define Type for "type". protected generateRepeatableTemplate(type: string, traderId: string, side: string): IRepeatableQuest { - const quest = this.jsonUtil.clone(this.databaseServer.getTables().templates.repeatableQuests.templates[type]); + const quest = this.jsonUtil.clone( + this.databaseServer.getTables().templates.repeatableQuests.templates[type], + ); quest._id = this.objectId.generate(); quest.traderId = traderId; /* in locale, these id correspond to the text of quests template ids -pmc : Elimination = 616052ea3054fc0e2c24ce6e / Completion = 61604635c725987e815b1a46 / Exploration = 616041eb031af660100c9967 - template ids -scav : Elimination = 62825ef60e88d037dc1eb428 / Completion = 628f588ebb558574b2260fe5 / Exploration = 62825ef60e88d037dc1eb42c + template ids -scav : Elimination = 62825ef60e88d037dc1eb428 / Completion = 628f588ebb558574b2260fe5 / Exploration = 62825ef60e88d037dc1eb42c */ // Get template id from config based on side and type of quest quest.templateId = this.questConfig.questTemplateIds[side.toLowerCase()][type.toLowerCase()]; - quest.name = quest.name.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.note = quest.note.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.description = quest.description.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.successMessageText = quest.successMessageText.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.failMessageText = quest.failMessageText.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.startedMessageText = quest.startedMessageText.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.changeQuestMessageText = quest.changeQuestMessageText.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.acceptPlayerMessage = quest.acceptPlayerMessage.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.declinePlayerMessage = quest.declinePlayerMessage.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); - quest.completePlayerMessage = quest.completePlayerMessage.replace("{traderId}", traderId).replace("{templateId}",quest.templateId); + quest.name = quest.name.replace("{traderId}", traderId).replace("{templateId}", quest.templateId); + quest.note = quest.note.replace("{traderId}", traderId).replace("{templateId}", quest.templateId); + quest.description = quest.description.replace("{traderId}", traderId).replace("{templateId}", quest.templateId); + quest.successMessageText = quest.successMessageText.replace("{traderId}", traderId).replace( + "{templateId}", + quest.templateId, + ); + quest.failMessageText = quest.failMessageText.replace("{traderId}", traderId).replace( + "{templateId}", + quest.templateId, + ); + quest.startedMessageText = quest.startedMessageText.replace("{traderId}", traderId).replace( + "{templateId}", + quest.templateId, + ); + quest.changeQuestMessageText = quest.changeQuestMessageText.replace("{traderId}", traderId).replace( + "{templateId}", + quest.templateId, + ); + quest.acceptPlayerMessage = quest.acceptPlayerMessage.replace("{traderId}", traderId).replace( + "{templateId}", + quest.templateId, + ); + quest.declinePlayerMessage = quest.declinePlayerMessage.replace("{traderId}", traderId).replace( + "{templateId}", + quest.templateId, + ); + quest.completePlayerMessage = quest.completePlayerMessage.replace("{traderId}", traderId).replace( + "{templateId}", + quest.templateId, + ); return quest; } -} \ No newline at end of file +} diff --git a/project/src/generators/ScavCaseRewardGenerator.ts b/project/src/generators/ScavCaseRewardGenerator.ts index bf39a911..6ceddaa7 100644 --- a/project/src/generators/ScavCaseRewardGenerator.ts +++ b/project/src/generators/ScavCaseRewardGenerator.ts @@ -10,7 +10,8 @@ import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; import { Money } from "@spt-aki/models/enums/Money"; import { IScavCaseConfig } from "@spt-aki/models/spt/config/IScavCaseConfig"; import { - RewardCountAndPriceDetails, ScavCaseRewardCountsAndPrices + RewardCountAndPriceDetails, + ScavCaseRewardCountsAndPrices, } from "@spt-aki/models/spt/hideout/ScavCaseRewardCountsAndPrices"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { ConfigServer } from "@spt-aki/servers/ConfigServer"; @@ -20,7 +21,7 @@ import { RagfairPriceService } from "@spt-aki/services/RagfairPriceService"; import { HashUtil } from "@spt-aki/utils/HashUtil"; import { RandomUtil } from "@spt-aki/utils/RandomUtil"; -/** +/** * Handle the creation of randomised scav case rewards */ @injectable() @@ -38,12 +39,12 @@ export class ScavCaseRewardGenerator @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("RagfairPriceService") protected ragfairPriceService: RagfairPriceService, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.scavCaseConfig = this.configServer.getConfig(ConfigTypes.SCAVCASE); } - + /** * Create an array of rewards that will be given to the player upon completing their scav case build * @param recipeId recipe of the scav case craft @@ -54,7 +55,7 @@ export class ScavCaseRewardGenerator this.cacheDbItems(); // Get scavcase details from hideout/scavcase.json - const scavCaseDetails = this.databaseServer.getTables().hideout.scavcase.find(r => r._id === recipeId); + const scavCaseDetails = this.databaseServer.getTables().hideout.scavcase.find((r) => r._id === recipeId); const rewardItemCounts = this.getScavCaseRewardCountsAndPrices(scavCaseDetails); // Get items that fit the price criteria as set by the scavCase config @@ -63,9 +64,17 @@ export class ScavCaseRewardGenerator const superRarePricedItems = this.getFilteredItemsByPrice(this.dbItemsCache, rewardItemCounts.Superrare); // Get randomly picked items from each item collction, the count range of which is defined in hideout/scavcase.json - const randomlyPickedCommonRewards = this.pickRandomRewards(commonPricedItems, rewardItemCounts.Common, "common"); + const randomlyPickedCommonRewards = this.pickRandomRewards( + commonPricedItems, + rewardItemCounts.Common, + "common", + ); const randomlyPickedRareRewards = this.pickRandomRewards(rarePricedItems, rewardItemCounts.Rare, "rare"); - const randomlyPickedSuperRareRewards = this.pickRandomRewards(superRarePricedItems, rewardItemCounts.Superrare, "superrare"); + const randomlyPickedSuperRareRewards = this.pickRandomRewards( + superRarePricedItems, + rewardItemCounts.Superrare, + "superrare", + ); // Add randomised stack sizes to ammo and money rewards const commonRewards = this.randomiseContainerItemRewards(randomlyPickedCommonRewards, "common"); @@ -95,11 +104,13 @@ export class ScavCaseRewardGenerator { return false; } - + // Skip item if item id is on blacklist - if ((item._type !== "Item") + if ( + (item._type !== "Item") || this.scavCaseConfig.rewardItemBlacklist.includes(item._id) - || this.itemFilterService.isItemBlacklisted(item._id)) + || this.itemFilterService.isItemBlacklisted(item._id) + ) { return false; } @@ -108,13 +119,13 @@ export class ScavCaseRewardGenerator { return false; } - + // Skip item if parent id is blacklisted if (this.itemHelper.isOfBaseclasses(item._id, this.scavCaseConfig.rewardItemParentBlacklist)) { return false; } - + return true; }); } @@ -139,13 +150,13 @@ export class ScavCaseRewardGenerator { return false; } - + // Skip ammo that doesn't stack as high as value in config if (item._props.StackMaxSize < this.scavCaseConfig.ammoRewards.minStackSize) { return false; } - + return true; }); } @@ -155,27 +166,31 @@ export class ScavCaseRewardGenerator * Pick a number of items to be rewards, the count is defined by the values in `itemFilters` param * @param items item pool to pick rewards from * @param itemFilters how the rewards should be filtered down (by item count) - * @returns + * @returns */ - protected pickRandomRewards(items: ITemplateItem[], itemFilters: RewardCountAndPriceDetails, rarity: string): ITemplateItem[] + protected pickRandomRewards( + items: ITemplateItem[], + itemFilters: RewardCountAndPriceDetails, + rarity: string, + ): ITemplateItem[] { const result: ITemplateItem[] = []; - + let rewardWasMoney = false; let rewardWasAmmo = false; const randomCount = this.randomUtil.getInt(itemFilters.minCount, itemFilters.maxCount); for (let i = 0; i < randomCount; i++) { - if (this.rewardShouldBeMoney() && !rewardWasMoney) // Only allow one reward to be money - { + if (this.rewardShouldBeMoney() && !rewardWasMoney) + { // Only allow one reward to be money result.push(this.getRandomMoney()); if (!this.scavCaseConfig.allowMultipleMoneyRewardsPerRarity) { rewardWasMoney = true; } } - else if (this.rewardShouldBeAmmo() && !rewardWasAmmo) // Only allow one reward to be ammo - { + else if (this.rewardShouldBeAmmo() && !rewardWasAmmo) + { // Only allow one reward to be ammo result.push(this.getRandomAmmo(rarity)); if (!this.scavCaseConfig.allowMultipleAmmoRewardsPerRarity) { @@ -214,10 +229,9 @@ export class ScavCaseRewardGenerator */ protected getRandomMoney(): ITemplateItem { - const money: ITemplateItem[] = []; - money.push(this.databaseServer.getTables().templates.items["5449016a4bdc2d6f028b456f"]); //rub - money.push(this.databaseServer.getTables().templates.items["569668774bdc2da2298b4568"]); //euro + money.push(this.databaseServer.getTables().templates.items["5449016a4bdc2d6f028b456f"]); // rub + money.push(this.databaseServer.getTables().templates.items["569668774bdc2da2298b4568"]); // euro money.push(this.databaseServer.getTables().templates.items["5696686a4bdc2da3298b456a"]); // dollar return this.randomUtil.getArrayValue(money); @@ -234,8 +248,10 @@ export class ScavCaseRewardGenerator { // Is ammo handbook price between desired range const handbookPrice = this.ragfairPriceService.getStaticPriceForItem(ammo._id); - if (handbookPrice >= this.scavCaseConfig.ammoRewards.ammoRewardValueRangeRub[rarity].min - && handbookPrice <= this.scavCaseConfig.ammoRewards.ammoRewardValueRangeRub[rarity].max) + if ( + handbookPrice >= this.scavCaseConfig.ammoRewards.ammoRewardValueRangeRub[rarity].min + && handbookPrice <= this.scavCaseConfig.ammoRewards.ammoRewardValueRangeRub[rarity].max + ) { return true; } @@ -263,11 +279,7 @@ export class ScavCaseRewardGenerator const result: Product[] = []; for (const item of rewardItems) { - const resultItem = { - _id: this.hashUtil.generate(), - _tpl: item._id, - upd: undefined - }; + const resultItem = { _id: this.hashUtil.generate(), _tpl: item._id, upd: undefined }; this.addStackCountToAmmoAndMoney(item, resultItem, rarity); @@ -288,29 +300,32 @@ export class ScavCaseRewardGenerator * @param item money or ammo item * @param resultItem money or ammo item with a randomise stack size */ - protected addStackCountToAmmoAndMoney(item: ITemplateItem, resultItem: { _id: string; _tpl: string; upd: Upd; }, rarity: string): void + protected addStackCountToAmmoAndMoney( + item: ITemplateItem, + resultItem: { _id: string; _tpl: string; upd: Upd; }, + rarity: string, + ): void { if (item._parent === BaseClasses.AMMO || item._parent === BaseClasses.MONEY) { - resultItem.upd = { - StackObjectsCount: this.getRandomAmountRewardForScavCase(item, rarity) - }; + resultItem.upd = { StackObjectsCount: this.getRandomAmountRewardForScavCase(item, rarity) }; } } - + /** - * * @param dbItems all items from the items.json * @param itemFilters controls how the dbItems will be filtered and returned (handbook price) * @returns filtered dbItems array */ - protected getFilteredItemsByPrice(dbItems: ITemplateItem[], itemFilters: RewardCountAndPriceDetails): ITemplateItem[] + protected getFilteredItemsByPrice( + dbItems: ITemplateItem[], + itemFilters: RewardCountAndPriceDetails, + ): ITemplateItem[] { return dbItems.filter((item) => { const handbookPrice = this.ragfairPriceService.getStaticPriceForItem(item._id); - if (handbookPrice >= itemFilters.minPriceRub - && handbookPrice <= itemFilters.maxPriceRub) + if (handbookPrice >= itemFilters.minPriceRub && handbookPrice <= itemFilters.maxPriceRub) { return true; } @@ -330,12 +345,11 @@ export class ScavCaseRewardGenerator // Create reward min/max counts for each type for (const rewardType of rewardTypes) { - result[rewardType] = - { + result[rewardType] = { minCount: scavCaseDetails.EndProducts[rewardType].min, maxCount: scavCaseDetails.EndProducts[rewardType].max, minPriceRub: this.scavCaseConfig.rewardItemValueRangeRub[rewardType.toLowerCase()].min, - maxPriceRub: this.scavCaseConfig.rewardItemValueRangeRub[rewardType.toLowerCase()].max + maxPriceRub: this.scavCaseConfig.rewardItemValueRangeRub[rewardType.toLowerCase()].max, }; } @@ -353,23 +367,35 @@ export class ScavCaseRewardGenerator let amountToGive = 1; if (itemToCalculate._parent === BaseClasses.AMMO) { - amountToGive = this.randomUtil.getInt(this.scavCaseConfig.ammoRewards.minStackSize, itemToCalculate._props.StackMaxSize); + amountToGive = this.randomUtil.getInt( + this.scavCaseConfig.ammoRewards.minStackSize, + itemToCalculate._props.StackMaxSize, + ); } else if (itemToCalculate._parent === BaseClasses.MONEY) { switch (itemToCalculate._id) { case Money.ROUBLES: - amountToGive = this.randomUtil.getInt(this.scavCaseConfig.moneyRewards.rubCount[rarity].min, this.scavCaseConfig.moneyRewards.rubCount[rarity].max); + amountToGive = this.randomUtil.getInt( + this.scavCaseConfig.moneyRewards.rubCount[rarity].min, + this.scavCaseConfig.moneyRewards.rubCount[rarity].max, + ); break; case Money.EUROS: - amountToGive = this.randomUtil.getInt(this.scavCaseConfig.moneyRewards.eurCount[rarity].min, this.scavCaseConfig.moneyRewards.eurCount[rarity].max); + amountToGive = this.randomUtil.getInt( + this.scavCaseConfig.moneyRewards.eurCount[rarity].min, + this.scavCaseConfig.moneyRewards.eurCount[rarity].max, + ); break; case Money.DOLLARS: - amountToGive = this.randomUtil.getInt(this.scavCaseConfig.moneyRewards.usdCount[rarity].min, this.scavCaseConfig.moneyRewards.usdCount[rarity].max); + amountToGive = this.randomUtil.getInt( + this.scavCaseConfig.moneyRewards.usdCount[rarity].min, + this.scavCaseConfig.moneyRewards.usdCount[rarity].max, + ); break; } } return amountToGive; } -} \ No newline at end of file +} diff --git a/project/src/generators/WeatherGenerator.ts b/project/src/generators/WeatherGenerator.ts index 52c8f49b..7f2efb42 100644 --- a/project/src/generators/WeatherGenerator.ts +++ b/project/src/generators/WeatherGenerator.ts @@ -23,7 +23,7 @@ export class WeatherGenerator @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("TimeUtil") protected timeUtil: TimeUtil, @inject("ApplicationContext") protected applicationContext: ApplicationContext, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.weatherConfig = this.configServer.getConfig(ConfigTypes.WEATHER); @@ -62,16 +62,17 @@ export class WeatherGenerator /** * Get the current in-raid time * @param currentDate (new Date()) - * @returns Date object of current in-raid time + * @returns Date object of current in-raid time */ public getInRaidTime(currentDate: Date): Date { // Get timestamp of when client conneted to server - const gameStartTimeStampMS = this.applicationContext.getLatestValue(ContextVariableType.CLIENT_START_TIMESTAMP).getValue(); + const gameStartTimeStampMS = this.applicationContext.getLatestValue(ContextVariableType.CLIENT_START_TIMESTAMP) + .getValue(); // Get delta between now and when client connected to server in milliseconds - const deltaMSFromNow = (Date.now() - gameStartTimeStampMS); - const acceleratedMS = (deltaMSFromNow * (this.weatherConfig.acceleration - 1)); // For some reason nodejs moves faster than client time, reducing acceleration by 1 when client is 7 helps + const deltaMSFromNow = Date.now() - gameStartTimeStampMS; + const acceleratedMS = deltaMSFromNow * (this.weatherConfig.acceleration - 1); // For some reason nodejs moves faster than client time, reducing acceleration by 1 when client is 7 helps const clientAcceleratedDate = new Date(currentDate.valueOf() + acceleratedMS); return clientAcceleratedDate; @@ -105,15 +106,13 @@ export class WeatherGenerator wind_gustiness: this.getRandomFloat("windGustiness"), rain: rain, // eslint-disable-next-line @typescript-eslint/naming-convention - rain_intensity: (rain > 1) - ? this.getRandomFloat("rainIntensity") - : 0, + rain_intensity: (rain > 1) ? this.getRandomFloat("rainIntensity") : 0, fog: this.getWeightedFog(), temp: this.getRandomFloat("temp"), pressure: this.getRandomFloat("pressure"), time: "", date: "", - timestamp: 0 + timestamp: 0, }; this.setCurrentDateTime(result); @@ -139,32 +138,49 @@ export class WeatherGenerator protected getWeightedWindDirection(): WindDirection { - return this.weightedRandomHelper.weightedRandom(this.weatherConfig.weather.windDirection.values, this.weatherConfig.weather.windDirection.weights).item; + return this.weightedRandomHelper.weightedRandom( + this.weatherConfig.weather.windDirection.values, + this.weatherConfig.weather.windDirection.weights, + ).item; } protected getWeightedClouds(): number { - return this.weightedRandomHelper.weightedRandom(this.weatherConfig.weather.clouds.values, this.weatherConfig.weather.clouds.weights).item; + return this.weightedRandomHelper.weightedRandom( + this.weatherConfig.weather.clouds.values, + this.weatherConfig.weather.clouds.weights, + ).item; } protected getWeightedWindSpeed(): number { - return this.weightedRandomHelper.weightedRandom(this.weatherConfig.weather.windSpeed.values, this.weatherConfig.weather.windSpeed.weights).item; + return this.weightedRandomHelper.weightedRandom( + this.weatherConfig.weather.windSpeed.values, + this.weatherConfig.weather.windSpeed.weights, + ).item; } protected getWeightedFog(): number { - return this.weightedRandomHelper.weightedRandom(this.weatherConfig.weather.fog.values, this.weatherConfig.weather.fog.weights).item; + return this.weightedRandomHelper.weightedRandom( + this.weatherConfig.weather.fog.values, + this.weatherConfig.weather.fog.weights, + ).item; } protected getWeightedRain(): number { - return this.weightedRandomHelper.weightedRandom(this.weatherConfig.weather.rain.values, this.weatherConfig.weather.rain.weights).item; + return this.weightedRandomHelper.weightedRandom( + this.weatherConfig.weather.rain.values, + this.weatherConfig.weather.rain.weights, + ).item; } protected getRandomFloat(node: string): number { - return parseFloat(this.randomUtil.getFloat(this.weatherConfig.weather[node].min, - this.weatherConfig.weather[node].max).toPrecision(3)); + return parseFloat( + this.randomUtil.getFloat(this.weatherConfig.weather[node].min, this.weatherConfig.weather[node].max) + .toPrecision(3), + ); } -} \ No newline at end of file +} diff --git a/project/src/generators/weapongen/IInventoryMagGen.ts b/project/src/generators/weapongen/IInventoryMagGen.ts index ac710ae1..86a1becb 100644 --- a/project/src/generators/weapongen/IInventoryMagGen.ts +++ b/project/src/generators/weapongen/IInventoryMagGen.ts @@ -5,4 +5,4 @@ export interface IInventoryMagGen getPriority(): number; canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean; process(inventoryMagGen: InventoryMagGen): void; -} \ No newline at end of file +} diff --git a/project/src/generators/weapongen/InventoryMagGen.ts b/project/src/generators/weapongen/InventoryMagGen.ts index 5584b747..c3ac5898 100644 --- a/project/src/generators/weapongen/InventoryMagGen.ts +++ b/project/src/generators/weapongen/InventoryMagGen.ts @@ -2,40 +2,40 @@ import { Inventory } from "@spt-aki/models/eft/common/tables/IBotBase"; import { GenerationData } from "@spt-aki/models/eft/common/tables/IBotType"; import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem"; -export class InventoryMagGen +export class InventoryMagGen { constructor( private magCounts: GenerationData, private magazineTemplate: ITemplateItem, private weaponTemplate: ITemplateItem, private ammoTemplate: ITemplateItem, - private pmcInventory: Inventory - ) + private pmcInventory: Inventory, + ) { } - public getMagCount(): GenerationData + public getMagCount(): GenerationData { return this.magCounts; } - public getMagazineTemplate(): ITemplateItem + public getMagazineTemplate(): ITemplateItem { return this.magazineTemplate; } - public getWeaponTemplate(): ITemplateItem + public getWeaponTemplate(): ITemplateItem { return this.weaponTemplate; } - public getAmmoTemplate(): ITemplateItem + public getAmmoTemplate(): ITemplateItem { return this.ammoTemplate; } - public getPmcInventory(): Inventory + public getPmcInventory(): Inventory { return this.pmcInventory; } -} \ No newline at end of file +} diff --git a/project/src/generators/weapongen/implementations/BarrelInventoryMagGen.ts b/project/src/generators/weapongen/implementations/BarrelInventoryMagGen.ts index 83fb5fd5..d289081b 100644 --- a/project/src/generators/weapongen/implementations/BarrelInventoryMagGen.ts +++ b/project/src/generators/weapongen/implementations/BarrelInventoryMagGen.ts @@ -8,36 +8,42 @@ import { RandomUtil } from "@spt-aki/utils/RandomUtil"; @injectable() export class BarrelInventoryMagGen implements IInventoryMagGen { - constructor( @inject("RandomUtil") protected randomUtil: RandomUtil, - @inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper + @inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper, ) - { } + {} - getPriority(): number + getPriority(): number { return 50; } - canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean + canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean { return inventoryMagGen.getWeaponTemplate()._props.ReloadMode === "OnlyBarrel"; } - - process(inventoryMagGen: InventoryMagGen): void + + process(inventoryMagGen: InventoryMagGen): void { // Can't be done by _props.ammoType as grenade launcher shoots grenades with ammoType of "buckshot" let randomisedAmmoStackSize: number; - if (inventoryMagGen.getAmmoTemplate()._props.StackMaxRandom === 1) // doesnt stack - { + if (inventoryMagGen.getAmmoTemplate()._props.StackMaxRandom === 1) + { // doesnt stack randomisedAmmoStackSize = this.randomUtil.getInt(3, 6); } else { - randomisedAmmoStackSize = this.randomUtil.getInt(inventoryMagGen.getAmmoTemplate()._props.StackMinRandom, inventoryMagGen.getAmmoTemplate()._props.StackMaxRandom); + randomisedAmmoStackSize = this.randomUtil.getInt( + inventoryMagGen.getAmmoTemplate()._props.StackMinRandom, + inventoryMagGen.getAmmoTemplate()._props.StackMaxRandom, + ); } - this.botWeaponGeneratorHelper.addAmmoIntoEquipmentSlots(inventoryMagGen.getAmmoTemplate()._id, randomisedAmmoStackSize, inventoryMagGen.getPmcInventory()); + this.botWeaponGeneratorHelper.addAmmoIntoEquipmentSlots( + inventoryMagGen.getAmmoTemplate()._id, + randomisedAmmoStackSize, + inventoryMagGen.getPmcInventory(), + ); } -} \ No newline at end of file +} diff --git a/project/src/generators/weapongen/implementations/ExternalInventoryMagGen.ts b/project/src/generators/weapongen/implementations/ExternalInventoryMagGen.ts index e5d2bda7..0926a4ef 100644 --- a/project/src/generators/weapongen/implementations/ExternalInventoryMagGen.ts +++ b/project/src/generators/weapongen/implementations/ExternalInventoryMagGen.ts @@ -12,41 +12,47 @@ import { LocalisationService } from "@spt-aki/services/LocalisationService"; @injectable() export class ExternalInventoryMagGen implements IInventoryMagGen { - constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper + @inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper, ) - { } + {} - getPriority(): number + getPriority(): number { return 99; } - + // eslint-disable-next-line @typescript-eslint/no-unused-vars - canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean + canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean { return true; // Fallback, if code reaches here it means no other implementation can handle this type of magazine } - process(inventoryMagGen: InventoryMagGen): void + process(inventoryMagGen: InventoryMagGen): void { let magTemplate = inventoryMagGen.getMagazineTemplate(); let magazineTpl = magTemplate._id; - const randomizedMagazineCount = Number(this.botWeaponGeneratorHelper.getRandomizedMagazineCount(inventoryMagGen.getMagCount())); + const randomizedMagazineCount = Number( + this.botWeaponGeneratorHelper.getRandomizedMagazineCount(inventoryMagGen.getMagCount()), + ); for (let i = 0; i < randomizedMagazineCount; i++) { - const magazineWithAmmo = this.botWeaponGeneratorHelper.createMagazineWithAmmo(magazineTpl, inventoryMagGen.getAmmoTemplate()._id, magTemplate); + const magazineWithAmmo = this.botWeaponGeneratorHelper.createMagazineWithAmmo( + magazineTpl, + inventoryMagGen.getAmmoTemplate()._id, + magTemplate, + ); const ableToFitMagazinesIntoBotInventory = this.botWeaponGeneratorHelper.addItemWithChildrenToEquipmentSlot( [EquipmentSlots.TACTICAL_VEST, EquipmentSlots.POCKETS], magazineWithAmmo[0]._id, magazineTpl, magazineWithAmmo, - inventoryMagGen.getPmcInventory()); + inventoryMagGen.getPmcInventory(), + ); if (ableToFitMagazinesIntoBotInventory === ItemAddedResult.NO_SPACE && i < randomizedMagazineCount) { @@ -54,18 +60,27 @@ export class ExternalInventoryMagGen implements IInventoryMagGen * so we fallback to default magazine and try again. * Temporary workaround to Killa spawning with no extras if he spawns with a drum mag */ - if (magazineTpl === this.botWeaponGeneratorHelper.getWeaponsDefaultMagazineTpl(inventoryMagGen.getWeaponTemplate())) + if ( + magazineTpl + === this.botWeaponGeneratorHelper.getWeaponsDefaultMagazineTpl( + inventoryMagGen.getWeaponTemplate(), + ) + ) { // We were already on default - stop here to prevent infinite looping break; } // Get default magazine tpl, reset loop counter by 1 and try again - magazineTpl = this.botWeaponGeneratorHelper.getWeaponsDefaultMagazineTpl(inventoryMagGen.getWeaponTemplate()); + magazineTpl = this.botWeaponGeneratorHelper.getWeaponsDefaultMagazineTpl( + inventoryMagGen.getWeaponTemplate(), + ); magTemplate = this.itemHelper.getItem(magazineTpl)[1]; if (!magTemplate) { - this.logger.error(this.localisationService.getText("bot-unable_to_find_default_magazine_item", magazineTpl)); + this.logger.error( + this.localisationService.getText("bot-unable_to_find_default_magazine_item", magazineTpl), + ); break; } @@ -78,5 +93,4 @@ export class ExternalInventoryMagGen implements IInventoryMagGen } } } - -} \ No newline at end of file +} diff --git a/project/src/generators/weapongen/implementations/InternalMagazineInventoryMagGen.ts b/project/src/generators/weapongen/implementations/InternalMagazineInventoryMagGen.ts index 9840dae9..2d865fee 100644 --- a/project/src/generators/weapongen/implementations/InternalMagazineInventoryMagGen.ts +++ b/project/src/generators/weapongen/implementations/InternalMagazineInventoryMagGen.ts @@ -7,25 +7,29 @@ import { BotWeaponGeneratorHelper } from "@spt-aki/helpers/BotWeaponGeneratorHel @injectable() export class InternalMagazineInventoryMagGen implements IInventoryMagGen { + constructor(@inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper) + {} - constructor( - @inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper - ) - { } - - public getPriority(): number + public getPriority(): number { return 0; } - public canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean + public canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean { return inventoryMagGen.getMagazineTemplate()._props.ReloadMagType === "InternalMagazine"; } - public process(inventoryMagGen: InventoryMagGen): void + public process(inventoryMagGen: InventoryMagGen): void { - const bulletCount = this.botWeaponGeneratorHelper.getRandomizedBulletCount(inventoryMagGen.getMagCount(), inventoryMagGen.getMagazineTemplate()); - this.botWeaponGeneratorHelper.addAmmoIntoEquipmentSlots(inventoryMagGen.getAmmoTemplate()._id, bulletCount, inventoryMagGen.getPmcInventory()); + const bulletCount = this.botWeaponGeneratorHelper.getRandomizedBulletCount( + inventoryMagGen.getMagCount(), + inventoryMagGen.getMagazineTemplate(), + ); + this.botWeaponGeneratorHelper.addAmmoIntoEquipmentSlots( + inventoryMagGen.getAmmoTemplate()._id, + bulletCount, + inventoryMagGen.getPmcInventory(), + ); } -} \ No newline at end of file +} diff --git a/project/src/generators/weapongen/implementations/UbglExternalMagGen.ts b/project/src/generators/weapongen/implementations/UbglExternalMagGen.ts index cb050c60..03abcb02 100644 --- a/project/src/generators/weapongen/implementations/UbglExternalMagGen.ts +++ b/project/src/generators/weapongen/implementations/UbglExternalMagGen.ts @@ -9,25 +9,30 @@ import { EquipmentSlots } from "@spt-aki/models/enums/EquipmentSlots"; @injectable() export class UbglExternalMagGen implements IInventoryMagGen { + constructor(@inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper) + {} - constructor( - @inject("BotWeaponGeneratorHelper") protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper - ) - { } - - public getPriority(): number + public getPriority(): number { return 1; } - public canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean + public canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean { return inventoryMagGen.getWeaponTemplate()._parent === BaseClasses.UBGL; } - public process(inventoryMagGen: InventoryMagGen): void + public process(inventoryMagGen: InventoryMagGen): void { - const bulletCount = this.botWeaponGeneratorHelper.getRandomizedBulletCount(inventoryMagGen.getMagCount(), inventoryMagGen.getMagazineTemplate()); - this.botWeaponGeneratorHelper.addAmmoIntoEquipmentSlots(inventoryMagGen.getAmmoTemplate()._id, bulletCount, inventoryMagGen.getPmcInventory(), [EquipmentSlots.TACTICAL_VEST]); + const bulletCount = this.botWeaponGeneratorHelper.getRandomizedBulletCount( + inventoryMagGen.getMagCount(), + inventoryMagGen.getMagazineTemplate(), + ); + this.botWeaponGeneratorHelper.addAmmoIntoEquipmentSlots( + inventoryMagGen.getAmmoTemplate()._id, + bulletCount, + inventoryMagGen.getPmcInventory(), + [EquipmentSlots.TACTICAL_VEST], + ); } -} \ No newline at end of file +} diff --git a/project/src/helpers/AssortHelper.ts b/project/src/helpers/AssortHelper.ts index 8026ab7b..19efc015 100644 --- a/project/src/helpers/AssortHelper.ts +++ b/project/src/helpers/AssortHelper.ts @@ -12,15 +12,14 @@ import { LocalisationService } from "@spt-aki/services/LocalisationService"; @injectable() export class AssortHelper { - constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("QuestHelper") protected questHelper: QuestHelper + @inject("QuestHelper") protected questHelper: QuestHelper, ) - { } + {} /** * Remove assorts from a trader that have not been unlocked yet (via player completing corrisponding quest) @@ -30,7 +29,13 @@ export class AssortHelper * @param mergedQuestAssorts Dict of quest assort to quest id unlocks for all traders (key = started/failed/complete) * @returns Assort items minus locked quest assorts */ - public stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, traderAssorts: ITraderAssort, mergedQuestAssorts: Record>, flea = false): ITraderAssort + public stripLockedQuestAssort( + pmcProfile: IPmcData, + traderId: string, + traderAssorts: ITraderAssort, + mergedQuestAssorts: Record>, + flea = false, + ): ITraderAssort { // Trader assort does not always contain loyal_level_items if (!traderAssorts.loyal_level_items) @@ -67,20 +72,26 @@ export class AssortHelper * @param assortId Assort to look for linked quest id * @returns quest id + array of quest status the assort should show for */ - protected getQuestIdAndStatusThatShowAssort(mergedQuestAssorts: Record>, assortId: string): { questId: string; status: QuestStatus[]; } + protected getQuestIdAndStatusThatShowAssort( + mergedQuestAssorts: Record>, + assortId: string, + ): { questId: string; status: QuestStatus[]; } { if (assortId in mergedQuestAssorts.started) { // Assort unlocked by starting quest, assort is visible to player when : started or ready to hand in + handed in - return { questId: mergedQuestAssorts.started[assortId], status: [QuestStatus.Started, QuestStatus.AvailableForFinish, QuestStatus.Success]}; + return { + questId: mergedQuestAssorts.started[assortId], + status: [QuestStatus.Started, QuestStatus.AvailableForFinish, QuestStatus.Success], + }; } else if (assortId in mergedQuestAssorts.success) { - return { questId: mergedQuestAssorts.success[assortId], status: [QuestStatus.Success]}; + return { questId: mergedQuestAssorts.success[assortId], status: [QuestStatus.Success] }; } else if (assortId in mergedQuestAssorts.fail) { - return { questId: mergedQuestAssorts.fail[assortId], status: [QuestStatus.Fail]}; + return { questId: mergedQuestAssorts.fail[assortId], status: [QuestStatus.Fail] }; } return undefined; @@ -127,7 +138,7 @@ export class AssortHelper if (assort.barter_scheme[itemID] && flea) { - assort.barter_scheme[itemID].forEach(b => b.forEach(br => br.sptQuestLocked = true)); + assort.barter_scheme[itemID].forEach((b) => b.forEach((br) => br.sptQuestLocked = true)); return assort; } delete assort.barter_scheme[itemID]; @@ -146,4 +157,4 @@ export class AssortHelper return assort; } -} \ No newline at end of file +} diff --git a/project/src/helpers/BotDifficultyHelper.ts b/project/src/helpers/BotDifficultyHelper.ts index 83688c7e..9fd469d6 100644 --- a/project/src/helpers/BotDifficultyHelper.ts +++ b/project/src/helpers/BotDifficultyHelper.ts @@ -23,22 +23,23 @@ export class BotDifficultyHelper @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("BotHelper") protected botHelper: BotHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.pmcConfig = this.configServer.getConfig(ConfigTypes.PMC); } - public getPmcDifficultySettings(pmcType: "bear"|"usec", difficulty: string, usecType: string, bearType: string): Difficulty + public getPmcDifficultySettings( + pmcType: "bear" | "usec", + difficulty: string, + usecType: string, + bearType: string, + ): Difficulty { const difficultySettings = this.getDifficultySettings(pmcType, difficulty); - const friendlyType = pmcType === "bear" - ? bearType - : usecType; - const enemyType = pmcType === "bear" - ? usecType - : bearType; + const friendlyType = pmcType === "bear" ? bearType : usecType; + const enemyType = pmcType === "bear" ? usecType : bearType; this.botHelper.addBotToEnemyList(difficultySettings, this.pmcConfig.enemyTypes, friendlyType); // Add generic bot types to enemy list this.botHelper.addBotToEnemyList(difficultySettings, [enemyType, friendlyType], ""); // add same/opposite side to enemy list @@ -61,14 +62,23 @@ export class BotDifficultyHelper { // get fallback this.logger.warning(this.localisationService.getText("bot-unable_to_get_bot_fallback_to_assault", type)); - this.databaseServer.getTables().bots.types[type] = this.jsonUtil.clone(this.databaseServer.getTables().bots.types.assault); + this.databaseServer.getTables().bots.types[type] = this.jsonUtil.clone( + this.databaseServer.getTables().bots.types.assault, + ); } const difficultySettings = this.botHelper.getBotTemplate(type).difficulty[difficulty]; if (!difficultySettings) { - this.logger.warning(this.localisationService.getText("bot-unable_to_get_bot_difficulty_fallback_to_assault", {botType: type, difficulty: difficulty})); - this.databaseServer.getTables().bots.types[type].difficulty[difficulty] = this.jsonUtil.clone(this.databaseServer.getTables().bots.types.assault.difficulty[difficulty]); + this.logger.warning( + this.localisationService.getText("bot-unable_to_get_bot_difficulty_fallback_to_assault", { + botType: type, + difficulty: difficulty, + }), + ); + this.databaseServer.getTables().bots.types[type].difficulty[difficulty] = this.jsonUtil.clone( + this.databaseServer.getTables().bots.types.assault.difficulty[difficulty], + ); } return this.jsonUtil.clone(difficultySettings); @@ -77,7 +87,7 @@ export class BotDifficultyHelper /** * Get difficulty settings for a PMC * @param type "usec" / "bear" - * @param difficulty what difficulty to retrieve + * @param difficulty what difficulty to retrieve * @returns Difficulty object */ protected getDifficultySettings(type: string, difficulty: string): Difficulty @@ -117,4 +127,4 @@ export class BotDifficultyHelper { return this.randomUtil.getArrayValue(["easy", "normal", "hard", "impossible"]); } -} \ No newline at end of file +} diff --git a/project/src/helpers/BotGeneratorHelper.ts b/project/src/helpers/BotGeneratorHelper.ts index 3e37645a..3390c352 100644 --- a/project/src/helpers/BotGeneratorHelper.ts +++ b/project/src/helpers/BotGeneratorHelper.ts @@ -19,7 +19,7 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; import { RandomUtil } from "@spt-aki/utils/RandomUtil"; @injectable() -export class BotGeneratorHelper +export class BotGeneratorHelper { protected botConfig: IBotConfig; protected pmcConfig: IPmcConfig; @@ -32,8 +32,8 @@ export class BotGeneratorHelper @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("ApplicationContext") protected applicationContext: ApplicationContext, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer - ) + @inject("ConfigServer") protected configServer: ConfigServer, + ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); this.pmcConfig = this.configServer.getConfig(ConfigTypes.PMC); @@ -46,56 +46,68 @@ export class BotGeneratorHelper * @param botRole Used by weapons to randomize the durability values. Null for non-equipped items * @returns Item Upd object with extra properties */ - public generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole: string = null): { upd?: Upd } + public generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole = null): { upd?: Upd; } { // Get raid settings, if no raid, default to day - const raidSettings = this.applicationContext.getLatestValue(ContextVariableType.RAID_CONFIGURATION)?.getValue(); + const raidSettings = this.applicationContext.getLatestValue(ContextVariableType.RAID_CONFIGURATION)?.getValue< + IGetRaidConfigurationRequestData + >(); const raidIsNight = raidSettings?.timeVariant === "PAST"; const itemProperties: Upd = {}; - if (itemTemplate._props.MaxDurability) + if (itemTemplate._props.MaxDurability) { - if (itemTemplate._props.weapClass) // Is weapon - { + if (itemTemplate._props.weapClass) + { // Is weapon itemProperties.Repairable = this.generateWeaponRepairableProperties(itemTemplate, botRole); } - else if (itemTemplate._props.armorClass) // Is armor - { + else if (itemTemplate._props.armorClass) + { // Is armor itemProperties.Repairable = this.generateArmorRepairableProperties(itemTemplate, botRole); } } - if (itemTemplate._props.HasHinge) + if (itemTemplate._props.HasHinge) { itemProperties.Togglable = { On: true }; } - if (itemTemplate._props.Foldable) + if (itemTemplate._props.Foldable) { itemProperties.Foldable = { Folded: false }; } - if (itemTemplate._props.weapFireType?.length) + if (itemTemplate._props.weapFireType?.length) { - if (itemTemplate._props.weapFireType.includes("fullauto")) + if (itemTemplate._props.weapFireType.includes("fullauto")) { itemProperties.FireMode = { FireMode: "fullauto" }; } - else + else { itemProperties.FireMode = { FireMode: this.randomUtil.getArrayValue(itemTemplate._props.weapFireType) }; } } - if (itemTemplate._props.MaxHpResource) + if (itemTemplate._props.MaxHpResource) { - itemProperties.MedKit = { HpResource: this.getRandomizedResourceValue(itemTemplate._props.MaxHpResource, this.botConfig.lootItemResourceRandomization[botRole]?.meds) }; + itemProperties.MedKit = { + HpResource: this.getRandomizedResourceValue( + itemTemplate._props.MaxHpResource, + this.botConfig.lootItemResourceRandomization[botRole]?.meds, + ), + }; } - if (itemTemplate._props.MaxResource && itemTemplate._props.foodUseTime) + if (itemTemplate._props.MaxResource && itemTemplate._props.foodUseTime) { - itemProperties.FoodDrink = { HpPercent: this.getRandomizedResourceValue(itemTemplate._props.MaxResource, this.botConfig.lootItemResourceRandomization[botRole]?.food) }; + itemProperties.FoodDrink = { + HpPercent: this.getRandomizedResourceValue( + itemTemplate._props.MaxResource, + this.botConfig.lootItemResourceRandomization[botRole]?.food, + ), + }; } if (itemTemplate._parent === BaseClasses.FLASHLIGHT) @@ -104,16 +116,26 @@ export class BotGeneratorHelper const lightLaserActiveChance = raidIsNight ? this.getBotEquipmentSettingFromConfig(botRole, "lightIsActiveNightChancePercent", 50) : this.getBotEquipmentSettingFromConfig(botRole, "lightIsActiveDayChancePercent", 25); - itemProperties.Light = { IsActive: (this.randomUtil.getChance100(lightLaserActiveChance)), SelectedMode: 0 }; + itemProperties.Light = { + IsActive: (this.randomUtil.getChance100(lightLaserActiveChance)), + SelectedMode: 0, + }; } else if (itemTemplate._parent === BaseClasses.TACTICAL_COMBO) { // Get chance from botconfig for bot type, use 50% if no value found - const lightLaserActiveChance = this.getBotEquipmentSettingFromConfig(botRole, "laserIsActiveChancePercent", 50); - itemProperties.Light = { IsActive: (this.randomUtil.getChance100(lightLaserActiveChance)), SelectedMode: 0 }; + const lightLaserActiveChance = this.getBotEquipmentSettingFromConfig( + botRole, + "laserIsActiveChancePercent", + 50, + ); + itemProperties.Light = { + IsActive: (this.randomUtil.getChance100(lightLaserActiveChance)), + SelectedMode: 0, + }; } - if (itemTemplate._parent === BaseClasses.NIGHTVISION) + if (itemTemplate._parent === BaseClasses.NIGHTVISION) { // Get chance from botconfig for bot type const nvgActiveChance = raidIsNight @@ -123,16 +145,18 @@ export class BotGeneratorHelper } // Togglable face shield - if (itemTemplate._props.HasHinge && itemTemplate._props.FaceShieldComponent) + if (itemTemplate._props.HasHinge && itemTemplate._props.FaceShieldComponent) { // Get chance from botconfig for bot type, use 75% if no value found - const faceShieldActiveChance = this.getBotEquipmentSettingFromConfig(botRole, "faceShieldIsActiveChancePercent", 75); + const faceShieldActiveChance = this.getBotEquipmentSettingFromConfig( + botRole, + "faceShieldIsActiveChancePercent", + 75, + ); itemProperties.Togglable = { On: (this.randomUtil.getChance100(faceShieldActiveChance)) }; } - return Object.keys(itemProperties).length - ? { upd: itemProperties } - : {}; + return Object.keys(itemProperties).length ? { upd: itemProperties } : {}; } /** @@ -153,8 +177,10 @@ export class BotGeneratorHelper return maxResource; } - return this.randomUtil.getInt(this.randomUtil.getPercentOfValue(randomizationValues.resourcePercent, maxResource, 0), maxResource); - + return this.randomUtil.getInt( + this.randomUtil.getPercentOfValue(randomizationValues.resourcePercent, maxResource, 0), + maxResource, + ); } /** @@ -164,22 +190,38 @@ export class BotGeneratorHelper * @param defaultValue default value for the chance of activation if the botrole or bot equipment role is null * @returns Percent chance to be active */ - protected getBotEquipmentSettingFromConfig(botRole: string, setting: keyof EquipmentFilters, defaultValue: number): number + protected getBotEquipmentSettingFromConfig( + botRole: string, + setting: keyof EquipmentFilters, + defaultValue: number, + ): number { - if (!botRole) + if (!botRole) { return defaultValue; } const botEquipmentSettings = this.botConfig.equipment[this.getBotEquipmentRole(botRole)]; if (!botEquipmentSettings) { - this.logger.warning(this.localisationService.getText("bot-missing_equipment_settings", {botRole: botRole, setting: setting, defaultValue: defaultValue})); + this.logger.warning( + this.localisationService.getText("bot-missing_equipment_settings", { + botRole: botRole, + setting: setting, + defaultValue: defaultValue, + }), + ); return defaultValue; } - if (botEquipmentSettings[setting] === undefined || typeof botEquipmentSettings[setting] !== "number") + if (botEquipmentSettings[setting] === undefined || typeof botEquipmentSettings[setting] !== "number") { - this.logger.warning(this.localisationService.getText("bot-missing_equipment_settings_property", {botRole: botRole, setting: setting, defaultValue: defaultValue})); + this.logger.warning( + this.localisationService.getText("bot-missing_equipment_settings_property", { + botRole: botRole, + setting: setting, + defaultValue: defaultValue, + }), + ); return defaultValue; } @@ -193,15 +235,16 @@ export class BotGeneratorHelper * @param botRole type of bot being generated for * @returns Repairable object */ - protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable { const maxDurability = this.durabilityLimitsHelper.getRandomizedMaxWeaponDurability(itemTemplate, botRole); - const currentDurability = this.durabilityLimitsHelper.getRandomizedWeaponDurability(itemTemplate, botRole, maxDurability); + const currentDurability = this.durabilityLimitsHelper.getRandomizedWeaponDurability( + itemTemplate, + botRole, + maxDurability, + ); - return { - Durability: currentDurability, - MaxDurability: maxDurability - }; + return { Durability: currentDurability, MaxDurability: maxDurability }; } /** @@ -210,7 +253,7 @@ export class BotGeneratorHelper * @param botRole type of bot being generated for * @returns Repairable object */ - protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable { let maxDurability: number; let currentDurability: number; @@ -219,16 +262,17 @@ export class BotGeneratorHelper maxDurability = itemTemplate._props.MaxDurability; currentDurability = itemTemplate._props.MaxDurability; } - else + else { maxDurability = this.durabilityLimitsHelper.getRandomizedMaxArmorDurability(itemTemplate, botRole); - currentDurability = this.durabilityLimitsHelper.getRandomizedArmorDurability(itemTemplate, botRole, maxDurability); + currentDurability = this.durabilityLimitsHelper.getRandomizedArmorDurability( + itemTemplate, + botRole, + maxDurability, + ); } - return { - Durability: currentDurability, - MaxDurability: maxDurability - }; + return { Durability: currentDurability, MaxDurability: maxDurability }; } /** @@ -238,51 +282,78 @@ export class BotGeneratorHelper * @param equipmentSlot Slot the item will be placed into * @returns false if no incompatibilities, also has incompatibility reason */ - public isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): { incompatible: boolean, reason: string } + public isItemIncompatibleWithCurrentItems( + items: Item[], + tplToCheck: string, + equipmentSlot: string, + ): { incompatible: boolean; reason: string; } { // Skip slots that have no incompatibilities - if (["Scabbard", "Backpack", "SecureContainer", "Holster", "ArmBand"].includes(equipmentSlot)) + if (["Scabbard", "Backpack", "SecureContainer", "Holster", "ArmBand"].includes(equipmentSlot)) { return { incompatible: false, reason: "" }; } // TODO: Can probably be optimized to cache itemTemplates as items are added to inventory - const equippedItems = items.map(i => this.databaseServer.getTables().templates.items[i._tpl]); + const equippedItems = items.map((i) => this.databaseServer.getTables().templates.items[i._tpl]); const item = this.itemHelper.getItem(tplToCheck); const itemToCheck = item[1]; if (!item[0]) { - this.logger.warning(this.localisationService.getText("bot-invalid_item_compatibility_check", {itemTpl: tplToCheck, slot: equipmentSlot})); + this.logger.warning( + this.localisationService.getText("bot-invalid_item_compatibility_check", { + itemTpl: tplToCheck, + slot: equipmentSlot, + }), + ); } if (!itemToCheck._props) { - this.logger.warning(this.localisationService.getText("bot-compatibility_check_missing_props", {id: itemToCheck._id, name: itemToCheck._name, slot: equipmentSlot})); + this.logger.warning( + this.localisationService.getText("bot-compatibility_check_missing_props", { + id: itemToCheck._id, + name: itemToCheck._name, + slot: equipmentSlot, + }), + ); } // Does an equipped item have a property that blocks the desired item - check for prop "BlocksX" .e.g BlocksEarpiece / BlocksFaceCover - let blockingItem = equippedItems.find(x => x._props[`Blocks${equipmentSlot}`]); - if (blockingItem) + let blockingItem = equippedItems.find((x) => x._props[`Blocks${equipmentSlot}`]); + if (blockingItem) { - //this.logger.warning(`1 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._name} - ${equipmentSlot}`); - return { incompatible: true, reason: `${tplToCheck} ${itemToCheck._name} in slot: ${equipmentSlot} blocked by: ${blockingItem._id} ${blockingItem._name}` }; + // this.logger.warning(`1 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._name} - ${equipmentSlot}`); + return { + incompatible: true, + reason: + `${tplToCheck} ${itemToCheck._name} in slot: ${equipmentSlot} blocked by: ${blockingItem._id} ${blockingItem._name}`, + }; } // Check if any of the current inventory templates have the incoming item defined as incompatible - blockingItem = equippedItems.find(x => x._props.ConflictingItems?.includes(tplToCheck)); - if (blockingItem) + blockingItem = equippedItems.find((x) => x._props.ConflictingItems?.includes(tplToCheck)); + if (blockingItem) { - //this.logger.warning(`2 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._props.Name} - ${equipmentSlot}`); - return { incompatible: true, reason: `${tplToCheck} ${itemToCheck._name} in slot: ${equipmentSlot} blocked by: ${blockingItem._id} ${blockingItem._name}` }; + // this.logger.warning(`2 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._props.Name} - ${equipmentSlot}`); + return { + incompatible: true, + reason: + `${tplToCheck} ${itemToCheck._name} in slot: ${equipmentSlot} blocked by: ${blockingItem._id} ${blockingItem._name}`, + }; } // Check if the incoming item has any inventory items defined as incompatible - const blockingInventoryItem = items.find(x => itemToCheck._props.ConflictingItems?.includes(x._tpl)); - if (blockingInventoryItem) + const blockingInventoryItem = items.find((x) => itemToCheck._props.ConflictingItems?.includes(x._tpl)); + if (blockingInventoryItem) { - //this.logger.warning(`3 incompatibility found between - ${itemToEquip[1]._name} and ${blockingInventoryItem._tpl} - ${equipmentSlot}`) - return { incompatible: true, reason: `${tplToCheck} blocks existing item ${blockingInventoryItem._tpl} in slot ${blockingInventoryItem.slotId}` }; + // this.logger.warning(`3 incompatibility found between - ${itemToEquip[1]._name} and ${blockingInventoryItem._tpl} - ${equipmentSlot}`) + return { + incompatible: true, + reason: + `${tplToCheck} blocks existing item ${blockingInventoryItem._tpl} in slot ${blockingInventoryItem.slotId}`, + }; } return { incompatible: false, reason: "" }; @@ -293,9 +364,11 @@ export class BotGeneratorHelper * @param botRole Role to convert * @returns Equipment role (e.g. pmc / assault / bossTagilla) */ - public getBotEquipmentRole(botRole: string): string + public getBotEquipmentRole(botRole: string): string { - return ([this.pmcConfig.usecType.toLowerCase(), this.pmcConfig.bearType.toLowerCase()].includes(botRole.toLowerCase())) + return ([this.pmcConfig.usecType.toLowerCase(), this.pmcConfig.bearType.toLowerCase()].includes( + botRole.toLowerCase(), + )) ? "pmc" : botRole; } @@ -306,18 +379,14 @@ export class ExhaustableArray { private pool: T[]; - constructor( - private itemPool: T[], - private randomUtil: RandomUtil, - private jsonUtil: JsonUtil - ) + constructor(private itemPool: T[], private randomUtil: RandomUtil, private jsonUtil: JsonUtil) { this.pool = this.jsonUtil.clone(itemPool); } - public getRandomValue(): T + public getRandomValue(): T { - if (!this.pool?.length) + if (!this.pool?.length) { return null; } @@ -328,9 +397,9 @@ export class ExhaustableArray return toReturn; } - public getFirstValue(): T + public getFirstValue(): T { - if (!this.pool?.length) + if (!this.pool?.length) { return null; } @@ -340,13 +409,13 @@ export class ExhaustableArray return toReturn; } - public hasValues(): boolean + public hasValues(): boolean { - if (this.pool?.length) + if (this.pool?.length) { return true; } return false; } -} \ No newline at end of file +} diff --git a/project/src/helpers/BotHelper.ts b/project/src/helpers/BotHelper.ts index bdcfca4e..d7c1991d 100644 --- a/project/src/helpers/BotHelper.ts +++ b/project/src/helpers/BotHelper.ts @@ -24,15 +24,13 @@ export class BotHelper @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); this.pmcConfig = this.configServer.getConfig(ConfigTypes.PMC); } - - /** * Get a template object for the specified botRole from bots.types db * @param role botRole to get template for @@ -52,10 +50,10 @@ export class BotHelper { if (this.randomUtil.getChance100(this.pmcConfig.chanceSameSideIsHostilePercent)) { - difficultySettings.Mind["CAN_RECEIVE_PLAYER_REQUESTS_BEAR"] = false; - difficultySettings.Mind["CAN_RECEIVE_PLAYER_REQUESTS_USEC"] = false; - difficultySettings.Mind["DEFAULT_USEC_BEHAVIOUR"] = "Attack"; - difficultySettings.Mind["DEFAULT_BEAR_BEHAVIOUR"] = "Attack"; + difficultySettings.Mind.CAN_RECEIVE_PLAYER_REQUESTS_BEAR = false; + difficultySettings.Mind.CAN_RECEIVE_PLAYER_REQUESTS_USEC = false; + difficultySettings.Mind.DEFAULT_USEC_BEHAVIOUR = "Attack"; + difficultySettings.Mind.DEFAULT_BEAR_BEHAVIOUR = "Attack"; } } @@ -71,7 +69,7 @@ export class BotHelper public isBotBoss(botRole: string): boolean { - return this.botConfig.bosses.some(x => x.toLowerCase() === botRole?.toLowerCase()); + return this.botConfig.bosses.some((x) => x.toLowerCase() === botRole?.toLowerCase()); } public isBotFollower(botRole: string): boolean @@ -193,7 +191,9 @@ export class BotHelper public botRoleIsPmc(botRole: string): boolean { - return [this.pmcConfig.usecType.toLowerCase(), this.pmcConfig.bearType.toLowerCase()].includes(botRole.toLowerCase()); + return [this.pmcConfig.usecType.toLowerCase(), this.pmcConfig.bearType.toLowerCase()].includes( + botRole.toLowerCase(), + ); } /** @@ -209,8 +209,8 @@ export class BotHelper { return null; } - - return botEquipConfig.randomisation.find(x => botLevel >= x.levelRange.min && botLevel <= x.levelRange.max); + + return botEquipConfig.randomisation.find((x) => botLevel >= x.levelRange.min && botLevel <= x.levelRange.max); } /** @@ -248,8 +248,6 @@ export class BotHelper */ protected getRandomizedPmcSide(): string { - return (this.randomUtil.getChance100(this.pmcConfig.isUsec)) - ? "Usec" - : "Bear"; + return (this.randomUtil.getChance100(this.pmcConfig.isUsec)) ? "Usec" : "Bear"; } -} \ No newline at end of file +} diff --git a/project/src/helpers/BotWeaponGeneratorHelper.ts b/project/src/helpers/BotWeaponGeneratorHelper.ts index d84037c0..fe9afb69 100644 --- a/project/src/helpers/BotWeaponGeneratorHelper.ts +++ b/project/src/helpers/BotWeaponGeneratorHelper.ts @@ -29,9 +29,9 @@ export class BotWeaponGeneratorHelper @inject("InventoryHelper") protected inventoryHelper: InventoryHelper, @inject("WeightedRandomHelper") protected weightedRandomHelper: WeightedRandomHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ContainerHelper") protected containerHelper: ContainerHelper + @inject("ContainerHelper") protected containerHelper: ContainerHelper, ) - { } + {} /** * Get a randomized number of bullets for a specific magazine @@ -61,7 +61,7 @@ export class BotWeaponGeneratorHelper /* Get the amount of bullets that would fit in the internal magazine * and multiply by how many magazines were supposed to be created */ - return chamberBulletCount * randomizedMagazineCount; + return chamberBulletCount * randomizedMagazineCount; } /** @@ -71,8 +71,8 @@ export class BotWeaponGeneratorHelper */ public getRandomizedMagazineCount(magCounts: GenerationData): number { - //const range = magCounts.max - magCounts.min; - //return this.randomUtil.getBiasedRandomNumber(magCounts.min, magCounts.max, Math.round(range * 0.75), 4); + // const range = magCounts.max - magCounts.min; + // return this.randomUtil.getBiasedRandomNumber(magCounts.min, magCounts.max, Math.round(range * 0.75), 4); return this.weightedRandomHelper.getWeightedValue(magCounts.weights); } @@ -96,10 +96,7 @@ export class BotWeaponGeneratorHelper */ public createMagazineWithAmmo(magazineTpl: string, ammoTpl: string, magTemplate: ITemplateItem): Item[] { - const magazine: Item[] = [{ - _id: this.hashUtil.generate(), - _tpl: magazineTpl - }]; + const magazine: Item[] = [{ _id: this.hashUtil.generate(), _tpl: magazineTpl }]; this.itemHelper.fillMagazineWithCartridge(magazine, magTemplate, ammoTpl, 1); @@ -113,22 +110,24 @@ export class BotWeaponGeneratorHelper * @param inventory bot inventory to add cartridges to * @param equipmentSlotsToAddTo what equipment slots should bullets be added into */ - public addAmmoIntoEquipmentSlots(ammoTpl: string, cartridgeCount: number, inventory: Inventory, equipmentSlotsToAddTo: EquipmentSlots[] = [EquipmentSlots.TACTICAL_VEST, EquipmentSlots.POCKETS] ): void + public addAmmoIntoEquipmentSlots( + ammoTpl: string, + cartridgeCount: number, + inventory: Inventory, + equipmentSlotsToAddTo: EquipmentSlots[] = [EquipmentSlots.TACTICAL_VEST, EquipmentSlots.POCKETS], + ): void { const ammoItems = this.itemHelper.splitStack({ _id: this.hashUtil.generate(), _tpl: ammoTpl, - upd: { "StackObjectsCount": cartridgeCount } + upd: { StackObjectsCount: cartridgeCount }, }); for (const ammoItem of ammoItems) { - const result = this.addItemWithChildrenToEquipmentSlot( - equipmentSlotsToAddTo, - ammoItem._id, - ammoItem._tpl, - [ammoItem], - inventory); + const result = this.addItemWithChildrenToEquipmentSlot(equipmentSlotsToAddTo, ammoItem._id, ammoItem._tpl, [ + ammoItem, + ], inventory); if (result === ItemAddedResult.NO_SPACE) { @@ -151,22 +150,32 @@ export class BotWeaponGeneratorHelper * TODO - move into BotGeneratorHelper, this is not the class for it * Adds an item with all its children into specified equipmentSlots, wherever it fits. * @param equipmentSlots Slot to add item+children into - * @param parentId - * @param parentTpl + * @param parentId + * @param parentTpl * @param itemWithChildren Item to add * @param inventory Inventory to add item+children into * @returns a `boolean` indicating item was added */ - public addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: Inventory): ItemAddedResult + public addItemWithChildrenToEquipmentSlot( + equipmentSlots: string[], + parentId: string, + parentTpl: string, + itemWithChildren: Item[], + inventory: Inventory, + ): ItemAddedResult { for (const slot of equipmentSlots) { // Get container to put item into - const container = inventory.items.find(i => i.slotId === slot); + const container = inventory.items.find((i) => i.slotId === slot); if (!container) { // Desired equipment container (e.g. backpack) not found - this.logger.debug(`Unable to add item: ${itemWithChildren[0]._tpl} to: ${slot}, slot missing/bot generated without equipment`); + this.logger.debug( + `Unable to add item: ${ + itemWithChildren[0]._tpl + } to: ${slot}, slot missing/bot generated without equipment`, + ); continue; } @@ -202,10 +211,12 @@ export class BotWeaponGeneratorHelper } // Get all base level items in backpack - const containerItems = inventory.items.filter(i => i.parentId === container._id && i.slotId === slotGrid._name); + const containerItems = inventory.items.filter((i) => + i.parentId === container._id && i.slotId === slotGrid._name + ); // Get a copy of base level items we can iterate over - const containerItemsToCheck = containerItems.filter(x => x.slotId === slotGrid._name); + const containerItemsToCheck = containerItems.filter((x) => x.slotId === slotGrid._name); for (const item of containerItemsToCheck) { // Look for children on items, insert into array if found @@ -218,14 +229,19 @@ export class BotWeaponGeneratorHelper } // Get rid of items free/used spots in current grid - const slotGridMap = this.inventoryHelper.getContainerMap(slotGrid._props.cellsH, slotGrid._props.cellsV, containerItems, container._id); + const slotGridMap = this.inventoryHelper.getContainerMap( + slotGrid._props.cellsH, + slotGrid._props.cellsV, + containerItems, + container._id, + ); // Try to fit item into grid const findSlotResult = this.containerHelper.findSlotForItem(slotGridMap, itemSize[0], itemSize[1]); // Open slot found, add item to inventory if (findSlotResult.success) { - const parentItem = itemWithChildren.find(i => i._id === parentId); + const parentItem = itemWithChildren.find((i) => i._id === parentId); // Set items parent to container id parentItem.parentId = container._id; @@ -233,7 +249,7 @@ export class BotWeaponGeneratorHelper parentItem.location = { x: findSlotResult.x, y: findSlotResult.y, - r: findSlotResult.rotation ? 1 : 0 + r: findSlotResult.rotation ? 1 : 0, }; inventory.items.push(...itemWithChildren); @@ -284,4 +300,4 @@ export class BotWeaponGeneratorHelper return true; } -} \ No newline at end of file +} diff --git a/project/src/helpers/ContainerHelper.ts b/project/src/helpers/ContainerHelper.ts index bb88c4bc..cfd16c6b 100644 --- a/project/src/helpers/ContainerHelper.ts +++ b/project/src/helpers/ContainerHelper.ts @@ -43,7 +43,7 @@ export class ContainerHelper /** * Try to rotate if there is enough room for the item * Only occupies one grid of items, no rotation required - * */ + */ if (!foundSlot && itemWidth * itemHeight > 1) { foundSlot = this.locateSlot(container2D, containerX, containerY, x, y, itemHeight, itemWidth); @@ -77,7 +77,15 @@ export class ContainerHelper * @param itemH Items height * @returns True - slot found */ - protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean + protected locateSlot( + container2D: number[][], + containerX: number, + containerY: number, + x: number, + y: number, + itemW: number, + itemH: number, + ): boolean { let foundSlot = true; @@ -124,7 +132,14 @@ export class ContainerHelper * @param rotate is item rotated * @returns Location to place item */ - public fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): number[][] + public fillContainerMapWithItem( + container2D: number[][], + x: number, + y: number, + itemW: number, + itemH: number, + rotate: boolean, + ): number[][] { const itemWidth = rotate ? itemH : itemW; const itemHeight = rotate ? itemW : itemH; @@ -146,4 +161,4 @@ export class ContainerHelper return container2D; } -} \ No newline at end of file +} diff --git a/project/src/helpers/DialogueHelper.ts b/project/src/helpers/DialogueHelper.ts index c54a8e4c..90a69dfc 100644 --- a/project/src/helpers/DialogueHelper.ts +++ b/project/src/helpers/DialogueHelper.ts @@ -4,7 +4,13 @@ import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; import { NotificationSendHelper } from "@spt-aki/helpers/NotificationSendHelper"; import { NotifierHelper } from "@spt-aki/helpers/NotifierHelper"; import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -import { Dialogue, Message, MessageContent, MessageItems, MessagePreview } from "@spt-aki/models/eft/profile/IAkiProfile"; +import { + Dialogue, + Message, + MessageContent, + MessageItems, + MessagePreview, +} from "@spt-aki/models/eft/profile/IAkiProfile"; import { MessageType } from "@spt-aki/models/enums/MessageType"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; @@ -24,19 +30,16 @@ export class DialogueHelper @inject("NotifierHelper") protected notifierHelper: NotifierHelper, @inject("NotificationSendHelper") protected notificationSendHelper: NotificationSendHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ItemHelper") protected itemHelper: ItemHelper + @inject("ItemHelper") protected itemHelper: ItemHelper, ) - { } + {} /** * @deprecated Use MailSendService.sendMessage() or helpers */ public createMessageContext(templateId: string, messageType: MessageType, maxStoreTime = null): MessageContent { - const result: MessageContent = { - templateId: templateId, - type: messageType - }; + const result: MessageContent = { templateId: templateId, type: messageType }; if (maxStoreTime) { @@ -49,7 +52,13 @@ export class DialogueHelper /** * @deprecated Use MailSendService.sendMessage() or helpers */ - public addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards: Item[] = [], messageType = MessageType.NPC_TRADER): void + public addDialogueMessage( + dialogueID: string, + messageContent: MessageContent, + sessionID: string, + rewards: Item[] = [], + messageType = MessageType.NPC_TRADER, + ): void { const dialogueData = this.saveServer.getProfile(sessionID).dialogues; const isNewDialogue = !(dialogueID in dialogueData); @@ -57,14 +66,7 @@ export class DialogueHelper if (isNewDialogue) { - dialogue = { - _id: dialogueID, - type: messageType, - messages: [], - pinned: false, - new: 0, - attachmentsNew: 0 - }; + dialogue = { _id: dialogueID, type: messageType, messages: [], pinned: false, new: 0, attachmentsNew: 0 }; dialogueData[dialogueID] = dialogue; } @@ -77,10 +79,7 @@ export class DialogueHelper if (rewards.length > 0) { const stashId = this.hashUtil.generate(); - items = { - stash: stashId, - data: [] - }; + items = { stash: stashId, data: [] }; rewards = this.itemHelper.replaceIDs(null, rewards); for (const reward of rewards) @@ -95,7 +94,12 @@ export class DialogueHelper if (!itemTemplate) { // Can happen when modded items are insured + mod is removed - this.logger.error(this.localisationService.getText("dialog-missing_item_template", {tpl: reward._tpl, type: MessageType[messageContent.type]})); + this.logger.error( + this.localisationService.getText("dialog-missing_item_template", { + tpl: reward._tpl, + type: MessageType[messageContent.type], + }), + ); continue; } @@ -132,7 +136,9 @@ export class DialogueHelper items: items, maxStorageTime: messageContent.maxStorageTime, systemData: messageContent.systemData ? messageContent.systemData : undefined, - profileChangeEvents: (messageContent.profileChangeEvents?.length === 0) ? messageContent.profileChangeEvents : undefined + profileChangeEvents: (messageContent.profileChangeEvents?.length === 0) + ? messageContent.profileChangeEvents + : undefined, }; if (!message.templateId) @@ -145,7 +151,10 @@ export class DialogueHelper // Offer Sold notifications are now separate from the main notification if (messageContent.type === MessageType.FLEAMARKET_MESSAGE && messageContent.ragfair) { - const offerSoldMessage = this.notifierHelper.createRagfairOfferSoldNotification(message, messageContent.ragfair); + const offerSoldMessage = this.notifierHelper.createRagfairOfferSoldNotification( + message, + messageContent.ragfair, + ); this.notificationSendHelper.sendMessage(sessionID, offerSoldMessage); message.type = MessageType.MESSAGE_WITH_ITEMS; // Should prevent getting the same notification popup twice } @@ -156,7 +165,7 @@ export class DialogueHelper /** * Get the preview contents of the last message in a dialogue. - * @param dialogue + * @param dialogue * @returns MessagePreview */ public getMessagePreview(dialogue: Dialogue): MessagePreview @@ -167,7 +176,7 @@ export class DialogueHelper dt: message?.dt, type: message?.type, templateId: message?.templateId, - uid: dialogue._id + uid: dialogue._id, }; if (message?.text) @@ -185,17 +194,17 @@ export class DialogueHelper /** * Get the item contents for a particular message. - * @param messageID - * @param sessionID + * @param messageID + * @param sessionID * @param itemId Item being moved to inventory - * @returns + * @returns */ public getMessageItemContents(messageID: string, sessionID: string, itemId: string): Item[] { const dialogueData = this.saveServer.getProfile(sessionID).dialogues; for (const dialogueId in dialogueData) { - const message = dialogueData[dialogueId].messages.find(x => x._id === messageID); + const message = dialogueData[dialogueId].messages.find((x) => x._id === messageID); if (!message) { continue; @@ -211,7 +220,7 @@ export class DialogueHelper // Check reward count when item being moved isn't in reward list // if count is 0, it means after this move the reward array will be empty and all rewards collected - const rewardItemCount = message.items.data.filter(x => x._id !== itemId ); + const rewardItemCount = message.items.data.filter((x) => x._id !== itemId); if (rewardItemCount.length === 0) { message.rewardCollected = true; @@ -240,4 +249,4 @@ export class DialogueHelper return profile.dialogues; } -} \ No newline at end of file +} diff --git a/project/src/helpers/DurabilityLimitsHelper.ts b/project/src/helpers/DurabilityLimitsHelper.ts index 61d8edc9..45d2abcb 100644 --- a/project/src/helpers/DurabilityLimitsHelper.ts +++ b/project/src/helpers/DurabilityLimitsHelper.ts @@ -15,7 +15,7 @@ export class DurabilityLimitsHelper constructor( @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("BotHelper") protected botHelper: BotHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -139,8 +139,8 @@ export class DurabilityLimitsHelper protected generateMaxPmcArmorDurability(itemMaxDurability: number): number { - const lowestMaxPercent = this.botConfig.durability["pmc"].armor.lowestMaxPercent; - const highestMaxPercent = this.botConfig.durability["pmc"].armor.highestMaxPercent; + const lowestMaxPercent = this.botConfig.durability.pmc.armor.lowestMaxPercent; + const highestMaxPercent = this.botConfig.durability.pmc.armor.highestMaxPercent; const multiplier = this.randomUtil.getInt(lowestMaxPercent, highestMaxPercent); return itemMaxDurability * (multiplier / 100); @@ -172,12 +172,12 @@ export class DurabilityLimitsHelper const maxDelta = this.getMaxWeaponDeltaFromConfig(botRole); const delta = this.randomUtil.getInt(minDelta, maxDelta); const result = maxDurability - delta; - const durabilityValueMinLimit = Math.round((this.getMinWeaponLimitPercentFromConfig(botRole) / 100) * maxDurability); + const durabilityValueMinLimit = Math.round( + (this.getMinWeaponLimitPercentFromConfig(botRole) / 100) * maxDurability, + ); // Dont let weapon dura go below the percent defined in config - return (result >= durabilityValueMinLimit) - ? result - : durabilityValueMinLimit; + return (result >= durabilityValueMinLimit) ? result : durabilityValueMinLimit; } protected generateArmorDurability(botRole: string, maxDurability: number): number @@ -186,12 +186,12 @@ export class DurabilityLimitsHelper const maxDelta = this.getMaxArmorDeltaFromConfig(botRole); const delta = this.randomUtil.getInt(minDelta, maxDelta); const result = maxDurability - delta; - const durabilityValueMinLimit = Math.round((this.getMinArmorLimitPercentFromConfig(botRole) / 100) * maxDurability); + const durabilityValueMinLimit = Math.round( + (this.getMinArmorLimitPercentFromConfig(botRole) / 100) * maxDurability, + ); // Dont let armor dura go below the percent defined in config - return (result >= durabilityValueMinLimit) - ? result - : durabilityValueMinLimit; + return (result >= durabilityValueMinLimit) ? result : durabilityValueMinLimit; } protected getMinWeaponDeltaFromConfig(botRole: string): number @@ -234,7 +234,7 @@ export class DurabilityLimitsHelper return this.botConfig.durability.default.armor.maxDelta; } - protected getMinArmorLimitPercentFromConfig (botRole: string): number + protected getMinArmorLimitPercentFromConfig(botRole: string): number { if (this.botConfig.durability[botRole]) { @@ -244,7 +244,7 @@ export class DurabilityLimitsHelper return this.botConfig.durability.default.armor.minLimitPercent; } - protected getMinWeaponLimitPercentFromConfig (botRole: string): number + protected getMinWeaponLimitPercentFromConfig(botRole: string): number { if (this.botConfig.durability[botRole]) { @@ -253,4 +253,4 @@ export class DurabilityLimitsHelper return this.botConfig.durability.default.weapon.minLimitPercent; } -} \ No newline at end of file +} diff --git a/project/src/helpers/GameEventHelper.ts b/project/src/helpers/GameEventHelper.ts index 14f3097e..b6b677c2 100644 --- a/project/src/helpers/GameEventHelper.ts +++ b/project/src/helpers/GameEventHelper.ts @@ -12,10 +12,9 @@ export class GameEventHelper constructor( @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.seasonalEventConfig = this.configServer.getConfig(ConfigTypes.SEASONAL_EVENT); } - -} \ No newline at end of file +} diff --git a/project/src/helpers/HandbookHelper.ts b/project/src/helpers/HandbookHelper.ts index b674daeb..a5662eb5 100644 --- a/project/src/helpers/HandbookHelper.ts +++ b/project/src/helpers/HandbookHelper.ts @@ -29,7 +29,7 @@ export class LookupCollection @injectable() export class HandbookHelper -{ +{ protected lookupCacheGenerated = false; protected handbookPriceCache = new LookupCollection(); @@ -49,9 +49,7 @@ export class HandbookHelper { this.handbookPriceCache.items.byParent.set(handbookItem.ParentId, []); } - this.handbookPriceCache.items.byParent - .get(handbookItem.ParentId) - .push(handbookItem.Id); + this.handbookPriceCache.items.byParent.get(handbookItem.ParentId).push(handbookItem.Id); } for (const handbookCategory of handbookDb.Categories) @@ -63,9 +61,7 @@ export class HandbookHelper { this.handbookPriceCache.categories.byParent.set(handbookCategory.ParentId, []); } - this.handbookPriceCache.categories.byParent - .get(handbookCategory.ParentId) - .push(handbookCategory.Id); + this.handbookPriceCache.categories.byParent.get(handbookCategory.ParentId).push(handbookCategory.Id); } } } @@ -89,7 +85,7 @@ export class HandbookHelper return this.handbookPriceCache.items.byId.get(tpl); } - const handbookItem = this.databaseServer.getTables().templates.handbook.Items.find(x => x.Id === tpl); + const handbookItem = this.databaseServer.getTables().templates.handbook.Items.find((x) => x.Id === tpl); if (!handbookItem) { const newValue = 0; @@ -103,7 +99,7 @@ export class HandbookHelper /** * Get all items in template with the given parent category - * @param parentId + * @param parentId * @returns string array */ public templatesWithParent(parentId: string): string[] @@ -113,7 +109,7 @@ export class HandbookHelper /** * Does category exist in handbook cache - * @param category + * @param category * @returns true if exists in cache */ public isCategory(category: string): boolean @@ -123,7 +119,7 @@ export class HandbookHelper /** * Get all items associated with a categories parent - * @param categoryParent + * @param categoryParent * @returns string array */ public childrenCategories(categoryParent: string): string[] @@ -164,4 +160,4 @@ export class HandbookHelper const price = this.getTemplatePrice(currencyTypeTo); return price ? Math.round(roubleCurrencyCount / price) : 0; } -} \ No newline at end of file +} diff --git a/project/src/helpers/HealthHelper.ts b/project/src/helpers/HealthHelper.ts index d1443f94..d5b2d3a0 100644 --- a/project/src/helpers/HealthHelper.ts +++ b/project/src/helpers/HealthHelper.ts @@ -21,7 +21,7 @@ export class HealthHelper @inject("WinstonLogger") protected logger: ILogger, @inject("TimeUtil") protected timeUtil: TimeUtil, @inject("SaveServer") protected saveServer: SaveServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.healthConfig = this.configServer.getConfig(ConfigTypes.HEALTH); @@ -36,12 +36,9 @@ export class HealthHelper { const profile = this.saveServer.getProfile(sessionID); - if (!profile.vitality) // Occurs on newly created profiles - { - profile.vitality = { - health: null, - effects: null - }; + if (!profile.vitality) + { // Occurs on newly created profiles + profile.vitality = { health: null, effects: null }; } profile.vitality.health = { Hydration: 0, @@ -53,7 +50,7 @@ export class HealthHelper LeftArm: 0, RightArm: 0, LeftLeg: 0, - RightLeg: 0 + RightLeg: 0, }; profile.vitality.effects = { @@ -63,7 +60,7 @@ export class HealthHelper LeftArm: {}, RightArm: {}, LeftLeg: {}, - RightLeg: {} + RightLeg: {}, }; return profile; @@ -77,7 +74,13 @@ export class HealthHelper * @param addEffects Should effects be added or removed (default - add) * @param deleteExistingEffects Should all prior effects be removed before apply new ones */ - public saveVitality(pmcData: IPmcData, request: ISyncHealthRequestData, sessionID: string, addEffects = true, deleteExistingEffects = true): void + public saveVitality( + pmcData: IPmcData, + request: ISyncHealthRequestData, + sessionID: string, + addEffects = true, + deleteExistingEffects = true, + ): void { const postRaidBodyParts = request.Health; // post raid health settings const profile = this.saveServer.getProfile(sessionID); @@ -96,20 +99,26 @@ export class HealthHelper { profileEffects[bodyPart] = postRaidBodyParts[bodyPart].Effects; } - if (request.IsAlive === true) // is player alive, not is limb alive - { + if (request.IsAlive === true) + { // is player alive, not is limb alive profileHealth[bodyPart] = postRaidBodyParts[bodyPart].Current; } else { - profileHealth[bodyPart] = pmcData.Health.BodyParts[bodyPart].Health.Maximum * this.healthConfig.healthMultipliers.death; + profileHealth[bodyPart] = pmcData.Health.BodyParts[bodyPart].Health.Maximum + * this.healthConfig.healthMultipliers.death; } } // Add effects to body parts if (addEffects) { - this.saveEffects(pmcData, sessionID, this.jsonUtil.clone(this.saveServer.getProfile(sessionID).vitality.effects), deleteExistingEffects); + this.saveEffects( + pmcData, + sessionID, + this.jsonUtil.clone(this.saveServer.getProfile(sessionID).vitality.effects), + deleteExistingEffects, + ); } // Adjust hydration/energy/temp and limb hp @@ -159,7 +168,10 @@ export class HealthHelper if (target === 0) { // Blacked body part - target = Math.round(pmcData.Health.BodyParts[healthModifier].Health.Maximum * this.healthConfig.healthMultipliers.blacked); + target = Math.round( + pmcData.Health.BodyParts[healthModifier].Health.Maximum + * this.healthConfig.healthMultipliers.blacked, + ); } pmcData.Health.BodyParts[healthModifier].Health.Current = Math.round(target); @@ -176,7 +188,12 @@ export class HealthHelper * @param bodyPartsWithEffects dict of body parts with effects that should be added to profile * @param addEffects Should effects be added back to profile */ - protected saveEffects(pmcData: IPmcData, sessionId: string, bodyPartsWithEffects: Effects, deleteExistingEffects = true): void + protected saveEffects( + pmcData: IPmcData, + sessionId: string, + bodyPartsWithEffects: Effects, + deleteExistingEffects = true, + ): void { if (!this.healthConfig.save.effects) { @@ -208,7 +225,9 @@ export class HealthHelper // Sometimes the value can be Infinity instead of -1, blame HealthListener.cs in modules if (time === "Infinity") { - this.logger.warning(`Effect ${effectType} found with value of Infinity, changed to -1, this is an issue with HealthListener.cs`); + this.logger.warning( + `Effect ${effectType} found with value of Infinity, changed to -1, this is an issue with HealthListener.cs`, + ); time = -1; } this.addEffect(pmcData, bodyPart, effectType, time); @@ -245,7 +264,7 @@ export class HealthHelper } } - protected isEmpty(map: Record): boolean + protected isEmpty(map: Record): boolean { for (const key in map) { @@ -257,4 +276,4 @@ export class HealthHelper return true; } -} \ No newline at end of file +} diff --git a/project/src/helpers/HideoutHelper.ts b/project/src/helpers/HideoutHelper.ts index 4255b98e..24acd20a 100644 --- a/project/src/helpers/HideoutHelper.ts +++ b/project/src/helpers/HideoutHelper.ts @@ -48,7 +48,7 @@ export class HideoutHelper @inject("InventoryHelper") protected inventoryHelper: InventoryHelper, @inject("PlayerService") protected playerService: PlayerService, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.hideoutConfig = this.configServer.getConfig(ConfigTypes.HIDEOUT); @@ -61,9 +61,13 @@ export class HideoutHelper * @param sessionID Session id * @returns client response */ - public registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinuousProductionStartRequestData, sessionID: string): IItemEventRouterResponse + public registerProduction( + pmcData: IPmcData, + body: IHideoutSingleProductionStartRequestData | IHideoutContinuousProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse { - const recipe = this.databaseServer.getTables().hideout.production.find(p => p._id === body.recipeId); + const recipe = this.databaseServer.getTables().hideout.production.find((p) => p._id === body.recipeId); if (!recipe) { this.logger.error(this.localisationService.getText("hideout-missing_recipe_in_db", body.recipeId)); @@ -71,7 +75,8 @@ export class HideoutHelper return this.httpResponse.appendErrorToOutput(this.eventOutputHolder.getOutput(sessionID)); } - const modifiedProductionTime = recipe.productionTime - this.getCraftingSkillProductionTimeReduction(pmcData, recipe.productionTime); + const modifiedProductionTime = recipe.productionTime + - this.getCraftingSkillProductionTimeReduction(pmcData, recipe.productionTime); // @Important: Here we need to be very exact: // - normal recipe: Production time value is stored in attribute "productionType" with small "p" @@ -80,7 +85,11 @@ export class HideoutHelper { pmcData.Hideout.Production = {}; } - pmcData.Hideout.Production[body.recipeId] = this.initProduction(body.recipeId, modifiedProductionTime, recipe.needFuelForAllProductionTime); + pmcData.Hideout.Production[body.recipeId] = this.initProduction( + body.recipeId, + modifiedProductionTime, + recipe.needFuelForAllProductionTime, + ); } /** @@ -100,14 +109,14 @@ export class HideoutHelper Interrupted: false, NeedFuelForAllProductionTime: needFuelForAllProductionTime, // Used when sending to client needFuelForAllProductionTime: needFuelForAllProductionTime, // used when stored in production.json - SkipTime: 0 + SkipTime: 0, }; } /** * Is the provided object a Production type - * @param productive - * @returns + * @param productive + * @returns */ public isProductionType(productive: Productive): productive is Production { @@ -124,12 +133,15 @@ export class HideoutHelper // Handle additional changes some bonuses need before being added switch (bonus.type) { - case "StashSize": { + case "StashSize": + { // Find stash item and adjust tpl to new tpl from bonus - const stashItem = pmcData.Inventory.items.find(x => x._id === pmcData.Inventory.stash); + const stashItem = pmcData.Inventory.items.find((x) => x._id === pmcData.Inventory.stash); if (!stashItem) { - this.logger.warning(`Unable to apply StashSize bonus, stash with id: ${pmcData.Inventory.stash} not found`); + this.logger.warning( + `Unable to apply StashSize bonus, stash with id: ${pmcData.Inventory.stash} not found`, + ); } stashItem._tpl = bonus.templateId; @@ -140,7 +152,7 @@ export class HideoutHelper pmcData.Health.Energy.Maximum += bonus.value; break; case "TextBonus": - //Delete values before they're added to profile + // Delete values before they're added to profile delete bonus.value; delete bonus.passive; delete bonus.production; @@ -173,15 +185,19 @@ export class HideoutHelper * @param pmcData Player profile * @returns Properties */ - protected getHideoutProperties(pmcData: IPmcData): { btcFarmCGs: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; } + protected getHideoutProperties( + pmcData: IPmcData, + ): { btcFarmCGs: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; } { - const bitcoinFarm = pmcData.Hideout.Areas.find(x => x.type === HideoutAreas.BITCOIN_FARM); - const bitcoinCount = bitcoinFarm?.slots.filter(slot => slot.item).length ?? 0; // Get slots with an item property + const bitcoinFarm = pmcData.Hideout.Areas.find((x) => x.type === HideoutAreas.BITCOIN_FARM); + const bitcoinCount = bitcoinFarm?.slots.filter((slot) => slot.item).length ?? 0; // Get slots with an item property const hideoutProperties = { btcFarmCGs: bitcoinCount, - isGeneratorOn: pmcData.Hideout.Areas.find(x => x.type === HideoutAreas.GENERATOR)?.active ?? false, - waterCollectorHasFilter: this.doesWaterCollectorHaveFilter(pmcData.Hideout.Areas.find(x => x.type === HideoutAreas.WATER_COLLECTOR)) + isGeneratorOn: pmcData.Hideout.Areas.find((x) => x.type === HideoutAreas.GENERATOR)?.active ?? false, + waterCollectorHasFilter: this.doesWaterCollectorHaveFilter( + pmcData.Hideout.Areas.find((x) => x.type === HideoutAreas.WATER_COLLECTOR), + ), }; return hideoutProperties; @@ -189,23 +205,27 @@ export class HideoutHelper protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean { - if (waterCollector.level === 3) // can put filters in from L3 - { + if (waterCollector.level === 3) + { // can put filters in from L3 // Has filter in at least one slot - return waterCollector.slots.some(x => x.item); + return waterCollector.slots.some((x) => x.item); } - + // No Filter return false; } - + /** * Update progress timer for water collector * @param pmcData profile to update * @param productionId id of water collection production to update * @param hideoutProperties Hideout properties */ - protected updateWaterCollectorProductionTimer(pmcData: IPmcData, productionId: string, hideoutProperties: { btcFarmCGs?: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; }): void + protected updateWaterCollectorProductionTimer( + pmcData: IPmcData, + productionId: string, + hideoutProperties: { btcFarmCGs?: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; }, + ): void { const timeElapsed = this.getTimeElapsedSinceLastServerTick(pmcData, hideoutProperties.isGeneratorOn); if (hideoutProperties.waterCollectorHasFilter) @@ -219,7 +239,10 @@ export class HideoutHelper * @param pmcData Profile to check for productions and update * @param hideoutProperties Hideout properties */ - protected updateProductionTimers(pmcData: IPmcData, hideoutProperties: { btcFarmCGs: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; }): void + protected updateProductionTimers( + pmcData: IPmcData, + hideoutProperties: { btcFarmCGs: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; }, + ): void { const recipes = this.databaseServer.getTables().hideout.production; @@ -263,12 +286,16 @@ export class HideoutHelper if (prodId === HideoutHelper.bitcoinFarm) { - pmcData.Hideout.Production[prodId] = this.updateBitcoinFarm(pmcData, hideoutProperties.btcFarmCGs, hideoutProperties.isGeneratorOn); + pmcData.Hideout.Production[prodId] = this.updateBitcoinFarm( + pmcData, + hideoutProperties.btcFarmCGs, + hideoutProperties.isGeneratorOn, + ); continue; } // Other recipes not covered by above - const recipe = recipes.find(r => r._id === prodId); + const recipe = recipes.find((r) => r._id === prodId); if (!recipe) { this.logger.error(this.localisationService.getText("hideout-missing_recipe_for_area", prodId)); @@ -285,9 +312,14 @@ export class HideoutHelper * @param pmcData Player profile * @param prodId Production id being crafted * @param recipe Recipe data being crafted - * @param hideoutProperties + * @param hideoutProperties */ - protected updateProductionProgress(pmcData: IPmcData, prodId: string, recipe: IHideoutProduction, hideoutProperties: { btcFarmCGs?: number; isGeneratorOn: boolean; waterCollectorHasFilter?: boolean; }): void + protected updateProductionProgress( + pmcData: IPmcData, + prodId: string, + recipe: IHideoutProduction, + hideoutProperties: { btcFarmCGs?: number; isGeneratorOn: boolean; waterCollectorHasFilter?: boolean; }, + ): void { // Production is complete, no need to do any calculations if (this.doesProgressMatchProductionTime(pmcData, prodId)) @@ -331,7 +363,8 @@ export class HideoutHelper */ protected updateScavCaseProductionTimer(pmcData: IPmcData, productionId: string): void { - const timeElapsed = (this.timeUtil.getTimestamp() - pmcData.Hideout.Production[productionId].StartTimestamp) - pmcData.Hideout.Production[productionId].Progress; + const timeElapsed = (this.timeUtil.getTimestamp() - pmcData.Hideout.Production[productionId].StartTimestamp) + - pmcData.Hideout.Production[productionId].Progress; pmcData.Hideout.Production[productionId].Progress += timeElapsed; } @@ -341,7 +374,11 @@ export class HideoutHelper * @param pmcData Profile to update areas of * @param hideoutProperties hideout properties */ - protected updateAreasWithResources(sessionID: string, pmcData: IPmcData, hideoutProperties: { btcFarmCGs: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; }): void + protected updateAreasWithResources( + sessionID: string, + pmcData: IPmcData, + hideoutProperties: { btcFarmCGs: number; isGeneratorOn: boolean; waterCollectorHasFilter: boolean; }, + ): void { for (const area of pmcData.Hideout.Areas) { @@ -371,9 +408,10 @@ export class HideoutHelper { // 1 resource last 14 min 27 sec, 1/14.45/60 = 0.00115 // 10-10-2021 From wiki, 1 resource last 12 minutes 38 seconds, 1/12.63333/60 = 0.00131 - let fuelDrainRate = this.databaseServer.getTables().hideout.settings.generatorFuelFlowRate * this.hideoutConfig.runIntervalSeconds; + let fuelDrainRate = this.databaseServer.getTables().hideout.settings.generatorFuelFlowRate + * this.hideoutConfig.runIntervalSeconds; // implemented moddable bonus for fuel consumption bonus instead of using solar power variable as before - const fuelBonus = pmcData.Bonuses.find(b => b.type === "FuelConsumption"); + const fuelBonus = pmcData.Bonuses.find((b) => b.type === "FuelConsumption"); const fuelBonusPercent = 1.0 - (fuelBonus ? Math.abs(fuelBonus.value) : 0) / 100; fuelDrainRate *= fuelBonusPercent; // Hideout management resource consumption bonus: @@ -410,7 +448,7 @@ export class HideoutHelper resourceValue = Math.round(resourceValue * 10000) / 10000; pointsConsumed = Math.round(pointsConsumed * 10000) / 10000; - //check unit consumed for increment skill point + // check unit consumed for increment skill point if (pmcData && Math.floor(pointsConsumed / 10) >= 1) { this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.HIDEOUT_MANAGEMENT, 1); @@ -442,7 +480,12 @@ export class HideoutHelper } } - protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void + protected updateWaterCollector( + sessionId: string, + pmcData: IPmcData, + area: HideoutArea, + isGeneratorOn: boolean, + ): void { // Skip water collector when not level 3 (cant collect until 3) if (area.level !== 3) @@ -464,7 +507,7 @@ export class HideoutHelper recipeId: HideoutHelper.waterCollector, Action: "HideoutSingleProductionStart", items: [], - timestamp: this.timeUtil.getTimestamp() + timestamp: this.timeUtil.getTimestamp(), }; this.registerProduction(pmcData, recipe, sessionId); @@ -479,14 +522,24 @@ export class HideoutHelper * @param pmcData Player profile * @returns Updated HideoutArea object */ - protected updateWaterFilters(waterFilterArea: HideoutArea, production: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea + protected updateWaterFilters( + waterFilterArea: HideoutArea, + production: Production, + isGeneratorOn: boolean, + pmcData: IPmcData, + ): HideoutArea { let filterDrainRate = this.getWaterFilterDrainRate(pmcData); const productionTime = this.getTotalProductionTimeSeconds(HideoutHelper.waterCollector); const secondsSinceServerTick = this.getTimeElapsedSinceLastServerTick(pmcData, isGeneratorOn); - - filterDrainRate = this.adjustWaterFilterDrainRate(secondsSinceServerTick, productionTime, production.Progress, filterDrainRate); - + + filterDrainRate = this.adjustWaterFilterDrainRate( + secondsSinceServerTick, + productionTime, + production.Progress, + filterDrainRate, + ); + // Production hasn't completed let pointsConsumed = 0; if (production.Progress < productionTime) @@ -510,7 +563,8 @@ export class HideoutHelper } else { - pointsConsumed = (waterFilterArea.slots[i].item[0].upd.Resource.UnitsConsumed || 0) + filterDrainRate; + pointsConsumed = (waterFilterArea.slots[i].item[0].upd.Resource.UnitsConsumed || 0) + + filterDrainRate; resourceValue -= filterDrainRate; } @@ -547,15 +601,20 @@ export class HideoutHelper } /** - * Get an adjusted water filter drain rate based on time elapsed since last run, + * Get an adjusted water filter drain rate based on time elapsed since last run, * handle edge case when craft time has gone on longer than total production time * @param secondsSinceServerTick Time passed * @param totalProductionTime Total time collecting water - * @param productionProgress how far water collector has progressed - * @param baseFilterDrainRate Base drain rate - * @returns + * @param productionProgress how far water collector has progressed + * @param baseFilterDrainRate Base drain rate + * @returns */ - protected adjustWaterFilterDrainRate(secondsSinceServerTick: number, totalProductionTime: number, productionProgress: number, baseFilterDrainRate: number): number + protected adjustWaterFilterDrainRate( + secondsSinceServerTick: number, + totalProductionTime: number, + productionProgress: number, + baseFilterDrainRate: number, + ): number { const drainRateMultiplier = secondsSinceServerTick > totalProductionTime ? (totalProductionTime - productionProgress) // more time passed than prod time, get total minus the current progress @@ -588,26 +647,23 @@ export class HideoutHelper */ protected getTotalProductionTimeSeconds(prodId: string): number { - const recipe = this.databaseServer.getTables().hideout.production.find(prod => prod._id === prodId); + const recipe = this.databaseServer.getTables().hideout.production.find((prod) => prod._id === prodId); return (recipe.productionTime || 0); } /** * Create a upd object using passed in parameters - * @param stackCount - * @param resourceValue - * @param resourceUnitsConsumed + * @param stackCount + * @param resourceValue + * @param resourceUnitsConsumed * @returns Upd */ protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd { return { StackObjectsCount: stackCount, - Resource: { - Value: resourceValue, - UnitsConsumed: resourceUnitsConsumed - } + Resource: { Value: resourceValue, UnitsConsumed: resourceUnitsConsumed }, }; } @@ -618,7 +674,8 @@ export class HideoutHelper Lasts for 17 hours 38 minutes and 49 seconds (23 hours 31 minutes and 45 seconds with elite hideout management skill), 300/17.64694/60/60 = 0.004722 */ - let filterDrainRate = this.databaseServer.getTables().hideout.settings.airFilterUnitFlowRate * this.hideoutConfig.runIntervalSeconds; + let filterDrainRate = this.databaseServer.getTables().hideout.settings.airFilterUnitFlowRate + * this.hideoutConfig.runIntervalSeconds; // Hideout management resource consumption bonus: const hideoutManagementConsumptionBonus = 1.0 - this.getHideoutManagementConsumptionBonus(pmcData); filterDrainRate *= hideoutManagementConsumptionBonus; @@ -644,7 +701,7 @@ export class HideoutHelper resourceValue = Math.round(resourceValue * 10000) / 10000; pointsConsumed = Math.round(pointsConsumed * 10000) / 10000; - //check unit consumed for increment skill point + // check unit consumed for increment skill point if (pmcData && Math.floor(pointsConsumed / 10) >= 1) { this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.HIDEOUT_MANAGEMENT, 1); @@ -655,10 +712,7 @@ export class HideoutHelper { airFilterArea.slots[i].item[0].upd = { StackObjectsCount: 1, - Resource: { - Value: resourceValue, - UnitsConsumed: pointsConsumed - } + Resource: { Value: resourceValue, UnitsConsumed: pointsConsumed }, }; this.logger.debug(`Air filter: ${resourceValue} filter left on slot ${i + 1}`); break; // Break here to avoid updating all filters @@ -672,11 +726,13 @@ export class HideoutHelper } } } - + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production { const btcProd = pmcData.Hideout.Production[HideoutHelper.bitcoinFarm]; - const bitcoinProdData = this.databaseServer.getTables().hideout.production.find(p => p._id === "5d5c205bd582a50d042a3c0e"); + const bitcoinProdData = this.databaseServer.getTables().hideout.production.find((p) => + p._id === "5d5c205bd582a50d042a3c0e" + ); const coinSlotCount = this.getBTCSlots(pmcData); // Full on bitcoins, halt progress @@ -728,7 +784,8 @@ export class HideoutHelper } */ // BSG finally fixed their settings, they now get loaded from the settings and used in the client - const coinCraftTimeSeconds = bitcoinProdData.productionTime / (1 + (btcFarmCGs - 1) * this.databaseServer.getTables().hideout.settings.gpuBoostRate); + const coinCraftTimeSeconds = bitcoinProdData.productionTime + / (1 + (btcFarmCGs - 1) * this.databaseServer.getTables().hideout.settings.gpuBoostRate); while (btcProd.Progress > coinCraftTimeSeconds) { if (btcProd.Products.length < coinSlotCount) @@ -762,9 +819,7 @@ export class HideoutHelper btcProd.Products.push({ _id: this.hashUtil.generate(), _tpl: "59faff1d86f7746c51718c9c", - upd: { - "StackObjectsCount": 1 - } + upd: { StackObjectsCount: 1 }, }); btcProd.Progress -= coinCraftTimeSeconds; @@ -777,13 +832,17 @@ export class HideoutHelper * @param recipe Hideout production recipe being crafted we need the ticks for * @returns Amount of time elapsed in seconds */ - protected getTimeElapsedSinceLastServerTick(pmcData: IPmcData, isGeneratorOn: boolean, recipe: IHideoutProduction = null): number + protected getTimeElapsedSinceLastServerTick( + pmcData: IPmcData, + isGeneratorOn: boolean, + recipe: IHideoutProduction = null, + ): number { // Reduce time elapsed (and progress) when generator is off let timeElapsed = this.timeUtil.getTimestamp() - pmcData.Hideout.sptUpdateLastRunTimestamp; - if (recipe?.areaType === HideoutAreas.LAVATORY) // Lavatory works at 100% when power is on / off - { + if (recipe?.areaType === HideoutAreas.LAVATORY) + { // Lavatory works at 100% when power is on / off return timeElapsed; } @@ -802,7 +861,9 @@ export class HideoutHelper */ protected getBTCSlots(pmcData: IPmcData): number { - const bitcoinProduction = this.databaseServer.getTables().hideout.production.find(p => p._id === HideoutHelper.bitcoinFarm); + const bitcoinProduction = this.databaseServer.getTables().hideout.production.find((p) => + p._id === HideoutHelper.bitcoinFarm + ); const productionSlots = bitcoinProduction?.productionLimitCount || 3; const hasManagementSkillSlots = this.profileHelper.hasEliteSkillLevel(SkillTypes.HIDEOUT_MANAGEMENT, pmcData); const managementSlotsCount = this.getBitcoinMinerContainerSlotSize() || 2; @@ -815,7 +876,8 @@ export class HideoutHelper */ protected getBitcoinMinerContainerSlotSize(): number { - return this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.BitcoinFarm.Container; + return this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.BitcoinFarm + .Container; } /** @@ -836,11 +898,11 @@ export class HideoutHelper // at level 1 you already get 0.5%, so it goes up until level 50. For some reason the wiki // says that it caps at level 51 with 25% but as per dump data that is incorrect apparently let roundedLevel = Math.floor(hideoutManagementSkill.Progress / 100); - roundedLevel = (roundedLevel === 51) - ? roundedLevel - 1 - : roundedLevel; + roundedLevel = (roundedLevel === 51) ? roundedLevel - 1 : roundedLevel; - return (roundedLevel * this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.ConsumptionReductionPerLevel) / 100; + return (roundedLevel + * this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement + .ConsumptionReductionPerLevel) / 100; } /** @@ -851,7 +913,7 @@ export class HideoutHelper */ protected getCraftingSkillProductionTimeReduction(pmcData: IPmcData, productionTime: number): number { - const craftingSkill = pmcData.Skills.Common.find(x=> x.Id === SkillTypes.CRAFTING); + const craftingSkill = pmcData.Skills.Common.find((x) => x.Id === SkillTypes.CRAFTING); if (!craftingSkill) { return productionTime; @@ -875,7 +937,11 @@ export class HideoutHelper * @param sessionId Session id * @returns IItemEventRouterResponse */ - public getBTC(pmcData: IPmcData, request: IHideoutTakeProductionRequestData, sessionId: string): IItemEventRouterResponse + public getBTC( + pmcData: IPmcData, + request: IHideoutTakeProductionRequestData, + sessionId: string, + ): IItemEventRouterResponse { const output = this.eventOutputHolder.getOutput(sessionId); @@ -885,7 +951,7 @@ export class HideoutHelper { const errorMsg = this.localisationService.getText("hideout-no_bitcoins_to_collect"); this.logger.error(errorMsg); - + return this.httpResponse.appendErrorToOutput(output, errorMsg); } @@ -921,9 +987,9 @@ export class HideoutHelper items: [{ // eslint-disable-next-line @typescript-eslint/naming-convention item_id: HideoutHelper.bitcoin, - count: pmcData.Hideout.Production[HideoutHelper.bitcoinFarm].Products.length + count: pmcData.Hideout.Production[HideoutHelper.bitcoinFarm].Products.length, }], - tid: "ragfair" + tid: "ragfair", }; } @@ -933,9 +999,9 @@ export class HideoutHelper */ public unlockHideoutWallInProfile(pmcProfile: IPmcData): void { - const waterCollector = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WATER_COLLECTOR); - const medStation = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.MEDSTATION); - const wall = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.EMERGENCY_WALL); + const waterCollector = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.WATER_COLLECTOR); + const medStation = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.MEDSTATION); + const wall = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.EMERGENCY_WALL); // No collector or med station, skip if (!(waterCollector && medStation)) @@ -957,9 +1023,7 @@ export class HideoutHelper */ protected hideoutImprovementIsComplete(improvement: IHideoutImprovement): boolean { - return improvement?.completed - ? true - : false; + return improvement?.completed ? true : false; } /** @@ -971,10 +1035,13 @@ export class HideoutHelper for (const improvementId in pmcProfile.Hideout.Improvement) { const improvementDetails = pmcProfile.Hideout.Improvement[improvementId]; - if (improvementDetails.completed === false && improvementDetails.improveCompleteTimestamp < this.timeUtil.getTimestamp()) + if ( + improvementDetails.completed === false + && improvementDetails.improveCompleteTimestamp < this.timeUtil.getTimestamp() + ) { improvementDetails.completed = true; } } } -} \ No newline at end of file +} diff --git a/project/src/helpers/HttpServerHelper.ts b/project/src/helpers/HttpServerHelper.ts index 19a85a34..d647c047 100644 --- a/project/src/helpers/HttpServerHelper.ts +++ b/project/src/helpers/HttpServerHelper.ts @@ -10,20 +10,18 @@ export class HttpServerHelper protected httpConfig: IHttpConfig; protected mime = { - "css": "text/css", - "bin": "application/octet-stream", - "html": "text/html", - "jpg": "image/jpeg", - "js": "text/javascript", - "json": "application/json", - "png": "image/png", - "svg": "image/svg+xml", - "txt": "text/plain" + css: "text/css", + bin: "application/octet-stream", + html: "text/html", + jpg: "image/jpeg", + js: "text/javascript", + json: "application/json", + png: "image/png", + svg: "image/svg+xml", + txt: "text/plain", }; - constructor( - @inject("ConfigServer") protected configServer: ConfigServer - ) + constructor(@inject("ConfigServer") protected configServer: ConfigServer) { this.httpConfig = this.configServer.getConfig(ConfigTypes.HTTP); } @@ -60,7 +58,7 @@ export class HttpServerHelper public sendTextJson(resp: any, output: any): void { // eslint-disable-next-line @typescript-eslint/naming-convention - resp.writeHead(200, "OK", { "Content-Type": this.mime["json"] }); + resp.writeHead(200, "OK", { "Content-Type": this.mime.json }); resp.end(output); } -} \ No newline at end of file +} diff --git a/project/src/helpers/InRaidHelper.ts b/project/src/helpers/InRaidHelper.ts index 5609cca2..523982ea 100644 --- a/project/src/helpers/InRaidHelper.ts +++ b/project/src/helpers/InRaidHelper.ts @@ -39,7 +39,7 @@ export class InRaidHelper @inject("PaymentHelper") protected paymentHelper: PaymentHelper, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("ProfileFixerService") protected profileFixerService: ProfileFixerService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.lostOnDeathConfig = this.configServer.getConfig(ConfigTypes.LOST_ON_DEATH); @@ -95,8 +95,13 @@ export class InRaidHelper { return acc + standingForKill; } - this.logger.warning(this.localisationService.getText("inraid-missing_standing_for_kill", {victimSide: victim.Side, victimRole: victim.Role})); - + this.logger.warning( + this.localisationService.getText("inraid-missing_standing_for_kill", { + victimSide: victim.Side, + victimRole: victim.Role, + }), + ); + return acc; }, existingFenceStanding); @@ -116,7 +121,7 @@ export class InRaidHelper // Scavs and bosses return botTypes[victim.Role.toLowerCase()]?.experience?.standingForKill; } - + // PMCs - get by bear/usec return botTypes[victim.Side.toLowerCase()]?.experience?.standingForKill; } @@ -131,7 +136,11 @@ export class InRaidHelper * @param sessionID Session id * @returns Reset profile object */ - public updateProfileBaseStats(profileData: IPmcData, saveProgressRequest: ISaveProgressRequestData, sessionID: string): IPmcData + public updateProfileBaseStats( + profileData: IPmcData, + saveProgressRequest: ISaveProgressRequestData, + sessionID: string, + ): IPmcData { // remove old skill fatigue this.resetSkillPointsEarnedDuringRaid(saveProgressRequest.profile); @@ -168,7 +177,9 @@ export class InRaidHelper if (matchingPreRaidCounter.value !== postRaidValue) { - this.logger.error(`Backendcounter: ${backendCounterKey} value is different post raid, old: ${matchingPreRaidCounter.value} new: ${postRaidValue}`); + this.logger.error( + `Backendcounter: ${backendCounterKey} value is different post raid, old: ${matchingPreRaidCounter.value} new: ${postRaidValue}`, + ); } } @@ -196,7 +207,6 @@ export class InRaidHelper return profileData; } - /** * Look for quests not are now status = fail that were not failed pre-raid and run the failQuest() function * @param sessionId Player id @@ -204,7 +214,12 @@ export class InRaidHelper * @param preRaidQuests Quests prior to starting raid * @param postRaidQuests Quest after raid */ - protected processFailedQuests(sessionId: string, pmcData: IPmcData, preRaidQuests: IQuestStatus[], postRaidQuests: IQuestStatus[]): void + protected processFailedQuests( + sessionId: string, + pmcData: IPmcData, + preRaidQuests: IQuestStatus[], + postRaidQuests: IQuestStatus[], + ): void { if (!preRaidQuests) { @@ -216,7 +231,7 @@ export class InRaidHelper for (const postRaidQuest of postRaidQuests) { // Find matching pre-raid quest - const preRaidQuest = preRaidQuests?.find(x => x.qid === postRaidQuest.qid); + const preRaidQuest = preRaidQuests?.find((x) => x.qid === postRaidQuest.qid); if (preRaidQuest) { // Post-raid quest is failed but wasn't pre-raid @@ -227,12 +242,11 @@ export class InRaidHelper const failBody: IFailQuestRequestData = { Action: "QuestComplete", qid: postRaidQuest.qid, - removeExcessItems: true + removeExcessItems: true, }; this.questHelper.failQuest(pmcData, failBody, sessionId); } } - } } @@ -249,7 +263,10 @@ export class InRaidHelper * @param saveProgressRequest post-raid request * @param profileData player profile on server */ - protected transferPostRaidLimbEffectsToProfile(saveProgressRequest: ISaveProgressRequestData, profileData: IPmcData): void + protected transferPostRaidLimbEffectsToProfile( + saveProgressRequest: ISaveProgressRequestData, + profileData: IPmcData, + ): void { // Iterate over each body part for (const bodyPartId in saveProgressRequest.profile.Health.BodyParts) @@ -274,7 +291,7 @@ export class InRaidHelper } // Add effect to server profile - profileBodyPartEffects[effect] = {Time: effectDetails.Time ?? -1}; + profileBodyPartEffects[effect] = { Time: effectDetails.Time ?? -1 }; } } } @@ -284,7 +301,10 @@ export class InRaidHelper * @param tradersServerProfile Server * @param tradersClientProfile Client */ - protected applyTraderStandingAdjustments(tradersServerProfile: Record, tradersClientProfile: Record): void + protected applyTraderStandingAdjustments( + tradersServerProfile: Record, + tradersClientProfile: Record, + ): void { for (const traderId in tradersClientProfile) { @@ -327,15 +347,16 @@ export class InRaidHelper public removeSpawnedInSessionPropertyFromItems(postRaidProfile: IPostRaidPmcData): IPostRaidPmcData { const dbItems = this.databaseServer.getTables().templates.items; - const itemsToRemovePropertyFrom = postRaidProfile.Inventory.items.filter(x => + const itemsToRemovePropertyFrom = postRaidProfile.Inventory.items.filter((x) => { // Has upd object + upd.SpawnedInSession property + not a quest item return "upd" in x && "SpawnedInSession" in x.upd && !dbItems[x._tpl]._props.QuestItem - && !(this.inRaidConfig.keepFiRSecureContainerOnDeath && this.itemHelper.itemIsInsideContainer(x, "SecuredContainer", postRaidProfile.Inventory.items)); + && !(this.inRaidConfig.keepFiRSecureContainerOnDeath + && this.itemHelper.itemIsInsideContainer(x, "SecuredContainer", postRaidProfile.Inventory.items)); }); - itemsToRemovePropertyFrom.forEach(item => + itemsToRemovePropertyFrom.forEach((item) => { delete item.upd.SpawnedInSession; }); @@ -380,8 +401,8 @@ export class InRaidHelper public deleteInventory(pmcData: IPmcData, sessionID: string): void { // Get inventory item ids to remove from players profile - const itemIdsToDeleteFromProfile = this.getInventoryItemsLostOnDeath(pmcData).map(x => x._id); - itemIdsToDeleteFromProfile.forEach(x => + const itemIdsToDeleteFromProfile = this.getInventoryItemsLostOnDeath(pmcData).map((x) => x._id); + itemIdsToDeleteFromProfile.forEach((x) => { this.inventoryHelper.removeItem(pmcData, x, sessionID); }); @@ -397,30 +418,30 @@ export class InRaidHelper */ protected getInventoryItemsLostOnDeath(pmcProfile: IPmcData): Item[] { - const inventoryItems = pmcProfile.Inventory.items ?? []; + const inventoryItems = pmcProfile.Inventory.items ?? []; const equipment = pmcProfile?.Inventory?.equipment; const questRaidItems = pmcProfile?.Inventory?.questRaidItems; - return inventoryItems.filter(x => + return inventoryItems.filter((x) => { // Keep items flagged as kept after death if (this.isItemKeptAfterDeath(pmcProfile, x)) { return false; } - + // Remove normal items or quest raid items if (x.parentId === equipment || x.parentId === questRaidItems) { return true; } - + // Pocket items are not lost on death if (x.slotId.startsWith("pocket")) { return true; } - + return false; }); } @@ -432,13 +453,13 @@ export class InRaidHelper */ protected getBaseItemsInRigPocketAndBackpack(pmcData: IPmcData): Item[] { - const rig = pmcData.Inventory.items.find(x => x.slotId === "TacticalVest"); - const pockets = pmcData.Inventory.items.find(x => x.slotId === "Pockets"); - const backpack = pmcData.Inventory.items.find(x => x.slotId === "Backpack"); + const rig = pmcData.Inventory.items.find((x) => x.slotId === "TacticalVest"); + const pockets = pmcData.Inventory.items.find((x) => x.slotId === "Pockets"); + const backpack = pmcData.Inventory.items.find((x) => x.slotId === "Backpack"); - const baseItemsInRig = pmcData.Inventory.items.filter(x => x.parentId === rig?._id); - const baseItemsInPockets = pmcData.Inventory.items.filter(x => x.parentId === pockets?._id); - const baseItemsInBackpack = pmcData.Inventory.items.filter(x => x.parentId === backpack?._id); + const baseItemsInRig = pmcData.Inventory.items.filter((x) => x.parentId === rig?._id); + const baseItemsInPockets = pmcData.Inventory.items.filter((x) => x.parentId === pockets?._id); + const baseItemsInBackpack = pmcData.Inventory.items.filter((x) => x.parentId === backpack?._id); return [...baseItemsInRig, ...baseItemsInPockets, ...baseItemsInBackpack]; } @@ -510,7 +531,7 @@ export class InRaidHelper "pocket1", "pocket2", "pocket3", - "pocket4" + "pocket4", ]; let inventoryItems: Item[] = []; @@ -543,10 +564,7 @@ export class InRaidHelper } // Add these new found items to our list of inventory items - inventoryItems = [ - ...inventoryItems, - ...foundItems - ]; + inventoryItems = [...inventoryItems, ...foundItems]; // Now find the children of these items newItems = foundItems; @@ -554,4 +572,4 @@ export class InRaidHelper return inventoryItems; } -} \ No newline at end of file +} diff --git a/project/src/helpers/InventoryHelper.ts b/project/src/helpers/InventoryHelper.ts index 455f38f5..6e374525 100644 --- a/project/src/helpers/InventoryHelper.ts +++ b/project/src/helpers/InventoryHelper.ts @@ -32,11 +32,11 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; export interface OwnerInventoryItems { /** Inventory items from source */ - from: Item[] + from: Item[]; /** Inventory items at destination */ - to: Item[] - sameInventory: boolean, - isMail: boolean + to: Item[]; + sameInventory: boolean; + isMail: boolean; } @injectable() @@ -58,7 +58,7 @@ export class InventoryHelper @inject("ContainerHelper") protected containerHelper: ContainerHelper, @inject("ProfileHelper") protected profileHelper: ProfileHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.inventoryConfig = this.configServer.getConfig(ConfigTypes.INVENTORY); @@ -76,7 +76,16 @@ export class InventoryHelper * @param useSortingTable Allow items to go into sorting table when stash has no space * @returns IItemEventRouterResponse */ - public addItem(pmcData: IPmcData, request: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: () => void, foundInRaid = false, addUpd = null, useSortingTable = false): IItemEventRouterResponse + public addItem( + pmcData: IPmcData, + request: IAddItemRequestData, + output: IItemEventRouterResponse, + sessionID: string, + callback: () => void, + foundInRaid = false, + addUpd = null, + useSortingTable = false, + ): IItemEventRouterResponse { const itemLib: Item[] = []; // TODO: what is the purpose of this property const itemsToAdd: IAddItemTempObject[] = []; @@ -85,7 +94,9 @@ export class InventoryHelper { if (requestItem.item_id in this.databaseServer.getTables().globals.ItemPresets) { - const presetItems = this.jsonUtil.clone(this.databaseServer.getTables().globals.ItemPresets[requestItem.item_id]._items); + const presetItems = this.jsonUtil.clone( + this.databaseServer.getTables().globals.ItemPresets[requestItem.item_id]._items, + ); itemLib.push(...presetItems); requestItem.isPreset = true; requestItem.item_id = presetItems[0]._id; @@ -97,7 +108,7 @@ export class InventoryHelper else if (request.tid === Traders.FENCE) { const fenceItems = this.fenceService.getRawFenceAssorts().items; - const itemIndex = fenceItems.findIndex(i => i._id === requestItem.item_id); + const itemIndex = fenceItems.findIndex((i) => i._id === requestItem.item_id); if (itemIndex === -1) { this.logger.debug(`Tried to buy item ${requestItem.item_id} from fence that no longer exists`); @@ -105,7 +116,10 @@ export class InventoryHelper return this.httpResponse.appendErrorToOutput(output, message); } - const purchasedItemWithChildren = this.itemHelper.findAndReturnChildrenAsItems(fenceItems, requestItem.item_id); + const purchasedItemWithChildren = this.itemHelper.findAndReturnChildrenAsItems( + fenceItems, + requestItem.item_id, + ); addUpd = purchasedItemWithChildren[0].upd; // Must persist the fence upd properties (e.g. durability/currentHp) itemLib.push(...purchasedItemWithChildren); } @@ -118,7 +132,9 @@ export class InventoryHelper // Only grab the relevant trader items and add unique values const traderItems = this.traderAssortHelper.getAssort(sessionID, request.tid).items; const relevantItems = this.itemHelper.findAndReturnChildrenAsItems(traderItems, requestItem.item_id); - const toAdd = relevantItems.filter(traderItem => !itemLib.some(item => traderItem._id === item._id)); // what's this + const toAdd = relevantItems.filter((traderItem) => + !itemLib.some((item) => traderItem._id === item._id) + ); // what's this itemLib.push(...toAdd); } @@ -133,7 +149,15 @@ export class InventoryHelper for (const itemToAdd of itemsToAdd) { - const errorOutput = this.placeItemInInventory(itemToAdd, stashFS2D, sortingTableFS2D, itemLib, pmcData.Inventory, useSortingTable, output); + const errorOutput = this.placeItemInInventory( + itemToAdd, + stashFS2D, + sortingTableFS2D, + itemLib, + pmcData.Inventory, + useSortingTable, + output, + ); if (errorOutput) { return errorOutput; @@ -151,9 +175,7 @@ export class InventoryHelper catch (err) { // Callback failed - const message = typeof err === "string" - ? err - : this.localisationService.getText("http-unknown_error"); + const message = typeof err === "string" ? err : this.localisationService.getText("http-unknown_error"); return this.httpResponse.appendErrorToOutput(output, message); } @@ -200,7 +222,7 @@ export class InventoryHelper { upd.SpawnedInSession = true; } - + // Remove invalid properties prior to adding to inventory if (upd.UnlimitedCount !== undefined) { @@ -223,7 +245,7 @@ export class InventoryHelper parentId: itemToAdd.containerId, slotId: "hideout", location: { x: itemToAdd.location.x, y: itemToAdd.location.y, r: itemToAdd.location.rotation ? 1 : 0 }, - upd: this.jsonUtil.clone(upd) + upd: this.jsonUtil.clone(upd), }); pmcData.Inventory.items.push({ @@ -232,7 +254,7 @@ export class InventoryHelper parentId: itemToAdd.containerId, slotId: "hideout", location: { x: itemToAdd.location.x, y: itemToAdd.location.y, r: itemToAdd.location.rotation ? 1 : 0 }, - upd: this.jsonUtil.clone(upd) // Clone upd to prevent multi-purchases of same item referencing same upd object in memory + upd: this.jsonUtil.clone(upd), // Clone upd to prevent multi-purchases of same item referencing same upd object in memory }); if (this.itemHelper.isOfBaseclass(itemToAdd.itemRef._tpl, BaseClasses.AMMO_BOX)) @@ -275,11 +297,8 @@ export class InventoryHelper _tpl: itemLib[tmpKey]._tpl, parentId: toDo[0][1], slotId: slotID, - location: { - x: itemToAdd.location.x, - y: itemToAdd.location.y, - r: "Horizontal" }, - upd: this.jsonUtil.clone(upd) + location: { x: itemToAdd.location.x, y: itemToAdd.location.y, r: "Horizontal" }, + upd: this.jsonUtil.clone(upd), }); pmcData.Inventory.items.push({ @@ -287,11 +306,8 @@ export class InventoryHelper _tpl: itemLib[tmpKey]._tpl, parentId: toDo[0][1], slotId: itemLib[tmpKey].slotId, - location: { - x: itemToAdd.location.x, - y: itemToAdd.location.y, - r: "Horizontal" }, - upd: this.jsonUtil.clone(upd) + location: { x: itemToAdd.location.x, y: itemToAdd.location.y, r: "Horizontal" }, + upd: this.jsonUtil.clone(upd), }); } else @@ -310,7 +326,7 @@ export class InventoryHelper parentId: toDo[0][1], slotId: slotID, ...itemLocation, - upd: this.jsonUtil.clone(upd) + upd: this.jsonUtil.clone(upd), }); pmcData.Inventory.items.push({ @@ -319,7 +335,7 @@ export class InventoryHelper parentId: toDo[0][1], slotId: itemLib[tmpKey].slotId, ...itemLocation, - upd: this.jsonUtil.clone(upd) + upd: this.jsonUtil.clone(upd), }); this.logger.debug(`Added ${itemLib[tmpKey]._tpl} with id: ${idForItemToAdd} to inventory`); } @@ -340,13 +356,21 @@ export class InventoryHelper * @param itemToAdd Item to add to inventory * @param stashFS2D Two dimentional stash map * @param sortingTableFS2D Two dimentional sorting table stash map - * @param itemLib + * @param itemLib * @param pmcData Player profile * @param useSortingTable Should sorting table be used for overflow items when no inventory space for item * @param output Client output object * @returns Client error output if placing item failed */ - protected placeItemInInventory(itemToAdd: IAddItemTempObject, stashFS2D: number[][], sortingTableFS2D: number[][], itemLib: Item[], playerInventory: Inventory, useSortingTable: boolean, output: IItemEventRouterResponse): IItemEventRouterResponse + protected placeItemInInventory( + itemToAdd: IAddItemTempObject, + stashFS2D: number[][], + sortingTableFS2D: number[][], + itemLib: Item[], + playerInventory: Inventory, + useSortingTable: boolean, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { const itemSize = this.getItemSize(itemToAdd.itemRef._tpl, itemToAdd.itemRef._id, itemLib); @@ -360,16 +384,24 @@ export class InventoryHelper try { - stashFS2D = this.containerHelper.fillContainerMapWithItem(stashFS2D, findSlotResult.x, findSlotResult.y, itemSizeX, itemSizeY, false); // TODO: rotation not passed in, bad? + stashFS2D = this.containerHelper.fillContainerMapWithItem( + stashFS2D, + findSlotResult.x, + findSlotResult.y, + itemSizeX, + itemSizeY, + false, + ); // TODO: rotation not passed in, bad? } catch (err) { - const errorText = typeof err === "string" - ? ` -> ${err}` - : ""; + const errorText = typeof err === "string" ? ` -> ${err}` : ""; this.logger.error(this.localisationService.getText("inventory-fill_container_failed", errorText)); - return this.httpResponse.appendErrorToOutput(output, this.localisationService.getText("inventory-no_stash_space")); + return this.httpResponse.appendErrorToOutput( + output, + this.localisationService.getText("inventory-no_stash_space"), + ); } // Store details for object, incuding container item will be placed in itemToAdd.containerId = playerInventory.stash; @@ -377,7 +409,7 @@ export class InventoryHelper x: findSlotResult.x, y: findSlotResult.y, r: findSlotResult.rotation ? 1 : 0, - rotation: findSlotResult.rotation + rotation: findSlotResult.rotation, }; // Success! exit @@ -387,19 +419,33 @@ export class InventoryHelper // Space not found in main stash, use sorting table if (useSortingTable) { - const findSortingSlotResult = this.containerHelper.findSlotForItem(sortingTableFS2D, itemSize[0], itemSize[1]); + const findSortingSlotResult = this.containerHelper.findSlotForItem( + sortingTableFS2D, + itemSize[0], + itemSize[1], + ); const itemSizeX = findSortingSlotResult.rotation ? itemSize[1] : itemSize[0]; const itemSizeY = findSortingSlotResult.rotation ? itemSize[0] : itemSize[1]; try { - sortingTableFS2D = this.containerHelper.fillContainerMapWithItem(sortingTableFS2D, findSortingSlotResult.x, findSortingSlotResult.y, itemSizeX, itemSizeY, false); // TODO: rotation not passed in, bad? + sortingTableFS2D = this.containerHelper.fillContainerMapWithItem( + sortingTableFS2D, + findSortingSlotResult.x, + findSortingSlotResult.y, + itemSizeX, + itemSizeY, + false, + ); // TODO: rotation not passed in, bad? } catch (err) { const errorText = typeof err === "string" ? ` -> ${err}` : ""; this.logger.error(this.localisationService.getText("inventory-fill_container_failed", errorText)); - return this.httpResponse.appendErrorToOutput(output, this.localisationService.getText("inventory-no_stash_space")); + return this.httpResponse.appendErrorToOutput( + output, + this.localisationService.getText("inventory-no_stash_space"), + ); } // Store details for object, incuding container item will be placed in @@ -408,12 +454,15 @@ export class InventoryHelper x: findSortingSlotResult.x, y: findSortingSlotResult.y, r: findSortingSlotResult.rotation ? 1 : 0, - rotation: findSortingSlotResult.rotation + rotation: findSortingSlotResult.rotation, }; } else { - return this.httpResponse.appendErrorToOutput(output, this.localisationService.getText("inventory-no_stash_space")); + return this.httpResponse.appendErrorToOutput( + output, + this.localisationService.getText("inventory-no_stash_space"), + ); } } @@ -427,7 +476,14 @@ export class InventoryHelper * @param output object to send to client * @param foundInRaid should ammo be FiR */ - protected hydrateAmmoBoxWithAmmo(pmcData: IPmcData, itemToAdd: IAddItemTempObject, parentId: string, sessionID: string, output: IItemEventRouterResponse, foundInRaid: boolean): void + protected hydrateAmmoBoxWithAmmo( + pmcData: IPmcData, + itemToAdd: IAddItemTempObject, + parentId: string, + sessionID: string, + output: IItemEventRouterResponse, + foundInRaid: boolean, + ): void { const itemInfo = this.itemHelper.getItem(itemToAdd.itemRef._tpl)[1]; const stackSlots = itemInfo._props.StackSlots; @@ -450,7 +506,7 @@ export class InventoryHelper parentId: parentId, slotId: "cartridges", location: location, - upd: { StackObjectsCount: ammoStackSize } + upd: { StackObjectsCount: ammoStackSize }, }; if (foundInRaid) @@ -472,7 +528,6 @@ export class InventoryHelper } /** - * * @param assortItems Items to add to inventory * @param requestItem Details of purchased item to add to inventory * @param result Array split stacks are added to @@ -488,14 +543,17 @@ export class InventoryHelper const itemToAdd: IAddItemTempObject = { itemRef: item, count: requestItem.count, - isPreset: requestItem.isPreset }; + isPreset: requestItem.isPreset, + }; // Split stacks if the size is higher than allowed by items StackMaxSize property let maxStackCount = 1; if (requestItem.count > itemDetails._props.StackMaxSize) { let remainingCountOfItemToAdd = requestItem.count; - const calc = requestItem.count - (Math.floor(requestItem.count / itemDetails._props.StackMaxSize) * itemDetails._props.StackMaxSize); + const calc = requestItem.count + - (Math.floor(requestItem.count / itemDetails._props.StackMaxSize) + * itemDetails._props.StackMaxSize); maxStackCount = (calc > 0) ? maxStackCount + Math.floor(remainingCountOfItemToAdd / itemDetails._props.StackMaxSize) @@ -542,7 +600,12 @@ export class InventoryHelper * @param output Existing IItemEventRouterResponse object to append data to, creates new one by default if not supplied * @returns IItemEventRouterResponse */ - public removeItem(profile: IPmcData, itemId: string, sessionID: string, output: IItemEventRouterResponse = undefined): IItemEventRouterResponse + public removeItem( + profile: IPmcData, + itemId: string, + sessionID: string, + output: IItemEventRouterResponse = undefined, + ): IItemEventRouterResponse { if (!itemId) { @@ -566,7 +629,7 @@ export class InventoryHelper { // We expect that each inventory item and each insured item has unique "_id", respective "itemId". // Therefore we want to use a NON-Greedy function and escape the iteration as soon as we find requested item. - const inventoryIndex = inventoryItems.findIndex(item => item._id === childId); + const inventoryIndex = inventoryItems.findIndex((item) => item._id === childId); if (inventoryIndex > -1) { inventoryItems.splice(inventoryIndex, 1); @@ -574,10 +637,12 @@ export class InventoryHelper if (inventoryIndex === -1) { - this.logger.warning(`Unable to remove item with Id: ${childId} as it was not found in inventory ${profile._id}`); + this.logger.warning( + `Unable to remove item with Id: ${childId} as it was not found in inventory ${profile._id}`, + ); } - const insuredIndex = insuredItems.findIndex(item => item.itemId === childId); + const insuredIndex = insuredItems.findIndex((item) => item.itemId === childId); if (insuredIndex > -1) { insuredItems.splice(insuredIndex, 1); @@ -587,7 +652,11 @@ export class InventoryHelper return output; } - public removeItemAndChildrenFromMailRewards(sessionId: string, removeRequest: IInventoryRemoveRequestData, output: IItemEventRouterResponse): IItemEventRouterResponse + public removeItemAndChildrenFromMailRewards( + sessionId: string, + removeRequest: IInventoryRemoveRequestData, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { const fullProfile = this.profileHelper.getFullProfile(sessionId); @@ -595,18 +664,23 @@ export class InventoryHelper const dialogs = Object.values(fullProfile.dialogues); for (const dialog of dialogs) { - const messageWithReward = dialog.messages.find(x => x._id === removeRequest.fromOwner.id); + const messageWithReward = dialog.messages.find((x) => x._id === removeRequest.fromOwner.id); if (messageWithReward) { // Find item + any possible children and remove them from mails items array - const itemWithChildern = this.itemHelper.findAndReturnChildrenAsItems(messageWithReward.items.data, removeRequest.item); + const itemWithChildern = this.itemHelper.findAndReturnChildrenAsItems( + messageWithReward.items.data, + removeRequest.item, + ); for (const itemToDelete of itemWithChildern) { // Get index of item to remove from reward array + remove it const indexOfItemToRemove = messageWithReward.items.data.indexOf(itemToDelete); if (indexOfItemToRemove === -1) { - this.logger.error(`Unable to remove item: ${removeRequest.item} from mail: ${removeRequest.fromOwner.id} as item could not be found, restart client immediately to prevent data corruption`); + this.logger.error( + `Unable to remove item: ${removeRequest.item} from mail: ${removeRequest.fromOwner.id} as item could not be found, restart client immediately to prevent data corruption`, + ); continue; } messageWithReward.items.data.splice(indexOfItemToRemove, 1); @@ -622,10 +696,18 @@ export class InventoryHelper return output; } - public removeItemByCount(pmcData: IPmcData, itemId: string, count: number, sessionID: string, output: IItemEventRouterResponse = undefined): IItemEventRouterResponse + public removeItemByCount( + pmcData: IPmcData, + itemId: string, + count: number, + sessionID: string, + output: IItemEventRouterResponse = undefined, + ): IItemEventRouterResponse { if (!itemId) + { return output; + } const itemsToReduce = this.itemHelper.findAndReturnChildrenAsItems(pmcData.Inventory.items, itemId); let remainingCount = count; @@ -644,11 +726,15 @@ export class InventoryHelper itemToReduce.upd.StackObjectsCount -= remainingCount; remainingCount = 0; if (output) + { output.profileChanges[sessionID].items.change.push(itemToReduce); + } } if (remainingCount === 0) + { break; + } } return output; @@ -666,7 +752,11 @@ export class InventoryHelper // note from 2027: there IS a thing i didn't explore and that is Merges With Children // -> Prepares item Width and height returns [sizeX, sizeY] - protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): number[] + protected getSizeByInventoryItemHash( + itemTpl: string, + itemID: string, + inventoryItemHash: InventoryHelper.InventoryItemHash, + ): number[] { const toDo = [itemID]; const result = this.itemHelper.getItem(itemTpl); @@ -681,7 +771,10 @@ export class InventoryHelper // Item found but no _props property if (tmpItem && !tmpItem._props) { - this.localisationService.getText("inventory-item_missing_props_property", {itemTpl: itemTpl, itemName: tmpItem?._name}); + this.localisationService.getText("inventory-item_missing_props_property", { + itemTpl: itemTpl, + itemName: tmpItem?._name, + }); } // No item object or getItem() returned false @@ -711,11 +804,11 @@ export class InventoryHelper const skipThisItems: string[] = [ BaseClasses.BACKPACK, BaseClasses.SEARCHABLE_ITEM, - BaseClasses.SIMPLE_CONTAINER + BaseClasses.SIMPLE_CONTAINER, ]; const rootFolded = rootItem.upd?.Foldable && rootItem.upd.Foldable.Folded === true; - //The item itself is collapsible + // The item itself is collapsible if (foldableWeapon && (foldedSlot === undefined || foldedSlot === "") && rootFolded) { outX -= tmpItem._props.SizeReduceRight; @@ -729,7 +822,7 @@ export class InventoryHelper { for (const item of inventoryItemHash.byParentId[toDo[0]]) { - //Filtering child items outside of mod slots, such as those inside containers, without counting their ExtraSize attribute + // Filtering child items outside of mod slots, such as those inside containers, without counting their ExtraSize attribute if (item.slotId.indexOf("mod_") < 0) { continue; @@ -741,7 +834,12 @@ export class InventoryHelper const itemResult = this.itemHelper.getItem(item._tpl); if (!itemResult[0]) { - this.logger.error(this.localisationService.getText("inventory-get_item_size_item_not_found_by_tpl", item._tpl)); + this.logger.error( + this.localisationService.getText( + "inventory-get_item_size_item_not_found_by_tpl", + item._tpl, + ), + ); } const itm = itemResult[1]; @@ -781,16 +879,13 @@ export class InventoryHelper return [ outX + sizeLeft + sizeRight + forcedLeft + forcedRight, - outY + sizeUp + sizeDown + forcedUp + forcedDown + outY + sizeUp + sizeDown + forcedUp + forcedDown, ]; } protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash { - const inventoryItemHash: InventoryHelper.InventoryItemHash = { - "byItemId": {}, - "byParentId": {} - }; + const inventoryItemHash: InventoryHelper.InventoryItemHash = { byItemId: {}, byParentId: {} }; for (let i = 0; i < inventoryItem.length; i++) { @@ -833,8 +928,16 @@ export class InventoryHelper const tmpSize = this.getSizeByInventoryItemHash(item._tpl, item._id, inventoryItemHash); const iW = tmpSize[0]; // x const iH = tmpSize[1]; // y - const fH = (((item.location as Location).r === 1 || (item.location as Location).r === "Vertical" || (item.location as Location).rotation === "Vertical") ? iW : iH); - const fW = (((item.location as Location).r === 1 || (item.location as Location).r === "Vertical" || (item.location as Location).rotation === "Vertical") ? iH : iW); + const fH = + ((item.location as Location).r === 1 || (item.location as Location).r === "Vertical" + || (item.location as Location).rotation === "Vertical") + ? iW + : iH; + const fW = + ((item.location as Location).r === 1 || (item.location as Location).r === "Vertical" + || (item.location as Location).rotation === "Vertical") + ? iH + : iW; const fillTo = (item.location as Location).x + fW; for (let y = 0; y < fH; y++) @@ -845,7 +948,12 @@ export class InventoryHelper } catch (e) { - this.logger.error(this.localisationService.getText("inventory-unable_to_fill_container", {id: item._id, error: e})); + this.logger.error( + this.localisationService.getText("inventory-unable_to_fill_container", { + id: item._id, + error: e, + }), + ); } } } @@ -861,7 +969,10 @@ export class InventoryHelper * @param sessionId Session id / playerid * @returns OwnerInventoryItems with inventory of player/scav to adjust */ - public getOwnerInventoryItems(request: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, sessionId: string): OwnerInventoryItems + public getOwnerInventoryItems( + request: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, + sessionId: string, + ): OwnerInventoryItems { let isSameInventory = false; const pmcItems = this.profileHelper.getPmcProfile(sessionId).Inventory.items; @@ -879,9 +990,7 @@ export class InventoryHelper else if (request.fromOwner.type.toLocaleLowerCase() === "mail") { // Split requests dont use 'use' but 'splitItem' property - const item = "splitItem" in request - ? request.splitItem - : request.item; + const item = "splitItem" in request ? request.splitItem : request.item; fromInventoryItems = this.dialogueHelper.getMessageItemContents(request.fromOwner.id, sessionId, item); fromType = "mail"; } @@ -909,7 +1018,7 @@ export class InventoryHelper from: fromInventoryItems, to: toInventoryItems, sameInventory: isSameInventory, - isMail: fromType === "mail" + isMail: fromType === "mail", }; } @@ -922,7 +1031,12 @@ export class InventoryHelper protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][] { const playerStashSize = this.getPlayerStashSize(sessionID); - return this.getContainerMap(playerStashSize[0], playerStashSize[1], pmcData.Inventory.items, pmcData.Inventory.stash); + return this.getContainerMap( + playerStashSize[0], + playerStashSize[1], + pmcData.Inventory.items, + pmcData.Inventory.stash, + ); } protected getSortingTableSlotMap(pmcData: IPmcData): number[][] @@ -937,7 +1051,7 @@ export class InventoryHelper */ protected getPlayerStashSize(sessionID: string): Record { - //this sets automatically a stash size from items.json (its not added anywhere yet cause we still use base stash) + // this sets automatically a stash size from items.json (its not added anywhere yet cause we still use base stash) const stashTPL = this.getStashType(sessionID); if (!stashTPL) { @@ -966,7 +1080,7 @@ export class InventoryHelper protected getStashType(sessionID: string): string { const pmcData = this.profileHelper.getPmcProfile(sessionID); - const stashObj = pmcData.Inventory.items.find(item => item._id === pmcData.Inventory.stash); + const stashObj = pmcData.Inventory.items.find((item) => item._id === pmcData.Inventory.stash); if (!stashObj) { this.logger.error(this.localisationService.getText("inventory-unable_to_find_stash")); @@ -988,7 +1102,7 @@ export class InventoryHelper const idsToMove = this.itemHelper.findAndReturnChildrenByItems(fromItems, body.item); for (const itemId of idsToMove) { - const itemToMove = fromItems.find(x => x._id === itemId); + const itemToMove = fromItems.find((x) => x._id === itemId); if (!itemToMove) { this.logger.error(`Unable to find item to move: ${itemId}`); @@ -1023,32 +1137,43 @@ export class InventoryHelper /** * Internal helper function to move item within the same profile_f. * @param pmcData profile to edit - * @param inventoryItems - * @param moveRequest + * @param inventoryItems + * @param moveRequest * @returns True if move was successful */ - public moveItemInternal(pmcData: IPmcData, inventoryItems: Item[], moveRequest: IInventoryMoveRequestData): {success: boolean, errorMessage?: string} + public moveItemInternal( + pmcData: IPmcData, + inventoryItems: Item[], + moveRequest: IInventoryMoveRequestData, + ): { success: boolean; errorMessage?: string; } { this.handleCartridges(inventoryItems, moveRequest); // Find item we want to 'move' - const matchingInventoryItem = inventoryItems.find(x => x._id === moveRequest.item); + const matchingInventoryItem = inventoryItems.find((x) => x._id === moveRequest.item); if (!matchingInventoryItem) { const errorMesage = `Unable to move item: ${moveRequest.item}, cannot find in inventory`; this.logger.error(errorMesage); - return {success: false, errorMessage: errorMesage}; + return { success: false, errorMessage: errorMesage }; } - this.logger.debug(`${moveRequest.Action} item: ${moveRequest.item} from slotid: ${matchingInventoryItem.slotId} to container: ${moveRequest.to.container}`); + this.logger.debug( + `${moveRequest.Action} item: ${moveRequest.item} from slotid: ${matchingInventoryItem.slotId} to container: ${moveRequest.to.container}`, + ); // don't move shells from camora to cartridges (happens when loading shells into mts-255 revolver shotgun) if (matchingInventoryItem.slotId.includes("camora_") && moveRequest.to.container === "cartridges") { - this.logger.warning(this.localisationService.getText("inventory-invalid_move_to_container", {slotId: matchingInventoryItem.slotId, container: moveRequest.to.container})); + this.logger.warning( + this.localisationService.getText("inventory-invalid_move_to_container", { + slotId: matchingInventoryItem.slotId, + container: moveRequest.to.container, + }), + ); - return {success: true}; + return { success: true }; } // Edit items details to match its new location @@ -1060,7 +1185,6 @@ export class InventoryHelper if ("location" in moveRequest.to) { matchingInventoryItem.location = moveRequest.to.location; - } else { @@ -1070,7 +1194,7 @@ export class InventoryHelper } } - return {success: true}; + return { success: true }; } /** @@ -1086,8 +1210,8 @@ export class InventoryHelper if (pmcData.Inventory.fastPanel[itemKey] === itemBeingMoved._id) { // Get moved items parent - const itemParent = pmcData.Inventory.items.find(x => x._id === itemBeingMoved.parentId); - + const itemParent = pmcData.Inventory.items.find((x) => x._id === itemBeingMoved.parentId); + // Empty out id if item is moved to a container other than pocket/rig if (itemParent && !(itemParent.slotId?.startsWith("Pockets") || itemParent.slotId === "TacticalVest")) { @@ -1100,8 +1224,8 @@ export class InventoryHelper } /** - * Internal helper function to handle cartridges in inventory if any of them exist. - */ + * Internal helper function to handle cartridges in inventory if any of them exist. + */ protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void { // -> Move item to different place - counts with equipping filling magazine etc @@ -1141,7 +1265,7 @@ namespace InventoryHelper { export interface InventoryItemHash { - byItemId: Record - byParentId: Record + byItemId: Record; + byParentId: Record; } -} \ No newline at end of file +} diff --git a/project/src/helpers/ItemHelper.ts b/project/src/helpers/ItemHelper.ts index c5bcd324..a85e758c 100644 --- a/project/src/helpers/ItemHelper.ts +++ b/project/src/helpers/ItemHelper.ts @@ -29,7 +29,7 @@ class ItemHelper BaseClasses.SORTING_TABLE, BaseClasses.INVENTORY, BaseClasses.STATIONARY_CONTAINER, - BaseClasses.POCKETS + BaseClasses.POCKETS, ]; constructor( @@ -44,7 +44,7 @@ class ItemHelper @inject("ItemBaseClassService") protected itemBaseClassService: ItemBaseClassService, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("LocaleService") protected localeService: LocaleService + @inject("LocaleService") protected localeService: LocaleService, ) {} @@ -70,7 +70,7 @@ class ItemHelper // Is item valid return !itemDetails[1]._props.QuestItem && itemDetails[1]._type === "Item" - && invalidBaseTypes.every(x => !this.isOfBaseclass(tpl, x)) + && invalidBaseTypes.every((x) => !this.isOfBaseclass(tpl, x)) && this.getItemPrice(tpl) > 0 && !this.itemFilterService.isItemBlacklisted(tpl); } @@ -176,9 +176,7 @@ class ItemHelper { if (item.upd === undefined) { - item.upd = { - StackObjectsCount: 1 - }; + item.upd = { StackObjectsCount: 1 }; } if (item.upd.StackObjectsCount === undefined) @@ -243,9 +241,7 @@ class ItemHelper parentId: parentId, slotId: slotId, location: 0, - upd: { - StackObjectsCount: count - } + upd: { StackObjectsCount: count }, }; stackSlotItems.push(stackSlotItem); } @@ -352,7 +348,6 @@ class ItemHelper return result; } - /** * Get a quality value based on a repairable items (weapon/armor) current state between current and max durability * @param itemDetails Db details for item we want quality value for @@ -365,7 +360,9 @@ class ItemHelper // Edge case, max durability is below durability if (repairable.Durability > repairable.MaxDurability) { - this.logger.warning(`Max durability: ${repairable.MaxDurability} for item id: ${item._id} was below Durability: ${repairable.Durability}, adjusting values to match`); + this.logger.warning( + `Max durability: ${repairable.MaxDurability} for item id: ${item._id} was below Durability: ${repairable.Durability}, adjusting values to match`, + ); repairable.MaxDurability = repairable.Durability; } @@ -434,7 +431,7 @@ class ItemHelper continue; } - if (childItem.parentId === baseItemId && !list.find(item => childItem._id === item._id)) + if (childItem.parentId === baseItemId && !list.find((item) => childItem._id === item._id)) { list.push(...this.findAndReturnChildrenAsItems(items, childItem._id)); } @@ -455,7 +452,7 @@ class ItemHelper for (const itemFromAssort of assort) { - if (itemFromAssort.parentId === itemIdToFind && !list.find(item => itemFromAssort._id === item._id)) + if (itemFromAssort.parentId === itemIdToFind && !list.find((item) => itemFromAssort._id === item._id)) { list.push(itemFromAssort); list = list.concat(this.findAndReturnChildrenByAssort(itemFromAssort._id, assort)); @@ -472,8 +469,7 @@ class ItemHelper */ public hasBuyRestrictions(itemToCheck: Item): boolean { - if (itemToCheck.upd?.BuyRestrictionCurrent !== undefined - && itemToCheck.upd?.BuyRestrictionMax !== undefined) + if (itemToCheck.upd?.BuyRestrictionCurrent !== undefined && itemToCheck.upd?.BuyRestrictionMax !== undefined) { return true; } @@ -571,18 +567,14 @@ class ItemHelper public findBarterItems(by: "tpl" | "id", items: Item[], barterItemId: string): Item[] { // find required items to take after buying (handles multiple items) - const barterIDs = typeof barterItemId === "string" - ? [barterItemId] - : barterItemId; + const barterIDs = typeof barterItemId === "string" ? [barterItemId] : barterItemId; let barterItems: Item[] = []; for (const barterID of barterIDs) { - const filterResult = items.filter(item => + const filterResult = items.filter((item) => { - return by === "tpl" - ? (item._tpl === barterID) - : (item._id === barterID); + return by === "tpl" ? (item._tpl === barterID) : (item._id === barterID); }); barterItems = Object.assign(barterItems, filterResult); @@ -615,17 +607,19 @@ class ItemHelper { // Insured items shouldn't be renamed // only works for pmcs. - if (insuredItems?.find(insuredItem => insuredItem.itemId === item._id)) + if (insuredItems?.find((insuredItem) => insuredItem.itemId === item._id)) { continue; } // Do not replace important ID's - if (item._id === pmcData.Inventory.equipment + if ( + item._id === pmcData.Inventory.equipment || item._id === pmcData.Inventory.questRaidItems || item._id === pmcData.Inventory.questStashItems || item._id === pmcData.Inventory.sortingTable - || item._id === pmcData.Inventory.stash) + || item._id === pmcData.Inventory.stash + ) { continue; } @@ -804,7 +798,9 @@ class ItemHelper let isRequiredSlot = false; if (parentTemplate[0] && parentTemplate[1]?._props?.Slots) { - isRequiredSlot = parentTemplate[1]._props.Slots.some(slot => slot._name === item.slotId && slot._required); + isRequiredSlot = parentTemplate[1]._props.Slots.some((slot) => + slot._name === item.slotId && slot._required + ); } return itemTemplate[0] && parentTemplate[0] && !(isNotRaidModdable || isRequiredSlot); @@ -850,7 +846,7 @@ class ItemHelper */ public isAttachmentAttached(item: Item): boolean { - return item.slotId !== "hideout" && item.slotId !== "main" && isNaN(Number(item.slotId)); + return item.slotId !== "hideout" && item.slotId !== "main" && Number.isNaN(Number(item.slotId)); } /** @@ -861,7 +857,7 @@ class ItemHelper */ public getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize { - const rootTemplate = this.getItem(items.filter(x => x._id === rootItemId)[0]._tpl)[1]; + const rootTemplate = this.getItem(items.filter((x) => x._id === rootItemId)[0]._tpl)[1]; const width = rootTemplate._props.Width; const height = rootTemplate._props.Height; @@ -893,13 +889,15 @@ class ItemHelper sizeUp = sizeUp < itemTemplate._props.ExtraSizeUp ? itemTemplate._props.ExtraSizeUp : sizeUp; sizeDown = sizeDown < itemTemplate._props.ExtraSizeDown ? itemTemplate._props.ExtraSizeDown : sizeDown; sizeLeft = sizeLeft < itemTemplate._props.ExtraSizeLeft ? itemTemplate._props.ExtraSizeLeft : sizeLeft; - sizeRight = sizeRight < itemTemplate._props.ExtraSizeRight ? itemTemplate._props.ExtraSizeRight : sizeRight; + sizeRight = sizeRight < itemTemplate._props.ExtraSizeRight + ? itemTemplate._props.ExtraSizeRight + : sizeRight; } } return { width: width + sizeLeft + sizeRight + forcedLeft + forcedRight, - height: height + sizeUp + sizeDown + forcedUp + forcedDown + height: height + sizeUp + sizeDown + forcedUp + forcedDown, }; } @@ -941,15 +939,13 @@ class ItemHelper while (currentStoredCartridgeCount < ammoBoxMaxCartridgeCount) { const remainingSpace = ammoBoxMaxCartridgeCount - currentStoredCartridgeCount; - const cartridgeCountToAdd = (remainingSpace < maxPerStack) - ? remainingSpace - : maxPerStack; + const cartridgeCountToAdd = (remainingSpace < maxPerStack) ? remainingSpace : maxPerStack; // Add cartridge item into items array ammoBox.push(this.createCartridges(ammoBox[0]._id, cartridgeTpl, cartridgeCountToAdd, location)); currentStoredCartridgeCount += cartridgeCountToAdd; - location ++; + location++; } } @@ -963,7 +959,7 @@ class ItemHelper public itemIsInsideContainer(item: Item, desiredContainerSlotId: string, items: Item[]): boolean { // Get items parent - const parent = items.find(x => x._id === item.parentId); + const parent = items.find((x) => x._id === item.parentId); if (!parent) { // No parent, end of line, not inside container @@ -993,7 +989,7 @@ class ItemHelper magTemplate: ITemplateItem, staticAmmoDist: Record, caliber: string = undefined, - minSizePercent = 0.25 + minSizePercent = 0.25, ): void { // no caliber defined, choose one at random @@ -1024,7 +1020,7 @@ class ItemHelper magazine: Item[], magTemplate: ITemplateItem, cartridgeTpl: string, - minSizePercent = 0.25 + minSizePercent = 0.25, ): void { // Get cartrdge properties and max allowed stack size @@ -1033,7 +1029,10 @@ class ItemHelper // Get max number of cartridges in magazine, choose random value between min/max const magazineCartridgeMaxCount = magTemplate._props.Cartridges[0]._max_count; - const desiredStackCount = this.randomUtil.getInt(Math.round(minSizePercent * magazineCartridgeMaxCount), magazineCartridgeMaxCount); + const desiredStackCount = this.randomUtil.getInt( + Math.round(minSizePercent * magazineCartridgeMaxCount), + magazineCartridgeMaxCount, + ); // Loop over cartridge count and add stacks to magazine let currentStoredCartridgeCount = 0; @@ -1056,7 +1055,7 @@ class ItemHelper magazine.push(this.createCartridges(magazine[0]._id, cartridgeTpl, cartridgeCountToAdd, location)); currentStoredCartridgeCount += cartridgeCountToAdd; - location ++; + location++; } } @@ -1070,12 +1069,10 @@ class ItemHelper const ammoTpls = magTemplate._props.Cartridges[0]._props.filters[0].Filter; const calibers = [ ...new Set( - ammoTpls.filter( - (x: string) => this.getItem(x)[0] - ).map( - (x: string) => this.getItem(x)[1]._props.Caliber - ) - ) + ammoTpls.filter((x: string) => this.getItem(x)[0]).map((x: string) => + this.getItem(x)[1]._props.Caliber + ), + ), ]; return this.randomUtil.drawRandomFromList(calibers)[0]; } @@ -1091,9 +1088,7 @@ class ItemHelper const ammoArray = new ProbabilityObjectArray(this.mathUtil, this.jsonUtil); for (const icd of staticAmmoDist[caliber]) { - ammoArray.push( - new ProbabilityObject(icd.tpl, icd.relativeProbability) - ); + ammoArray.push(new ProbabilityObject(icd.tpl, icd.relativeProbability)); } return ammoArray.draw(1)[0]; } @@ -1114,7 +1109,7 @@ class ItemHelper parentId: parentId, slotId: "cartridges", location: location, - upd: { StackObjectsCount: stackCount } + upd: { StackObjectsCount: stackCount }, }; } @@ -1145,7 +1140,9 @@ class ItemHelper public getItemTplsOfBaseType(desiredBaseType: string): string[] { - return Object.values(this.databaseServer.getTables().templates.items).filter(x => x._parent === desiredBaseType).map(x =>x._id); + return Object.values(this.databaseServer.getTables().templates.items).filter((x) => + x._parent === desiredBaseType + ).map((x) => x._id); } } @@ -1153,10 +1150,9 @@ namespace ItemHelper { export interface ItemSize { - width: number - height: number + width: number; + height: number; } } -export { ItemHelper }; - +export {ItemHelper}; diff --git a/project/src/helpers/NotificationSendHelper.ts b/project/src/helpers/NotificationSendHelper.ts index 32e81201..788d0dbd 100644 --- a/project/src/helpers/NotificationSendHelper.ts +++ b/project/src/helpers/NotificationSendHelper.ts @@ -16,14 +16,14 @@ export class NotificationSendHelper @inject("WebSocketServer") protected webSocketServer: WebSocketServer, @inject("HashUtil") protected hashUtil: HashUtil, @inject("SaveServer") protected saveServer: SaveServer, - @inject("NotificationService") protected notificationService: NotificationService + @inject("NotificationService") protected notificationService: NotificationService, ) {} /** * Send notification message to the appropriate channel - * @param sessionID - * @param notificationMessage + * @param sessionID + * @param notificationMessage */ public sendMessage(sessionID: string, notificationMessage: INotification): void { @@ -44,7 +44,12 @@ export class NotificationSendHelper * @param messageText Text to send player * @param messageType Underlying type of message being sent */ - public sendMessageToPlayer(sessionId: string, senderDetails: IUserDialogInfo, messageText: string, messageType: MessageType): void + public sendMessageToPlayer( + sessionId: string, + senderDetails: IUserDialogInfo, + messageText: string, + messageType: MessageType, + ): void { const dialog = this.getDialog(sessionId, messageType, senderDetails); @@ -57,7 +62,7 @@ export class NotificationSendHelper text: messageText, hasRewards: undefined, rewardCollected: undefined, - items: undefined + items: undefined, }; dialog.messages.push(message); @@ -65,7 +70,7 @@ export class NotificationSendHelper type: NotificationType.NEW_MESSAGE, eventId: message._id, dialogId: message.uid, - message: message + message: message, }; this.sendMessage(sessionId, notification); } @@ -80,7 +85,9 @@ export class NotificationSendHelper protected getDialog(sessionId: string, messageType: MessageType, senderDetails: IUserDialogInfo): Dialogue { // Use trader id if sender is trader, otherwise use nickname - const key = (senderDetails.info.MemberCategory === MemberCategory.TRADER) ? senderDetails._id : senderDetails.info.Nickname; + const key = (senderDetails.info.MemberCategory === MemberCategory.TRADER) + ? senderDetails._id + : senderDetails.info.Nickname; const dialogueData = this.saveServer.getProfile(sessionId).dialogues; const isNewDialogue = !(key in dialogueData); let dialogue: Dialogue = dialogueData[key]; @@ -95,11 +102,11 @@ export class NotificationSendHelper pinned: false, new: 0, attachmentsNew: 0, - Users: (senderDetails.info.MemberCategory === MemberCategory.TRADER) ? undefined : [senderDetails] + Users: (senderDetails.info.MemberCategory === MemberCategory.TRADER) ? undefined : [senderDetails], }; dialogueData[key] = dialogue; } return dialogue; } -} \ No newline at end of file +} diff --git a/project/src/helpers/NotifierHelper.ts b/project/src/helpers/NotifierHelper.ts index d4acdf13..a32e24f8 100644 --- a/project/src/helpers/NotifierHelper.ts +++ b/project/src/helpers/NotifierHelper.ts @@ -10,14 +10,9 @@ export class NotifierHelper /** * The default notification sent when waiting times out. */ - protected defaultNotification: INotification = { - type: NotificationType.PING, - eventId: "ping" - }; + protected defaultNotification: INotification = { type: NotificationType.PING, eventId: "ping" }; - constructor( - @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper - ) + constructor(@inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper) {} public getDefaultNotification(): INotification @@ -29,22 +24,25 @@ export class NotifierHelper * Create a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside * @param dialogueMessage Message from dialog that was sent * @param ragfairData Ragfair data to attach to notification - * @returns + * @returns */ - public createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): INotification + public createRagfairOfferSoldNotification( + dialogueMessage: Message, + ragfairData: MessageContentRagfair, + ): INotification { return { type: NotificationType.RAGFAIR_OFFER_SOLD, eventId: dialogueMessage._id, dialogId: dialogueMessage.uid, - ...ragfairData + ...ragfairData, }; } /** * Create a new notification with the specified dialogueMessage object - * @param dialogueMessage - * @returns + * @param dialogueMessage + * @returns */ public createNewMessageNotification(dialogueMessage: Message): INotification { @@ -52,7 +50,7 @@ export class NotifierHelper type: NotificationType.NEW_MESSAGE, eventId: dialogueMessage._id, dialogId: dialogueMessage.uid, - message: dialogueMessage + message: dialogueMessage, }; } @@ -60,4 +58,4 @@ export class NotifierHelper { return `${this.httpServerHelper.getWebsocketUrl()}/notifierServer/getwebsocket/${sessionID}`; } -} \ No newline at end of file +} diff --git a/project/src/helpers/PaymentHelper.ts b/project/src/helpers/PaymentHelper.ts index e49e4521..909dceb9 100644 --- a/project/src/helpers/PaymentHelper.ts +++ b/project/src/helpers/PaymentHelper.ts @@ -10,9 +10,7 @@ export class PaymentHelper { protected inventoryConfig: IInventoryConfig; - constructor( - @inject("ConfigServer") protected configServer: ConfigServer - ) + constructor(@inject("ConfigServer") protected configServer: ConfigServer) { this.inventoryConfig = this.configServer.getConfig(ConfigTypes.INVENTORY); } @@ -24,14 +22,16 @@ export class PaymentHelper */ public isMoneyTpl(tpl: string): boolean { - return [Money.DOLLARS, Money.EUROS, Money.ROUBLES, ...this.inventoryConfig.customMoneyTpls].some(element => element === tpl); + return [Money.DOLLARS, Money.EUROS, Money.ROUBLES, ...this.inventoryConfig.customMoneyTpls].some((element) => + element === tpl + ); } /** - * Gets currency TPL from TAG - * @param {string} currency - * @returns string - */ + * Gets currency TPL from TAG + * @param {string} currency + * @returns string + */ public getCurrency(currency: string): string { switch (currency) @@ -46,4 +46,4 @@ export class PaymentHelper return ""; } } -} \ No newline at end of file +} diff --git a/project/src/helpers/PresetHelper.ts b/project/src/helpers/PresetHelper.ts index f48b8767..cfefb0bd 100644 --- a/project/src/helpers/PresetHelper.ts +++ b/project/src/helpers/PresetHelper.ts @@ -12,9 +12,9 @@ export class PresetHelper constructor( @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("DatabaseServer") protected databaseServer: DatabaseServer + @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) - { } + {} public hydratePresetStore(input: Record): void { @@ -25,13 +25,13 @@ export class PresetHelper { if (!this.defaultPresets) { - this.defaultPresets = Object.values(this.databaseServer.getTables().globals.ItemPresets) - .filter(x => x._encyclopedia !== undefined) - .reduce((acc, cur) => - { - acc[cur._id] = cur; - return acc; - }, {}); + this.defaultPresets = Object.values(this.databaseServer.getTables().globals.ItemPresets).filter((x) => + x._encyclopedia !== undefined + ).reduce((acc, cur) => + { + acc[cur._id] = cur; + return acc; + }, {}); } return this.defaultPresets; @@ -112,4 +112,4 @@ export class PresetHelper return ""; } -} \ No newline at end of file +} diff --git a/project/src/helpers/ProbabilityHelper.ts b/project/src/helpers/ProbabilityHelper.ts index f00963e3..f2815447 100644 --- a/project/src/helpers/ProbabilityHelper.ts +++ b/project/src/helpers/ProbabilityHelper.ts @@ -8,9 +8,9 @@ export class ProbabilityHelper { constructor( @inject("WinstonLogger") protected logger: ILogger, - @inject("RandomUtil") protected randomUtil: RandomUtil + @inject("RandomUtil") protected randomUtil: RandomUtil, ) - { } + {} /** * Chance to roll a number out of 100 @@ -20,6 +20,6 @@ export class ProbabilityHelper */ public rollChance(chance: number, scale = 1): boolean { - return (this.randomUtil.getInt(1, 100 * scale)/ (1 * scale)) <= chance; + return (this.randomUtil.getInt(1, 100 * scale) / (1 * scale)) <= chance; } -} \ No newline at end of file +} diff --git a/project/src/helpers/ProfileHelper.ts b/project/src/helpers/ProfileHelper.ts index 1b06d85a..c859226f 100644 --- a/project/src/helpers/ProfileHelper.ts +++ b/project/src/helpers/ProfileHelper.ts @@ -27,9 +27,9 @@ export class ProfileHelper @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("ProfileSnapshotService") protected profileSnapshotService: ProfileSnapshotService, - @inject("LocalisationService") protected localisationService: LocalisationService + @inject("LocalisationService") protected localisationService: LocalisationService, ) - { } + {} /** * Remove/reset a completed quest condtion from players profile quest data @@ -41,7 +41,7 @@ export class ProfileHelper for (const questId in questConditionId) { const conditionId = questConditionId[questId]; - const profileQuest = pmcData.Quests.find(x => x.qid === questId); + const profileQuest = pmcData.Quests.find((x) => x.qid === questId); // Find index of condition in array const index = profileQuest.completedConditions.indexOf(conditionId); @@ -51,7 +51,7 @@ export class ProfileHelper profileQuest.completedConditions.splice(index, 1); } } - } + } /** * Get all profiles from server @@ -97,7 +97,12 @@ export class ProfileHelper * @param scavProfile post-raid scav profile * @returns updated profile array */ - protected postRaidXpWorkaroundFix(sessionId: string, output: IPmcData[], pmcProfile: IPmcData, scavProfile: IPmcData): IPmcData[] + protected postRaidXpWorkaroundFix( + sessionId: string, + output: IPmcData[], + pmcProfile: IPmcData, + scavProfile: IPmcData, + ): IPmcData[] { const clonedPmc = this.jsonUtil.clone(pmcProfile); const clonedScav = this.jsonUtil.clone(scavProfile); @@ -119,7 +124,7 @@ export class ProfileHelper /** * Check if a nickname is used by another profile loaded by the server - * @param nicknameRequest + * @param nicknameRequest * @param sessionID Session id * @returns True if already used */ @@ -133,8 +138,10 @@ export class ProfileHelper continue; } - if (!this.sessionIdMatchesProfileId(profile.info.id, sessionID) - && this.nicknameMatches(profile.characters.pmc.Info.LowerNickname, nicknameRequest.nickname)) + if ( + !this.sessionIdMatchesProfileId(profile.info.id, sessionID) + && this.nicknameMatches(profile.characters.pmc.Info.LowerNickname, nicknameRequest.nickname) + ) { return true; } @@ -209,9 +216,7 @@ export class ProfileHelper public getDefaultAkiDataObject(): any { - return { - "version": this.getServerVersion() - }; + return { version: this.getServerVersion() }; } public getFullProfile(sessionID: string): IAkiProfile @@ -220,10 +225,10 @@ export class ProfileHelper { return undefined; } - + return this.saveServer.getProfile(sessionID); } - + public getPmcProfile(sessionID: string): IPmcData { const fullProfile = this.getFullProfile(sessionID); @@ -231,10 +236,10 @@ export class ProfileHelper { return undefined; } - + return this.saveServer.getProfile(sessionID).characters.pmc; } - + public getScavProfile(sessionID: string): IPmcData { return this.saveServer.getProfile(sessionID).characters.scav; @@ -254,11 +259,11 @@ export class ProfileHelper LastSessionDate: this.timeUtil.getTimestamp(), SessionCounters: { Items: [] }, OverallCounters: { Items: [] }, - TotalInGameTime: 0 - } + TotalInGameTime: 0, + }, }; } - + protected isWiped(sessionID: string): boolean { return this.saveServer.getProfile(sessionID).info.wipe; @@ -277,14 +282,17 @@ export class ProfileHelper public removeSecureContainer(profile: IPmcData): IPmcData { const items = profile.Inventory.items; - const secureContainer = items.find(x => x.slotId === "SecuredContainer"); + const secureContainer = items.find((x) => x.slotId === "SecuredContainer"); if (secureContainer) { // Find and remove container + children - const childItemsInSecureContainer = this.itemHelper.findAndReturnChildrenByItems(items, secureContainer._id); + const childItemsInSecureContainer = this.itemHelper.findAndReturnChildrenByItems( + items, + secureContainer._id, + ); // Remove child items + secure container - profile.Inventory.items = items.filter(x => !childItemsInSecureContainer.includes(x._id)); + profile.Inventory.items = items.filter((x) => !childItemsInSecureContainer.includes(x._id)); } return profile; @@ -305,7 +313,7 @@ export class ProfileHelper profileToUpdate.aki.receivedGifts = []; } - profileToUpdate.aki.receivedGifts.push({giftId: giftId, timestampAccepted: this.timeUtil.getTimestamp()}); + profileToUpdate.aki.receivedGifts.push({ giftId: giftId, timestampAccepted: this.timeUtil.getTimestamp() }); } /** @@ -328,7 +336,7 @@ export class ProfileHelper return false; } - return !!profile.aki.receivedGifts.find(x => x.giftId === giftId); + return !!profile.aki.receivedGifts.find((x) => x.giftId === giftId); } /** @@ -338,7 +346,7 @@ export class ProfileHelper */ public incrementStatCounter(counters: CounterKeyValue[], keyToIncrement: string): void { - const stat = counters.find(x => x.Key.includes(keyToIncrement)); + const stat = counters.find((x) => x.Key.includes(keyToIncrement)); if (stat) { stat.Value++; @@ -359,7 +367,7 @@ export class ProfileHelper return false; } - const profileSkill = profileSkills.find(x => x.Id === skillType); + const profileSkill = profileSkills.find((x) => x.Id === skillType); if (!profileSkill) { this.logger.warning(`Unable to check for elite skill ${skillType}, not found in profile`); @@ -375,13 +383,20 @@ export class ProfileHelper * @param pointsToAdd Points to add * @param pmcProfile Player profile with skill * @param useSkillProgressRateMultipler Skills are multiplied by a value in globals, default is off to maintain compatibility with legacy code - * @returns + * @returns */ - public addSkillPointsToPlayer(pmcProfile: IPmcData, skill: SkillTypes, pointsToAdd: number, useSkillProgressRateMultipler = false): void + public addSkillPointsToPlayer( + pmcProfile: IPmcData, + skill: SkillTypes, + pointsToAdd: number, + useSkillProgressRateMultipler = false, + ): void { if (!pointsToAdd || pointsToAdd < 0) { - this.logger.error(this.localisationService.getText("player-attempt_to_increment_skill_with_negative_value", skill)); + this.logger.error( + this.localisationService.getText("player-attempt_to_increment_skill_with_negative_value", skill), + ); return; } @@ -393,7 +408,7 @@ export class ProfileHelper return; } - const profileSkill = profileSkills.find(x => x.Id === skill); + const profileSkill = profileSkills.find((x) => x.Id === skill); if (!profileSkill) { this.logger.error(this.localisationService.getText("quest-no_skill_found", skill)); @@ -414,7 +429,7 @@ export class ProfileHelper public getSkillFromProfile(pmcData: IPmcData, skill: SkillTypes): Common { - const skillToReturn = pmcData.Skills.Common.find(x => x.Id === skill); + const skillToReturn = pmcData.Skills.Common.find((x) => x.Id === skill); if (!skillToReturn) { this.logger.warning(`Profile ${pmcData.sessionId} does not have a skill named: ${skill}`); @@ -423,4 +438,4 @@ export class ProfileHelper return skillToReturn; } -} \ No newline at end of file +} diff --git a/project/src/helpers/QuestConditionHelper.ts b/project/src/helpers/QuestConditionHelper.ts index f964551f..b47ba161 100644 --- a/project/src/helpers/QuestConditionHelper.ts +++ b/project/src/helpers/QuestConditionHelper.ts @@ -1,4 +1,3 @@ - import { injectable } from "tsyringe"; import { AvailableForConditions } from "@spt-aki/models/eft/common/tables/IQuest"; @@ -6,29 +5,45 @@ import { AvailableForConditions } from "@spt-aki/models/eft/common/tables/IQuest @injectable() export class QuestConditionHelper { - public getQuestConditions(q: AvailableForConditions[], furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null): AvailableForConditions[] + public getQuestConditions( + q: AvailableForConditions[], + furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null, + ): AvailableForConditions[] { return this.filterConditions(q, "Quest", furtherFilter); } - public getLevelConditions(q: AvailableForConditions[], furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null): AvailableForConditions[] + public getLevelConditions( + q: AvailableForConditions[], + furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null, + ): AvailableForConditions[] { return this.filterConditions(q, "Level", furtherFilter); } - public getLoyaltyConditions(q: AvailableForConditions[], furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null): AvailableForConditions[] + public getLoyaltyConditions( + q: AvailableForConditions[], + furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null, + ): AvailableForConditions[] { return this.filterConditions(q, "TraderLoyalty", furtherFilter); } - public getStandingConditions(q: AvailableForConditions[], furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null): AvailableForConditions[] + public getStandingConditions( + q: AvailableForConditions[], + furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null, + ): AvailableForConditions[] { return this.filterConditions(q, "TraderStanding", furtherFilter); } - protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null): AvailableForConditions[] + protected filterConditions( + q: AvailableForConditions[], + questType: string, + furtherFilter: (a: AvailableForConditions) => AvailableForConditions[] = null, + ): AvailableForConditions[] { - const filteredQuests = q.filter(c => + const filteredQuests = q.filter((c) => { if (c._parent === questType) { @@ -43,4 +58,4 @@ export class QuestConditionHelper return filteredQuests; } -} \ No newline at end of file +} diff --git a/project/src/helpers/QuestHelper.ts b/project/src/helpers/QuestHelper.ts index 2ea06add..506350b3 100644 --- a/project/src/helpers/QuestHelper.ts +++ b/project/src/helpers/QuestHelper.ts @@ -53,25 +53,23 @@ export class QuestHelper @inject("LocalisationService") protected localisationService: LocalisationService, @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("MailSendService") protected mailSendService: MailSendService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.questConfig = this.configServer.getConfig(ConfigTypes.QUEST); } /** - * Get status of a quest in player profile by its id - * @param pmcData Profile to search - * @param questId Quest id to look up - * @returns QuestStatus enum - */ + * Get status of a quest in player profile by its id + * @param pmcData Profile to search + * @param questId Quest id to look up + * @returns QuestStatus enum + */ public getQuestStatus(pmcData: IPmcData, questId: string): QuestStatus { - const quest = pmcData.Quests?.find(q => q.qid === questId); + const quest = pmcData.Quests?.find((q) => q.qid === questId); - return quest - ? quest.status - : QuestStatus.Locked; + return quest ? quest.status : QuestStatus.Locked; } /** @@ -97,7 +95,12 @@ export class QuestHelper case "=": return playerLevel === condition._props.value; default: - this.logger.error(this.localisationService.getText("quest-unable_to_find_compare_condition", condition._props.compareMethod)); + this.logger.error( + this.localisationService.getText( + "quest-unable_to_find_compare_condition", + condition._props.compareMethod, + ), + ); return false; } } @@ -181,7 +184,7 @@ export class QuestHelper /** * Get quest name by quest id * @param questId id to get - * @returns + * @returns */ public getQuestNameFromLocale(questId: string): string { @@ -189,7 +192,6 @@ export class QuestHelper return this.localeService.getLocaleDb()[questNameKey]; } - /** * Check if trader has sufficient loyalty to fulfill quest requirement * @param questProperties Quest props @@ -242,7 +244,7 @@ export class QuestHelper return current !== required; case "==": return current === required; - + default: this.logger.error(this.localisationService.getText("quest-compare_operator_unhandled", compareMethod)); @@ -274,9 +276,11 @@ export class QuestHelper // separate base item and mods, fix stacks if (item._id === reward.target) { - if ((item.parentId !== undefined) && (item.parentId === "hideout") + if ( + (item.parentId !== undefined) && (item.parentId === "hideout") && (item.upd !== undefined) && (item.upd.StackObjectsCount !== undefined) - && (item.upd.StackObjectsCount > 1)) + && (item.upd.StackObjectsCount > 1) + ) { item.upd.StackObjectsCount = 1; } @@ -307,7 +311,7 @@ export class QuestHelper items.push(this.jsonUtil.clone(mod)); } - rewardItems = rewardItems.concat( this.ragfairServerHelper.reparentPresets(target, items)); + rewardItems = rewardItems.concat(this.ragfairServerHelper.reparentPresets(target, items)); } return rewardItems; @@ -322,10 +326,9 @@ export class QuestHelper public getQuestRewardItems(quest: IQuest, status: QuestStatus): Reward[] { // Iterate over all rewards with the desired status, flatten out items that have a type of Item - const questRewards = quest.rewards[QuestStatus[status]] - .flatMap((reward: Reward) => reward.type === "Item" - ? this.processReward(reward) - : []); + const questRewards = quest.rewards[QuestStatus[status]].flatMap((reward: Reward) => + reward.type === "Item" ? this.processReward(reward) : [] + ); return questRewards; } @@ -336,9 +339,13 @@ export class QuestHelper * @param newState State the new quest should be in when returned * @param acceptedQuest Details of accepted quest from client */ - public getQuestReadyForProfile(pmcData: IPmcData, newState: QuestStatus, acceptedQuest: IAcceptQuestRequestData): IQuestStatus + public getQuestReadyForProfile( + pmcData: IPmcData, + newState: QuestStatus, + acceptedQuest: IAcceptQuestRequestData, + ): IQuestStatus { - const existingQuest = pmcData.Quests.find(q => q.qid === acceptedQuest.qid); + const existingQuest = pmcData.Quests.find((q) => q.qid === acceptedQuest.qid); if (existingQuest) { // Quest exists, update its status @@ -360,12 +367,12 @@ export class QuestHelper qid: acceptedQuest.qid, startTime: this.timeUtil.getTimestamp(), status: newState, - statusTimers: {} + statusTimers: {}, }; - + // Check if quest has a prereq to be placed in a 'pending' state const questDbData = this.getQuestFromDb(acceptedQuest.qid, pmcData); - const waitTime = questDbData.conditions.AvailableForStart.find(x => x._props.availableAfter > 0); + const waitTime = questDbData.conditions.AvailableForStart.find((x) => x._props.availableAfter > 0); if (waitTime && acceptedQuest.type !== "repeatable") { // Quest should be put into 'pending' state @@ -392,14 +399,14 @@ export class QuestHelper { // Get quest acceptance data from profile const profile: IPmcData = this.profileHelper.getPmcProfile(sessionID); - const startedQuestInProfile = profile.Quests.find(x => x.qid === startedQuestId); + const startedQuestInProfile = profile.Quests.find((x) => x.qid === startedQuestId); - // Get quests that + // Get quests that const eligibleQuests = this.getQuestsFromDb().filter((quest) => { // Quest is accessible to player when the accepted quest passed into param is started // e.g. Quest A passed in, quest B is looped over and has requirement of A to be started, include it - const acceptedQuestCondition = quest.conditions.AvailableForStart.find(x => + const acceptedQuestCondition = quest.conditions.AvailableForStart.find((x) => { return x._parent === "Quest" && x._props.target === startedQuestId @@ -412,7 +419,9 @@ export class QuestHelper return false; } - const standingRequirements = this.questConditionHelper.getStandingConditions(quest.conditions.AvailableForStart); + const standingRequirements = this.questConditionHelper.getStandingConditions( + quest.conditions.AvailableForStart, + ); for (const condition of standingRequirements) { if (!this.traderStandingRequirementCheck(condition._props, profile)) @@ -421,7 +430,9 @@ export class QuestHelper } } - const loyaltyRequirements = this.questConditionHelper.getLoyaltyConditions(quest.conditions.AvailableForStart); + const loyaltyRequirements = this.questConditionHelper.getLoyaltyConditions( + quest.conditions.AvailableForStart, + ); for (const condition of loyaltyRequirements) { if (!this.traderLoyaltyLevelRequirementCheck(condition._props, profile)) @@ -431,7 +442,8 @@ export class QuestHelper } // Include if quest found in profile and is started or ready to hand in - return startedQuestInProfile && ([QuestStatus.Started, QuestStatus.AvailableForFinish].includes(startedQuestInProfile.status)); + return startedQuestInProfile + && ([QuestStatus.Started, QuestStatus.AvailableForFinish].includes(startedQuestInProfile.status)); }); return this.getQuestsWithOnlyLevelRequirementStartCondition(eligibleQuests); @@ -446,17 +458,16 @@ export class QuestHelper public failedUnlocked(failedQuestId: string, sessionId: string): IQuest[] { const profile = this.profileHelper.getPmcProfile(sessionId); - const profileQuest = profile.Quests.find(x => x.qid === failedQuestId); + const profileQuest = profile.Quests.find((x) => x.qid === failedQuestId); const quests = this.getQuestsFromDb().filter((q) => { - const acceptedQuestCondition = q.conditions.AvailableForStart.find( - c => - { - return c._parent === "Quest" - && c._props.target === failedQuestId - && c._props.status[0] === QuestStatus.Fail; - }); + const acceptedQuestCondition = q.conditions.AvailableForStart.find((c) => + { + return c._parent === "Quest" + && c._props.target === failedQuestId + && c._props.status[0] === QuestStatus.Fail; + }); if (!acceptedQuestCondition) { @@ -490,7 +501,9 @@ export class QuestHelper { if (this.paymentHelper.isMoneyTpl(reward.items[0]._tpl)) { - reward.items[0].upd.StackObjectsCount += Math.round(reward.items[0].upd.StackObjectsCount * multiplier / 100); + reward.items[0].upd.StackObjectsCount += Math.round( + reward.items[0].upd.StackObjectsCount * multiplier / 100, + ); } } } @@ -507,9 +520,15 @@ export class QuestHelper * @param sessionID Session id * @param output ItemEvent router response */ - public changeItemStack(pmcData: IPmcData, itemId: string, newStackSize: number, sessionID: string, output: IItemEventRouterResponse): void + public changeItemStack( + pmcData: IPmcData, + itemId: string, + newStackSize: number, + sessionID: string, + output: IItemEventRouterResponse, + ): void { - const inventoryItemIndex = pmcData.Inventory.items.findIndex(item => item._id === itemId); + const inventoryItemIndex = pmcData.Inventory.items.findIndex((item) => item._id === itemId); if (inventoryItemIndex < 0) { this.logger.error(this.localisationService.getText("quest-item_not_found_in_inventory", itemId)); @@ -532,7 +551,7 @@ export class QuestHelper { // this case is probably dead Code right now, since the only calling function // checks explicitly for Value > 0. - output.profileChanges[sessionID].items.del.push({ "_id": itemId }); + output.profileChanges[sessionID].items.del.push({ _id: itemId }); pmcData.Inventory.items.splice(inventoryItemIndex, 1); } } @@ -543,15 +562,19 @@ export class QuestHelper * @param sessionId Session id * @param item Item that was adjusted */ - protected addItemStackSizeChangeIntoEventResponse(output: IItemEventRouterResponse, sessionId: string, item: Item): void + protected addItemStackSizeChangeIntoEventResponse( + output: IItemEventRouterResponse, + sessionId: string, + item: Item, + ): void { output.profileChanges[sessionId].items.change.push({ - "_id": item._id, - "_tpl": item._tpl, - "parentId": item.parentId, - "slotId": item.slotId, - "location": item.location, - "upd": { "StackObjectsCount": item.upd.StackObjectsCount } + _id: item._id, + _tpl: item._tpl, + parentId: item.parentId, + slotId: item.slotId, + location: item.location, + upd: { StackObjectsCount: item.upd.StackObjectsCount }, }); } @@ -578,7 +601,7 @@ export class QuestHelper public getQuestWithOnlyLevelRequirementStartCondition(quest: IQuest): IQuest { quest = this.jsonUtil.clone(quest); - quest.conditions.AvailableForStart = quest.conditions.AvailableForStart.filter(q => q._parent === "Level"); + quest.conditions.AvailableForStart = quest.conditions.AvailableForStart.filter((q) => q._parent === "Level"); return quest; } @@ -591,7 +614,12 @@ export class QuestHelper * @param output Client output * @returns Item event router response */ - public failQuest(pmcData: IPmcData, failRequest: IFailQuestRequestData, sessionID: string, output: IItemEventRouterResponse = null): IItemEventRouterResponse + public failQuest( + pmcData: IPmcData, + failRequest: IFailQuestRequestData, + sessionID: string, + output: IItemEventRouterResponse = null, + ): IItemEventRouterResponse { // Prepare response to send back client if (!output) @@ -611,7 +639,7 @@ export class QuestHelper MessageType.QUEST_FAIL, quest.failMessageText, questRewards, - this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime) + this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime), ); output.profileChanges[sessionID].quests.push(this.failedUnlocked(failRequest.qid, sessionID)); @@ -645,7 +673,7 @@ export class QuestHelper // Check daily/weekly objects for (const repeatableType of pmcData.RepeatableQuests) { - quest = repeatableType.activeQuests.find(x => x._id === questId); + quest = repeatableType.activeQuests.find((x) => x._id === questId); if (quest) { break; @@ -666,7 +694,10 @@ export class QuestHelper { // blank or is a guid, use description instead const startedMessageText = this.getQuestLocaleIdFromDb(startedMessageTextId); - if (!startedMessageText || startedMessageText.trim() === "" || startedMessageText.toLowerCase() === "test" || startedMessageText.length === 24) + if ( + !startedMessageText || startedMessageText.trim() === "" || startedMessageText.toLowerCase() === "test" + || startedMessageText.length === 24 + ) { return questDescriptionId; } @@ -694,7 +725,7 @@ export class QuestHelper public updateQuestState(pmcData: IPmcData, newQuestState: QuestStatus, questId: string): void { // Find quest in profile, update status to desired status - const questToUpdate = pmcData.Quests.find(quest => quest.qid === questId); + const questToUpdate = pmcData.Quests.find((quest) => quest.qid === questId); if (questToUpdate) { questToUpdate.status = newQuestState; @@ -711,8 +742,14 @@ export class QuestHelper * @param questResponse Response to send back to client * @returns Array of reward objects */ - public applyQuestReward(pmcData: IPmcData, questId: string, state: QuestStatus, sessionId: string, questResponse: IItemEventRouterResponse): Reward[] - { + public applyQuestReward( + pmcData: IPmcData, + questId: string, + state: QuestStatus, + sessionId: string, + questResponse: IItemEventRouterResponse, + ): Reward[] + { let questDetails = this.getQuestFromDb(questId, pmcData); if (!questDetails) { @@ -720,7 +757,7 @@ export class QuestHelper return []; } - + // Check for and apply intel center money bonus if it exists const questMoneyRewardBonus = this.getQuestMoneyRewardBonus(pmcData); if (questMoneyRewardBonus > 0) @@ -736,7 +773,11 @@ export class QuestHelper switch (reward.type) { case QuestRewardType.SKILL: - this.profileHelper.addSkillPointsToPlayer(pmcData, reward.target as SkillTypes, Number(reward.value)); + this.profileHelper.addSkillPointsToPlayer( + pmcData, + reward.target as SkillTypes, + Number(reward.value), + ); break; case QuestRewardType.EXPERIENCE: this.profileHelper.addExperienceToPmc(sessionId, parseInt(reward.value)); // this must occur first as the output object needs to take the modified profile exp value @@ -757,10 +798,22 @@ export class QuestHelper this.logger.debug("Not implemented stash rows reward yet"); break; case QuestRewardType.PRODUCTIONS_SCHEME: - this.findAndAddHideoutProductionIdToProfile(pmcData, reward, questDetails, sessionId, questResponse); + this.findAndAddHideoutProductionIdToProfile( + pmcData, + reward, + questDetails, + sessionId, + questResponse, + ); break; default: - this.logger.error(this.localisationService.getText("quest-reward_type_not_handled", {rewardType: reward.type, questId: questId, questName: questDetails.QuestName})); + this.logger.error( + this.localisationService.getText("quest-reward_type_not_handled", { + rewardType: reward.type, + questId: questId, + questName: questDetails.QuestName, + }), + ); break; } } @@ -777,19 +830,31 @@ export class QuestHelper * @param sessionID Session id * @param response Response to send back to client */ - protected findAndAddHideoutProductionIdToProfile(pmcData: IPmcData, craftUnlockReward: Reward, questDetails: IQuest, sessionID: string, response: IItemEventRouterResponse): void + protected findAndAddHideoutProductionIdToProfile( + pmcData: IPmcData, + craftUnlockReward: Reward, + questDetails: IQuest, + sessionID: string, + response: IItemEventRouterResponse, + ): void { // Get hideout crafts and find those that match by areatype/required level/end product tpl - hope for just one match const hideoutProductions = this.databaseServer.getTables().hideout.production; - const matchingProductions = hideoutProductions.filter(x => - x.areaType === Number.parseInt(craftUnlockReward.traderId) - && x.requirements.some(x => x.requiredLevel === craftUnlockReward.loyaltyLevel) - && x.endProduct === craftUnlockReward.items[0]._tpl); + const matchingProductions = hideoutProductions.filter((x) => + x.areaType === Number.parseInt(craftUnlockReward.traderId) + && x.requirements.some((x) => x.requiredLevel === craftUnlockReward.loyaltyLevel) + && x.endProduct === craftUnlockReward.items[0]._tpl + ); // More/less than 1 match, above filtering wasn't strict enough if (matchingProductions.length !== 1) { - this.logger.error(this.localisationService.getText("quest-unable_to_find_matching_hideout_production", {questName: questDetails.QuestName, matchCount: matchingProductions.length})); + this.logger.error( + this.localisationService.getText("quest-unable_to_find_matching_hideout_production", { + questName: questDetails.QuestName, + matchCount: matchingProductions.length, + }), + ); return; } @@ -808,7 +873,7 @@ export class QuestHelper protected getQuestMoneyRewardBonus(pmcData: IPmcData): number { // Check player has intel center - const moneyRewardBonuses = pmcData.Bonuses.filter(x => x.type === "QuestMoneyReward"); + const moneyRewardBonuses = pmcData.Bonuses.filter((x) => x.type === "QuestMoneyReward"); if (!moneyRewardBonuses) { return 0; @@ -821,7 +886,7 @@ export class QuestHelper const hideoutManagementSkill = this.profileHelper.getSkillFromProfile(pmcData, SkillTypes.HIDEOUT_MANAGEMENT); if (hideoutManagementSkill) { - moneyRewardBonus *= (1 + (hideoutManagementSkill.Progress / 10000)); // 5100 becomes 0.51, add 1 to it, 1.51, multiply the moneyreward bonus by it (e.g. 15 x 51) + moneyRewardBonus *= 1 + (hideoutManagementSkill.Progress / 10000); // 5100 becomes 0.51, add 1 to it, 1.51, multiply the moneyreward bonus by it (e.g. 15 x 51) } return moneyRewardBonus; @@ -833,19 +898,27 @@ export class QuestHelper * @param questIds Quests to search through for the findItem condition * @returns quest id with 'FindItem' condition id */ - public getFindItemConditionByQuestItem(itemTpl: string, questIds: string[], allQuests: IQuest[]): Record + public getFindItemConditionByQuestItem( + itemTpl: string, + questIds: string[], + allQuests: IQuest[], + ): Record { const result: Record = {}; for (const questId of questIds) { - const questInDb = allQuests.find(x => x._id === questId); + const questInDb = allQuests.find((x) => x._id === questId); if (!questInDb) { - this.logger.warning(`Unable to find quest: ${questId} in db, cannot get 'FindItem' condition, skipping`); + this.logger.warning( + `Unable to find quest: ${questId} in db, cannot get 'FindItem' condition, skipping`, + ); continue; } - const condition = questInDb.conditions.AvailableForFinish.find(c => c._parent === "FindItem" && c._props?.target?.includes(itemTpl)); + const condition = questInDb.conditions.AvailableForFinish.find((c) => + c._parent === "FindItem" && c._props?.target?.includes(itemTpl) + ); if (condition) { result[questId] = condition._props.id; @@ -870,7 +943,7 @@ export class QuestHelper { // Quest from db matches quests in profile, skip const questData = quests[questKey]; - if (pmcProfile.Quests.find(x => x.qid === questData._id)) + if (pmcProfile.Quests.find((x) => x.qid === questData._id)) { continue; } @@ -887,13 +960,13 @@ export class QuestHelper status: statuses[statuses.length - 1], statusTimers: statusesDict, completedConditions: [], - availableAfter: 0 + availableAfter: 0, }; - if (pmcProfile.Quests.some(x => x.qid === questKey)) + if (pmcProfile.Quests.some((x) => x.qid === questKey)) { // Update existing - const existingQuest = pmcProfile.Quests.find(x => x.qid === questKey); + const existingQuest = pmcProfile.Quests.find((x) => x.qid === questKey); existingQuest.status = questRecordToAdd.status; existingQuest.statusTimers = questRecordToAdd.statusTimers; } @@ -907,10 +980,10 @@ export class QuestHelper public findAndRemoveQuestFromArrayIfExists(questId: string, quests: IQuestStatus[]): void { - const pmcQuestToReplaceStatus = quests.find(x => x.qid === questId); + const pmcQuestToReplaceStatus = quests.find((x) => x.qid === questId); if (pmcQuestToReplaceStatus) { quests.splice(quests.indexOf(pmcQuestToReplaceStatus, 1)); } } -} \ No newline at end of file +} diff --git a/project/src/helpers/RagfairHelper.ts b/project/src/helpers/RagfairHelper.ts index 1a73cc0c..85dc82d7 100644 --- a/project/src/helpers/RagfairHelper.ts +++ b/project/src/helpers/RagfairHelper.ts @@ -31,17 +31,17 @@ export class RagfairHelper @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("RagfairLinkedItemService") protected ragfairLinkedItemService: RagfairLinkedItemService, @inject("UtilityHelper") protected utilityHelper: UtilityHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); } /** - * Gets currency TAG from TPL - * @param {string} currency - * @returns string - */ + * Gets currency TAG from TPL + * @param {string} currency + * @returns string + */ public getCurrencyTag(currency: string): string { switch (currency) @@ -74,9 +74,7 @@ export class RagfairHelper if (info.linkedSearchId) { const data = this.ragfairLinkedItemService.getLinkedItems(info.linkedSearchId); - result = !data - ? [] - : [...data]; + result = !data ? [] : [...data]; } // Case: category @@ -186,7 +184,7 @@ export class RagfairHelper for (let item of items) { item = this.itemHelper.fixItemStackCount(item); - const isChild = items.find(it => it._id === item.parentId); + const isChild = items.find((it) => it._id === item.parentId); if (!isChild) { @@ -219,10 +217,8 @@ export class RagfairHelper case Money.DOLLARS: return "$"; - - case Money.ROUBLES: default: return "₽"; } } -} \ No newline at end of file +} diff --git a/project/src/helpers/RagfairOfferHelper.ts b/project/src/helpers/RagfairOfferHelper.ts index 45f2e7d4..620bf7d6 100644 --- a/project/src/helpers/RagfairOfferHelper.ts +++ b/project/src/helpers/RagfairOfferHelper.ts @@ -60,7 +60,7 @@ export class RagfairOfferHelper @inject("LocaleService") protected localeService: LocaleService, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("MailSendService") protected mailSendService: MailSendService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -75,9 +75,16 @@ export class RagfairOfferHelper * @param pmcProfile Player profile * @returns Offers the player should see */ - public getValidOffers(searchRequest: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record, pmcProfile: IPmcData): IRagfairOffer[] + public getValidOffers( + searchRequest: ISearchRequestData, + itemsToAdd: string[], + traderAssorts: Record, + pmcProfile: IPmcData, + ): IRagfairOffer[] { - return this.ragfairOfferService.getOffers().filter(x => this.isDisplayableOffer(searchRequest, itemsToAdd, traderAssorts, x, pmcProfile)); + return this.ragfairOfferService.getOffers().filter((x) => + this.isDisplayableOffer(searchRequest, itemsToAdd, traderAssorts, x, pmcProfile) + ); } /** @@ -88,7 +95,12 @@ export class RagfairOfferHelper * @param pmcProfile Player profile * @returns IRagfairOffer array */ - public getOffersForBuild(searchRequest: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record, pmcProfile: IPmcData): IRagfairOffer[] + public getOffersForBuild( + searchRequest: ISearchRequestData, + itemsToAdd: string[], + traderAssorts: Record, + pmcProfile: IPmcData, + ): IRagfairOffer[] { const offersMap = new Map(); const offers: IRagfairOffer[] = []; @@ -137,13 +149,13 @@ export class RagfairOfferHelper if (possibleOffers.length > 1) { const lockedOffers = this.getLoyaltyLockedOffers(possibleOffers, pmcProfile); - + // Exclude locked offers + above loyalty locked offers if at least 1 was found - const availableOffers = possibleOffers.filter(x => !(x.locked || lockedOffers.includes(x._id))); + const availableOffers = possibleOffers.filter((x) => !(x.locked || lockedOffers.includes(x._id))); if (availableOffers.length > 0) { possibleOffers = availableOffers; - } + } } const offer = this.ragfairSortHelper.sortOffers(possibleOffers, RagfairSort.PRICE, 0)[0]; @@ -174,7 +186,9 @@ export class RagfairOfferHelper */ public traderOfferItemQuestLocked(offer: IRagfairOffer, traderAssorts: Record): boolean { - return offer.items?.some(i => traderAssorts[offer.user.id].barter_scheme[i._id]?.some(bs1 => bs1?.some(bs2 => bs2.sptQuestLocked))); + return offer.items?.some((i) => + traderAssorts[offer.user.id].barter_scheme[i._id]?.some((bs1) => bs1?.some((bs2) => bs2.sptQuestLocked)) + ); } /** @@ -182,7 +196,7 @@ export class RagfairOfferHelper * @param offer Offer to check stock of * @returns true if out of stock */ - protected traderOutOfStock(offer: IRagfairOffer): boolean + protected traderOutOfStock(offer: IRagfairOffer): boolean { if (offer?.items?.length === 0) { @@ -200,17 +214,21 @@ export class RagfairOfferHelper protected traderBuyRestrictionReached(offer: IRagfairOffer): boolean { const traderAssorts = this.traderHelper.getTraderAssortsByTraderId(offer.user.id).items; - const assortData = traderAssorts.find(x => x._id === offer.items[0]._id); + const assortData = traderAssorts.find((x) => x._id === offer.items[0]._id); // No trader assort data if (!assortData) { - this.logger.warning(`Unable to find trader: ${offer.user.nickname} assort for item: ${this.itemHelper.getItemName(offer.items[0]._tpl)} ${offer.items[0]._tpl}, cannot check if buy restriction reached`); + this.logger.warning( + `Unable to find trader: ${offer.user.nickname} assort for item: ${ + this.itemHelper.getItemName(offer.items[0]._tpl) + } ${offer.items[0]._tpl}, cannot check if buy restriction reached`, + ); return false; } // No restriction values - // Can't use !assortData.upd.BuyRestrictionX as value could be 0 + // Can't use !assortData.upd.BuyRestrictionX as value could be 0 if (assortData.upd.BuyRestrictionMax === undefined || assortData.upd.BuyRestrictionCurrent === undefined) { return false; @@ -279,7 +297,10 @@ export class RagfairOfferHelper boughtAmount = offer.sellResult[0].amount; } - this.increaseProfileRagfairRating(this.saveServer.getProfile(sessionID), offer.summaryCost / totalItemsCount * boughtAmount); + this.increaseProfileRagfairRating( + this.saveServer.getProfile(sessionID), + offer.summaryCost / totalItemsCount * boughtAmount, + ); this.completeOffer(sessionID, offer, boughtAmount); offer.sellResult.splice(0, 1); @@ -297,7 +318,7 @@ export class RagfairOfferHelper public increaseProfileRagfairRating(profile: IAkiProfile, amountToIncrementBy: number): void { profile.characters.pmc.RagfairInfo.isRatingGrowing = true; - if (isNaN(amountToIncrementBy)) + if (Number.isNaN(amountToIncrementBy)) { this.logger.warning(`Unable to increment ragfair rating, value was not a number: ${amountToIncrementBy}`); @@ -331,7 +352,7 @@ export class RagfairOfferHelper protected deleteOfferById(sessionID: string, offerId: string): void { const profileRagfairInfo = this.saveServer.getProfile(sessionID).characters.pmc.RagfairInfo; - const index = profileRagfairInfo.offers.findIndex(o => o._id === offerId); + const index = profileRagfairInfo.offers.findIndex((o) => o._id === offerId); profileRagfairInfo.offers.splice(index, 1); // Also delete from ragfair this.ragfairOfferService.removeOfferById(offerId); @@ -357,7 +378,7 @@ export class RagfairOfferHelper else { offer.items[0].upd.StackObjectsCount -= boughtAmount; - const rootItems = offer.items.filter(i => i.parentId === "hideout"); + const rootItems = offer.items.filter((i) => i.parentId === "hideout"); rootItems.splice(0, 1); let removeCount = boughtAmount; @@ -384,11 +405,13 @@ export class RagfairOfferHelper while (foundNewItems) { foundNewItems = false; - + // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const id of idsToRemove) { - const newIds = offer.items.filter(i => !idsToRemove.includes(i._id) && idsToRemove.includes(i.parentId)).map(i => i._id); + const newIds = offer.items.filter((i) => + !idsToRemove.includes(i._id) && idsToRemove.includes(i.parentId) + ).map((i) => i._id); if (newIds.length > 0) { foundNewItems = true; @@ -399,7 +422,7 @@ export class RagfairOfferHelper if (idsToRemove.length > 0) { - offer.items = offer.items.filter(i => !idsToRemove.includes(i._id)); + offer.items = offer.items.filter((i) => !idsToRemove.includes(i._id)); } } @@ -410,7 +433,7 @@ export class RagfairOfferHelper const requestedItem: Item = { _id: this.hashUtil.generate(), _tpl: requirement._tpl, - upd: { StackObjectsCount: requirement.count * boughtAmount } + upd: { StackObjectsCount: requirement.count * boughtAmount }, }; const stacks = this.itemHelper.splitStack(requestedItem); @@ -436,7 +459,7 @@ export class RagfairOfferHelper const ragfairDetails = { offerId: offer._id, count: offer.sellInOnePiece ? offerStackCount : boughtAmount, // pack-offers NEED to the full item count otherwise it only removes 1 from the pack, leaving phantom offer on client ui - handbookId: itemTpl + handbookId: itemTpl, }; this.mailSendService.sendDirectNpcMessageToPlayer( @@ -447,7 +470,8 @@ export class RagfairOfferHelper itemsToSend, this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime), null, - ragfairDetails); + ragfairDetails, + ); return this.eventOutputHolder.getOutput(sessionID); } @@ -465,14 +489,19 @@ export class RagfairOfferHelper const soldMessageLocaleGuid = globalLocales[RagfairOfferHelper.goodSoldTemplate]; if (!soldMessageLocaleGuid) { - this.logger.error(this.localisationService.getText("ragfair-unable_to_find_locale_by_key", RagfairOfferHelper.goodSoldTemplate)); + this.logger.error( + this.localisationService.getText( + "ragfair-unable_to_find_locale_by_key", + RagfairOfferHelper.goodSoldTemplate, + ), + ); } // Used to replace tokens in sold message sent to player const tplVars: ISystemData = { soldItem: globalLocales[`${itemTpl} Name`] || itemTpl, buyerNickname: this.ragfairServerHelper.getNickname(this.hashUtil.generate()), - itemCount: boughtAmount + itemCount: boughtAmount, }; const offerSoldMessageText = soldMessageLocaleGuid.replace(/{\w+}/g, (matched) => @@ -492,14 +521,23 @@ export class RagfairOfferHelper * @param pmcProfile Player profile * @returns True = should be shown to player */ - public isDisplayableOffer(searchRequest: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean + public isDisplayableOffer( + searchRequest: ISearchRequestData, + itemsToAdd: string[], + traderAssorts: Record, + offer: IRagfairOffer, + pmcProfile: IPmcData, + ): boolean { const item = offer.items[0]; const money = offer.requirements[0]._tpl; const isTraderOffer = offer.user.memberType === MemberCategory.TRADER; const isDefaultUserOffer = offer.user.memberType === MemberCategory.DEFAULT; - if (pmcProfile.Info.Level < this.databaseServer.getTables().globals.config.RagFair.minUserLevel && isDefaultUserOffer) + if ( + pmcProfile.Info.Level < this.databaseServer.getTables().globals.config.RagFair.minUserLevel + && isDefaultUserOffer + ) { // Skip item if player is < global unlock level (default is 15) and item is from a dynamically generated source return false; @@ -512,7 +550,7 @@ export class RagfairOfferHelper } // Performing a required search and offer doesn't have requirement for item - if (searchRequest.neededSearchId && !offer.requirements.some(x => x._tpl === searchRequest.neededSearchId)) + if (searchRequest.neededSearchId && !offer.requirements.some((x) => x._tpl === searchRequest.neededSearchId)) { return false; } @@ -559,7 +597,10 @@ export class RagfairOfferHelper return false; } - if (( item.upd.MedKit || item.upd.Repairable ) && !this.itemQualityInRange(item, searchRequest.conditionFrom, searchRequest.conditionTo)) + if ( + (item.upd.MedKit || item.upd.Repairable) + && !this.itemQualityInRange(item, searchRequest.conditionFrom, searchRequest.conditionTo) + ) { return false; } @@ -595,7 +636,7 @@ export class RagfairOfferHelper return false; } - if (isNaN(offer.requirementsCost)) + if (Number.isNaN(offer.requirementsCost)) { // don't include offers with null or NaN in it return false; @@ -612,10 +653,12 @@ export class RagfairOfferHelper return false; } - if (!traderAssorts[offer.user.id].items.find((item) => - { - return item._id === offer.root; - })) + if ( + !traderAssorts[offer.user.id].items.find((item) => + { + return item._id === offer.root; + }) + ) { // skip (quest) locked items return false; @@ -649,4 +692,4 @@ export class RagfairOfferHelper return true; } -} \ No newline at end of file +} diff --git a/project/src/helpers/RagfairSellHelper.ts b/project/src/helpers/RagfairSellHelper.ts index 43f95f93..8cbf6545 100644 --- a/project/src/helpers/RagfairSellHelper.ts +++ b/project/src/helpers/RagfairSellHelper.ts @@ -17,7 +17,7 @@ export class RagfairSellHelper @inject("WinstonLogger") protected logger: ILogger, @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("TimeUtil") protected timeUtil: TimeUtil, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -30,15 +30,22 @@ export class RagfairSellHelper * @param qualityMultiplier Quality multipler of item being sold * @returns percent value */ - public calculateSellChance(averageOfferPriceRub: number, playerListedPriceRub: number, qualityMultiplier: number): number + public calculateSellChance( + averageOfferPriceRub: number, + playerListedPriceRub: number, + qualityMultiplier: number, + ): number { const baseSellChancePercent = this.ragfairConfig.sell.chance.base * qualityMultiplier; const listedPriceAboveAverage = playerListedPriceRub > averageOfferPriceRub; // Get sell chance multiplier - const multiplier = (listedPriceAboveAverage) + const multiplier = listedPriceAboveAverage ? this.ragfairConfig.sell.chance.overpriced // Player price is over average listing price - : this.getSellMultiplierWhenPlayerPriceIsBelowAverageListingPrice(averageOfferPriceRub, playerListedPriceRub); + : this.getSellMultiplierWhenPlayerPriceIsBelowAverageListingPrice( + averageOfferPriceRub, + playerListedPriceRub, + ); return Math.round(baseSellChancePercent * (averageOfferPriceRub / playerListedPriceRub * multiplier)); } @@ -49,11 +56,12 @@ export class RagfairSellHelper * @param averageOfferPriceRub Price of average offer in roubles * @returns percent value */ - protected getSellMultiplierWhenPlayerPriceIsBelowAverageListingPrice(averageOfferPriceRub: number, playerListedPriceRub: number): number + protected getSellMultiplierWhenPlayerPriceIsBelowAverageListingPrice( + averageOfferPriceRub: number, + playerListedPriceRub: number, + ): number { - return (playerListedPriceRub < averageOfferPriceRub) - ? this.ragfairConfig.sell.chance.underpriced - : 1; + return (playerListedPriceRub < averageOfferPriceRub) ? this.ragfairConfig.sell.chance.underpriced : 1; } /** @@ -75,14 +83,16 @@ export class RagfairSellHelper let sellTime = startTime; let remainingCount = itemSellCount; const result: SellResult[] = []; - + // Value can sometimes be NaN for whatever reason, default to base chance if that happens - if (isNaN(sellChancePercent)) + if (Number.isNaN(sellChancePercent)) { - this.logger.warning(`Sell chance was not a number: ${sellChancePercent}, defaulting to ${this.ragfairConfig.sell.chance.base} %`); + this.logger.warning( + `Sell chance was not a number: ${sellChancePercent}, defaulting to ${this.ragfairConfig.sell.chance.base} %`, + ); sellChancePercent = this.ragfairConfig.sell.chance.base; } - + this.logger.debug(`Rolling to sell: ${itemSellCount} items (chance: ${sellChancePercent}%)`); // No point rolling for a sale on a 0% chance item, exit early @@ -90,19 +100,19 @@ export class RagfairSellHelper { return result; } - + while (remainingCount > 0 && sellTime < endTime) { const boughtAmount = this.randomUtil.getInt(1, remainingCount); if (this.randomUtil.getChance100(sellChancePercent)) { // Passed roll check, item will be sold - sellTime += Math.max(Math.round(chance / 100 * this.ragfairConfig.sell.time.max * 60), this.ragfairConfig.sell.time.min * 60); + sellTime += Math.max( + Math.round(chance / 100 * this.ragfairConfig.sell.time.max * 60), + this.ragfairConfig.sell.time.min * 60, + ); - result.push({ - sellTime: sellTime, - amount: boughtAmount - }); + result.push({ sellTime: sellTime, amount: boughtAmount }); this.logger.debug(`Offer will sell at: ${new Date(sellTime * 1000).toLocaleTimeString("en-US")}`); } @@ -116,4 +126,4 @@ export class RagfairSellHelper return result; } -} \ No newline at end of file +} diff --git a/project/src/helpers/RagfairServerHelper.ts b/project/src/helpers/RagfairServerHelper.ts index 9ff80555..5f12bb48 100644 --- a/project/src/helpers/RagfairServerHelper.ts +++ b/project/src/helpers/RagfairServerHelper.ts @@ -48,7 +48,7 @@ export class RagfairServerHelper @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("MailSendService") protected mailSendService: MailSendService, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -57,7 +57,7 @@ export class RagfairServerHelper /** * Is item valid / on blacklist / quest item - * @param itemDetails + * @param itemDetails * @returns boolean */ public isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean @@ -95,7 +95,10 @@ export class RagfairServerHelper } // Don't include damaged ammo packs - if (this.ragfairConfig.dynamic.blacklist.damagedAmmoPacks && itemDetails[1]._parent === BaseClasses.AMMO_BOX && itemDetails[1]._name.includes("_damaged")) + if ( + this.ragfairConfig.dynamic.blacklist.damagedAmmoPacks && itemDetails[1]._parent === BaseClasses.AMMO_BOX + && itemDetails[1]._name.includes("_damaged") + ) { return false; } @@ -120,7 +123,7 @@ export class RagfairServerHelper /** * is supplied id a trader - * @param traderId + * @param traderId * @returns True if id was a trader */ public isTrader(traderId: string): boolean @@ -155,7 +158,7 @@ export class RagfairServerHelper MessageType.MESSAGE_WITH_ITEMS, RagfairServerHelper.goodsReturnedTemplate, returnedItems, - this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime) + this.timeUtil.getHoursAsSeconds(this.questConfig.redeemTime), ); } @@ -171,7 +174,10 @@ export class RagfairServerHelper } // Item Types to return one of - if (isWeaponPreset || this.itemHelper.isOfBaseclasses(itemDetails[1]._id, this.ragfairConfig.dynamic.showAsSingleStack)) + if ( + isWeaponPreset + || this.itemHelper.isOfBaseclasses(itemDetails[1]._id, this.ragfairConfig.dynamic.showAsSingleStack) + ) { return 1; } @@ -185,7 +191,9 @@ export class RagfairServerHelper return Math.round(this.randomUtil.getInt(config.nonStackableCount.min, config.nonStackableCount.max)); } - const stackPercent = Math.round(this.randomUtil.getInt(config.stackablePercent.min, config.stackablePercent.max)); + const stackPercent = Math.round( + this.randomUtil.getInt(config.stackablePercent.min, config.stackablePercent.max), + ); return Math.round((maxStackCount / 100) * stackPercent); } @@ -263,7 +271,9 @@ export class RagfairServerHelper { if (this.databaseServer.getTables().globals.ItemPresets[itemId]._items[0]._tpl === item._tpl) { - const presetItems = this.jsonUtil.clone(this.databaseServer.getTables().globals.ItemPresets[itemId]._items); + const presetItems = this.jsonUtil.clone( + this.databaseServer.getTables().globals.ItemPresets[itemId]._items, + ); presets.push(this.reparentPresets(item, presetItems)); } } @@ -274,7 +284,7 @@ export class RagfairServerHelper /** * Generate new unique ids for the children while preserving hierarchy * @param item base item - * @param preset + * @param preset * @returns Item array with new IDs */ public reparentPresets(item: Item, preset: Item[]): Item[] @@ -296,11 +306,11 @@ export class RagfairServerHelper idMappings[mod.parentId] = this.hashUtil.generate(); } - mod._id = idMappings[mod._id]; + mod._id = idMappings[mod._id]; if (mod.parentId !== undefined) { - mod.parentId = idMappings[mod.parentId]; + mod.parentId = idMappings[mod.parentId]; } } @@ -309,4 +319,4 @@ export class RagfairServerHelper return preset; } -} \ No newline at end of file +} diff --git a/project/src/helpers/RagfairSortHelper.ts b/project/src/helpers/RagfairSortHelper.ts index 2e41203b..edb06fa4 100644 --- a/project/src/helpers/RagfairSortHelper.ts +++ b/project/src/helpers/RagfairSortHelper.ts @@ -10,15 +10,15 @@ export class RagfairSortHelper { constructor( @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("LocaleService") protected localeService: LocaleService + @inject("LocaleService") protected localeService: LocaleService, ) - { } + {} /** * Sort a list of ragfair offers by something (id/rating/offer name/price/expiry time) * @param offers Offers to sort * @param type How to sort it - * @param direction Ascending/descending + * @param direction Ascending/descending * @returns Sorted offers */ public sortOffers(offers: IRagfairOffer[], type: RagfairSort, direction = 0): IRagfairOffer[] @@ -75,16 +75,14 @@ export class RagfairSortHelper const nameA = locale[`${tplA} Name`] || tplA; const nameB = locale[`${tplB} Name`] || tplB; - return (nameA < nameB) - ? -1 - : (nameA > nameB) ? 1 : 0; + return (nameA < nameB) ? -1 : (nameA > nameB) ? 1 : 0; } /** * Order two offers by rouble price value * @param a Offer a * @param b Offer b - * @returns + * @returns */ protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number { @@ -95,4 +93,4 @@ export class RagfairSortHelper { return a.endTime - b.endTime; } -} \ No newline at end of file +} diff --git a/project/src/helpers/RepairHelper.ts b/project/src/helpers/RepairHelper.ts index 9b1a07bd..0e031ecd 100644 --- a/project/src/helpers/RepairHelper.ts +++ b/project/src/helpers/RepairHelper.ts @@ -21,7 +21,7 @@ export class RepairHelper @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.repairConfig = this.configServer.getConfig(ConfigTypes.REPAIR); @@ -44,7 +44,7 @@ export class RepairHelper amountToRepair: number, useRepairKit: boolean, traderQualityMultipler: number, - applyMaxDurabilityDegradation = true + applyMaxDurabilityDegradation = true, ): void { this.logger.debug(`Adding ${amountToRepair} to ${itemToRepairDetails._name} using kit: ${useRepairKit}`); @@ -68,22 +68,29 @@ export class RepairHelper } // Construct object to return - itemToRepair.upd.Repairable = { - Durability: newCurrentDurability, - MaxDurability: newCurrentMaxDurability - }; + itemToRepair.upd.Repairable = { Durability: newCurrentDurability, MaxDurability: newCurrentMaxDurability }; // when modders set the repair coefficient to 0 it means that they dont want to lose durability on items // the code below generates a random degradation on the weapon durability if (applyMaxDurabilityDegradation) { - const randomisedWearAmount = (isArmor) - ? this.getRandomisedArmorRepairDegradationValue(itemToRepairDetails._props.ArmorMaterial, useRepairKit, itemCurrentMaxDurability, traderQualityMultipler) - : this.getRandomisedWeaponRepairDegradationValue(itemToRepairDetails._props, useRepairKit, itemCurrentMaxDurability, traderQualityMultipler); - + const randomisedWearAmount = isArmor + ? this.getRandomisedArmorRepairDegradationValue( + itemToRepairDetails._props.ArmorMaterial, + useRepairKit, + itemCurrentMaxDurability, + traderQualityMultipler, + ) + : this.getRandomisedWeaponRepairDegradationValue( + itemToRepairDetails._props, + useRepairKit, + itemCurrentMaxDurability, + traderQualityMultipler, + ); + // Apply wear to durability itemToRepair.upd.Repairable.MaxDurability -= randomisedWearAmount; - + // After adjusting max durability with degradation, ensure current dura isnt above max if (itemToRepair.upd.Repairable.Durability > itemToRepair.upd.Repairable.MaxDurability) { @@ -98,7 +105,12 @@ export class RepairHelper } } - protected getRandomisedArmorRepairDegradationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number, traderQualityMultipler: number): number + protected getRandomisedArmorRepairDegradationValue( + armorMaterial: string, + isRepairKit: boolean, + armorMax: number, + traderQualityMultipler: number, + ): number { const armorMaterialSettings = this.databaseServer.getTables().globals.config.ArmorMaterials[armorMaterial]; @@ -111,19 +123,20 @@ export class RepairHelper : armorMaterialSettings.MaxRepairDegradation; const duraLossPercent = this.randomUtil.getFloat(minMultiplier, maxMultiplier); - const duraLossMultipliedByTraderMultiplier = (duraLossPercent * armorMax) * traderQualityMultipler; + const duraLossMultipliedByTraderMultiplier = (duraLossPercent * armorMax) * traderQualityMultipler; return Number(duraLossMultipliedByTraderMultiplier.toFixed(2)); } - protected getRandomisedWeaponRepairDegradationValue(itemProps: Props, isRepairKit: boolean, weaponMax: number, traderQualityMultipler: number): number + protected getRandomisedWeaponRepairDegradationValue( + itemProps: Props, + isRepairKit: boolean, + weaponMax: number, + traderQualityMultipler: number, + ): number { - const minRepairDeg = (isRepairKit) - ? itemProps.MinRepairKitDegradation - : itemProps.MinRepairDegradation; - let maxRepairDeg = (isRepairKit) - ? itemProps.MaxRepairKitDegradation - : itemProps.MaxRepairDegradation; + const minRepairDeg = isRepairKit ? itemProps.MinRepairKitDegradation : itemProps.MinRepairDegradation; + let maxRepairDeg = isRepairKit ? itemProps.MaxRepairKitDegradation : itemProps.MaxRepairDegradation; // WORKAROUND: Some items are always 0 when repairkit is true if (maxRepairDeg === 0) @@ -132,7 +145,7 @@ export class RepairHelper } const duraLossPercent = this.randomUtil.getFloat(minRepairDeg, maxRepairDeg); - const duraLossMultipliedByTraderMultiplier = (duraLossPercent * weaponMax) * traderQualityMultipler; + const duraLossMultipliedByTraderMultiplier = (duraLossPercent * weaponMax) * traderQualityMultipler; return Number(duraLossMultipliedByTraderMultiplier.toFixed(2)); } @@ -151,5 +164,4 @@ export class RepairHelper return parentNode._id === BaseClasses.WEAPON; } - -} \ No newline at end of file +} diff --git a/project/src/helpers/RepeatableQuestHelper.ts b/project/src/helpers/RepeatableQuestHelper.ts index dabf30cd..24182c84 100644 --- a/project/src/helpers/RepeatableQuestHelper.ts +++ b/project/src/helpers/RepeatableQuestHelper.ts @@ -15,7 +15,7 @@ export class RepeatableQuestHelper constructor( @inject("MathUtil") protected mathUtil: MathUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.questConfig = this.configServer.getConfig(ConfigTypes.QUEST); @@ -27,9 +27,14 @@ export class RepeatableQuestHelper * @param repeatableConfig Main repeatable config * @returns IEliminationConfig */ - public getEliminationConfigByPmcLevel(pmcLevel: number, repeatableConfig: IRepeatableQuestConfig): IEliminationConfig + public getEliminationConfigByPmcLevel( + pmcLevel: number, + repeatableConfig: IRepeatableQuestConfig, + ): IEliminationConfig { - return repeatableConfig.questConfig.Elimination.find(x => pmcLevel >= x.levelRange.min && pmcLevel <= x.levelRange.max); + return repeatableConfig.questConfig.Elimination.find((x) => + pmcLevel >= x.levelRange.min && pmcLevel <= x.levelRange.max + ); } public probabilityObjectArray(configArrayInput: ProbabilityObject[]): ProbabilityObjectArray @@ -38,8 +43,10 @@ export class RepeatableQuestHelper const probabilityArray = new ProbabilityObjectArray(this.mathUtil, this.jsonUtil); for (const configObject of configArray) { - probabilityArray.push(new ProbabilityObject(configObject.key, configObject.relativeProbability, configObject.data)); + probabilityArray.push( + new ProbabilityObject(configObject.key, configObject.relativeProbability, configObject.data), + ); } return probabilityArray; } -} \ No newline at end of file +} diff --git a/project/src/helpers/SecureContainerHelper.ts b/project/src/helpers/SecureContainerHelper.ts index bce992cb..a8dd36af 100644 --- a/project/src/helpers/SecureContainerHelper.ts +++ b/project/src/helpers/SecureContainerHelper.ts @@ -5,24 +5,21 @@ import { Item } from "@spt-aki/models/eft/common/tables/IItem"; export interface OwnerInventoryItems { - from: Item[] - to: Item[] - sameInventory: boolean, - isMail: boolean + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; } @injectable() export class SecureContainerHelper { - - constructor( - @inject("ItemHelper") protected itemHelper: ItemHelper - ) - { } + constructor(@inject("ItemHelper") protected itemHelper: ItemHelper) + {} public getSecureContainerItems(items: Item[]): string[] { - const secureContainer = items.find(x => x.slotId === "SecuredContainer"); + const secureContainer = items.find((x) => x.slotId === "SecuredContainer"); // No container found, drop out if (!secureContainer) @@ -33,6 +30,6 @@ export class SecureContainerHelper const itemsInSecureContainer = this.itemHelper.findAndReturnChildrenByItems(items, secureContainer._id); // Return all items returned and exclude the secure container item itself - return itemsInSecureContainer.filter(x => x !== secureContainer._id); + return itemsInSecureContainer.filter((x) => x !== secureContainer._id); } } diff --git a/project/src/helpers/TradeHelper.ts b/project/src/helpers/TradeHelper.ts index e92f3b77..11750a18 100644 --- a/project/src/helpers/TradeHelper.ts +++ b/project/src/helpers/TradeHelper.ts @@ -34,7 +34,7 @@ export class TradeHelper @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("InventoryHelper") protected inventoryHelper: InventoryHelper, @inject("RagfairServer") protected ragfairServer: RagfairServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.traderConfig = this.configServer.getConfig(ConfigTypes.TRADER); @@ -47,21 +47,25 @@ export class TradeHelper * @param sessionID Session id * @param foundInRaid Should item be found in raid * @param upd optional item details used when buying from flea - * @returns + * @returns */ - public buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse + public buyItem( + pmcData: IPmcData, + buyRequestData: IProcessBuyTradeRequestData, + sessionID: string, + foundInRaid: boolean, + upd: Upd, + ): IItemEventRouterResponse { let output = this.eventOutputHolder.getOutput(sessionID); const newReq = { - items: [ - { - // eslint-disable-next-line @typescript-eslint/naming-convention - item_id: buyRequestData.item_id, - count: buyRequestData.count - } - ], - tid: buyRequestData.tid + items: [{ + // eslint-disable-next-line @typescript-eslint/naming-convention + item_id: buyRequestData.item_id, + count: buyRequestData.count, + }], + tid: buyRequestData.tid, }; const callback = () => @@ -71,13 +75,13 @@ export class TradeHelper if (isRagfair) { const allOffers = this.ragfairServer.getOffers(); - const offersWithItem = allOffers.find(x => x.items[0]._id === buyRequestData.item_id); + const offersWithItem = allOffers.find((x) => x.items[0]._id === buyRequestData.item_id); itemPurchased = offersWithItem.items[0]; } else { const traderAssorts = this.traderHelper.getTraderAssortsByTraderId(buyRequestData.tid).items; - itemPurchased = traderAssorts.find(x => x._id === buyRequestData.item_id); + itemPurchased = traderAssorts.find((x) => x._id === buyRequestData.item_id); } // Ensure purchase does not exceed trader item limit @@ -130,7 +134,12 @@ export class TradeHelper * @param sessionID Session id * @returns IItemEventRouterResponse */ - public sellItem(profileWithItemsToSell: IPmcData, profileToReceiveMoney: IPmcData, sellRequest: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse + public sellItem( + profileWithItemsToSell: IPmcData, + profileToReceiveMoney: IPmcData, + sellRequest: IProcessSellTradeRequestData, + sessionID: string, + ): IItemEventRouterResponse { let output = this.eventOutputHolder.getOutput(sessionID); @@ -140,7 +149,7 @@ export class TradeHelper const itemIdToFind = itemToBeRemoved.id.replace(/\s+/g, ""); // Strip out whitespace // Find item in player inventory, or show error to player if not found - const matchingItemInInventory = profileWithItemsToSell.Inventory.items.find(x => x._id === itemIdToFind); + const matchingItemInInventory = profileWithItemsToSell.Inventory.items.find((x) => x._id === itemIdToFind); if (!matchingItemInInventory) { const errorMessage = `Unable to sell item ${itemToBeRemoved.id}, cannot be found in player inventory`; @@ -179,7 +188,9 @@ export class TradeHelper { if ((assortBeingPurchased.upd.BuyRestrictionCurrent + count) > assortBeingPurchased.upd?.BuyRestrictionMax) { - throw new Error(`Unable to purchase ${count} items, this would exceed your purchase limit of ${assortBeingPurchased.upd.BuyRestrictionMax} from the trader this refresh`); + throw new Error( + `Unable to purchase ${count} items, this would exceed your purchase limit of ${assortBeingPurchased.upd.BuyRestrictionMax} from the trader this refresh`, + ); } } -} \ No newline at end of file +} diff --git a/project/src/helpers/TraderAssortHelper.ts b/project/src/helpers/TraderAssortHelper.ts index 15a39dc7..fb6a4431 100644 --- a/project/src/helpers/TraderAssortHelper.ts +++ b/project/src/helpers/TraderAssortHelper.ts @@ -26,11 +26,7 @@ import { TimeUtil } from "@spt-aki/utils/TimeUtil"; export class TraderAssortHelper { protected traderConfig: ITraderConfig; - protected mergedQuestAssorts: Record> = { - started: {}, - success: {}, - fail: {} - }; + protected mergedQuestAssorts: Record> = { started: {}, success: {}, fail: {} }; protected createdMergedQuestAssorts = false; constructor( @@ -46,10 +42,11 @@ export class TraderAssortHelper @inject("RagfairOfferGenerator") protected ragfairOfferGenerator: RagfairOfferGenerator, @inject("TraderAssortService") protected traderAssortService: TraderAssortService, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("TraderPurchasePersisterService") protected traderPurchasePersisterService: TraderPurchasePersisterService, + @inject("TraderPurchasePersisterService") protected traderPurchasePersisterService: + TraderPurchasePersisterService, @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("FenceService") protected fenceService: FenceService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.traderConfig = this.configServer.getConfig(ConfigTypes.TRADER); @@ -81,7 +78,7 @@ export class TraderAssortHelper // Strip assorts player should not see yet if (!flea) - { + { trader.assort = this.assortHelper.stripLockedLoyaltyAssort(pmcProfile, traderId, trader.assort); } @@ -89,21 +86,28 @@ export class TraderAssortHelper trader.assort.nextResupply = trader.base.nextResupply; // Adjust displayed assort counts based on values stored in profile - const assortPurchasesfromTrader = this.traderPurchasePersisterService.getProfileTraderPurchases(sessionId, traderId); + const assortPurchasesfromTrader = this.traderPurchasePersisterService.getProfileTraderPurchases( + sessionId, + traderId, + ); for (const assortId in assortPurchasesfromTrader) { // Find assort we want to update current buy count of - const assortToAdjust = trader.assort.items.find(x => x._id === assortId); + const assortToAdjust = trader.assort.items.find((x) => x._id === assortId); if (!assortToAdjust) { - this.logger.debug(`Cannot find trader: ${trader.base.nickname} assort: ${assortId} to adjust BuyRestrictionCurrent value, skipping`); + this.logger.debug( + `Cannot find trader: ${trader.base.nickname} assort: ${assortId} to adjust BuyRestrictionCurrent value, skipping`, + ); continue; } if (!assortToAdjust.upd) { - this.logger.debug(`Unable to adjust assort ${assortToAdjust._id} item: ${assortToAdjust._tpl} BuyRestrictionCurrent value, assort has an undefined upd object`); + this.logger.debug( + `Unable to adjust assort ${assortToAdjust._id} item: ${assortToAdjust._tpl} BuyRestrictionCurrent value, assort has an undefined upd object`, + ); continue; } @@ -117,7 +121,13 @@ export class TraderAssortHelper this.hydrateMergedQuestAssorts(); this.createdMergedQuestAssorts = true; } - trader.assort = this.assortHelper.stripLockedQuestAssort(pmcProfile, traderId, trader.assort, this.mergedQuestAssorts, flea); + trader.assort = this.assortHelper.stripLockedQuestAssort( + pmcProfile, + traderId, + trader.assort, + this.mergedQuestAssorts, + flea, + ); // Multiply price if multiplier is other than 1 if (this.traderConfig.traderPriceMultipler !== 1) @@ -234,7 +244,7 @@ export class TraderAssortHelper barter_scheme: {}, // eslint-disable-next-line @typescript-eslint/naming-convention loyal_level_items: {}, - nextResupply: null + nextResupply: null, }; } -} \ No newline at end of file +} diff --git a/project/src/helpers/TraderHelper.ts b/project/src/helpers/TraderHelper.ts index 2557b866..7730ff34 100644 --- a/project/src/helpers/TraderHelper.ts +++ b/project/src/helpers/TraderHelper.ts @@ -42,14 +42,14 @@ export class TraderHelper @inject("FenceService") protected fenceService: FenceService, @inject("TimeUtil") protected timeUtil: TimeUtil, @inject("RandomUtil") protected randomUtil: RandomUtil, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.traderConfig = this.configServer.getConfig(ConfigTypes.TRADER); } /** - * Get a trader base object, update profile to reflect players current standing in profile + * Get a trader base object, update profile to reflect players current standing in profile * when trader not found in profile * @param traderID Traders Id to get * @param sessionID Players id @@ -62,7 +62,7 @@ export class TraderHelper { this.logger.error(`No profile with sessionId: ${sessionID}`); } - + // Profile has traderInfo dict (profile beyond creation stage) but no requested trader in profile if (pmcData.TradersInfo && !(traderID in pmcData.TradersInfo)) { @@ -70,7 +70,7 @@ export class TraderHelper this.resetTrader(sessionID, traderID); this.lvlUp(traderID, pmcData); } - + const trader = this.databaseServer.getTables().traders?.[traderID]?.base; if (!trader) { @@ -109,7 +109,7 @@ export class TraderHelper } // Find specific assort in traders data - const purchasedAssort = traderAssorts.items.find(x => x._id === assortId); + const purchasedAssort = traderAssorts.items.find((x) => x._id === assortId); if (!purchasedAssort) { this.logger.debug(`No assort ${assortId} on trader: ${traderId} found`); @@ -130,15 +130,17 @@ export class TraderHelper { const account = this.saveServer.getProfile(sessionID); const pmcData = this.profileHelper.getPmcProfile(sessionID); - const rawProfileTemplate: ProfileTraderTemplate = this.databaseServer.getTables().templates.profiles[account.info.edition][pmcData.Info.Side.toLowerCase()].trader; + const rawProfileTemplate: ProfileTraderTemplate = + this.databaseServer.getTables().templates.profiles[account.info.edition][pmcData.Info.Side.toLowerCase()] + .trader; pmcData.TradersInfo[traderID] = { disabled: false, loyaltyLevel: rawProfileTemplate.initialLoyaltyLevel, salesSum: rawProfileTemplate.initialSalesSum, - standing: this.getStartingStanding(traderID, rawProfileTemplate), + standing: this.getStartingStanding(traderID, rawProfileTemplate), nextResupply: this.databaseServer.getTables().traders[traderID].base.nextResupply, - unlocked: this.databaseServer.getTables().traders[traderID].base.unlockedByDefault + unlocked: this.databaseServer.getTables().traders[traderID].base.unlockedByDefault, }; if (traderID === Traders.JAEGER) @@ -197,9 +199,7 @@ export class TraderHelper { const newStanding = currentStanding + standingToAdd; - return newStanding < 0 - ? 0 - : newStanding; + return newStanding < 0 ? 0 : newStanding; } /** @@ -224,10 +224,11 @@ export class TraderHelper { const loyalty = loyaltyLevels[level]; - if ((loyalty.minLevel <= pmcData.Info.Level - && loyalty.minSalesSum <= pmcData.TradersInfo[traderID].salesSum - && loyalty.minStanding <= pmcData.TradersInfo[traderID].standing) - && targetLevel < 4) + if ( + (loyalty.minLevel <= pmcData.Info.Level + && loyalty.minSalesSum <= pmcData.TradersInfo[traderID].salesSum + && loyalty.minStanding <= pmcData.TradersInfo[traderID].standing) && targetLevel < 4 + ) { // level reached targetLevel++; @@ -257,15 +258,17 @@ export class TraderHelper */ public getTraderUpdateSeconds(traderId: string): number { - const traderDetails = this.traderConfig.updateTime.find(x => x.traderId === traderId); + const traderDetails = this.traderConfig.updateTime.find((x) => x.traderId === traderId); if (!traderDetails) { - this.logger.warning(this.localisationService.getText("trader-missing_trader_details_using_default_refresh_time", {traderId: traderId, updateTime: this.traderConfig.updateTimeDefault})); - this.traderConfig.updateTime.push( // create temporary entry to prevent logger spam - { + this.logger.warning( + this.localisationService.getText("trader-missing_trader_details_using_default_refresh_time", { traderId: traderId, - seconds: this.traderConfig.updateTimeDefault - } + updateTime: this.traderConfig.updateTimeDefault, + }), + ); + this.traderConfig.updateTime.push( // create temporary entry to prevent logger spam + { traderId: traderId, seconds: this.traderConfig.updateTimeDefault }, ); } else @@ -298,7 +301,10 @@ export class TraderHelper * @param newPurchaseDetails New item assort id + count */ // eslint-disable-next-line @typescript-eslint/naming-convention - public addTraderPurchasesToPlayerProfile(sessionID: string, newPurchaseDetails: { items: { item_id: string; count: number; }[]; tid: string; }): void + public addTraderPurchasesToPlayerProfile( + sessionID: string, + newPurchaseDetails: { items: { item_id: string; count: number; }[]; tid: string; }, + ): void { const profile = this.profileHelper.getFullProfile(sessionID); const traderId = newPurchaseDetails.tid; @@ -320,10 +326,9 @@ export class TraderHelper const currentTime = this.timeUtil.getTimestamp(); if (!profile.traderPurchases[traderId][purchasedItem.item_id]) { - profile.traderPurchases[traderId][purchasedItem.item_id] = - { + profile.traderPurchases[traderId][purchasedItem.item_id] = { count: purchasedItem.count, - purchaseTimestamp: currentTime + purchaseTimestamp: currentTime, }; continue; @@ -369,7 +374,7 @@ export class TraderHelper } // Get all item assorts that have parentid of hideout (base item and not a mod of other item) - for (const item of traderAssorts.items.filter(x => x.parentId === "hideout")) + for (const item of traderAssorts.items.filter((x) => x.parentId === "hideout")) { // Get barter scheme (contains cost of item) const barterScheme = traderAssorts.barter_scheme[item._id][0][0]; @@ -409,7 +414,6 @@ export class TraderHelper return this.highestTraderBuyPriceItems[tpl]; } - // Find highest trader price for item for (const traderName in Traders) { @@ -423,7 +427,9 @@ export class TraderHelper const traderBuyBackPricePercent = relevantLoyaltyData.buy_price_coef; const itemHandbookPrice = this.handbookHelper.getTemplatePrice(tpl); - const priceTraderBuysItemAt = Math.round(this.randomUtil.getPercentOfValue(traderBuyBackPricePercent, itemHandbookPrice)); + const priceTraderBuysItemAt = Math.round( + this.randomUtil.getPercentOfValue(traderBuyBackPricePercent, itemHandbookPrice), + ); // Set new item to 1 rouble as default if (!this.highestTraderBuyPriceItems[tpl]) @@ -449,7 +455,7 @@ export class TraderHelper */ public getTraderById(traderId: string): Traders { - const keys = Object.keys(Traders).filter(x => Traders[x] === traderId); + const keys = Object.keys(Traders).filter((x) => Traders[x] === traderId); if (keys.length === 0) { @@ -462,16 +468,16 @@ export class TraderHelper } /** - * Validates that the provided traderEnumValue exists in the Traders enum. If the value is valid, it returns the - * same enum value, effectively serving as a trader ID; otherwise, it logs an error and returns an empty string. + * Validates that the provided traderEnumValue exists in the Traders enum. If the value is valid, it returns the + * same enum value, effectively serving as a trader ID; otherwise, it logs an error and returns an empty string. * This method provides a runtime check to prevent undefined behavior when using the enum as a dictionary key. - * + * * For example, instead of this: * `const traderId = Traders[Traders.PRAPOR];` - * + * * You can use safely use this: * `const traderId = this.traderHelper.getValidTraderIdByEnumValue(Traders.PRAPOR);` - * + * * @param traderEnumValue The trader enum value to validate * @returns The validated trader enum value as a string, or an empty string if invalid */ @@ -483,7 +489,7 @@ export class TraderHelper return ""; } - + return Traders[traderEnumValue]; } @@ -506,4 +512,4 @@ export class TraderHelper { return Object.values(Traders).some((x) => x === traderId); } -} \ No newline at end of file +} diff --git a/project/src/helpers/UtilityHelper.ts b/project/src/helpers/UtilityHelper.ts index 8093354f..6e10d619 100644 --- a/project/src/helpers/UtilityHelper.ts +++ b/project/src/helpers/UtilityHelper.ts @@ -5,6 +5,6 @@ export class UtilityHelper { public arrayIntersect(a: T[], b: T[]): T[] { - return a.filter(x => b.includes(x)); + return a.filter((x) => b.includes(x)); } -} \ No newline at end of file +} diff --git a/project/src/helpers/WeightedRandomHelper.ts b/project/src/helpers/WeightedRandomHelper.ts index 17d639d0..7b5f8169 100644 --- a/project/src/helpers/WeightedRandomHelper.ts +++ b/project/src/helpers/WeightedRandomHelper.ts @@ -77,11 +77,8 @@ export class WeightedRandomHelper { if (cumulativeWeights[itemIndex] >= randomNumber) { - return { - item: items[itemIndex], - index: itemIndex - }; + return { item: items[itemIndex], index: itemIndex }; } } } -} \ No newline at end of file +} diff --git a/project/src/loaders/BundleLoader.ts b/project/src/loaders/BundleLoader.ts index b14e5b9b..b2e40f6f 100644 --- a/project/src/loaders/BundleLoader.ts +++ b/project/src/loaders/BundleLoader.ts @@ -1,4 +1,3 @@ - import { inject, injectable } from "tsyringe"; import { HttpServerHelper } from "@spt-aki/helpers/HttpServerHelper"; @@ -31,9 +30,9 @@ export class BundleLoader constructor( @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper, @inject("VFS") protected vfs: VFS, - @inject("JsonUtil") protected jsonUtil: JsonUtil + @inject("JsonUtil") protected jsonUtil: JsonUtil, ) - { } + {} /** * Handle singleplayer/bundles @@ -65,7 +64,8 @@ export class BundleLoader public addBundles(modpath: string): void { - const manifest = this.jsonUtil.deserialize(this.vfs.readFile(`${modpath}bundles.json`)).manifest; + const manifest = + this.jsonUtil.deserialize(this.vfs.readFile(`${modpath}bundles.json`)).manifest; for (const bundle of manifest) { @@ -75,7 +75,7 @@ export class BundleLoader } } - public addBundle(key: string, b: BundleInfo): void + public addBundle(key: string, b: BundleInfo): void { this.bundles[key] = b; } @@ -83,11 +83,11 @@ export class BundleLoader export interface BundleManifest { - manifest: Array + manifest: Array; } export interface BundleManifestEntry { - key: string - path: string -} \ No newline at end of file + key: string; + path: string; +} diff --git a/project/src/loaders/ModLoadOrder.ts b/project/src/loaders/ModLoadOrder.ts index 9755c1df..8b7daed5 100644 --- a/project/src/loaders/ModLoadOrder.ts +++ b/project/src/loaders/ModLoadOrder.ts @@ -14,9 +14,9 @@ export class ModLoadOrder constructor( @inject("WinstonLogger") protected logger: ILogger, - @inject("LocalisationService") protected localisationService: LocalisationService + @inject("LocalisationService") protected localisationService: LocalisationService, ) - { } + {} public setModList(mods: Record): void { @@ -26,8 +26,8 @@ export class ModLoadOrder const visited = new Set(); - //invert loadBefore into loadAfter on specified mods - for (const [ modName, modConfig ] of this.modsAvailable) + // invert loadBefore into loadAfter on specified mods + for (const [modName, modConfig] of this.modsAvailable) { if ((modConfig.loadBefore ?? []).length > 0) { @@ -128,7 +128,7 @@ export class ModLoadOrder // Wait for input const errorHandler = new ErrorHandler(); - errorHandler.handleCriticalError({errorMessage}); + errorHandler.handleCriticalError({ errorMessage }); } // Check dependencies @@ -151,7 +151,10 @@ export class ModLoadOrder { if (this.modsAvailable.get(modAfter)?.loadAfter?.includes(mod)) { - const errorMessage = this.localisationService.getText("modloader-load_order_conflict", {modOneName: mod, modTwoName: modAfter}); + const errorMessage = this.localisationService.getText("modloader-load_order_conflict", { + modOneName: mod, + modTwoName: modAfter, + }); this.logger.error(errorMessage); const errorHandler = new ErrorHandler(); errorHandler.handleCriticalError(errorMessage); diff --git a/project/src/loaders/ModTypeCheck.ts b/project/src/loaders/ModTypeCheck.ts index 2edc06de..56b0cd29 100644 --- a/project/src/loaders/ModTypeCheck.ts +++ b/project/src/loaders/ModTypeCheck.ts @@ -10,7 +10,6 @@ import { IPreAkiLoadModAsync } from "@spt-aki/models/external/IPreAkiLoadModAsyn @injectable() export class ModTypeCheck { - /** * Use defined safe guard to check if the mod is a IPreAkiLoadMod * @returns boolean @@ -19,7 +18,7 @@ export class ModTypeCheck { return mod?.preAkiLoad; } - + /** * Use defined safe guard to check if the mod is a IPostAkiLoadMod * @returns boolean @@ -28,7 +27,7 @@ export class ModTypeCheck { return mod?.postAkiLoad; } - + /** * Use defined safe guard to check if the mod is a IPostDBLoadMod * @returns boolean @@ -46,7 +45,7 @@ export class ModTypeCheck { return mod?.preAkiLoadAsync; } - + /** * Use defined safe guard to check if the mod is a IPostAkiLoadModAsync * @returns boolean @@ -55,7 +54,7 @@ export class ModTypeCheck { return mod?.postAkiLoadAsync; } - + /** * Use defined safe guard to check if the mod is a IPostDBLoadModAsync * @returns boolean @@ -71,12 +70,11 @@ export class ModTypeCheck */ public isPostV3Compatible(mod: any): boolean { - return this.isPreAkiLoad(mod) || - this.isPostAkiLoad(mod) || - this.isPostDBAkiLoad(mod) || - this.isPreAkiLoadAsync(mod) || - this.isPostAkiLoadAsync(mod) || - this.isPostDBAkiLoadAsync(mod); - + return this.isPreAkiLoad(mod) + || this.isPostAkiLoad(mod) + || this.isPostDBAkiLoad(mod) + || this.isPreAkiLoadAsync(mod) + || this.isPostAkiLoadAsync(mod) + || this.isPostDBAkiLoadAsync(mod); } -} \ No newline at end of file +} diff --git a/project/src/loaders/PostAkiModLoader.ts b/project/src/loaders/PostAkiModLoader.ts index deb30055..a04b4c2c 100644 --- a/project/src/loaders/PostAkiModLoader.ts +++ b/project/src/loaders/PostAkiModLoader.ts @@ -19,9 +19,9 @@ export class PostAkiModLoader implements IModLoader @inject("VFS") protected vfs: VFS, @inject("PreAkiModLoader") protected preAkiModLoader: PreAkiModLoader, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ModTypeCheck") protected modTypeCheck: ModTypeCheck + @inject("ModTypeCheck") protected modTypeCheck: ModTypeCheck, ) - { } + {} public getModPath(mod: string): string { @@ -43,20 +43,27 @@ export class PostAkiModLoader implements IModLoader for (const modName of mods) { // // import class - const filepath = `${this.preAkiModLoader.getModPath(modName)}${this.preAkiModLoader.getImportedModDetails()[modName].main}`; + const filepath = `${this.preAkiModLoader.getModPath(modName)}${ + this.preAkiModLoader.getImportedModDetails()[modName].main + }`; const modpath = `${process.cwd()}/${filepath}`; // eslint-disable-next-line @typescript-eslint/no-var-requires const mod = require(modpath); if (this.modTypeCheck.isPostAkiLoadAsync(mod.mod)) { - try + try { await (mod.mod as IPostAkiLoadModAsync).postAkiLoadAsync(container); } - catch (err) + catch (err) { - this.logger.error(this.localisationService.getText("modloader-async_mod_error", `${err?.message ?? ""}\n${err.stack ?? ""}`)); + this.logger.error( + this.localisationService.getText( + "modloader-async_mod_error", + `${err?.message ?? ""}\n${err.stack ?? ""}`, + ), + ); } } @@ -80,4 +87,4 @@ export class PostAkiModLoader implements IModLoader } } } -} \ No newline at end of file +} diff --git a/project/src/loaders/PostDBModLoader.ts b/project/src/loaders/PostDBModLoader.ts index 8b324792..27f20248 100644 --- a/project/src/loaders/PostDBModLoader.ts +++ b/project/src/loaders/PostDBModLoader.ts @@ -15,10 +15,10 @@ export class PostDBModLoader implements OnLoad @inject("WinstonLogger") protected logger: ILogger, @inject("PreAkiModLoader") protected preAkiModLoader: PreAkiModLoader, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ModTypeCheck") protected modTypeCheck: ModTypeCheck + @inject("ModTypeCheck") protected modTypeCheck: ModTypeCheck, ) - { } - + {} + public async onLoad(): Promise { if (globalThis.G_MODS_ENABLED) @@ -26,13 +26,12 @@ export class PostDBModLoader implements OnLoad await this.executeMods(this.preAkiModLoader.getContainer()); } } - + public getRoute(): string { return "aki-mods"; } - public getModPath(mod: string): string { return this.preAkiModLoader.getModPath(mod); @@ -44,20 +43,27 @@ export class PostDBModLoader implements OnLoad for (const modName of mods) { // // import class - const filepath = `${this.preAkiModLoader.getModPath(modName)}${this.preAkiModLoader.getImportedModDetails()[modName].main}`; + const filepath = `${this.preAkiModLoader.getModPath(modName)}${ + this.preAkiModLoader.getImportedModDetails()[modName].main + }`; const modpath = `${process.cwd()}/${filepath}`; // eslint-disable-next-line @typescript-eslint/no-var-requires const mod = require(modpath); if (this.modTypeCheck.isPostDBAkiLoadAsync(mod.mod)) { - try + try { await (mod.mod as IPostDBLoadModAsync).postDBLoadAsync(container); } - catch (err) + catch (err) { - this.logger.error(this.localisationService.getText("modloader-async_mod_error", `${err?.message ?? ""}\n${err.stack ?? ""}`)); + this.logger.error( + this.localisationService.getText( + "modloader-async_mod_error", + `${err?.message ?? ""}\n${err.stack ?? ""}`, + ), + ); } } @@ -67,4 +73,4 @@ export class PostDBModLoader implements OnLoad } } } -} \ No newline at end of file +} diff --git a/project/src/loaders/PreAkiModLoader.ts b/project/src/loaders/PreAkiModLoader.ts index 8db771d1..25cf6bca 100644 --- a/project/src/loaders/PreAkiModLoader.ts +++ b/project/src/loaders/PreAkiModLoader.ts @@ -43,7 +43,7 @@ export class PreAkiModLoader implements IModLoader @inject("LocalisationService") protected localisationService: LocalisationService, @inject("ConfigServer") protected configServer: ConfigServer, @inject("ModLoadOrder") protected modLoadOrder: ModLoadOrder, - @inject("ModTypeCheck") protected modTypeCheck: ModTypeCheck + @inject("ModTypeCheck") protected modTypeCheck: ModTypeCheck, ) { this.akiConfig = this.configServer.getConfig(ConfigTypes.CORE); @@ -96,10 +96,10 @@ export class PreAkiModLoader implements IModLoader for (const modName in modsGroupedByName) { const modDatas = modsGroupedByName[modName]; - const modVersions = modDatas.map(x => x.version); + const modVersions = modDatas.map((x) => x.version); const highestVersion = semver.maxSatisfying(modVersions, "*"); - const chosenVersion = modDatas.find(x => x.name === modName && x.version === highestVersion); + const chosenVersion = modDatas.find((x) => x.name === modName && x.version === highestVersion); if (!chosenVersion) { continue; @@ -130,28 +130,28 @@ export class PreAkiModLoader implements IModLoader * array of mod folder names */ const mods: string[] = this.vfs.getDirs(this.basepath); - + this.logger.info(this.localisationService.getText("modloader-loading_mods", mods.length)); // Mod order - if (!this.vfs.exists(this.modOrderPath)) + if (!this.vfs.exists(this.modOrderPath)) { this.logger.info(this.localisationService.getText("modloader-mod_order_missing")); // Write file with empty order array to disk - this.vfs.writeFile(this.modOrderPath, this.jsonUtil.serializeAdvanced({order: []}, null, 4)); + this.vfs.writeFile(this.modOrderPath, this.jsonUtil.serializeAdvanced({ order: [] }, null, 4)); } - else + else { const modOrder = this.vfs.readFile(this.modOrderPath, { encoding: "utf8" }); - try + try { - this.jsonUtil.deserialize(modOrder).order.forEach((mod: string, index: number) => + this.jsonUtil.deserialize(modOrder).order.forEach((mod: string, index: number) => { this.order[mod] = index; }); } - catch (error) + catch (error) { this.logger.error(this.localisationService.getText("modloader-mod_order_error")); } @@ -175,7 +175,10 @@ export class PreAkiModLoader implements IModLoader } // if the mod has library dependencies check if these dependencies are bundled in the server, if not install them - if (modToValidate.dependencies && Object.keys(modToValidate.dependencies).length > 0 && !this.vfs.exists(`${this.basepath}${modFolderName}/node_modules`)) + if ( + modToValidate.dependencies && Object.keys(modToValidate.dependencies).length > 0 + && !this.vfs.exists(`${this.basepath}${modFolderName}/node_modules`) + ) { this.autoInstallDependencies(`${this.basepath}${modFolderName}`, modToValidate); } @@ -210,7 +213,11 @@ export class PreAkiModLoader implements IModLoader validMods.sort((prev, next) => this.sortMods(prev, next, missingFromOrderJSON)); // log the missing mods from order.json - Object.keys(missingFromOrderJSON).forEach((missingMod) => (this.logger.debug(this.localisationService.getText("modloader-mod_order_missing_from_json", missingMod)))); + Object.keys(missingFromOrderJSON).forEach(( + missingMod, + ) => (this.logger.debug( + this.localisationService.getText("modloader-mod_order_missing_from_json", missingMod), + ))); // add mods for (const mod of validMods) @@ -233,15 +240,15 @@ export class PreAkiModLoader implements IModLoader { const previndex = this.order[prev]; const nextindex = this.order[next]; - + // mod is not on the list, move the mod to last - if (previndex === undefined) + if (previndex === undefined) { missingFromOrderJSON[prev] = true; return 1; } - else if (nextindex === undefined) + else if (nextindex === undefined) { missingFromOrderJSON[next] = true; @@ -280,7 +287,7 @@ export class PreAkiModLoader implements IModLoader /** * Returns an array of valid mods. - * + * * @param mods mods to validate * @returns array of mod folder names */ @@ -388,14 +395,19 @@ export class PreAkiModLoader implements IModLoader // Perform async load of mod if (this.modTypeCheck.isPreAkiLoadAsync(requiredMod.mod)) { - try + try { await (requiredMod.mod as IPreAkiLoadModAsync).preAkiLoadAsync(container); globalThis[mod] = requiredMod; } - catch (err) + catch (err) { - this.logger.error(this.localisationService.getText("modloader-async_mod_error", `${err?.message ?? ""}\n${err.stack ?? ""}`)); + this.logger.error( + this.localisationService.getText( + "modloader-async_mod_error", + `${err?.message ?? ""}\n${err.stack ?? ""}`, + ), + ); } continue; @@ -454,7 +466,7 @@ export class PreAkiModLoader implements IModLoader else { // rename the mod entry point to .ts if it's set to .js because G_MODS_TRANSPILE_TS is set to false - pkg.main = (pkg.main).replace(".js", ".ts"); + pkg.main = pkg.main.replace(".js", ".ts"); } } @@ -462,15 +474,21 @@ export class PreAkiModLoader implements IModLoader pkg.scripts = {}; // Add mod to imported list - this.imported[mod] = {...pkg, dependencies: pkg.modDependencies}; - this.logger.info(this.localisationService.getText("modloader-loaded_mod", {name: pkg.name, version: pkg.version, author: pkg.author})); + this.imported[mod] = { ...pkg, dependencies: pkg.modDependencies }; + this.logger.info( + this.localisationService.getText("modloader-loaded_mod", { + name: pkg.name, + version: pkg.version, + author: pkg.author, + }), + ); } /** * Checks if a given mod should be loaded or skipped. - * + * * @param pkg mod package.json data - * @returns + * @returns */ protected shouldSkipMod(pkg: IPackageJsonData): boolean { @@ -506,12 +524,17 @@ export class PreAkiModLoader implements IModLoader // If this feature flag is set to false, we warn the user he has a mod that requires extra dependencies and might not work, point them in the right direction on how to enable this feature. if (!this.akiConfig.features.autoInstallModDependencies) { - this.logger.warning(this.localisationService.getText("modloader-installing_external_dependencies_disabled", { - name: pkg.name, - author: pkg.author, - configPath: path.join(globalThis.G_RELEASE_CONFIGURATION ? "Aki_Data/Server/configs" : "assets/configs", "core.json"), - configOption: "autoInstallModDependencies" - })); + this.logger.warning( + this.localisationService.getText("modloader-installing_external_dependencies_disabled", { + name: pkg.name, + author: pkg.author, + configPath: path.join( + globalThis.G_RELEASE_CONFIGURATION ? "Aki_Data/Server/configs" : "assets/configs", + "core.json", + ), + configOption: "autoInstallModDependencies", + }), + ); this.skippedMods.add(`${pkg.author}-${pkg.name}`); return; @@ -521,9 +544,18 @@ export class PreAkiModLoader implements IModLoader this.vfs.rename(`${modPath}/package.json`, `${modPath}/package.json.bak`); this.vfs.writeFile(`${modPath}/package.json`, "{}"); - this.logger.info(this.localisationService.getText("modloader-installing_external_dependencies", {name: pkg.name, author: pkg.author})); + this.logger.info( + this.localisationService.getText("modloader-installing_external_dependencies", { + name: pkg.name, + author: pkg.author, + }), + ); - const pnpmPath = path.join(process.cwd(), (globalThis.G_RELEASE_CONFIGURATION ? "Aki_Data/Server/@pnpm/exe" : "node_modules/@pnpm/exe"), (os.platform() === "win32" ? "pnpm.exe" : "pnpm")); + const pnpmPath = path.join( + process.cwd(), + globalThis.G_RELEASE_CONFIGURATION ? "Aki_Data/Server/@pnpm/exe" : "node_modules/@pnpm/exe", + os.platform() === "win32" ? "pnpm.exe" : "pnpm", + ); let command = `${pnpmPath} install `; command += dependenciesToInstall.map(([depName, depVersion]) => `${depName}@${depVersion}`).join(" "); execSync(command, { cwd: modPath }); @@ -542,18 +574,30 @@ export class PreAkiModLoader implements IModLoader const modName = `${pkg.author}-${pkg.name}`; - for (const [modDependency, requiredVersion ] of Object.entries(pkg.modDependencies)) + for (const [modDependency, requiredVersion] of Object.entries(pkg.modDependencies)) { // Raise dependency version incompatible if the dependency is not found in the mod list if (!loadedMods.has(modDependency)) { - this.logger.error(this.localisationService.getText("modloader-missing_dependency", {mod: modName, modDependency: modDependency})); + this.logger.error( + this.localisationService.getText("modloader-missing_dependency", { + mod: modName, + modDependency: modDependency, + }), + ); return false; } if (!semver.satisfies(loadedMods.get(modDependency).version, requiredVersion)) { - this.logger.error(this.localisationService.getText("modloader-outdated_dependency", {mod: modName, modDependency: modDependency, currentVersion: loadedMods.get(modDependency).version, requiredVersion: requiredVersion})); + this.logger.error( + this.localisationService.getText("modloader-outdated_dependency", { + mod: modName, + modDependency: modDependency, + currentVersion: loadedMods.get(modDependency).version, + requiredVersion: requiredVersion, + }), + ); return false; } } @@ -574,7 +618,13 @@ export class PreAkiModLoader implements IModLoader // Raise dependency version incompatible if any incompatible mod is found if (loadedMods.has(incompatibleModName)) { - this.logger.error(this.localisationService.getText("modloader-incompatible_mod_found", {author: mod.author, modName: mod.name, incompatibleModName: incompatibleModName})); + this.logger.error( + this.localisationService.getText("modloader-incompatible_mod_found", { + author: mod.author, + modName: mod.name, + incompatibleModName: incompatibleModName, + }), + ); return false; } } @@ -596,7 +646,7 @@ export class PreAkiModLoader implements IModLoader const modIsCalledSrc = modName.toLowerCase() === "src"; const modIsCalledDb = modName.toLowerCase() === "db"; const hasBepinExFolderStructure = this.vfs.exists(`${modPath}/plugins`); - const containsDll = this.vfs.getFiles(`${modPath}`).find(x => x.includes(".dll")); + const containsDll = this.vfs.getFiles(`${modPath}`).find((x) => x.includes(".dll")); if (modIsCalledSrc || modIsCalledDb || modIsCalledUser) { @@ -626,7 +676,12 @@ export class PreAkiModLoader implements IModLoader { if (!(check in config)) { - this.logger.error(this.localisationService.getText("modloader-missing_package_json_property", {modName: modName, prop: check})); + this.logger.error( + this.localisationService.getText("modloader-missing_package_json_property", { + modName: modName, + prop: check, + }), + ); issue = true; } } @@ -639,23 +694,23 @@ export class PreAkiModLoader implements IModLoader if ("main" in config) { - if (config.main.split(".").pop() !== "js") // expects js file as entry - { + if (config.main.split(".").pop() !== "js") + { // expects js file as entry this.logger.error(this.localisationService.getText("modloader-main_property_not_js", modName)); issue = true; } - if (!this.vfs.exists(`${modPath}/${config.main}`)) { - // If TS file exists with same name, dont perform check as we'll generate JS from TS file const tsFileName = config.main.replace(".js", ".ts"); const tsFileExists = this.vfs.exists(`${modPath}/${tsFileName}`); if (!tsFileExists) { - this.logger.error(this.localisationService.getText("modloader-main_property_points_to_nothing", modName)); + this.logger.error( + this.localisationService.getText("modloader-main_property_points_to_nothing", modName), + ); issue = true; } } @@ -663,7 +718,9 @@ export class PreAkiModLoader implements IModLoader if (config.incompatibilities && !Array.isArray(config.incompatibilities)) { - this.logger.error(this.localisationService.getText("modloader-incompatibilities_not_string_array", modName)); + this.logger.error( + this.localisationService.getText("modloader-incompatibilities_not_string_array", modName), + ); issue = true; } diff --git a/project/src/models/common/MinMax.ts b/project/src/models/common/MinMax.ts index 782821e8..2b5efbad 100644 --- a/project/src/models/common/MinMax.ts +++ b/project/src/models/common/MinMax.ts @@ -1,5 +1,5 @@ -export interface MinMax +export interface MinMax { - max: number - min: number -} \ No newline at end of file + max: number; + min: number; +} diff --git a/project/src/models/eft/bot/IGenerateBotsRequestData.ts b/project/src/models/eft/bot/IGenerateBotsRequestData.ts index 236d49e7..86097fcc 100644 --- a/project/src/models/eft/bot/IGenerateBotsRequestData.ts +++ b/project/src/models/eft/bot/IGenerateBotsRequestData.ts @@ -1,12 +1,12 @@ -export interface IGenerateBotsRequestData +export interface IGenerateBotsRequestData { - conditions: Condition[] + conditions: Condition[]; } -export interface Condition +export interface Condition { /** e.g. assault/pmcBot/bossKilla */ - Role: string - Limit: number - Difficulty: string -} \ No newline at end of file + Role: string; + Limit: number; + Difficulty: string; +} diff --git a/project/src/models/eft/bot/IRandomisedBotLevelResult.ts b/project/src/models/eft/bot/IRandomisedBotLevelResult.ts index 5b60979c..b0571202 100644 --- a/project/src/models/eft/bot/IRandomisedBotLevelResult.ts +++ b/project/src/models/eft/bot/IRandomisedBotLevelResult.ts @@ -1,5 +1,5 @@ export interface IRandomisedBotLevelResult { - level: number, - exp: number -} \ No newline at end of file + level: number; + exp: number; +} diff --git a/project/src/models/eft/common/IEmptyRequestData.ts b/project/src/models/eft/common/IEmptyRequestData.ts index 498b1ede..0cd4f101 100644 --- a/project/src/models/eft/common/IEmptyRequestData.ts +++ b/project/src/models/eft/common/IEmptyRequestData.ts @@ -1,4 +1,3 @@ export interface IEmptyRequestData { - -} \ No newline at end of file +} diff --git a/project/src/models/eft/common/IGlobals.ts b/project/src/models/eft/common/IGlobals.ts index 67c655f8..098742c3 100644 --- a/project/src/models/eft/common/IGlobals.ts +++ b/project/src/models/eft/common/IGlobals.ts @@ -2,1657 +2,1653 @@ import { Ixyz } from "@spt-aki/models/eft/common/Ixyz"; import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -export interface IGlobals +export interface IGlobals { - time: number - config: IConfig - bot_presets: IBotPreset[] - AudioSettings: IAudioSettings - BotWeaponScatterings: IBotWeaponScattering[] - ItemPresets: Record + time: number; + config: IConfig; + bot_presets: IBotPreset[]; + AudioSettings: IAudioSettings; + BotWeaponScatterings: IBotWeaponScattering[]; + ItemPresets: Record; } -export interface IConfig +export interface IConfig { - content: IContent - AimPunchMagnitude: number - WeaponSkillProgressRate: number - SkillAtrophy: boolean - exp: IExp - t_base_looting: number - t_base_lockpicking: number - armor: IArmor - SessionsToShowHotKeys: number - MaxBotsAliveOnMap: number - SavagePlayCooldown: number - SavagePlayCooldownNdaFree: number - MarksmanAccuracy: number - SavagePlayCooldownDevelop: number - TODSkyDate: string - Mastering: IMastering[] - GlobalItemPriceModifier: number - TradingUnlimitedItems: boolean - MaxLoyaltyLevelForAll: boolean - GlobalLootChanceModifier: number - GraphicSettings: IGraphicSettings - TimeBeforeDeploy: number - TimeBeforeDeployLocal: number - TradingSetting: number, - TradingSettings: ITradingSettings, - ItemsCommonSettings: IItemsCommonSettings - LoadTimeSpeedProgress: number - BaseLoadTime: number - BaseUnloadTime: number - BaseCheckTime: number - Customization: ICustomization - UncheckOnShot: boolean - BotsEnabled: boolean - BufferZone: IBufferZone - ArmorMaterials: IArmorMaterials - LegsOverdamage: number - HandsOverdamage: number - StomachOverdamage: number - Health: IHealth - rating: IRating - tournament: ITournament - RagFair: IRagFair - handbook: IHandbook - FractureCausedByFalling: IProbability - FractureCausedByBulletHit: IProbability - WAVE_COEF_LOW: number - WAVE_COEF_MID: number - WAVE_COEF_HIGH: number - WAVE_COEF_HORDE: number - Stamina: IStamina - StaminaRestoration: IStaminaRestoration - StaminaDrain: IStaminaDrain - RequirementReferences: IRequirementReferences - RestrictionsInRaid: IRestrictionsInRaid[] - SkillMinEffectiveness: number - SkillFatiguePerPoint: number - SkillFreshEffectiveness: number - SkillFreshPoints: number - SkillPointsBeforeFatigue: number - SkillFatigueReset: number - DiscardLimitsEnabled: boolean - EventType: string[] - WalkSpeed: Ixyz - SprintSpeed: Ixyz - SquadSettings: ISquadSettings - SkillEnduranceWeightThreshold: number - TeamSearchingTimeout: number - Insurance: IInsurance - SkillExpPerLevel: number - GameSearchingTimeout: number - WallContusionAbsorption: Ixyz - WeaponFastDrawSettings: IWeaponFastDrawSettings - SkillsSettings: ISkillsSettings - AzimuthPanelShowsPlayerOrientation: boolean - Aiming: IAiming - Malfunction: IMalfunction - Overheat: IOverheat - FenceSettings: IFenceSettings - TestValue: number - Inertia: IInertia - Ballistic: IBallistic - RepairSettings: IRepairSettings + content: IContent; + AimPunchMagnitude: number; + WeaponSkillProgressRate: number; + SkillAtrophy: boolean; + exp: IExp; + t_base_looting: number; + t_base_lockpicking: number; + armor: IArmor; + SessionsToShowHotKeys: number; + MaxBotsAliveOnMap: number; + SavagePlayCooldown: number; + SavagePlayCooldownNdaFree: number; + MarksmanAccuracy: number; + SavagePlayCooldownDevelop: number; + TODSkyDate: string; + Mastering: IMastering[]; + GlobalItemPriceModifier: number; + TradingUnlimitedItems: boolean; + MaxLoyaltyLevelForAll: boolean; + GlobalLootChanceModifier: number; + GraphicSettings: IGraphicSettings; + TimeBeforeDeploy: number; + TimeBeforeDeployLocal: number; + TradingSetting: number; + TradingSettings: ITradingSettings; + ItemsCommonSettings: IItemsCommonSettings; + LoadTimeSpeedProgress: number; + BaseLoadTime: number; + BaseUnloadTime: number; + BaseCheckTime: number; + Customization: ICustomization; + UncheckOnShot: boolean; + BotsEnabled: boolean; + BufferZone: IBufferZone; + ArmorMaterials: IArmorMaterials; + LegsOverdamage: number; + HandsOverdamage: number; + StomachOverdamage: number; + Health: IHealth; + rating: IRating; + tournament: ITournament; + RagFair: IRagFair; + handbook: IHandbook; + FractureCausedByFalling: IProbability; + FractureCausedByBulletHit: IProbability; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + Stamina: IStamina; + StaminaRestoration: IStaminaRestoration; + StaminaDrain: IStaminaDrain; + RequirementReferences: IRequirementReferences; + RestrictionsInRaid: IRestrictionsInRaid[]; + SkillMinEffectiveness: number; + SkillFatiguePerPoint: number; + SkillFreshEffectiveness: number; + SkillFreshPoints: number; + SkillPointsBeforeFatigue: number; + SkillFatigueReset: number; + DiscardLimitsEnabled: boolean; + EventType: string[]; + WalkSpeed: Ixyz; + SprintSpeed: Ixyz; + SquadSettings: ISquadSettings; + SkillEnduranceWeightThreshold: number; + TeamSearchingTimeout: number; + Insurance: IInsurance; + SkillExpPerLevel: number; + GameSearchingTimeout: number; + WallContusionAbsorption: Ixyz; + WeaponFastDrawSettings: IWeaponFastDrawSettings; + SkillsSettings: ISkillsSettings; + AzimuthPanelShowsPlayerOrientation: boolean; + Aiming: IAiming; + Malfunction: IMalfunction; + Overheat: IOverheat; + FenceSettings: IFenceSettings; + TestValue: number; + Inertia: IInertia; + Ballistic: IBallistic; + RepairSettings: IRepairSettings; } export interface IWeaponFastDrawSettings { - HandShakeCurveFrequency: number - HandShakeCurveIntensity: number - HandShakeMaxDuration: number - HandShakeTremorIntensity: number - WeaponFastSwitchMaxSpeedMult: number - WeaponFastSwitchMinSpeedMult: number - WeaponPistolFastSwitchMaxSpeedMult: number - WeaponPistolFastSwitchMinSpeedMult: number + HandShakeCurveFrequency: number; + HandShakeCurveIntensity: number; + HandShakeMaxDuration: number; + HandShakeTremorIntensity: number; + WeaponFastSwitchMaxSpeedMult: number; + WeaponFastSwitchMinSpeedMult: number; + WeaponPistolFastSwitchMaxSpeedMult: number; + WeaponPistolFastSwitchMinSpeedMult: number; } export interface IGraphicSettings { - ExperimentalFogInCity: boolean + ExperimentalFogInCity: boolean; } export interface IBufferZone { - CustomerAccessTime: number - CustomerCriticalTimeStart: number - CustomerKickNotifTime: number + CustomerAccessTime: number; + CustomerCriticalTimeStart: number; + CustomerKickNotifTime: number; } export interface IItemsCommonSettings { - ItemRemoveAfterInterruptionTime: number + ItemRemoveAfterInterruptionTime: number; } export interface ITradingSettings { - BuyoutRestrictions: IBuyoutRestrictions + BuyoutRestrictions: IBuyoutRestrictions; } export interface IBuyoutRestrictions { - MinDurability: number - MinFoodDrinkResource: number - MinMedsResource: number + MinDurability: number; + MinFoodDrinkResource: number; + MinMedsResource: number; } -export interface IContent +export interface IContent { - ip: string - port: number - root: string + ip: string; + port: number; + root: string; } -export interface IExp +export interface IExp { - heal: IHeal - match_end: IMatchEnd - kill: IKill - level: ILevel - loot_attempts: ILootAttempt[] - expForLockedDoorOpen: number - expForLockedDoorBreach: number - triggerMult: number + heal: IHeal; + match_end: IMatchEnd; + kill: IKill; + level: ILevel; + loot_attempts: ILootAttempt[]; + expForLockedDoorOpen: number; + expForLockedDoorBreach: number; + triggerMult: number; } -export interface IHeal +export interface IHeal { - expForHeal: number - expForHydration: number - expForEnergy: number + expForHeal: number; + expForHydration: number; + expForEnergy: number; } -export interface IMatchEnd +export interface IMatchEnd { - README: string - survived_exp_requirement: number - survived_seconds_requirement: number - survived_exp_reward: number - mia_exp_reward: number - runner_exp_reward: number - leftMult: number - miaMult: number - survivedMult: number - runnerMult: number - killedMult: number + README: string; + survived_exp_requirement: number; + survived_seconds_requirement: number; + survived_exp_reward: number; + mia_exp_reward: number; + runner_exp_reward: number; + leftMult: number; + miaMult: number; + survivedMult: number; + runnerMult: number; + killedMult: number; } -export interface IKill +export interface IKill { - combo: ICombo[] - victimLevelExp: number - headShotMult: number - expOnDamageAllHealth: number - longShotDistance: number - bloodLossToLitre: number - botExpOnDamageAllHealth: number - botHeadShotMult: number - victimBotLevelExp: number - pmcExpOnDamageAllHealth: number - pmcHeadShotMult: number + combo: ICombo[]; + victimLevelExp: number; + headShotMult: number; + expOnDamageAllHealth: number; + longShotDistance: number; + bloodLossToLitre: number; + botExpOnDamageAllHealth: number; + botHeadShotMult: number; + victimBotLevelExp: number; + pmcExpOnDamageAllHealth: number; + pmcHeadShotMult: number; } -export interface ICombo +export interface ICombo { - percent: number + percent: number; } -export interface ILevel +export interface ILevel { - exp_table: IExpTable[] - trade_level: number - savage_level: number - clan_level: number - mastering1: number - mastering2: number + exp_table: IExpTable[]; + trade_level: number; + savage_level: number; + clan_level: number; + mastering1: number; + mastering2: number; } -export interface IExpTable +export interface IExpTable { - exp: number + exp: number; } -export interface ILootAttempt +export interface ILootAttempt { - k_exp: number + k_exp: number; } -export interface IArmor +export interface IArmor { - class: IClass[] + class: IClass[]; } -export interface IClass +export interface IClass { - resistance: number + resistance: number; } -export interface IMastering +export interface IMastering { - Name: string - Templates: string[] - Level2: number - Level3: number + Name: string; + Templates: string[]; + Level2: number; + Level3: number; } -export interface ICustomization +export interface ICustomization { - SavageHead: ISavageHead - SavageBody: ISavageBody - SavageFeet: ISavageFeet - CustomizationVoice: ICustomizationVoice[] - BodyParts: IBodyParts + SavageHead: ISavageHead; + SavageBody: ISavageBody; + SavageFeet: ISavageFeet; + CustomizationVoice: ICustomizationVoice[]; + BodyParts: IBodyParts; } -export interface ISavageHead +export interface ISavageHead { - wild_head_1: IWildHead - wild_head_2: IWildHead - wild_head_3: IWildHead - Wild_Dealmaker_head: IWildHead - Wild_Killa_head: IWildHead - bear_head: IWildHead - bear_head_1: IWildHead - usec_head_1: IWildHead - Head_BOSS_Glukhar: IWildHead - Wild_Head_nonMesh: IWildHead - Head_BOSS_Sanitar: IWildHead - wild_head_drozd: IWildHead - wild_head_misha: IWildHead - head_cultist_01: IWildHead - head_cultist_02: IWildHead - head_cultist_03: IWildHead - DefaultUsecHead: IWildHead - usec_head_3: IWildHead - usec_head_4: IWildHead - usec_head_5: IWildHead + wild_head_1: IWildHead; + wild_head_2: IWildHead; + wild_head_3: IWildHead; + Wild_Dealmaker_head: IWildHead; + Wild_Killa_head: IWildHead; + bear_head: IWildHead; + bear_head_1: IWildHead; + usec_head_1: IWildHead; + Head_BOSS_Glukhar: IWildHead; + Wild_Head_nonMesh: IWildHead; + Head_BOSS_Sanitar: IWildHead; + wild_head_drozd: IWildHead; + wild_head_misha: IWildHead; + head_cultist_01: IWildHead; + head_cultist_02: IWildHead; + head_cultist_03: IWildHead; + DefaultUsecHead: IWildHead; + usec_head_3: IWildHead; + usec_head_4: IWildHead; + usec_head_5: IWildHead; } -export interface IWildHead +export interface IWildHead { - head: string - isNotRandom: boolean - NotRandom: boolean + head: string; + isNotRandom: boolean; + NotRandom: boolean; } -export interface ISavageBody +export interface ISavageBody { - wild_body: IWildBody - wild_body_1: IWildBody - wild_body_2: IWildBody - wild_body_3: IWildBody - Wild_Dealmaker_body: IWildBody - wild_security_body_1: IWildBody - wild_security_body_2: IWildBody - wild_Killa_body: IWildBody - wild_pmcBot_body: IWildBody - wild_Shturman_body: IWildBody - wild_Gluhar_body: IWildBody - Tshirt_security_TshirtTatu_01: IWildBody - Tshirt_security_TshirtTatu_02: IWildBody - Top_security_Husky: IWildBody - Top_security_Gorka4: IWildBody - scav_kit_upper_meteor: IWildBody - wild_body_russia1: IWildBody - Top_BOSS_Sanitar: IWildBody - wild_body_motocross: IWildBody - top_cultist_01: IWildBody - top_cultist_02: IWildBody - wild_body_rainparka: IWildBody - wild_body_underarmour: IWildBody - top_boss_tagilla: IWildBody - DefaultUsecBody: IWildBody - usec_upper_acu: IWildBody - usec_upper_commando: IWildBody - usec_upper_aggressor: IWildBody - usec_upper_hoody: IWildBody - usec_upper_pcuironsight: IWildBody - usec_top_beltstaff: IWildBody - usec_upper_flexion: IWildBody - usec_upper_tier3: IWildBody - usec_upper_pcsmulticam: IWildBody - usec_upper_tier_2: IWildBody - usec_upper_infiltrator: IWildBody - user_upper_NightPatrol: IWildBody - wild_body_bomber: IWildBody - wild_top_yellowcoat: IWildBody + wild_body: IWildBody; + wild_body_1: IWildBody; + wild_body_2: IWildBody; + wild_body_3: IWildBody; + Wild_Dealmaker_body: IWildBody; + wild_security_body_1: IWildBody; + wild_security_body_2: IWildBody; + wild_Killa_body: IWildBody; + wild_pmcBot_body: IWildBody; + wild_Shturman_body: IWildBody; + wild_Gluhar_body: IWildBody; + Tshirt_security_TshirtTatu_01: IWildBody; + Tshirt_security_TshirtTatu_02: IWildBody; + Top_security_Husky: IWildBody; + Top_security_Gorka4: IWildBody; + scav_kit_upper_meteor: IWildBody; + wild_body_russia1: IWildBody; + Top_BOSS_Sanitar: IWildBody; + wild_body_motocross: IWildBody; + top_cultist_01: IWildBody; + top_cultist_02: IWildBody; + wild_body_rainparka: IWildBody; + wild_body_underarmour: IWildBody; + top_boss_tagilla: IWildBody; + DefaultUsecBody: IWildBody; + usec_upper_acu: IWildBody; + usec_upper_commando: IWildBody; + usec_upper_aggressor: IWildBody; + usec_upper_hoody: IWildBody; + usec_upper_pcuironsight: IWildBody; + usec_top_beltstaff: IWildBody; + usec_upper_flexion: IWildBody; + usec_upper_tier3: IWildBody; + usec_upper_pcsmulticam: IWildBody; + usec_upper_tier_2: IWildBody; + usec_upper_infiltrator: IWildBody; + user_upper_NightPatrol: IWildBody; + wild_body_bomber: IWildBody; + wild_top_yellowcoat: IWildBody; } -export interface IWildBody +export interface IWildBody { - body: string - hands: string - isNotRandom: boolean + body: string; + hands: string; + isNotRandom: boolean; } -export interface ISavageFeet +export interface ISavageFeet { - wild_feet: IWildFeet - wild_feet_1: IWildFeet - wild_feet_2: IWildFeet - Wild_Dealmaker_feet: IWildFeet - wild_security_feet_1: IWildFeet - Wild_Killa_feet: IWildFeet - wild_pmcBot_feet: IWildFeet - Pants_BOSS_Glukhar: IWildFeet - Pants_BOSS_Shturman: IWildFeet - Pants_security_Gorka4: IWildFeet - Pants_security_Flora: IWildFeet - scav_kit_lower_sklon: IWildFeet - Pants_BOSS_Sanitar: IWildFeet - wild_feet_sweatpants: IWildFeet - wild_feet_wasatch: IWildFeet - wild_feet_slimPants: IWildFeet - pants_cultist_01: IWildFeet - pants_cultist_02: IWildFeet - wild_feet_scavelite_taclite: IWildFeet - pants_boss_tagilla: IWildFeet - wild_feet_bomber: IWildFeet - wild_pants_yellowcoat: IWildFeet + wild_feet: IWildFeet; + wild_feet_1: IWildFeet; + wild_feet_2: IWildFeet; + Wild_Dealmaker_feet: IWildFeet; + wild_security_feet_1: IWildFeet; + Wild_Killa_feet: IWildFeet; + wild_pmcBot_feet: IWildFeet; + Pants_BOSS_Glukhar: IWildFeet; + Pants_BOSS_Shturman: IWildFeet; + Pants_security_Gorka4: IWildFeet; + Pants_security_Flora: IWildFeet; + scav_kit_lower_sklon: IWildFeet; + Pants_BOSS_Sanitar: IWildFeet; + wild_feet_sweatpants: IWildFeet; + wild_feet_wasatch: IWildFeet; + wild_feet_slimPants: IWildFeet; + pants_cultist_01: IWildFeet; + pants_cultist_02: IWildFeet; + wild_feet_scavelite_taclite: IWildFeet; + pants_boss_tagilla: IWildFeet; + wild_feet_bomber: IWildFeet; + wild_pants_yellowcoat: IWildFeet; } -export interface IWildFeet +export interface IWildFeet { - feet: string - isNotRandom: boolean - NotRandom: boolean + feet: string; + isNotRandom: boolean; + NotRandom: boolean; } -export interface ICustomizationVoice +export interface ICustomizationVoice { - voice: string - side: string[] - isNotRandom: boolean + voice: string; + side: string[]; + isNotRandom: boolean; } -export interface IBodyParts +export interface IBodyParts { - Head: string - Body: string - Feet: string - Hands: string + Head: string; + Body: string; + Feet: string; + Hands: string; } -export interface IArmorMaterials +export interface IArmorMaterials { - UHMWPE: IArmorType - Aramid: IArmorType - Combined: IArmorType - Titan: IArmorType - Aluminium: IArmorType - ArmoredSteel: IArmorType - Ceramic: IArmorType - Glass: IArmorType + UHMWPE: IArmorType; + Aramid: IArmorType; + Combined: IArmorType; + Titan: IArmorType; + Aluminium: IArmorType; + ArmoredSteel: IArmorType; + Ceramic: IArmorType; + Glass: IArmorType; } -export interface IArmorType +export interface IArmorType { - Destructibility: number - MinRepairDegradation: number - MaxRepairDegradation: number - ExplosionDestructibility: number - MinRepairKitDegradation: number - MaxRepairKitDegradation: number + Destructibility: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + ExplosionDestructibility: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; } -export interface IHealth +export interface IHealth { - Falling: IFalling - Effects: IEffects - HealPrice: IHealPrice - ProfileHealthSettings: IProfileHealthSettings + Falling: IFalling; + Effects: IEffects; + HealPrice: IHealPrice; + ProfileHealthSettings: IProfileHealthSettings; } -export interface IFalling +export interface IFalling { - DamagePerMeter: number - SafeHeight: number + DamagePerMeter: number; + SafeHeight: number; } -export interface IEffects +export interface IEffects { - Existence: IExistence - Dehydration: IDehydration - BreakPart: IBreakPart - Contusion: IContusion - Disorientation: IDisorientation - Exhaustion: IExhaustion - LowEdgeHealth: ILowEdgeHealth - RadExposure: IRadExposure - Stun: IStun - Intoxication: Intoxication - Regeneration: IRegeneration - Wound: IWound - Berserk: IBerserk - Flash: IFlash - MedEffect: IMedEffect - Pain: IPain - PainKiller: IPainKiller - SandingScreen: ISandingScreen - MildMusclePain: IMusclePainEffect - SevereMusclePain: IMusclePainEffect - Stimulator: IStimulator - Tremor: ITremor - ChronicStaminaFatigue: IChronicStaminaFatigue - Fracture: IFracture - HeavyBleeding: IHeavyBleeding - LightBleeding: ILightBleeding - BodyTemperature: IBodyTemperature + Existence: IExistence; + Dehydration: IDehydration; + BreakPart: IBreakPart; + Contusion: IContusion; + Disorientation: IDisorientation; + Exhaustion: IExhaustion; + LowEdgeHealth: ILowEdgeHealth; + RadExposure: IRadExposure; + Stun: IStun; + Intoxication: Intoxication; + Regeneration: IRegeneration; + Wound: IWound; + Berserk: IBerserk; + Flash: IFlash; + MedEffect: IMedEffect; + Pain: IPain; + PainKiller: IPainKiller; + SandingScreen: ISandingScreen; + MildMusclePain: IMusclePainEffect; + SevereMusclePain: IMusclePainEffect; + Stimulator: IStimulator; + Tremor: ITremor; + ChronicStaminaFatigue: IChronicStaminaFatigue; + Fracture: IFracture; + HeavyBleeding: IHeavyBleeding; + LightBleeding: ILightBleeding; + BodyTemperature: IBodyTemperature; } -export interface IExistence +export interface IExistence { - EnergyLoopTime: number - HydrationLoopTime: number - EnergyDamage: number - HydrationDamage: number - DestroyedStomachEnergyTimeFactor: number - DestroyedStomachHydrationTimeFactor: number + EnergyLoopTime: number; + HydrationLoopTime: number; + EnergyDamage: number; + HydrationDamage: number; + DestroyedStomachEnergyTimeFactor: number; + DestroyedStomachHydrationTimeFactor: number; } -export interface IDehydration +export interface IDehydration { - DefaultDelay: number - DefaultResidueTime: number - BleedingHealth: number - BleedingLoopTime: number - BleedingLifeTime: number - DamageOnStrongDehydration: number - StrongDehydrationLoopTime: number + DefaultDelay: number; + DefaultResidueTime: number; + BleedingHealth: number; + BleedingLoopTime: number; + BleedingLifeTime: number; + DamageOnStrongDehydration: number; + StrongDehydrationLoopTime: number; } -export interface IBreakPart +export interface IBreakPart { - DefaultDelay: number - DefaultResidueTime: number - HealExperience: number - OfflineDurationMin: number - OfflineDurationMax: number - RemovePrice: number - RemovedAfterDeath: boolean - BulletHitProbability: IProbability - FallingProbability: IProbability + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: IProbability; + FallingProbability: IProbability; } -export interface IContusion +export interface IContusion { - Dummy: number + Dummy: number; } -export interface IDisorientation +export interface IDisorientation { - Dummy: number + Dummy: number; } -export interface IExhaustion +export interface IExhaustion { - DefaultDelay: number - DefaultResidueTime: number - Damage: number - DamageLoopTime: number + DefaultDelay: number; + DefaultResidueTime: number; + Damage: number; + DamageLoopTime: number; } -export interface ILowEdgeHealth +export interface ILowEdgeHealth { - DefaultDelay: number - DefaultResidueTime: number - StartCommonHealth: number + DefaultDelay: number; + DefaultResidueTime: number; + StartCommonHealth: number; } -export interface IRadExposure +export interface IRadExposure { - Damage: number - DamageLoopTime: number + Damage: number; + DamageLoopTime: number; } -export interface IStun +export interface IStun { - Dummy: number + Dummy: number; } -export interface Intoxication +export interface Intoxication { - DefaultDelay: number - DefaultResidueTime: number - DamageHealth: number - HealthLoopTime: number - OfflineDurationMin: number - OfflineDurationMax: number - RemovedAfterDeath: boolean - HealExperience: number - RemovePrice: number + DefaultDelay: number; + DefaultResidueTime: number; + DamageHealth: number; + HealthLoopTime: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovedAfterDeath: boolean; + HealExperience: number; + RemovePrice: number; } -export interface IRegeneration +export interface IRegeneration { - LoopTime: number - MinimumHealthPercentage: number - Energy: number - Hydration: number - BodyHealth: IBodyHealth - Influences: IInfluences + LoopTime: number; + MinimumHealthPercentage: number; + Energy: number; + Hydration: number; + BodyHealth: IBodyHealth; + Influences: IInfluences; } -export interface IBodyHealth +export interface IBodyHealth { - Head: IBodyHealthValue - Chest: IBodyHealthValue - Stomach: IBodyHealthValue - LeftArm: IBodyHealthValue - RightArm: IBodyHealthValue - LeftLeg: IBodyHealthValue - RightLeg: IBodyHealthValue + Head: IBodyHealthValue; + Chest: IBodyHealthValue; + Stomach: IBodyHealthValue; + LeftArm: IBodyHealthValue; + RightArm: IBodyHealthValue; + LeftLeg: IBodyHealthValue; + RightLeg: IBodyHealthValue; } -export interface IBodyHealthValue +export interface IBodyHealthValue { - Value: number + Value: number; } -export interface IInfluences +export interface IInfluences { - LightBleeding: IInfluence - HeavyBleeding: IInfluence - Fracture: IInfluence - RadExposure: IInfluence - Intoxication: IInfluence + LightBleeding: IInfluence; + HeavyBleeding: IInfluence; + Fracture: IInfluence; + RadExposure: IInfluence; + Intoxication: IInfluence; } -export interface IInfluence +export interface IInfluence { - HealthSlowDownPercentage: number - EnergySlowDownPercentage: number - HydrationSlowDownPercentage: number + HealthSlowDownPercentage: number; + EnergySlowDownPercentage: number; + HydrationSlowDownPercentage: number; } -export interface IWound +export interface IWound { - WorkingTime: number - ThresholdMin: number - ThresholdMax: number + WorkingTime: number; + ThresholdMin: number; + ThresholdMax: number; } -export interface IBerserk +export interface IBerserk { - DefaultDelay: number - WorkingTime: number - DefaultResidueTime: number + DefaultDelay: number; + WorkingTime: number; + DefaultResidueTime: number; } -export interface IFlash +export interface IFlash { - Dummy: number + Dummy: number; } -export interface IMedEffect +export interface IMedEffect { - LoopTime: number - StartDelay: number - DrinkStartDelay: number - FoodStartDelay: number - DrugsStartDelay: number - MedKitStartDelay: number - MedicalStartDelay: number - StimulatorStartDelay: number + LoopTime: number; + StartDelay: number; + DrinkStartDelay: number; + FoodStartDelay: number; + DrugsStartDelay: number; + MedKitStartDelay: number; + MedicalStartDelay: number; + StimulatorStartDelay: number; } -export interface IPain +export interface IPain { - TremorDelay: number - HealExperience: number + TremorDelay: number; + HealExperience: number; } -export interface IPainKiller +export interface IPainKiller { - Dummy: number + Dummy: number; } -export interface ISandingScreen +export interface ISandingScreen { - Dummy: number + Dummy: number; } export interface IMusclePainEffect { - GymEffectivity: number - OfflineDurationMax: number - OfflineDurationMin: number - TraumaChance: number + GymEffectivity: number; + OfflineDurationMax: number; + OfflineDurationMin: number; + TraumaChance: number; } -export interface IStimulator +export interface IStimulator { - BuffLoopTime: number - Buffs: IBuffs + BuffLoopTime: number; + Buffs: IBuffs; } -export interface IBuffs +export interface IBuffs { - BuffsSJ1TGLabs: IBuff[] - BuffsSJ6TGLabs: IBuff[] - BuffsPropital: IBuff[] - BuffsZagustin: IBuff[] - BuffseTGchange: IBuff[] - BuffsAdrenaline: IBuff[] - BuffsGoldenStarBalm: IBuff[] - Buffs_drink_aquamari: IBuff[] - Buffs_drink_maxenergy: IBuff[] - Buffs_drink_milk: IBuff[] - Buffs_drink_tarcola: IBuff[] - Buffs_drink_hotrod: IBuff[] - Buffs_drink_juice_army: IBuff[] - Buffs_drink_water: IBuff[] - Buffs_food_borodinskiye: IBuff[] - Buffs_food_condensed_milk: IBuff[] - Buffs_food_emelya: IBuff[] - Buffs_food_mayonez: IBuff[] - Buffs_food_mre: IBuff[] - Buffs_food_sugar: IBuff[] - Buffs_drink_vodka: IBuff[] - Buffs_drink_jack: IBuff[] - Buffs_drink_moonshine: IBuff[] - Buffs_drink_purewater: IBuff[] - Buffs_3bTG: IBuff[] - Buffs_AHF1M: IBuff[] - Buffs_L1: IBuff[] - Buffs_MULE: IBuff[] - Buffs_Meldonin: IBuff[] - Buffs_Obdolbos: IBuff[] - Buffs_P22: IBuff[] - Buffs_KultistsToxin: IBuff[] - Buffs_BodyTemperature: IBuff[] - Buffs_Antidote: IBuff[] - Buffs_melee_bleed: IBuff[] - Buffs_melee_blunt: IBuff[] - Buffs_hultafors: IBuff[] - Buffs_drink_vodka_BAD: IBuff[] - Buffs_food_alyonka: IBuff[] - Buffs_food_slippers: IBuff[] - Buffs_knife: IBuff[] + BuffsSJ1TGLabs: IBuff[]; + BuffsSJ6TGLabs: IBuff[]; + BuffsPropital: IBuff[]; + BuffsZagustin: IBuff[]; + BuffseTGchange: IBuff[]; + BuffsAdrenaline: IBuff[]; + BuffsGoldenStarBalm: IBuff[]; + Buffs_drink_aquamari: IBuff[]; + Buffs_drink_maxenergy: IBuff[]; + Buffs_drink_milk: IBuff[]; + Buffs_drink_tarcola: IBuff[]; + Buffs_drink_hotrod: IBuff[]; + Buffs_drink_juice_army: IBuff[]; + Buffs_drink_water: IBuff[]; + Buffs_food_borodinskiye: IBuff[]; + Buffs_food_condensed_milk: IBuff[]; + Buffs_food_emelya: IBuff[]; + Buffs_food_mayonez: IBuff[]; + Buffs_food_mre: IBuff[]; + Buffs_food_sugar: IBuff[]; + Buffs_drink_vodka: IBuff[]; + Buffs_drink_jack: IBuff[]; + Buffs_drink_moonshine: IBuff[]; + Buffs_drink_purewater: IBuff[]; + Buffs_3bTG: IBuff[]; + Buffs_AHF1M: IBuff[]; + Buffs_L1: IBuff[]; + Buffs_MULE: IBuff[]; + Buffs_Meldonin: IBuff[]; + Buffs_Obdolbos: IBuff[]; + Buffs_P22: IBuff[]; + Buffs_KultistsToxin: IBuff[]; + Buffs_BodyTemperature: IBuff[]; + Buffs_Antidote: IBuff[]; + Buffs_melee_bleed: IBuff[]; + Buffs_melee_blunt: IBuff[]; + Buffs_hultafors: IBuff[]; + Buffs_drink_vodka_BAD: IBuff[]; + Buffs_food_alyonka: IBuff[]; + Buffs_food_slippers: IBuff[]; + Buffs_knife: IBuff[]; } -export interface IBuff +export interface IBuff { - BuffType: string - Chance: number - Delay: number - Duration: number - Value: number - AbsoluteValue: boolean - SkillName: string + BuffType: string; + Chance: number; + Delay: number; + Duration: number; + Value: number; + AbsoluteValue: boolean; + SkillName: string; } -export interface ITremor +export interface ITremor { - DefaultDelay: number - DefaultResidueTime: number + DefaultDelay: number; + DefaultResidueTime: number; } -export interface IChronicStaminaFatigue +export interface IChronicStaminaFatigue { - EnergyRate: number - WorkingTime: number - TicksEvery: number - EnergyRatePerStack: number + EnergyRate: number; + WorkingTime: number; + TicksEvery: number; + EnergyRatePerStack: number; } -export interface IFracture +export interface IFracture { - DefaultDelay: number - DefaultResidueTime: number - HealExperience: number - OfflineDurationMin: number - OfflineDurationMax: number - RemovePrice: number - RemovedAfterDeath: boolean - BulletHitProbability: IProbability - FallingProbability: IProbability + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: IProbability; + FallingProbability: IProbability; } -export interface IHeavyBleeding +export interface IHeavyBleeding { - DefaultDelay: number - DefaultResidueTime: number - DamageEnergy: number - DamageHealth: number - EnergyLoopTime: number - HealthLoopTime: number - DamageHealthDehydrated: number - HealthLoopTimeDehydrated: number - LifeTimeDehydrated: number - EliteVitalityDuration: number - HealExperience: number - OfflineDurationMin: number - OfflineDurationMax: number - RemovePrice: number - RemovedAfterDeath: boolean - Probability: IProbability + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: IProbability; } -export interface IProbability +export interface IProbability { - FunctionType: string - K: number - B: number - Threshold: number + FunctionType: string; + K: number; + B: number; + Threshold: number; } -export interface ILightBleeding +export interface ILightBleeding { - DefaultDelay: number - DefaultResidueTime: number - DamageEnergy: number - DamageHealth: number - EnergyLoopTime: number - HealthLoopTime: number - DamageHealthDehydrated: number - HealthLoopTimeDehydrated: number - LifeTimeDehydrated: number - EliteVitalityDuration: number - HealExperience: number - OfflineDurationMin: number - OfflineDurationMax: number - RemovePrice: number - RemovedAfterDeath: boolean - Probability: IProbability + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: IProbability; } -export interface IBodyTemperature +export interface IBodyTemperature { - DefaultBuildUpTime: number - DefaultResidueTime: number - LoopTime: number + DefaultBuildUpTime: number; + DefaultResidueTime: number; + LoopTime: number; } -export interface IHealPrice +export interface IHealPrice { - HealthPointPrice: number - HydrationPointPrice: number - EnergyPointPrice: number - TrialLevels: number - TrialRaids: number + HealthPointPrice: number; + HydrationPointPrice: number; + EnergyPointPrice: number; + TrialLevels: number; + TrialRaids: number; } -export interface IProfileHealthSettings +export interface IProfileHealthSettings { - BodyPartsSettings: IBodyPartsSettings - HealthFactorsSettings: IHealthFactorsSettings - DefaultStimulatorBuff: string + BodyPartsSettings: IBodyPartsSettings; + HealthFactorsSettings: IHealthFactorsSettings; + DefaultStimulatorBuff: string; } -export interface IBodyPartsSettings +export interface IBodyPartsSettings { - Head: IBodyPartsSetting - Chest: IBodyPartsSetting - Stomach: IBodyPartsSetting - LeftArm: IBodyPartsSetting - RightArm: IBodyPartsSetting - LeftLeg: IBodyPartsSetting - RightLeg: IBodyPartsSetting + Head: IBodyPartsSetting; + Chest: IBodyPartsSetting; + Stomach: IBodyPartsSetting; + LeftArm: IBodyPartsSetting; + RightArm: IBodyPartsSetting; + LeftLeg: IBodyPartsSetting; + RightLeg: IBodyPartsSetting; } -export interface IBodyPartsSetting +export interface IBodyPartsSetting { - Minimum: number - Maximum: number - Default: number - OverDamageReceivedMultiplier: number + Minimum: number; + Maximum: number; + Default: number; + OverDamageReceivedMultiplier: number; } -export interface IHealthFactorsSettings +export interface IHealthFactorsSettings { - Energy: IHealthFactorSetting - Hydration: IHealthFactorSetting - Temperature: IHealthFactorSetting - Poisoning: IHealthFactorSetting - Radiation: IHealthFactorSetting + Energy: IHealthFactorSetting; + Hydration: IHealthFactorSetting; + Temperature: IHealthFactorSetting; + Poisoning: IHealthFactorSetting; + Radiation: IHealthFactorSetting; } -export interface IHealthFactorSetting +export interface IHealthFactorSetting { - Minimum: number - Maximum: number - Default: number + Minimum: number; + Maximum: number; + Default: number; } -export interface IRating +export interface IRating { - levelRequired: number - limit: number - categories: ICategories + levelRequired: number; + limit: number; + categories: ICategories; } -export interface ICategories +export interface ICategories { - experience: boolean - kd: boolean - surviveRatio: boolean - avgEarnings: boolean - pmcKills: boolean - raidCount: boolean - longestShot: boolean - timeOnline: boolean - inventoryFullCost: boolean - ragFairStanding: boolean + experience: boolean; + kd: boolean; + surviveRatio: boolean; + avgEarnings: boolean; + pmcKills: boolean; + raidCount: boolean; + longestShot: boolean; + timeOnline: boolean; + inventoryFullCost: boolean; + ragFairStanding: boolean; } -export interface ITournament +export interface ITournament { - categories: ITournamentCategories - limit: number - levelRequired: number + categories: ITournamentCategories; + limit: number; + levelRequired: number; } -export interface ITournamentCategories +export interface ITournamentCategories { - dogtags: boolean + dogtags: boolean; } -export interface IRagFair +export interface IRagFair { - enabled: boolean - priceStabilizerEnabled: boolean - includePveTraderSales: boolean - priceStabilizerStartIntervalInHours: number - minUserLevel: number - communityTax: number - communityItemTax: number - communityRequirementTax: number - offerPriorityCost: number - offerDurationTimeInHour: number - offerDurationTimeInHourAfterRemove: number - priorityTimeModifier: number - maxRenewOfferTimeInHour: number - renewPricePerHour: number - maxActiveOfferCount: IMaxActiveOfferCount[] - balancerRemovePriceCoefficient: number - balancerMinPriceCount: number - balancerAveragePriceCoefficient: number - delaySinceOfferAdd: number - uniqueBuyerTimeoutInDays: number - ratingSumForIncrease: number - ratingIncreaseCount: number - ratingSumForDecrease: number - ratingDecreaseCount: number - maxSumForIncreaseRatingPerOneSale: number - maxSumForDecreaseRatingPerOneSale: number - maxSumForRarity: IMaxSumForRarity - ChangePriceCoef: number - balancerUserItemSaleCooldownEnabled: boolean - balancerUserItemSaleCooldown: number - youSellOfferMaxStorageTimeInHour: number - yourOfferDidNotSellMaxStorageTimeInHour: number - isOnlyFoundInRaidAllowed: boolean - sellInOnePiece: number + enabled: boolean; + priceStabilizerEnabled: boolean; + includePveTraderSales: boolean; + priceStabilizerStartIntervalInHours: number; + minUserLevel: number; + communityTax: number; + communityItemTax: number; + communityRequirementTax: number; + offerPriorityCost: number; + offerDurationTimeInHour: number; + offerDurationTimeInHourAfterRemove: number; + priorityTimeModifier: number; + maxRenewOfferTimeInHour: number; + renewPricePerHour: number; + maxActiveOfferCount: IMaxActiveOfferCount[]; + balancerRemovePriceCoefficient: number; + balancerMinPriceCount: number; + balancerAveragePriceCoefficient: number; + delaySinceOfferAdd: number; + uniqueBuyerTimeoutInDays: number; + ratingSumForIncrease: number; + ratingIncreaseCount: number; + ratingSumForDecrease: number; + ratingDecreaseCount: number; + maxSumForIncreaseRatingPerOneSale: number; + maxSumForDecreaseRatingPerOneSale: number; + maxSumForRarity: IMaxSumForRarity; + ChangePriceCoef: number; + balancerUserItemSaleCooldownEnabled: boolean; + balancerUserItemSaleCooldown: number; + youSellOfferMaxStorageTimeInHour: number; + yourOfferDidNotSellMaxStorageTimeInHour: number; + isOnlyFoundInRaidAllowed: boolean; + sellInOnePiece: number; } -export interface IMaxActiveOfferCount +export interface IMaxActiveOfferCount { - from: number - to: number - count: number + from: number; + to: number; + count: number; } -export interface IMaxSumForRarity +export interface IMaxSumForRarity { - Common: IRarityMaxSum - Rare: IRarityMaxSum - Superrare: IRarityMaxSum - Not_exist: IRarityMaxSum + Common: IRarityMaxSum; + Rare: IRarityMaxSum; + Superrare: IRarityMaxSum; + Not_exist: IRarityMaxSum; } -export interface IRarityMaxSum +export interface IRarityMaxSum { - value: number + value: number; } -export interface IHandbook +export interface IHandbook { - defaultCategory: string + defaultCategory: string; } - -export interface IStamina +export interface IStamina { - Capacity: number - SprintDrainRate: number - BaseRestorationRate: number - JumpConsumption: number - GrenadeHighThrow: number - GrenadeLowThrow: number - AimDrainRate: number - AimRangeFinderDrainRate: number - OxygenCapacity: number - OxygenRestoration: number - WalkOverweightLimits: Ixyz - BaseOverweightLimits: Ixyz - SprintOverweightLimits: Ixyz - WalkSpeedOverweightLimits: Ixyz - CrouchConsumption: Ixyz - WalkConsumption: Ixyz - StandupConsumption: Ixyz - TransitionSpeed: Ixyz - SprintAccelerationLowerLimit: number - SprintSpeedLowerLimit: number - SprintSensitivityLowerLimit: number - AimConsumptionByPose: Ixyz - RestorationMultiplierByPose: Ixyz - OverweightConsumptionByPose: Ixyz - AimingSpeedMultiplier: number - WalkVisualEffectMultiplier: number - WeaponFastSwitchConsumption: number - HandsCapacity: number - HandsRestoration: number - ProneConsumption: number - BaseHoldBreathConsumption: number - SoundRadius: Ixyz - ExhaustedMeleeSpeed: number - FatigueRestorationRate: number - FatigueAmountToCreateEffect: number - ExhaustedMeleeDamageMultiplier: number - FallDamageMultiplier: number - SafeHeightOverweight: number - SitToStandConsumption: number - StaminaExhaustionCausesJiggle: boolean - StaminaExhaustionStartsBreathSound: boolean - StaminaExhaustionRocksCamera: boolean - HoldBreathStaminaMultiplier: Ixyz - PoseLevelIncreaseSpeed: Ixyz - PoseLevelDecreaseSpeed: Ixyz - PoseLevelConsumptionPerNotch: Ixyz + Capacity: number; + SprintDrainRate: number; + BaseRestorationRate: number; + JumpConsumption: number; + GrenadeHighThrow: number; + GrenadeLowThrow: number; + AimDrainRate: number; + AimRangeFinderDrainRate: number; + OxygenCapacity: number; + OxygenRestoration: number; + WalkOverweightLimits: Ixyz; + BaseOverweightLimits: Ixyz; + SprintOverweightLimits: Ixyz; + WalkSpeedOverweightLimits: Ixyz; + CrouchConsumption: Ixyz; + WalkConsumption: Ixyz; + StandupConsumption: Ixyz; + TransitionSpeed: Ixyz; + SprintAccelerationLowerLimit: number; + SprintSpeedLowerLimit: number; + SprintSensitivityLowerLimit: number; + AimConsumptionByPose: Ixyz; + RestorationMultiplierByPose: Ixyz; + OverweightConsumptionByPose: Ixyz; + AimingSpeedMultiplier: number; + WalkVisualEffectMultiplier: number; + WeaponFastSwitchConsumption: number; + HandsCapacity: number; + HandsRestoration: number; + ProneConsumption: number; + BaseHoldBreathConsumption: number; + SoundRadius: Ixyz; + ExhaustedMeleeSpeed: number; + FatigueRestorationRate: number; + FatigueAmountToCreateEffect: number; + ExhaustedMeleeDamageMultiplier: number; + FallDamageMultiplier: number; + SafeHeightOverweight: number; + SitToStandConsumption: number; + StaminaExhaustionCausesJiggle: boolean; + StaminaExhaustionStartsBreathSound: boolean; + StaminaExhaustionRocksCamera: boolean; + HoldBreathStaminaMultiplier: Ixyz; + PoseLevelIncreaseSpeed: Ixyz; + PoseLevelDecreaseSpeed: Ixyz; + PoseLevelConsumptionPerNotch: Ixyz; } -export interface IStaminaRestoration +export interface IStaminaRestoration { - LowerLeftPoint: number - LowerRightPoint: number - LeftPlatoPoint: number - RightPlatoPoint: number - RightLimit: number - ZeroValue: number + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; } -export interface IStaminaDrain +export interface IStaminaDrain { - LowerLeftPoint: number - LowerRightPoint: number - LeftPlatoPoint: number - RightPlatoPoint: number - RightLimit: number - ZeroValue: number + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; } -export interface IRequirementReferences +export interface IRequirementReferences { - Alpinist: IAlpinist[] + Alpinist: IAlpinist[]; } -export interface IAlpinist +export interface IAlpinist { - Requirement: string - Id: string - Count: number - RequiredSlot: string - RequirementTip: string + Requirement: string; + Id: string; + Count: number; + RequiredSlot: string; + RequirementTip: string; } -export interface IRestrictionsInRaid +export interface IRestrictionsInRaid { - TemplateId: string - Value: number + TemplateId: string; + Value: number; } -export interface ISquadSettings +export interface ISquadSettings { - CountOfRequestsToOnePlayer: number - SecondsForExpiredRequest: number - SendRequestDelaySeconds: number + CountOfRequestsToOnePlayer: number; + SecondsForExpiredRequest: number; + SendRequestDelaySeconds: number; } -export interface IInsurance +export interface IInsurance { - MaxStorageTimeInHour: number + MaxStorageTimeInHour: number; } -export interface ISkillsSettings +export interface ISkillsSettings { - SkillProgressRate: number - WeaponSkillProgressRate: number - WeaponSkillRecoilBonusPerLevel: number - HideoutManagement: IHideoutManagement - Crafting: ICrafting - Metabolism: IMetabolism - Immunity: Immunity - Endurance: IEndurance - Strength: IStrength - Vitality: IVitality - Health: IHealthSkillProgress - StressResistance: IStressResistance - Throwing: IThrowing - RecoilControl: IRecoilControl - Pistol: IWeaponSkills - Revolver: IWeaponSkills - SMG: any[] - Assault: IWeaponSkills - Shotgun: IWeaponSkills - Sniper: IWeaponSkills - LMG: any[] - HMG: any[] - Launcher: any[] - AttachedLauncher: any[] - Melee: IMeleeSkill - DMR: IWeaponSkills - BearAssaultoperations: any[] - BearAuthority: any[] - BearAksystems: any[] - BearHeavycaliber: any[] - BearRawpower: any[] - UsecArsystems: any[] - UsecDeepweaponmodding_Settings: any[] - UsecLongrangeoptics_Settings: any[] - UsecNegotiations: any[] - UsecTactics: any[] - BotReload: any[] - CovertMovement: ICovertMovement - FieldMedicine: any[] - Search: ISearch - Sniping: any[] - ProneMovement: any[] - FirstAid: any[] - LightVests: IArmorSkills - HeavyVests: IArmorSkills - WeaponModding: any[] - AdvancedModding: any[] - NightOps: any[] - SilentOps: any[] - Lockpicking: any[] - WeaponTreatment: IWeaponTreatment - MagDrills: IMagDrills - Freetrading: any[] - Auctions: any[] - Cleanoperations: any[] - Barter: any[] - Shadowconnections: any[] - Taskperformance: any[] - Perception: IPerception - Intellect: Intellect - Attention: IAttention - Charisma: ICharisma - Memory: IMemory - Surgery: ISurgery - AimDrills: IAimDrills - BotSound: any[] - TroubleShooting: ITroubleShooting + SkillProgressRate: number; + WeaponSkillProgressRate: number; + WeaponSkillRecoilBonusPerLevel: number; + HideoutManagement: IHideoutManagement; + Crafting: ICrafting; + Metabolism: IMetabolism; + Immunity: Immunity; + Endurance: IEndurance; + Strength: IStrength; + Vitality: IVitality; + Health: IHealthSkillProgress; + StressResistance: IStressResistance; + Throwing: IThrowing; + RecoilControl: IRecoilControl; + Pistol: IWeaponSkills; + Revolver: IWeaponSkills; + SMG: any[]; + Assault: IWeaponSkills; + Shotgun: IWeaponSkills; + Sniper: IWeaponSkills; + LMG: any[]; + HMG: any[]; + Launcher: any[]; + AttachedLauncher: any[]; + Melee: IMeleeSkill; + DMR: IWeaponSkills; + BearAssaultoperations: any[]; + BearAuthority: any[]; + BearAksystems: any[]; + BearHeavycaliber: any[]; + BearRawpower: any[]; + UsecArsystems: any[]; + UsecDeepweaponmodding_Settings: any[]; + UsecLongrangeoptics_Settings: any[]; + UsecNegotiations: any[]; + UsecTactics: any[]; + BotReload: any[]; + CovertMovement: ICovertMovement; + FieldMedicine: any[]; + Search: ISearch; + Sniping: any[]; + ProneMovement: any[]; + FirstAid: any[]; + LightVests: IArmorSkills; + HeavyVests: IArmorSkills; + WeaponModding: any[]; + AdvancedModding: any[]; + NightOps: any[]; + SilentOps: any[]; + Lockpicking: any[]; + WeaponTreatment: IWeaponTreatment; + MagDrills: IMagDrills; + Freetrading: any[]; + Auctions: any[]; + Cleanoperations: any[]; + Barter: any[]; + Shadowconnections: any[]; + Taskperformance: any[]; + Perception: IPerception; + Intellect: Intellect; + Attention: IAttention; + Charisma: ICharisma; + Memory: IMemory; + Surgery: ISurgery; + AimDrills: IAimDrills; + BotSound: any[]; + TroubleShooting: ITroubleShooting; } export interface IMeleeSkill { - BuffSettings: IBuffSettings + BuffSettings: IBuffSettings; } export interface IArmorSkills { - BuffMaxCount: number - BuffSettings: IBuffSettings - Counters: IArmorCounters - MoveSpeedPenaltyReductionHVestsReducePerLevel: number - RicochetChanceHVestsCurrentDurabilityThreshold: number - RicochetChanceHVestsEliteLevel: number - RicochetChanceHVestsMaxDurabilityThreshold: number - MeleeDamageLVestsReducePerLevel: number - MoveSpeedPenaltyReductionLVestsReducePerLevel: number - WearAmountRepairLVestsReducePerLevel: number - WearChanceRepairLVestsReduceEliteLevel: number + BuffMaxCount: number; + BuffSettings: IBuffSettings; + Counters: IArmorCounters; + MoveSpeedPenaltyReductionHVestsReducePerLevel: number; + RicochetChanceHVestsCurrentDurabilityThreshold: number; + RicochetChanceHVestsEliteLevel: number; + RicochetChanceHVestsMaxDurabilityThreshold: number; + MeleeDamageLVestsReducePerLevel: number; + MoveSpeedPenaltyReductionLVestsReducePerLevel: number; + WearAmountRepairLVestsReducePerLevel: number; + WearChanceRepairLVestsReduceEliteLevel: number; } export interface IArmorCounters { - armorDurability: ISkillCounter + armorDurability: ISkillCounter; } -export interface IHideoutManagement +export interface IHideoutManagement { - SkillPointsPerAreaUpgrade: number - SkillPointsPerCraft: number - ConsumptionReductionPerLevel: number - SkillBoostPercent: number - SkillPointsRate: ISkillPointsRate - EliteSlots: IEliteSlots + SkillPointsPerAreaUpgrade: number; + SkillPointsPerCraft: number; + ConsumptionReductionPerLevel: number; + SkillBoostPercent: number; + SkillPointsRate: ISkillPointsRate; + EliteSlots: IEliteSlots; } -export interface ISkillPointsRate +export interface ISkillPointsRate { - Generator: ISkillPointRate - AirFilteringUnit: ISkillPointRate - WaterCollector: ISkillPointRate - SolarPower: ISkillPointRate + Generator: ISkillPointRate; + AirFilteringUnit: ISkillPointRate; + WaterCollector: ISkillPointRate; + SolarPower: ISkillPointRate; } -export interface ISkillPointRate +export interface ISkillPointRate { - ResourceSpent: number - PointsGained: number + ResourceSpent: number; + PointsGained: number; } -export interface IEliteSlots +export interface IEliteSlots { - Generator: IEliteSlot - AirFilteringUnit: IEliteSlot - WaterCollector: IEliteSlot - BitcoinFarm: IEliteSlot + Generator: IEliteSlot; + AirFilteringUnit: IEliteSlot; + WaterCollector: IEliteSlot; + BitcoinFarm: IEliteSlot; } -export interface IEliteSlot +export interface IEliteSlot { - Slots: number - Container: number + Slots: number; + Container: number; } -export interface ICrafting +export interface ICrafting { - PointsPerCraftingCycle: number - CraftingCycleHours: number - PointsPerUniqueCraftCycle: number - UniqueCraftsPerCycle: number - CraftTimeReductionPerLevel: number - ProductionTimeReductionPerLevel: number - EliteExtraProductions: number - CraftingPointsToInteligence: number + PointsPerCraftingCycle: number; + CraftingCycleHours: number; + PointsPerUniqueCraftCycle: number; + UniqueCraftsPerCycle: number; + CraftTimeReductionPerLevel: number; + ProductionTimeReductionPerLevel: number; + EliteExtraProductions: number; + CraftingPointsToInteligence: number; } -export interface IMetabolism +export interface IMetabolism { - HydrationRecoveryRate: number - EnergyRecoveryRate: number - IncreasePositiveEffectDurationRate: number - DecreaseNegativeEffectDurationRate: number - DecreasePoisonDurationRate: number + HydrationRecoveryRate: number; + EnergyRecoveryRate: number; + IncreasePositiveEffectDurationRate: number; + DecreaseNegativeEffectDurationRate: number; + DecreasePoisonDurationRate: number; } -export interface Immunity +export interface Immunity { - ImmunityMiscEffects: number - ImmunityPoisonBuff: number - ImmunityPainKiller: number - HealthNegativeEffect: number - StimulatorNegativeBuff: number + ImmunityMiscEffects: number; + ImmunityPoisonBuff: number; + ImmunityPainKiller: number; + HealthNegativeEffect: number; + StimulatorNegativeBuff: number; } -export interface IEndurance +export interface IEndurance { - MovementAction: number - SprintAction: number - GainPerFatigueStack: number - DependentSkillRatios: IDependentSkillRatio[] - QTELevelMultipliers: Record> + MovementAction: number; + SprintAction: number; + GainPerFatigueStack: number; + DependentSkillRatios: IDependentSkillRatio[]; + QTELevelMultipliers: Record>; } -export interface IStrength +export interface IStrength { - DependentSkillRatios: IDependentSkillRatio[] - SprintActionMin: number - SprintActionMax: number - MovementActionMin: number - MovementActionMax: number - PushUpMin: number - PushUpMax: number - QTELevelMultipliers: IQTELevelMultiplier[] - FistfightAction: number - ThrowAction: number + DependentSkillRatios: IDependentSkillRatio[]; + SprintActionMin: number; + SprintActionMax: number; + MovementActionMin: number; + MovementActionMax: number; + PushUpMin: number; + PushUpMax: number; + QTELevelMultipliers: IQTELevelMultiplier[]; + FistfightAction: number; + ThrowAction: number; } export interface IDependentSkillRatio { - Ratio: number - SkillId: string + Ratio: number; + SkillId: string; } export interface IQTELevelMultiplier { - Level: number - Multiplier: number + Level: number; + Multiplier: number; } -export interface IVitality +export interface IVitality { - DamageTakenAction: number - HealthNegativeEffect: number + DamageTakenAction: number; + HealthNegativeEffect: number; } -export interface IHealthSkillProgress +export interface IHealthSkillProgress { - SkillProgress: number + SkillProgress: number; } -export interface IStressResistance +export interface IStressResistance { - HealthNegativeEffect: number - LowHPDuration: number + HealthNegativeEffect: number; + LowHPDuration: number; } -export interface IThrowing +export interface IThrowing { - ThrowAction: number + ThrowAction: number; } -export interface IRecoilControl +export interface IRecoilControl { - RecoilAction: number - RecoilBonusPerLevel: number + RecoilAction: number; + RecoilBonusPerLevel: number; } -export interface IWeaponSkills +export interface IWeaponSkills { - WeaponReloadAction: number - WeaponShotAction: number - WeaponFixAction: number - WeaponChamberAction: number + WeaponReloadAction: number; + WeaponShotAction: number; + WeaponFixAction: number; + WeaponChamberAction: number; } -export interface ICovertMovement +export interface ICovertMovement { - MovementAction: number + MovementAction: number; } -export interface ISearch +export interface ISearch { - SearchAction: number - FindAction: number + SearchAction: number; + FindAction: number; } -export interface IWeaponTreatment +export interface IWeaponTreatment { - BuffMaxCount: number - BuffSettings: IBuffSettings - Counters: IWeaponTreatmentCounters - DurLossReducePerLevel: number - SkillPointsPerRepair: number - Filter: any[] - WearAmountRepairGunsReducePerLevel: number - WearChanceRepairGunsReduceEliteLevel: number + BuffMaxCount: number; + BuffSettings: IBuffSettings; + Counters: IWeaponTreatmentCounters; + DurLossReducePerLevel: number; + SkillPointsPerRepair: number; + Filter: any[]; + WearAmountRepairGunsReducePerLevel: number; + WearChanceRepairGunsReduceEliteLevel: number; } export interface IWeaponTreatmentCounters { - firearmsDurability: ISkillCounter + firearmsDurability: ISkillCounter; } export interface IBuffSettings { - CommonBuffChanceLevelBonus: number - CommonBuffMinChanceValue: number - CurrentDurabilityLossToRemoveBuff?: number - MaxDurabilityLossToRemoveBuff?: number - RareBuffChanceCoff: number - ReceivedDurabilityMaxPercent: number + CommonBuffChanceLevelBonus: number; + CommonBuffMinChanceValue: number; + CurrentDurabilityLossToRemoveBuff?: number; + MaxDurabilityLossToRemoveBuff?: number; + RareBuffChanceCoff: number; + ReceivedDurabilityMaxPercent: number; } -export interface IMagDrills +export interface IMagDrills { - RaidLoadedAmmoAction: number - RaidUnloadedAmmoAction: number - MagazineCheckAction: number + RaidLoadedAmmoAction: number; + RaidUnloadedAmmoAction: number; + MagazineCheckAction: number; } -export interface IPerception +export interface IPerception { - DependentSkillRatios: ISkillRatio[] - OnlineAction: number - UniqueLoot: number + DependentSkillRatios: ISkillRatio[]; + OnlineAction: number; + UniqueLoot: number; } export interface ISkillRatio { - Ratio: number - SkillId: string + Ratio: number; + SkillId: string; } -export interface Intellect +export interface Intellect { - Counters: IIntellectCounters - ExamineAction: number - SkillProgress: number - RepairAction: number - WearAmountReducePerLevel: number - WearChanceReduceEliteLevel: number - RepairPointsCostReduction: number + Counters: IIntellectCounters; + ExamineAction: number; + SkillProgress: number; + RepairAction: number; + WearAmountReducePerLevel: number; + WearChanceReduceEliteLevel: number; + RepairPointsCostReduction: number; } export interface IIntellectCounters { - armorDurability: ISkillCounter - firearmsDurability: ISkillCounter - meleeWeaponDurability: ISkillCounter + armorDurability: ISkillCounter; + firearmsDurability: ISkillCounter; + meleeWeaponDurability: ISkillCounter; } export interface ISkillCounter { - divisor: number - points: number + divisor: number; + points: number; } -export interface IAttention +export interface IAttention { - DependentSkillRatios: ISkillRatio[] - ExamineWithInstruction: number - FindActionFalse: number - FindActionTrue: number + DependentSkillRatios: ISkillRatio[]; + ExamineWithInstruction: number; + FindActionFalse: number; + FindActionTrue: number; } -export interface ICharisma +export interface ICharisma { - BonusSettings: IBonusSettings - Counters: ICharismaSkillCounters - SkillProgressInt: number - SkillProgressAtn: number - SkillProgressPer: number + BonusSettings: IBonusSettings; + Counters: ICharismaSkillCounters; + SkillProgressInt: number; + SkillProgressAtn: number; + SkillProgressPer: number; } export interface ICharismaSkillCounters { - insuranceCost: ISkillCounter - repairCost: ISkillCounter - repeatableQuestCompleteCount: ISkillCounter - restoredHealthCost: ISkillCounter - scavCaseCost: ISkillCounter + insuranceCost: ISkillCounter; + repairCost: ISkillCounter; + repeatableQuestCompleteCount: ISkillCounter; + restoredHealthCost: ISkillCounter; + scavCaseCost: ISkillCounter; } export interface IBonusSettings { - EliteBonusSettings: IEliteBonusSettings - LevelBonusSettings: ILevelBonusSettings + EliteBonusSettings: IEliteBonusSettings; + LevelBonusSettings: ILevelBonusSettings; } export interface IEliteBonusSettings { - FenceStandingLossDiscount: number - RepeatableQuestExtraCount: number - ScavCaseDiscount: number + FenceStandingLossDiscount: number; + RepeatableQuestExtraCount: number; + ScavCaseDiscount: number; } - + export interface ILevelBonusSettings { - HealthRestoreDiscount: number - HealthRestoreTraderDiscount: number - InsuranceDiscount: number - InsuranceTraderDiscount: number - PaidExitDiscount: number - RepeatableQuestChangeDiscount: number + HealthRestoreDiscount: number; + HealthRestoreTraderDiscount: number; + InsuranceDiscount: number; + InsuranceTraderDiscount: number; + PaidExitDiscount: number; + RepeatableQuestChangeDiscount: number; } -export interface IMemory +export interface IMemory { - AnySkillUp: number - SkillProgress: number + AnySkillUp: number; + SkillProgress: number; } -export interface ISurgery +export interface ISurgery { - SurgeryAction: number - SkillProgress: number + SurgeryAction: number; + SkillProgress: number; } -export interface IAimDrills +export interface IAimDrills { - WeaponShotAction: number + WeaponShotAction: number; } -export interface ITroubleShooting +export interface ITroubleShooting { - MalfRepairSpeedBonusPerLevel: number - SkillPointsPerMalfFix: number - EliteDurabilityChanceReduceMult: number - EliteAmmoChanceReduceMult: number - EliteMagChanceReduceMult: number + MalfRepairSpeedBonusPerLevel: number; + SkillPointsPerMalfFix: number; + EliteDurabilityChanceReduceMult: number; + EliteAmmoChanceReduceMult: number; + EliteMagChanceReduceMult: number; } -export interface IAiming +export interface IAiming { - ProceduralIntensityByPose: Ixyz - AimProceduralIntensity: number - HeavyWeight: number - LightWeight: number - MaxTimeHeavy: number - MinTimeHeavy: number - MaxTimeLight: number - MinTimeLight: number - RecoilScaling: number - RecoilDamping: number - CameraSnapGlobalMult: number - RecoilXIntensityByPose: Ixyz - RecoilYIntensityByPose: Ixyz - RecoilZIntensityByPose: Ixyz - RecoilCrank: boolean - RecoilHandDamping: number - RecoilConvergenceMult: number - RecoilVertBonus: number - RecoilBackBonus: number + ProceduralIntensityByPose: Ixyz; + AimProceduralIntensity: number; + HeavyWeight: number; + LightWeight: number; + MaxTimeHeavy: number; + MinTimeHeavy: number; + MaxTimeLight: number; + MinTimeLight: number; + RecoilScaling: number; + RecoilDamping: number; + CameraSnapGlobalMult: number; + RecoilXIntensityByPose: Ixyz; + RecoilYIntensityByPose: Ixyz; + RecoilZIntensityByPose: Ixyz; + RecoilCrank: boolean; + RecoilHandDamping: number; + RecoilConvergenceMult: number; + RecoilVertBonus: number; + RecoilBackBonus: number; } - -export interface IMalfunction +export interface IMalfunction { - AmmoMalfChanceMult: number - MagazineMalfChanceMult: number - MalfRepairHardSlideMult: number - MalfRepairOneHandBrokenMult: number - MalfRepairTwoHandsBrokenMult: number - AllowMalfForBots: boolean - ShowGlowAttemptsCount: number - OutToIdleSpeedMultForPistol: number - IdleToOutSpeedMultOnMalf: number - TimeToQuickdrawPistol: number - DurRangeToIgnoreMalfs: Ixyz - DurFeedWt: number - DurMisfireWt: number - DurJamWt: number - DurSoftSlideWt: number - DurHardSlideMinWt: number - DurHardSlideMaxWt: number - AmmoMisfireWt: number - AmmoFeedWt: number - AmmoJamWt: number - OverheatFeedWt: number - OverheatJamWt: number - OverheatSoftSlideWt: number - OverheatHardSlideMinWt: number - OverheatHardSlideMaxWt: number + AmmoMalfChanceMult: number; + MagazineMalfChanceMult: number; + MalfRepairHardSlideMult: number; + MalfRepairOneHandBrokenMult: number; + MalfRepairTwoHandsBrokenMult: number; + AllowMalfForBots: boolean; + ShowGlowAttemptsCount: number; + OutToIdleSpeedMultForPistol: number; + IdleToOutSpeedMultOnMalf: number; + TimeToQuickdrawPistol: number; + DurRangeToIgnoreMalfs: Ixyz; + DurFeedWt: number; + DurMisfireWt: number; + DurJamWt: number; + DurSoftSlideWt: number; + DurHardSlideMinWt: number; + DurHardSlideMaxWt: number; + AmmoMisfireWt: number; + AmmoFeedWt: number; + AmmoJamWt: number; + OverheatFeedWt: number; + OverheatJamWt: number; + OverheatSoftSlideWt: number; + OverheatHardSlideMinWt: number; + OverheatHardSlideMaxWt: number; } - -export interface IOverheat +export interface IOverheat { - MinOverheat: number - MaxOverheat: number - OverheatProblemsStart: number - ModHeatFactor: number - ModCoolFactor: number - MinWearOnOverheat: number - MaxWearOnOverheat: number - MinWearOnMaxOverheat: number - MaxWearOnMaxOverheat: number - OverheatWearLimit: number - MaxCOIIncreaseMult: number - MinMalfChance: number - MaxMalfChance: number - DurReduceMinMult: number - DurReduceMaxMult: number - BarrelMoveRndDuration: number - BarrelMoveMaxMult: number - FireratePitchMult: number - FirerateReduceMinMult: number - FirerateReduceMaxMult: number - FirerateOverheatBorder: number - EnableSlideOnMaxOverheat: boolean - StartSlideOverheat: number - FixSlideOverheat: number - AutoshotMinOverheat: number - AutoshotChance: number - AutoshotPossibilityDuration: number - MaxOverheatCoolCoef: number + MinOverheat: number; + MaxOverheat: number; + OverheatProblemsStart: number; + ModHeatFactor: number; + ModCoolFactor: number; + MinWearOnOverheat: number; + MaxWearOnOverheat: number; + MinWearOnMaxOverheat: number; + MaxWearOnMaxOverheat: number; + OverheatWearLimit: number; + MaxCOIIncreaseMult: number; + MinMalfChance: number; + MaxMalfChance: number; + DurReduceMinMult: number; + DurReduceMaxMult: number; + BarrelMoveRndDuration: number; + BarrelMoveMaxMult: number; + FireratePitchMult: number; + FirerateReduceMinMult: number; + FirerateReduceMaxMult: number; + FirerateOverheatBorder: number; + EnableSlideOnMaxOverheat: boolean; + StartSlideOverheat: number; + FixSlideOverheat: number; + AutoshotMinOverheat: number; + AutoshotChance: number; + AutoshotPossibilityDuration: number; + MaxOverheatCoolCoef: number; } -export interface IFenceSettings +export interface IFenceSettings { - FenceId: string - Levels: Record - paidExitStandingNumerator: number + FenceId: string; + Levels: Record; + paidExitStandingNumerator: number; } -export interface IFenceLevel -{ - SavageCooldownModifier: number - ScavCaseTimeModifier: number - PaidExitCostModifier: number - BotFollowChance: number - ScavEquipmentSpawnChanceModifier: number - PriceModifier: number - HostileBosses: boolean - HostileScavs: boolean - ScavAttackSupport: boolean - ExfiltrationPriceModifier: number - AvailableExits: number - BotApplySilenceChance: number - BotGetInCoverChance: number - BotHelpChance: number - BotSpreadoutChance: number - BotStopChance: number -} - -export interface IInertia +export interface IFenceLevel { - InertiaLimits: Ixyz - InertiaLimitsStep: number - ExitMovementStateSpeedThreshold: Ixyz - WalkInertia: Ixyz - FallThreshold: number - SpeedLimitAfterFallMin: Ixyz - SpeedLimitAfterFallMax: Ixyz - SpeedLimitDurationMin: Ixyz - SpeedLimitDurationMax: Ixyz - SpeedInertiaAfterJump: Ixyz - BaseJumpPenaltyDuration: number - DurationPower: number - BaseJumpPenalty: number - PenaltyPower: number - InertiaTiltCurveMin: Ixyz - InertiaTiltCurveMax: Ixyz - InertiaBackwardCoef: Ixyz - TiltInertiaMaxSpeed: Ixyz - TiltStartSideBackSpeed: Ixyz - TiltMaxSideBackSpeed: Ixyz - TiltAcceleration: Ixyz - AverageRotationFrameSpan: number - SprintSpeedInertiaCurveMin: Ixyz - SprintSpeedInertiaCurveMax: Ixyz - SprintBrakeInertia: Ixyz - SprintTransitionMotionPreservation: Ixyz - WeaponFlipSpeed: Ixyz - PreSprintAccelerationLimits: Ixyz - SprintAccelerationLimits: Ixyz - SideTime: Ixyz - DiagonalTime: Ixyz - MaxTimeWithoutInput: Ixyz - MinDirectionBlendTime: number - MoveTimeRange: Ixyz - ProneDirectionAccelerationRange: Ixyz - ProneSpeedAccelerationRange: Ixyz - MinMovementAccelerationRangeRight: Ixyz - MaxMovementAccelerationRangeRight: Ixyz + SavageCooldownModifier: number; + ScavCaseTimeModifier: number; + PaidExitCostModifier: number; + BotFollowChance: number; + ScavEquipmentSpawnChanceModifier: number; + PriceModifier: number; + HostileBosses: boolean; + HostileScavs: boolean; + ScavAttackSupport: boolean; + ExfiltrationPriceModifier: number; + AvailableExits: number; + BotApplySilenceChance: number; + BotGetInCoverChance: number; + BotHelpChance: number; + BotSpreadoutChance: number; + BotStopChance: number; } -export interface IBallistic +export interface IInertia { - GlobalDamageDegradationCoefficient: number + InertiaLimits: Ixyz; + InertiaLimitsStep: number; + ExitMovementStateSpeedThreshold: Ixyz; + WalkInertia: Ixyz; + FallThreshold: number; + SpeedLimitAfterFallMin: Ixyz; + SpeedLimitAfterFallMax: Ixyz; + SpeedLimitDurationMin: Ixyz; + SpeedLimitDurationMax: Ixyz; + SpeedInertiaAfterJump: Ixyz; + BaseJumpPenaltyDuration: number; + DurationPower: number; + BaseJumpPenalty: number; + PenaltyPower: number; + InertiaTiltCurveMin: Ixyz; + InertiaTiltCurveMax: Ixyz; + InertiaBackwardCoef: Ixyz; + TiltInertiaMaxSpeed: Ixyz; + TiltStartSideBackSpeed: Ixyz; + TiltMaxSideBackSpeed: Ixyz; + TiltAcceleration: Ixyz; + AverageRotationFrameSpan: number; + SprintSpeedInertiaCurveMin: Ixyz; + SprintSpeedInertiaCurveMax: Ixyz; + SprintBrakeInertia: Ixyz; + SprintTransitionMotionPreservation: Ixyz; + WeaponFlipSpeed: Ixyz; + PreSprintAccelerationLimits: Ixyz; + SprintAccelerationLimits: Ixyz; + SideTime: Ixyz; + DiagonalTime: Ixyz; + MaxTimeWithoutInput: Ixyz; + MinDirectionBlendTime: number; + MoveTimeRange: Ixyz; + ProneDirectionAccelerationRange: Ixyz; + ProneSpeedAccelerationRange: Ixyz; + MinMovementAccelerationRangeRight: Ixyz; + MaxMovementAccelerationRangeRight: Ixyz; +} + +export interface IBallistic +{ + GlobalDamageDegradationCoefficient: number; } export interface IRepairSettings { - ItemEnhancementSettings: IItemEnhancementSettings - MinimumLevelToApplyBuff: number - RepairStrategies: IRepairStrategies - armorClassDivisor: number - durabilityPointCostArmor: number - durabilityPointCostGuns: number + ItemEnhancementSettings: IItemEnhancementSettings; + MinimumLevelToApplyBuff: number; + RepairStrategies: IRepairStrategies; + armorClassDivisor: number; + durabilityPointCostArmor: number; + durabilityPointCostGuns: number; } export interface IItemEnhancementSettings { - DamageReduction: IPriceModifier - MalfunctionProtections: IPriceModifier - WeaponSpread: IPriceModifier + DamageReduction: IPriceModifier; + MalfunctionProtections: IPriceModifier; + WeaponSpread: IPriceModifier; } export interface IPriceModifier { - PriceModifier: number + PriceModifier: number; } export interface IRepairStrategies { - Armor: IRepairStrategy - Firearms: IRepairStrategy + Armor: IRepairStrategy; + Firearms: IRepairStrategy; } export interface IRepairStrategy { - BuffTypes: string[] - Filter: string[] + BuffTypes: string[]; + Filter: string[]; } -export interface IBotPreset +export interface IBotPreset { - UseThis: boolean - Role: string - BotDifficulty: string - VisibleAngle: number - VisibleDistance: number - ScatteringPerMeter: number - HearingSense: number - SCATTERING_DIST_MODIF: number - MAX_AIMING_UPGRADE_BY_TIME: number - FIRST_CONTACT_ADD_SEC: number - COEF_IF_MOVE: number + UseThis: boolean; + Role: string; + BotDifficulty: string; + VisibleAngle: number; + VisibleDistance: number; + ScatteringPerMeter: number; + HearingSense: number; + SCATTERING_DIST_MODIF: number; + MAX_AIMING_UPGRADE_BY_TIME: number; + FIRST_CONTACT_ADD_SEC: number; + COEF_IF_MOVE: number; } export interface IAudioSettings { - AudioGroupPresets: IAudioGroupPreset[] + AudioGroupPresets: IAudioGroupPreset[]; } export interface IAudioGroupPreset { - AngleToAllowBinaural: number - DisabledBinauralByDistance: boolean - DistanceToAllowBinaural: number - GroupType: number - HeightToAllowBinaural: number - Name: string - OcclusionEnabled: boolean - OcclusionIntensity: number - OverallVolume: number - + AngleToAllowBinaural: number; + DisabledBinauralByDistance: boolean; + DistanceToAllowBinaural: number; + GroupType: number; + HeightToAllowBinaural: number; + Name: string; + OcclusionEnabled: boolean; + OcclusionIntensity: number; + OverallVolume: number; } -export interface IBotWeaponScattering +export interface IBotWeaponScattering { - Name: string - PriorityScatter1meter: number - PriorityScatter10meter: number - PriorityScatter100meter: number + Name: string; + PriorityScatter1meter: number; + PriorityScatter10meter: number; + PriorityScatter100meter: number; } -export interface IPreset +export interface IPreset { - _id: string - _type: string - _changeWeaponName: boolean - _name: string - _parent: string - _items: Item[] + _id: string; + _type: string; + _changeWeaponName: boolean; + _name: string; + _parent: string; + _items: Item[]; /** Default presets have this property */ - _encyclopedia?: string -} \ No newline at end of file + _encyclopedia?: string; +} diff --git a/project/src/models/eft/common/ILocation.ts b/project/src/models/eft/common/ILocation.ts index 57f22d9b..6c787905 100644 --- a/project/src/models/eft/common/ILocation.ts +++ b/project/src/models/eft/common/ILocation.ts @@ -1,28 +1,28 @@ import { ILocationBase } from "@spt-aki/models/eft/common/ILocationBase"; import { ILooseLoot } from "@spt-aki/models/eft/common/ILooseLoot"; -export interface ILocation +export interface ILocation { - base: ILocationBase + base: ILocationBase; looseLoot: ILooseLoot; - statics: IStaticContainer + statics: IStaticContainer; } export interface IStaticContainer { - containersGroups: Record - containers: Record< string, IContainerData> + containersGroups: Record; + containers: Record; } export interface IContainerMinMax { - minContainers: number - maxContainers: number - current?: number - chosenCount?: number + minContainers: number; + maxContainers: number; + current?: number; + chosenCount?: number; } export interface IContainerData { - groupId: string + groupId: string; } diff --git a/project/src/models/eft/common/ILocationBase.ts b/project/src/models/eft/common/ILocationBase.ts index d39279bb..42fcabff 100644 --- a/project/src/models/eft/common/ILocationBase.ts +++ b/project/src/models/eft/common/ILocationBase.ts @@ -2,268 +2,266 @@ import { MinMax } from "@spt-aki/models/common/MinMax"; import { Ixyz } from "@spt-aki/models/eft/common/Ixyz"; /* eslint-disable @typescript-eslint/naming-convention */ -export interface ILocationBase +export interface ILocationBase { - AccessKeys: string[] - AirdropParameters: AirdropParameter[] - Area: number - AveragePlayTime: number - AveragePlayerLevel: number - Banners: Banner[] - BossLocationSpawn: BossLocationSpawn[] - BotAssault: number - BotEasy: number - BotHard: number - BotImpossible: number - BotLocationModifier: BotLocationModifier - BotMarksman: number - BotMax: number - BotMaxPlayer: number - BotMaxTimePlayer: number - BotNormal: number - BotSpawnCountStep: number - BotSpawnPeriodCheck: number - BotSpawnTimeOffMax: number - BotSpawnTimeOffMin: number - BotSpawnTimeOnMax: number - BotSpawnTimeOnMin: number - BotStart: number - BotStop: number - Description: string - DisabledForScav: boolean - DisabledScavExits: string - Enabled: boolean - EnableCoop: boolean - GlobalLootChanceModifier: number - GlobalContainerChanceModifier: number - IconX: number - IconY: number - Id: string - Insurance: boolean - IsSecret: boolean - Locked: boolean - Loot: any[] - MatchMakerMinPlayersByWaitTime: MinPlayerWaitTime[] - MaxBotPerZone: number - MaxDistToFreePoint: number - MaxPlayers: number - MinDistToExitPoint: number - MinDistToFreePoint: number - MinMaxBots: MinMaxBot[] - MinPlayers: number - MaxCoopGroup: number - Name: string - NonWaveGroupScenario: INonWaveGroupScenario - NewSpawn: boolean - OcculsionCullingEnabled: boolean - OldSpawn: boolean - OpenZones: string - Preview: Preview - PlayersRequestCount: number - RequiredPlayerLevel?: number - RequiredPlayerLevelMin?: number - RequiredPlayerLevelMax?: number - MinPlayerLvlAccessKeys: number - PmcMaxPlayersInGroup: number - ScavMaxPlayersInGroup: number - Rules: string - SafeLocation: boolean - Scene: Scene - SpawnPointParams: SpawnPointParam[] - UnixDateTime: number - _Id: string - doors: any[] - EscapeTimeLimit: number - EscapeTimeLimitCoop: number - exit_access_time: number - exit_count: number - exit_time: number - exits: Exit[] - filter_ex: string[] - limits: ILimit[] - matching_min_seconds: number - GenerateLocalLootCache: boolean - maxItemCountInLocation: MaxItemCountInLocation[] - sav_summon_seconds: number - tmp_location_field_remove_me: number - users_gather_seconds: number - users_spawn_seconds_n: number - users_spawn_seconds_n2: number - users_summon_seconds: number - waves: Wave[] + AccessKeys: string[]; + AirdropParameters: AirdropParameter[]; + Area: number; + AveragePlayTime: number; + AveragePlayerLevel: number; + Banners: Banner[]; + BossLocationSpawn: BossLocationSpawn[]; + BotAssault: number; + BotEasy: number; + BotHard: number; + BotImpossible: number; + BotLocationModifier: BotLocationModifier; + BotMarksman: number; + BotMax: number; + BotMaxPlayer: number; + BotMaxTimePlayer: number; + BotNormal: number; + BotSpawnCountStep: number; + BotSpawnPeriodCheck: number; + BotSpawnTimeOffMax: number; + BotSpawnTimeOffMin: number; + BotSpawnTimeOnMax: number; + BotSpawnTimeOnMin: number; + BotStart: number; + BotStop: number; + Description: string; + DisabledForScav: boolean; + DisabledScavExits: string; + Enabled: boolean; + EnableCoop: boolean; + GlobalLootChanceModifier: number; + GlobalContainerChanceModifier: number; + IconX: number; + IconY: number; + Id: string; + Insurance: boolean; + IsSecret: boolean; + Locked: boolean; + Loot: any[]; + MatchMakerMinPlayersByWaitTime: MinPlayerWaitTime[]; + MaxBotPerZone: number; + MaxDistToFreePoint: number; + MaxPlayers: number; + MinDistToExitPoint: number; + MinDistToFreePoint: number; + MinMaxBots: MinMaxBot[]; + MinPlayers: number; + MaxCoopGroup: number; + Name: string; + NonWaveGroupScenario: INonWaveGroupScenario; + NewSpawn: boolean; + OcculsionCullingEnabled: boolean; + OldSpawn: boolean; + OpenZones: string; + Preview: Preview; + PlayersRequestCount: number; + RequiredPlayerLevel?: number; + RequiredPlayerLevelMin?: number; + RequiredPlayerLevelMax?: number; + MinPlayerLvlAccessKeys: number; + PmcMaxPlayersInGroup: number; + ScavMaxPlayersInGroup: number; + Rules: string; + SafeLocation: boolean; + Scene: Scene; + SpawnPointParams: SpawnPointParam[]; + UnixDateTime: number; + _Id: string; + doors: any[]; + EscapeTimeLimit: number; + EscapeTimeLimitCoop: number; + exit_access_time: number; + exit_count: number; + exit_time: number; + exits: Exit[]; + filter_ex: string[]; + limits: ILimit[]; + matching_min_seconds: number; + GenerateLocalLootCache: boolean; + maxItemCountInLocation: MaxItemCountInLocation[]; + sav_summon_seconds: number; + tmp_location_field_remove_me: number; + users_gather_seconds: number; + users_spawn_seconds_n: number; + users_spawn_seconds_n2: number; + users_summon_seconds: number; + waves: Wave[]; } export interface INonWaveGroupScenario { - Chance: number - Enabled: boolean, - MaxToBeGroup: number - MinToBeGroup: number + Chance: number; + Enabled: boolean; + MaxToBeGroup: number; + MinToBeGroup: number; } export interface ILimit extends MinMax { - items: any[] + items: any[]; +} -} - -export interface AirdropParameter +export interface AirdropParameter { - AirdropPointDeactivateDistance: number - MinPlayersCountToSpawnAirdrop: number - PlaneAirdropChance: number - PlaneAirdropCooldownMax: number - PlaneAirdropCooldownMin: number - PlaneAirdropEnd: number - PlaneAirdropMax: number - PlaneAirdropStartMax: number - PlaneAirdropStartMin: number - UnsuccessfulTryPenalty: number + AirdropPointDeactivateDistance: number; + MinPlayersCountToSpawnAirdrop: number; + PlaneAirdropChance: number; + PlaneAirdropCooldownMax: number; + PlaneAirdropCooldownMin: number; + PlaneAirdropEnd: number; + PlaneAirdropMax: number; + PlaneAirdropStartMax: number; + PlaneAirdropStartMin: number; + UnsuccessfulTryPenalty: number; } - -export interface Banner + +export interface Banner { - id: string - pic: Pic + id: string; + pic: Pic; } - -export interface Pic + +export interface Pic { - path: string - rcid: string + path: string; + rcid: string; } - -export interface BossLocationSpawn + +export interface BossLocationSpawn { - BossChance: number - BossDifficult: string - BossEscortAmount: string - BossEscortDifficult: string - BossEscortType: string - BossName: string - BossPlayer: boolean - BossZone: string - RandomTimeSpawn: boolean - Time: number - TriggerId: string - TriggerName: string - Delay?: number - Supports?: BossSupport[] - sptId?: string + BossChance: number; + BossDifficult: string; + BossEscortAmount: string; + BossEscortDifficult: string; + BossEscortType: string; + BossName: string; + BossPlayer: boolean; + BossZone: string; + RandomTimeSpawn: boolean; + Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; + sptId?: string; } export interface BossSupport { - BossEscortAmount: string - BossEscortDifficult: string[] - BossEscortType: string + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; } - -export interface BotLocationModifier + +export interface BotLocationModifier { - AccuracySpeed: number - DistToActivate: number - DistToPersueAxemanCoef: number - DistToSleep: number - GainSight: number - KhorovodChance: number - MagnetPower: number - MarksmanAccuratyCoef: number - Scattering: number - VisibleDistance: number + AccuracySpeed: number; + DistToActivate: number; + DistToPersueAxemanCoef: number; + DistToSleep: number; + GainSight: number; + KhorovodChance: number; + MagnetPower: number; + MarksmanAccuratyCoef: number; + Scattering: number; + VisibleDistance: number; } - + export interface MinMaxBot extends MinMax { - WildSpawnType: WildSpawnType | string + WildSpawnType: WildSpawnType | string; } export interface MinPlayerWaitTime { - minPlayers: number - time: number -} - -export interface Preview -{ - path: string - rcid: string -} - -export interface Scene -{ - path: string - rcid: string -} - -export interface SpawnPointParam -{ - BotZoneName: string - Categories: string[] - ColliderParams: ColliderParams - DelayToCanSpawnSec: number - Id: string - Infiltration: string - Position: Ixyz - Rotation: number - Sides: string[] -} - -export interface ColliderParams -{ - _parent: string - _props: Props -} - -export interface Props -{ - Center: Ixyz - Radius: number + minPlayers: number; + time: number; } - -export interface Exit +export interface Preview { - Chance: number - Count: number - EntryPoints: string - ExfiltrationTime: number - ExfiltrationType: string - RequiredSlot?: string - Id: string - MaxTime: number - MinTime: number - Name: string - PassageRequirement: string - PlayersCount: number - RequirementTip: string + path: string; + rcid: string; } - -export interface MaxItemCountInLocation + +export interface Scene { - TemplateId: string - Value: number + path: string; + rcid: string; } - -export interface Wave + +export interface SpawnPointParam { - BotPreset: string - BotSide: string - SpawnPoints: string - WildSpawnType: WildSpawnType - isPlayers: boolean - number: number - slots_max: number - slots_min: number - time_max: number - time_min: number - sptId?: string - ChanceGroup?: number + BotZoneName: string; + Categories: string[]; + ColliderParams: ColliderParams; + DelayToCanSpawnSec: number; + Id: string; + Infiltration: string; + Position: Ixyz; + Rotation: number; + Sides: string[]; +} + +export interface ColliderParams +{ + _parent: string; + _props: Props; +} + +export interface Props +{ + Center: Ixyz; + Radius: number; +} + +export interface Exit +{ + Chance: number; + Count: number; + EntryPoints: string; + ExfiltrationTime: number; + ExfiltrationType: string; + RequiredSlot?: string; + Id: string; + MaxTime: number; + MinTime: number; + Name: string; + PassageRequirement: string; + PlayersCount: number; + RequirementTip: string; +} + +export interface MaxItemCountInLocation +{ + TemplateId: string; + Value: number; +} + +export interface Wave +{ + BotPreset: string; + BotSide: string; + SpawnPoints: string; + WildSpawnType: WildSpawnType; + isPlayers: boolean; + number: number; + slots_max: number; + slots_min: number; + time_max: number; + time_min: number; + sptId?: string; + ChanceGroup?: number; } export enum WildSpawnType - { +{ ASSAULT = "assault", MARKSMAN = "marksman", - PMCBOT = "pmcbot" -} \ No newline at end of file + PMCBOT = "pmcbot", +} diff --git a/project/src/models/eft/common/ILocationsSourceDestinationBase.ts b/project/src/models/eft/common/ILocationsSourceDestinationBase.ts index aa9ac14e..e55949b5 100644 --- a/project/src/models/eft/common/ILocationsSourceDestinationBase.ts +++ b/project/src/models/eft/common/ILocationsSourceDestinationBase.ts @@ -1,13 +1,13 @@ import { ILocations } from "@spt-aki/models/spt/server/ILocations"; -export interface ILocationsGenerateAllResponse +export interface ILocationsGenerateAllResponse { - locations: ILocations - paths: Path[] + locations: ILocations; + paths: Path[]; } -export interface Path +export interface Path { - Source: string - Destination: string -} \ No newline at end of file + Source: string; + Destination: string; +} diff --git a/project/src/models/eft/common/ILooseLoot.ts b/project/src/models/eft/common/ILooseLoot.ts index b18e41fe..8790c795 100644 --- a/project/src/models/eft/common/ILooseLoot.ts +++ b/project/src/models/eft/common/ILooseLoot.ts @@ -1,56 +1,56 @@ import { Ixyz } from "@spt-aki/models/eft/common/Ixyz"; import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -export interface ILooseLoot +export interface ILooseLoot { spawnpointCount: SpawnpointCount; spawnpointsForced: SpawnpointsForced[]; spawnpoints: Spawnpoint[]; } -export interface SpawnpointCount +export interface SpawnpointCount { - mean: number - std: number + mean: number; + std: number; } -export interface SpawnpointsForced +export interface SpawnpointsForced { - locationId: string - probability: number - template: SpawnpointTemplate + locationId: string; + probability: number; + template: SpawnpointTemplate; } -export interface SpawnpointTemplate +export interface SpawnpointTemplate { - Id: string - IsContainer: boolean - useGravity: boolean - randomRotation: boolean - Position: Ixyz - Rotation: Ixyz - IsAlwaysSpawn: boolean - IsGroupPosition: boolean - GroupPositions: any[] - Root: string - Items: Item[] + Id: string; + IsContainer: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Ixyz; + Rotation: Ixyz; + IsAlwaysSpawn: boolean; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: string; + Items: Item[]; } -export interface Spawnpoint +export interface Spawnpoint { - locationId: string - probability: number - template: SpawnpointTemplate - itemDistribution: ItemDistribution[] + locationId: string; + probability: number; + template: SpawnpointTemplate; + itemDistribution: ItemDistribution[]; } -export interface ItemDistribution +export interface ItemDistribution { - composedKey: ComposedKey - relativeProbability: number + composedKey: ComposedKey; + relativeProbability: number; } export interface ComposedKey { - key: string + key: string; } diff --git a/project/src/models/eft/common/IMetricsTableData.ts b/project/src/models/eft/common/IMetricsTableData.ts index cf059691..c2da53e9 100644 --- a/project/src/models/eft/common/IMetricsTableData.ts +++ b/project/src/models/eft/common/IMetricsTableData.ts @@ -1,8 +1,8 @@ -export interface IMetricsTableData +export interface IMetricsTableData { - Keys: number[] - NetProcessingBins: number[] - RenderBins: number[] - GameUpdateBins: number[] - MemoryMeasureInterval: number -} \ No newline at end of file + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; +} diff --git a/project/src/models/eft/common/IPmcData.ts b/project/src/models/eft/common/IPmcData.ts index ec0fb4cf..84219b79 100644 --- a/project/src/models/eft/common/IPmcData.ts +++ b/project/src/models/eft/common/IPmcData.ts @@ -6,5 +6,5 @@ export interface IPmcData extends IBotBase export interface IPostRaidPmcData extends IBotBase { /** Only found in profile we get from client post raid */ - EftStats: IEftStats -} \ No newline at end of file + EftStats: IEftStats; +} diff --git a/project/src/models/eft/common/Ixyz.ts b/project/src/models/eft/common/Ixyz.ts index 3b5023f6..8b43d332 100644 --- a/project/src/models/eft/common/Ixyz.ts +++ b/project/src/models/eft/common/Ixyz.ts @@ -1,5 +1,4 @@ - -export interface Ixyz +export interface Ixyz { x: number; y: number; diff --git a/project/src/models/eft/common/request/IBaseInteractionRequestData.ts b/project/src/models/eft/common/request/IBaseInteractionRequestData.ts index 20c57fdd..84a80d8e 100644 --- a/project/src/models/eft/common/request/IBaseInteractionRequestData.ts +++ b/project/src/models/eft/common/request/IBaseInteractionRequestData.ts @@ -1,12 +1,12 @@ -export interface IBaseInteractionRequestData +export interface IBaseInteractionRequestData { - Action: string - fromOwner?: OwnerInfo - toOwner?: OwnerInfo + Action: string; + fromOwner?: OwnerInfo; + toOwner?: OwnerInfo; } -export interface OwnerInfo +export interface OwnerInfo { - id: string - type: string -} \ No newline at end of file + id: string; + type: string; +} diff --git a/project/src/models/eft/common/tables/IBotBase.ts b/project/src/models/eft/common/tables/IBotBase.ts index 5190c225..4b283a28 100644 --- a/project/src/models/eft/common/tables/IBotBase.ts +++ b/project/src/models/eft/common/tables/IBotBase.ts @@ -5,512 +5,511 @@ import { HideoutAreas } from "@spt-aki/models/enums/HideoutAreas"; import { MemberCategory } from "@spt-aki/models/enums/MemberCategory"; import { QuestStatus } from "@spt-aki/models/enums/QuestStatus"; -export interface IBotBase +export interface IBotBase { - - _id: string - aid: number + _id: string; + aid: number; /** SPT property - use to store player id - TODO - move to AID ( account id as guid of choice) */ - sessionId: string - savage?: string - Info: Info - Customization: Customization - Health: Health - Inventory: Inventory - Skills: Skills - Stats: Stats - Encyclopedia: Record - ConditionCounters: ConditionCounters - BackendCounters: Record - InsuredItems: InsuredItem[] - Hideout: Hideout - Quests: IQuestStatus[] - TradersInfo: Record - UnlockedInfo: IUnlockedInfo - RagfairInfo: RagfairInfo - RepeatableQuests: IPmcDataRepeatableQuest[] - Bonuses: Bonus[] - Notes: Notes - CarExtractCounts: Record - CoopExtractCounts: Record - SurvivorClass: SurvivorClass - WishList: string[] + sessionId: string; + savage?: string; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: Record; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: InsuredItem[]; + Hideout: Hideout; + Quests: IQuestStatus[]; + TradersInfo: Record; + UnlockedInfo: IUnlockedInfo; + RagfairInfo: RagfairInfo; + RepeatableQuests: IPmcDataRepeatableQuest[]; + Bonuses: Bonus[]; + Notes: Notes; + CarExtractCounts: Record; + CoopExtractCounts: Record; + SurvivorClass: SurvivorClass; + WishList: string[]; /** SPT specific property used during bot generation in raid */ - sptIsPmc?: boolean + sptIsPmc?: boolean; } export interface IUnlockedInfo { - unlockedProductionRecipe: string[] + unlockedProductionRecipe: string[]; } -export interface Info +export interface Info { - EntryPoint: string - Nickname: string - LowerNickname: string - Side: string - SquadInviteRestriction: boolean - Voice: string - Level: number - Experience: number - RegistrationDate: number - GameVersion: string - AccountType: number - MemberCategory: MemberCategory - lockedMoveCommands: boolean - SavageLockTime: number - LastTimePlayedAsSavage: number - Settings: Settings - NicknameChangeDate: number - NeedWipeOptions: any[] - lastCompletedWipe: LastCompleted - Bans: IBan[] - BannedState: boolean - BannedUntil: number - IsStreamerModeAvailable: boolean - lastCompletedEvent?: LastCompleted + EntryPoint: string; + Nickname: string; + LowerNickname: string; + Side: string; + SquadInviteRestriction: boolean; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: MemberCategory; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + NeedWipeOptions: any[]; + lastCompletedWipe: LastCompleted; + Bans: IBan[]; + BannedState: boolean; + BannedUntil: number; + IsStreamerModeAvailable: boolean; + lastCompletedEvent?: LastCompleted; } -export interface Settings +export interface Settings { - Role: string - BotDifficulty: string - Experience: number - StandingForKill: number - AggressorBonus: number + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; } export interface IBan { - type: BanType - dateTime: number + type: BanType; + dateTime: number; } export enum BanType - { +{ CHAT = 0, RAGFAIR = 1, VOIP = 2, TRADING = 3, ONLINE = 4, FRIENDS = 5, - CHANGE_NICKNAME = 6 + CHANGE_NICKNAME = 6, } -export interface Customization +export interface Customization { - Head: string - Body: string - Feet: string - Hands: string + Head: string; + Body: string; + Feet: string; + Hands: string; } -export interface Health +export interface Health { - Hydration: CurrentMax - Energy: CurrentMax - Temperature: CurrentMax - BodyParts: BodyPartsHealth - UpdateTime: number + Hydration: CurrentMax; + Energy: CurrentMax; + Temperature: CurrentMax; + BodyParts: BodyPartsHealth; + UpdateTime: number; } -export interface BodyPartsHealth +export interface BodyPartsHealth { - Head: BodyPartHealth - Chest: BodyPartHealth - Stomach: BodyPartHealth - LeftArm: BodyPartHealth - RightArm: BodyPartHealth - LeftLeg: BodyPartHealth - RightLeg: BodyPartHealth + Head: BodyPartHealth; + Chest: BodyPartHealth; + Stomach: BodyPartHealth; + LeftArm: BodyPartHealth; + RightArm: BodyPartHealth; + LeftLeg: BodyPartHealth; + RightLeg: BodyPartHealth; } -export interface BodyPartHealth +export interface BodyPartHealth { - Health: CurrentMax - Effects?: Record + Health: CurrentMax; + Effects?: Record; } export interface BodyPartEffectProperties { - Time: number + Time: number; } -export interface CurrentMax +export interface CurrentMax { - Current: number - Maximum: number + Current: number; + Maximum: number; } -export interface Inventory +export interface Inventory { - items: Item[] - equipment: string - stash: string - sortingTable: string - questRaidItems: string - questStashItems: string + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; /** Key is hideout area enum numeric as string e.g. "24", value is area _id */ - hideoutAreaStashes: Record - fastPanel: Record + hideoutAreaStashes: Record; + fastPanel: Record; } export interface IBaseJsonSkills { - Common: Record - Mastering: Record - Points: number + Common: Record; + Mastering: Record; + Points: number; } -export interface Skills +export interface Skills { - Common: Common[] - Mastering: Mastering[] - Points: number + Common: Common[]; + Mastering: Mastering[]; + Points: number; } export interface IBaseSkill { - Id: string - Progress: number - max?: number - min?: number + Id: string; + Progress: number; + max?: number; + min?: number; } export interface Common extends IBaseSkill { - PointsEarnedDuringSession?: number - LastAccess?: number + PointsEarnedDuringSession?: number; + LastAccess?: number; } export interface Mastering extends IBaseSkill {} -export interface Stats +export interface Stats { - Eft: IEftStats + Eft: IEftStats; } export interface IEftStats { - CarriedQuestItems: string[] - Victims: Victim[] - TotalSessionExperience: number - LastSessionDate: number - SessionCounters: SessionCounters - OverallCounters: OverallCounters - SessionExperienceMult?: number - ExperienceBonusMult?: number - Aggressor?: Aggressor - DroppedItems?: IDroppedItem[] - FoundInRaidItems?: FoundInRaidItem[] - DamageHistory?: DamageHistory - DeathCause?: DeathCause - LastPlayerState?: LastPlayerState - TotalInGameTime: number - SurvivorClass?: string + CarriedQuestItems: string[]; + Victims: Victim[]; + TotalSessionExperience: number; + LastSessionDate: number; + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; + SessionExperienceMult?: number; + ExperienceBonusMult?: number; + Aggressor?: Aggressor; + DroppedItems?: IDroppedItem[]; + FoundInRaidItems?: FoundInRaidItem[]; + DamageHistory?: DamageHistory; + DeathCause?: DeathCause; + LastPlayerState?: LastPlayerState; + TotalInGameTime: number; + SurvivorClass?: string; } export interface IDroppedItem { - QuestId: string - ItemId: string - ZoneId: string + QuestId: string; + ItemId: string; + ZoneId: string; } export interface FoundInRaidItem { - QuestId: string - ItemId: string + QuestId: string; + ItemId: string; } -export interface Victim +export interface Victim { - AccountId: string - ProfileId: string - Name: string - Side: string - BodyPart: string - Time: string - Distance: number - Level: number - Weapon: string - Role: string + AccountId: string; + ProfileId: string; + Name: string; + Side: string; + BodyPart: string; + Time: string; + Distance: number; + Level: number; + Weapon: string; + Role: string; } -export interface SessionCounters +export interface SessionCounters { - Items: CounterKeyValue[] + Items: CounterKeyValue[]; } -export interface OverallCounters +export interface OverallCounters { - Items: CounterKeyValue[] + Items: CounterKeyValue[]; } -export interface CounterKeyValue +export interface CounterKeyValue { - Key: string[] - Value: number + Key: string[]; + Value: number; } -export interface ConditionCounters +export interface ConditionCounters { - Counters: Counter[] + Counters: Counter[]; } -export interface Counter +export interface Counter { - id: string - value: number - qid: string + id: string; + value: number; + qid: string; } -export interface Aggressor +export interface Aggressor { - AccountId: string - ProfileId: string - MainProfileNickname: string - Name: string - Side: string - BodyPart: string - HeadSegment: string - WeaponName: string - Category: string + AccountId: string; + ProfileId: string; + MainProfileNickname: string; + Name: string; + Side: string; + BodyPart: string; + HeadSegment: string; + WeaponName: string; + Category: string; } -export interface DamageHistory +export interface DamageHistory { - LethalDamagePart: string - LethalDamage: LethalDamage - BodyParts: BodyPartsDamageHistory + LethalDamagePart: string; + LethalDamage: LethalDamage; + BodyParts: BodyPartsDamageHistory; } -export interface LethalDamage +export interface LethalDamage { - Amount: number - Type: string - SourceId: string - OverDamageFrom: string - Blunt: boolean - ImpactsCount: number + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; } -export interface BodyPartsDamageHistory +export interface BodyPartsDamageHistory { - Head: DamageStats[] - Chest: DamageStats[] - Stomach: DamageStats[] - LeftArm: DamageStats[] - RightArm: DamageStats[] - LeftLeg: DamageStats[] - RightLeg: DamageStats[] - Common: DamageStats[] + Head: DamageStats[]; + Chest: DamageStats[]; + Stomach: DamageStats[]; + LeftArm: DamageStats[]; + RightArm: DamageStats[]; + LeftLeg: DamageStats[]; + RightLeg: DamageStats[]; + Common: DamageStats[]; } -export interface DamageStats +export interface DamageStats { - Amount: number - Type: string - SourceId: string - OverDamageFrom: string - Blunt: boolean - ImpactsCount: number + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; } -export interface DeathCause +export interface DeathCause { - DamageType: string - Side: string - Role: string - WeaponId: string + DamageType: string; + Side: string; + Role: string; + WeaponId: string; } export interface LastPlayerState { - Info: LastPlayerStateInfo - Customization: Record - Equipment: any + Info: LastPlayerStateInfo; + Customization: Record; + Equipment: any; } export interface LastPlayerStateInfo { - Nickname: string - Side: string - Level: number - MemberCategory: MemberCategory + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; } -export interface BackendCounter +export interface BackendCounter { - id: string - qid?: string - value: number + id: string; + qid?: string; + value: number; } -export interface InsuredItem +export interface InsuredItem { /** Trader Id item was insured by */ - tid: string - itemId: string + tid: string; + itemId: string; } -export interface Hideout +export interface Hideout { - Production: Record - Areas: HideoutArea[] - Improvement: Record - Seed: number - sptUpdateLastRunTimestamp: number + Production: Record; + Areas: HideoutArea[]; + Improvement: Record; + Seed: number; + sptUpdateLastRunTimestamp: number; } export interface IHideoutImprovement { - completed: boolean - improveCompleteTimestamp: number + completed: boolean; + improveCompleteTimestamp: number; } export interface Productive { - Products: Product[] + Products: Product[]; /** Seconds passed of production */ - Progress?: number + Progress?: number; /** Is craft in some state of being worked on by client (crafting/ready to pick up) */ - inProgress?: boolean - StartTimestamp?: number - SkipTime?: number + inProgress?: boolean; + StartTimestamp?: number; + SkipTime?: number; /** Seconds needed to fully craft */ - ProductionTime?: number - GivenItemsInStart?: string[] - Interrupted?: boolean + ProductionTime?: number; + GivenItemsInStart?: string[]; + Interrupted?: boolean; /** Used in hideout production.json */ - needFuelForAllProductionTime?: boolean + needFuelForAllProductionTime?: boolean; /** Used when sending data to client */ - NeedFuelForAllProductionTime?: boolean - sptIsScavCase?: boolean + NeedFuelForAllProductionTime?: boolean; + sptIsScavCase?: boolean; /** Some crafts are always inProgress, but need to be reset, e.g. water collector */ - sptIsComplete?: boolean + sptIsComplete?: boolean; } -export interface Production extends Productive +export interface Production extends Productive { - RecipeId: string - SkipTime: number - ProductionTime: number + RecipeId: string; + SkipTime: number; + ProductionTime: number; } -export interface ScavCase extends Productive +export interface ScavCase extends Productive { - RecipeId: string + RecipeId: string; } -export interface Product +export interface Product { - _id: string - _tpl: string - upd?: Upd + _id: string; + _tpl: string; + upd?: Upd; } -export interface HideoutArea +export interface HideoutArea { - type: HideoutAreas - level: number - active: boolean - passiveBonusesEnabled: boolean - completeTime: number - constructing: boolean - slots: HideoutSlot[] - lastRecipe: string + type: HideoutAreas; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: HideoutSlot[]; + lastRecipe: string; } -export interface HideoutSlot +export interface HideoutSlot { /** SPT specific value to keep track of what index this slot is (0,1,2,3 etc) */ - locationIndex: number - item?: HideoutItem[] + locationIndex: number; + item?: HideoutItem[]; } -export interface HideoutItem +export interface HideoutItem { - _id: string - _tpl: string - upd?: Upd + _id: string; + _tpl: string; + upd?: Upd; } export interface LastCompleted { - $oid: string + $oid: string; } -export interface Notes +export interface Notes { - Notes: Note[] + Notes: Note[]; } export enum SurvivorClass - { +{ UNKNOWN = 0, NEUTRALIZER = 1, MARAUDER = 2, PARAMEDIC = 3, - SURVIVOR = 4 + SURVIVOR = 4, } -export interface IQuestStatus +export interface IQuestStatus { - qid: string - startTime: number - status: QuestStatus - statusTimers?: Record + qid: string; + startTime: number; + status: QuestStatus; + statusTimers?: Record; /** SPT specific property */ - completedConditions?: string[] - availableAfter?: number + completedConditions?: string[]; + availableAfter?: number; } -export interface TraderInfo +export interface TraderInfo { - loyaltyLevel: number - salesSum: number - standing: number - nextResupply: number - unlocked: boolean - disabled: boolean + loyaltyLevel: number; + salesSum: number; + standing: number; + nextResupply: number; + unlocked: boolean; + disabled: boolean; } /** This object is sent to the client as part of traderRelations */ export interface TraderData { - salesSum: number - standing: number - loyalty: number - unlocked: boolean - disabled: boolean + salesSum: number; + standing: number; + loyalty: number; + unlocked: boolean; + disabled: boolean; } -export interface RagfairInfo +export interface RagfairInfo { - rating: number - isRatingGrowing: boolean - offers: IRagfairOffer[] + rating: number; + isRatingGrowing: boolean; + offers: IRagfairOffer[]; } -export interface Bonus +export interface Bonus { - id?: string - type: string - templateId?: string - passive?: boolean - production?: boolean - visible?: boolean - value?: number - icon?: string - filter?: string[] - skillType?: string + id?: string; + type: string; + templateId?: string; + passive?: boolean; + production?: boolean; + visible?: boolean; + value?: number; + icon?: string; + filter?: string[]; + skillType?: string; } -export interface Note +export interface Note { - Time: number, - Text: string -} \ No newline at end of file + Time: number; + Text: string; +} diff --git a/project/src/models/eft/common/tables/IBotCore.ts b/project/src/models/eft/common/tables/IBotCore.ts index af14541a..8499e840 100644 --- a/project/src/models/eft/common/tables/IBotCore.ts +++ b/project/src/models/eft/common/tables/IBotCore.ts @@ -1,135 +1,135 @@ /* eslint-disable @typescript-eslint/naming-convention */ -export interface IBotCore +export interface IBotCore { - SAVAGE_KILL_DIST: number - SOUND_DOOR_BREACH_METERS: number - SOUND_DOOR_OPEN_METERS: number - STEP_NOISE_DELTA: number - JUMP_NOISE_DELTA: number - GUNSHOT_SPREAD: number - GUNSHOT_SPREAD_SILENCE: number - BASE_WALK_SPEREAD2: number - MOVE_SPEED_COEF_MAX: number - SPEED_SERV_SOUND_COEF_A: number - SPEED_SERV_SOUND_COEF_B: number - G: number - STAY_COEF: number - SIT_COEF: number - LAY_COEF: number - MAX_ITERATIONS: number - START_DIST_TO_COV: number - MAX_DIST_TO_COV: number - STAY_HEIGHT: number - CLOSE_POINTS: number - COUNT_TURNS: number - SIMPLE_POINT_LIFE_TIME_SEC: number - DANGER_POINT_LIFE_TIME_SEC: number - DANGER_POWER: number - COVER_DIST_CLOSE: number - GOOD_DIST_TO_POINT: number - COVER_TOOFAR_FROM_BOSS: number - COVER_TOOFAR_FROM_BOSS_SQRT: number - MAX_Y_DIFF_TO_PROTECT: number - FLARE_POWER: number - MOVE_COEF: number - PRONE_POSE: number - LOWER_POSE: number - MAX_POSE: number - FLARE_TIME: number - MAX_REQUESTS__PER_GROUP: number - UPDATE_GOAL_TIMER_SEC: number - DIST_NOT_TO_GROUP: number - DIST_NOT_TO_GROUP_SQR: number - LAST_SEEN_POS_LIFETIME: number - DELTA_GRENADE_START_TIME: number - DELTA_GRENADE_END_TIME: number - DELTA_GRENADE_RUN_DIST: number - DELTA_GRENADE_RUN_DIST_SQRT: number - PATROL_MIN_LIGHT_DIST: number - HOLD_MIN_LIGHT_DIST: number - STANDART_BOT_PAUSE_DOOR: number - ARMOR_CLASS_COEF: number - SHOTGUN_POWER: number - RIFLE_POWER: number - PISTOL_POWER: number - SMG_POWER: number - SNIPE_POWER: number - GESTUS_PERIOD_SEC: number - GESTUS_AIMING_DELAY: number - GESTUS_REQUEST_LIFETIME: number - GESTUS_FIRST_STAGE_MAX_TIME: number - GESTUS_SECOND_STAGE_MAX_TIME: number - GESTUS_MAX_ANSWERS: number - GESTUS_FUCK_TO_SHOOT: number - GESTUS_DIST_ANSWERS: number - GESTUS_DIST_ANSWERS_SQRT: number - GESTUS_ANYWAY_CHANCE: number - TALK_DELAY: number - CAN_SHOOT_TO_HEAD: boolean - CAN_TILT: boolean - TILT_CHANCE: number - MIN_BLOCK_DIST: number - MIN_BLOCK_TIME: number - COVER_SECONDS_AFTER_LOSE_VISION: number - MIN_ARG_COEF: number - MAX_ARG_COEF: number - DEAD_AGR_DIST: number - MAX_DANGER_CARE_DIST_SQRT: number - MAX_DANGER_CARE_DIST: number - MIN_MAX_PERSON_SEARCH: number - PERCENT_PERSON_SEARCH: number - LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number - CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number - SHOOT_TO_CHANGE_RND_PART_MIN: number - SHOOT_TO_CHANGE_RND_PART_MAX: number - SHOOT_TO_CHANGE_RND_PART_DELTA: number - FORMUL_COEF_DELTA_DIST: number - FORMUL_COEF_DELTA_SHOOT: number - FORMUL_COEF_DELTA_FRIEND_COVER: number - SUSPETION_POINT_DIST_CHECK: number - MAX_BASE_REQUESTS_PER_PLAYER: number - MAX_HOLD_REQUESTS_PER_PLAYER: number - MAX_GO_TO_REQUESTS_PER_PLAYER: number - MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number - CORE_POINT_MAX_VALUE: number - CORE_POINTS_MAX: number - CORE_POINTS_MIN: number - BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean - BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean - SCAV_GROUPS_TOGETHER: boolean - LAY_DOWN_ANG_SHOOT: number - HOLD_REQUEST_TIME_SEC: number - TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number - MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number - MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number - MIN_DIST_TO_STOP_RUN: number - JUMP_SPREAD_DIST: number - LOOK_TIMES_TO_KILL: number - COME_INSIDE_TIMES: number - TOTAL_TIME_KILL: number - TOTAL_TIME_KILL_AFTER_WARN: number - MOVING_AIM_COEF: number - VERTICAL_DIST_TO_IGNORE_SOUND: number - DEFENCE_LEVEL_SHIFT: number - MIN_DIST_CLOSE_DEF: number - USE_ID_PRIOR_WHO_GO: boolean - SMOKE_GRENADE_RADIUS_COEF: number - GRENADE_PRECISION: number - MAX_WARNS_BEFORE_KILL: number - CARE_ENEMY_ONLY_TIME: number - MIDDLE_POINT_COEF: number - MAIN_TACTIC_ONLY_ATTACK: boolean - LAST_DAMAGE_ACTIVE: number - SHALL_DIE_IF_NOT_INITED: boolean - CHECK_BOT_INIT_TIME_SEC: number - WEAPON_ROOT_Y_OFFSET: number - DELTA_SUPRESS_DISTANCE_SQRT: number - DELTA_SUPRESS_DISTANCE: number - WAVE_COEF_LOW: number - WAVE_COEF_MID: number - WAVE_COEF_HIGH: number - WAVE_COEF_HORDE: number - WAVE_ONLY_AS_ONLINE: boolean - LOCAL_BOTS_COUNT: number - AXE_MAN_KILLS_END: number -} \ No newline at end of file + SAVAGE_KILL_DIST: number; + SOUND_DOOR_BREACH_METERS: number; + SOUND_DOOR_OPEN_METERS: number; + STEP_NOISE_DELTA: number; + JUMP_NOISE_DELTA: number; + GUNSHOT_SPREAD: number; + GUNSHOT_SPREAD_SILENCE: number; + BASE_WALK_SPEREAD2: number; + MOVE_SPEED_COEF_MAX: number; + SPEED_SERV_SOUND_COEF_A: number; + SPEED_SERV_SOUND_COEF_B: number; + G: number; + STAY_COEF: number; + SIT_COEF: number; + LAY_COEF: number; + MAX_ITERATIONS: number; + START_DIST_TO_COV: number; + MAX_DIST_TO_COV: number; + STAY_HEIGHT: number; + CLOSE_POINTS: number; + COUNT_TURNS: number; + SIMPLE_POINT_LIFE_TIME_SEC: number; + DANGER_POINT_LIFE_TIME_SEC: number; + DANGER_POWER: number; + COVER_DIST_CLOSE: number; + GOOD_DIST_TO_POINT: number; + COVER_TOOFAR_FROM_BOSS: number; + COVER_TOOFAR_FROM_BOSS_SQRT: number; + MAX_Y_DIFF_TO_PROTECT: number; + FLARE_POWER: number; + MOVE_COEF: number; + PRONE_POSE: number; + LOWER_POSE: number; + MAX_POSE: number; + FLARE_TIME: number; + MAX_REQUESTS__PER_GROUP: number; + UPDATE_GOAL_TIMER_SEC: number; + DIST_NOT_TO_GROUP: number; + DIST_NOT_TO_GROUP_SQR: number; + LAST_SEEN_POS_LIFETIME: number; + DELTA_GRENADE_START_TIME: number; + DELTA_GRENADE_END_TIME: number; + DELTA_GRENADE_RUN_DIST: number; + DELTA_GRENADE_RUN_DIST_SQRT: number; + PATROL_MIN_LIGHT_DIST: number; + HOLD_MIN_LIGHT_DIST: number; + STANDART_BOT_PAUSE_DOOR: number; + ARMOR_CLASS_COEF: number; + SHOTGUN_POWER: number; + RIFLE_POWER: number; + PISTOL_POWER: number; + SMG_POWER: number; + SNIPE_POWER: number; + GESTUS_PERIOD_SEC: number; + GESTUS_AIMING_DELAY: number; + GESTUS_REQUEST_LIFETIME: number; + GESTUS_FIRST_STAGE_MAX_TIME: number; + GESTUS_SECOND_STAGE_MAX_TIME: number; + GESTUS_MAX_ANSWERS: number; + GESTUS_FUCK_TO_SHOOT: number; + GESTUS_DIST_ANSWERS: number; + GESTUS_DIST_ANSWERS_SQRT: number; + GESTUS_ANYWAY_CHANCE: number; + TALK_DELAY: number; + CAN_SHOOT_TO_HEAD: boolean; + CAN_TILT: boolean; + TILT_CHANCE: number; + MIN_BLOCK_DIST: number; + MIN_BLOCK_TIME: number; + COVER_SECONDS_AFTER_LOSE_VISION: number; + MIN_ARG_COEF: number; + MAX_ARG_COEF: number; + DEAD_AGR_DIST: number; + MAX_DANGER_CARE_DIST_SQRT: number; + MAX_DANGER_CARE_DIST: number; + MIN_MAX_PERSON_SEARCH: number; + PERCENT_PERSON_SEARCH: number; + LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number; + CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number; + SHOOT_TO_CHANGE_RND_PART_MIN: number; + SHOOT_TO_CHANGE_RND_PART_MAX: number; + SHOOT_TO_CHANGE_RND_PART_DELTA: number; + FORMUL_COEF_DELTA_DIST: number; + FORMUL_COEF_DELTA_SHOOT: number; + FORMUL_COEF_DELTA_FRIEND_COVER: number; + SUSPETION_POINT_DIST_CHECK: number; + MAX_BASE_REQUESTS_PER_PLAYER: number; + MAX_HOLD_REQUESTS_PER_PLAYER: number; + MAX_GO_TO_REQUESTS_PER_PLAYER: number; + MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number; + CORE_POINT_MAX_VALUE: number; + CORE_POINTS_MAX: number; + CORE_POINTS_MIN: number; + BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean; + BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean; + SCAV_GROUPS_TOGETHER: boolean; + LAY_DOWN_ANG_SHOOT: number; + HOLD_REQUEST_TIME_SEC: number; + TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number; + MIN_DIST_TO_STOP_RUN: number; + JUMP_SPREAD_DIST: number; + LOOK_TIMES_TO_KILL: number; + COME_INSIDE_TIMES: number; + TOTAL_TIME_KILL: number; + TOTAL_TIME_KILL_AFTER_WARN: number; + MOVING_AIM_COEF: number; + VERTICAL_DIST_TO_IGNORE_SOUND: number; + DEFENCE_LEVEL_SHIFT: number; + MIN_DIST_CLOSE_DEF: number; + USE_ID_PRIOR_WHO_GO: boolean; + SMOKE_GRENADE_RADIUS_COEF: number; + GRENADE_PRECISION: number; + MAX_WARNS_BEFORE_KILL: number; + CARE_ENEMY_ONLY_TIME: number; + MIDDLE_POINT_COEF: number; + MAIN_TACTIC_ONLY_ATTACK: boolean; + LAST_DAMAGE_ACTIVE: number; + SHALL_DIE_IF_NOT_INITED: boolean; + CHECK_BOT_INIT_TIME_SEC: number; + WEAPON_ROOT_Y_OFFSET: number; + DELTA_SUPRESS_DISTANCE_SQRT: number; + DELTA_SUPRESS_DISTANCE: number; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + WAVE_ONLY_AS_ONLINE: boolean; + LOCAL_BOTS_COUNT: number; + AXE_MAN_KILLS_END: number; +} diff --git a/project/src/models/eft/common/tables/IBotType.ts b/project/src/models/eft/common/tables/IBotType.ts index 1ab63357..0bb6b94c 100644 --- a/project/src/models/eft/common/tables/IBotType.ts +++ b/project/src/models/eft/common/tables/IBotType.ts @@ -1,202 +1,202 @@ import { MinMax } from "@spt-aki/models/common/MinMax"; import { Skills } from "@spt-aki/models/eft/common/tables/IBotBase"; -export interface IBotType +export interface IBotType { - appearance: Appearance - chances: Chances - difficulty: Difficulties - experience: Experience - firstName: string[] - generation: Generation - health: Health - inventory: Inventory - lastName: string[] - skills: Skills + appearance: Appearance; + chances: Chances; + difficulty: Difficulties; + experience: Experience; + firstName: string[]; + generation: Generation; + health: Health; + inventory: Inventory; + lastName: string[]; + skills: Skills; } -export interface Appearance +export interface Appearance { - body: Record - feet: Record - hands: string[] - head: string[] - voice: string[] + body: Record; + feet: Record; + hands: string[]; + head: string[]; + voice: string[]; } -export interface Chances +export interface Chances { - equipment: EquipmentChances - mods: ModsChances + equipment: EquipmentChances; + mods: ModsChances; } -export interface EquipmentChances +export interface EquipmentChances { - ArmBand: number - ArmorVest: number - Backpack: number - Earpiece: number - Eyewear: number - FaceCover: number - FirstPrimaryWeapon: number - Headwear: number - Holster: number - Pockets: number - Scabbard: number - SecondPrimaryWeapon: number - SecuredContainer: number - TacticalVest: number + ArmBand: number; + ArmorVest: number; + Backpack: number; + Earpiece: number; + Eyewear: number; + FaceCover: number; + FirstPrimaryWeapon: number; + Headwear: number; + Holster: number; + Pockets: number; + Scabbard: number; + SecondPrimaryWeapon: number; + SecuredContainer: number; + TacticalVest: number; } /* eslint-disable @typescript-eslint/naming-convention */ -export interface ModsChances +export interface ModsChances { - mod_charge: number - mod_equipment: number - mod_equipment_000: number - mod_equipment_001: number - mod_equipment_002: number - mod_flashlight: number - mod_foregrip: number - mod_launcher: number - mod_magazine: number - mod_mount: number - mod_mount_000: number - mod_mount_001: number - mod_muzzle: number - mod_nvg: number - mod_pistol_grip: number - mod_reciever: number - mod_scope: number - mod_scope_000: number - mod_scope_001: number - mod_scope_002: number - mod_scope_003: number - mod_sight_front: number - mod_sight_rear: number - mod_stock: number - mod_stock_000: number - mod_stock_akms: number - mod_tactical: number - mod_tactical_000: number - mod_tactical_001: number - mod_tactical_002: number - mod_tactical_003: number - mod_handguard: number + mod_charge: number; + mod_equipment: number; + mod_equipment_000: number; + mod_equipment_001: number; + mod_equipment_002: number; + mod_flashlight: number; + mod_foregrip: number; + mod_launcher: number; + mod_magazine: number; + mod_mount: number; + mod_mount_000: number; + mod_mount_001: number; + mod_muzzle: number; + mod_nvg: number; + mod_pistol_grip: number; + mod_reciever: number; + mod_scope: number; + mod_scope_000: number; + mod_scope_001: number; + mod_scope_002: number; + mod_scope_003: number; + mod_sight_front: number; + mod_sight_rear: number; + mod_stock: number; + mod_stock_000: number; + mod_stock_akms: number; + mod_tactical: number; + mod_tactical_000: number; + mod_tactical_001: number; + mod_tactical_002: number; + mod_tactical_003: number; + mod_handguard: number; } -export interface Difficulties +export interface Difficulties { - easy: Difficulty - normal: Difficulty - hard: Difficulty - impossible: Difficulty + easy: Difficulty; + normal: Difficulty; + hard: Difficulty; + impossible: Difficulty; } -export interface Difficulty +export interface Difficulty { - Aiming: Record - Boss: Record - Change: Record - Core: Record - Cover: Record - Grenade: Record - Hearing: Record - Lay: Record - Look: Record - Mind: Record - Move: Record - Patrol: Record - Scattering: Record - Shoot: Record + Aiming: Record; + Boss: Record; + Change: Record; + Core: Record; + Cover: Record; + Grenade: Record; + Hearing: Record; + Lay: Record; + Look: Record; + Mind: Record; + Move: Record; + Patrol: Record; + Scattering: Record; + Shoot: Record; } -export interface Experience +export interface Experience { - aggressorBonus: number - level: MinMax - reward: MinMax - standingForKill: number + aggressorBonus: number; + level: MinMax; + reward: MinMax; + standingForKill: number; } -export interface Generation +export interface Generation { - items: GenerationWeightingItems + items: GenerationWeightingItems; } -export interface GenerationWeightingItems +export interface GenerationWeightingItems { - grenades: GenerationData - healing: GenerationData - drugs: GenerationData - stims: GenerationData - backpackLoot: GenerationData - pocketLoot: GenerationData - vestLoot: GenerationData - magazines: GenerationData - specialItems: GenerationData + grenades: GenerationData; + healing: GenerationData; + drugs: GenerationData; + stims: GenerationData; + backpackLoot: GenerationData; + pocketLoot: GenerationData; + vestLoot: GenerationData; + magazines: GenerationData; + specialItems: GenerationData; } export interface GenerationData { /** key: number of items, value: weighting */ - weights: Record + weights: Record; /** Array of item tpls */ - whitelist: string[] + whitelist: string[]; } -export interface Health +export interface Health { - BodyParts: BodyPart[] - Energy: MinMax - Hydration: MinMax - Temperature: MinMax + BodyParts: BodyPart[]; + Energy: MinMax; + Hydration: MinMax; + Temperature: MinMax; } -export interface BodyPart +export interface BodyPart { - Chest: MinMax - Head: MinMax - LeftArm: MinMax - LeftLeg: MinMax - RightArm: MinMax - RightLeg: MinMax - Stomach: MinMax + Chest: MinMax; + Head: MinMax; + LeftArm: MinMax; + LeftLeg: MinMax; + RightArm: MinMax; + RightLeg: MinMax; + Stomach: MinMax; } -export interface Inventory +export interface Inventory { - equipment: Equipment - Ammo: Record> - items: Items - mods: Mods + equipment: Equipment; + Ammo: Record>; + items: Items; + mods: Mods; } -export interface Equipment +export interface Equipment { - ArmBand: Record - ArmorVest: Record - Backpack: Record - Earpiece: Record - Eyewear: Record - FaceCover: Record - FirstPrimaryWeapon: Record - Headwear: Record - Holster: Record - Pockets: Record - Scabbard: Record - SecondPrimaryWeapon: Record - SecuredContainer: Record - TacticalVest: Record + ArmBand: Record; + ArmorVest: Record; + Backpack: Record; + Earpiece: Record; + Eyewear: Record; + FaceCover: Record; + FirstPrimaryWeapon: Record; + Headwear: Record; + Holster: Record; + Pockets: Record; + Scabbard: Record; + SecondPrimaryWeapon: Record; + SecuredContainer: Record; + TacticalVest: Record; } -export interface Items +export interface Items { - Backpack: string[] - Pockets: string[] - SecuredContainer: string[] - SpecialLoot: string[] - TacticalVest: string[] + Backpack: string[]; + Pockets: string[]; + SecuredContainer: string[]; + SpecialLoot: string[]; + TacticalVest: string[]; } -export type Mods = Record> \ No newline at end of file +export type Mods = Record>; diff --git a/project/src/models/eft/common/tables/ICustomizationItem.ts b/project/src/models/eft/common/tables/ICustomizationItem.ts index 9a173862..07585857 100644 --- a/project/src/models/eft/common/tables/ICustomizationItem.ts +++ b/project/src/models/eft/common/tables/ICustomizationItem.ts @@ -1,35 +1,35 @@ import { Ixyz } from "@spt-aki/models/eft/common/Ixyz"; -export interface ICustomizationItem +export interface ICustomizationItem { - _id: string - _name: string - _parent: string - _type: string - _props: Props - _proto: string + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; } -export interface Props +export interface Props { - Name: string - ShortName: string - Description: string - Side: string[] - BodyPart: string - AvailableAsDefault?: boolean - Body: string - Hands: string - Feet: string - Prefab: Prefab - WatchPrefab: Prefab - IntegratedArmorVest: boolean - WatchPosition: Ixyz - WatchRotation: Ixyz + Name: string; + ShortName: string; + Description: string; + Side: string[]; + BodyPart: string; + AvailableAsDefault?: boolean; + Body: string; + Hands: string; + Feet: string; + Prefab: Prefab; + WatchPrefab: Prefab; + IntegratedArmorVest: boolean; + WatchPosition: Ixyz; + WatchRotation: Ixyz; } -export interface Prefab +export interface Prefab { - path: string - rcid: string -} \ No newline at end of file + path: string; + rcid: string; +} diff --git a/project/src/models/eft/common/tables/IHandbookBase.ts b/project/src/models/eft/common/tables/IHandbookBase.ts index d3664e6c..c079d753 100644 --- a/project/src/models/eft/common/tables/IHandbookBase.ts +++ b/project/src/models/eft/common/tables/IHandbookBase.ts @@ -1,21 +1,21 @@ export interface IHandbookBase { - Categories: Category[] - Items: HandbookItem[] + Categories: Category[]; + Items: HandbookItem[]; } -export interface Category +export interface Category { - Id: string - ParentId?: string - Icon: string - Color: string - Order: string + Id: string; + ParentId?: string; + Icon: string; + Color: string; + Order: string; } - -export interface HandbookItem + +export interface HandbookItem { - Id: string - ParentId: string - Price: number -} \ No newline at end of file + Id: string; + ParentId: string; + Price: number; +} diff --git a/project/src/models/eft/common/tables/IItem.ts b/project/src/models/eft/common/tables/IItem.ts index 7dbc0f68..f49011e2 100644 --- a/project/src/models/eft/common/tables/IItem.ts +++ b/project/src/models/eft/common/tables/IItem.ts @@ -1,165 +1,164 @@ -export interface Item +export interface Item { - - _id: string - _tpl: string - parentId?: string - slotId?: string - location?: Location | number - upd?: Upd + _id: string; + _tpl: string; + parentId?: string; + slotId?: string; + location?: Location | number; + upd?: Upd; } -export interface Upd +export interface Upd { - Buff?: Buff - OriginalStackObjectsCount?: number - Togglable?: Togglable - Map?: Map - Tag?: Tag + Buff?: Buff; + OriginalStackObjectsCount?: number; + Togglable?: Togglable; + Map?: Map; + Tag?: Tag; /** SPT specific property, not made by BSG */ - sptPresetId?: string - FaceShield?: FaceShield - StackObjectsCount?: number - UnlimitedCount?: boolean - Repairable?: Repairable - RecodableComponent?: RecodableComponent - FireMode?: FireMode - SpawnedInSession?: boolean - Light?: Light - Key?: Key - Resource?: Resource - Sight?: Sight - MedKit?: MedKit - FoodDrink?: FoodDrink - Dogtag?: Dogtag - BuyRestrictionMax?: number - BuyRestrictionCurrent?: number - Foldable?: Foldable - SideEffect?: SideEffect - RepairKit?: RepairKit + sptPresetId?: string; + FaceShield?: FaceShield; + StackObjectsCount?: number; + UnlimitedCount?: boolean; + Repairable?: Repairable; + RecodableComponent?: RecodableComponent; + FireMode?: FireMode; + SpawnedInSession?: boolean; + Light?: Light; + Key?: Key; + Resource?: Resource; + Sight?: Sight; + MedKit?: MedKit; + FoodDrink?: FoodDrink; + Dogtag?: Dogtag; + BuyRestrictionMax?: number; + BuyRestrictionCurrent?: number; + Foldable?: Foldable; + SideEffect?: SideEffect; + RepairKit?: RepairKit; } export interface Buff { - rarity: string - buffType: string - value: number - thresholdDurability?: number + rarity: string; + buffType: string; + value: number; + thresholdDurability?: number; } export interface Togglable { - On: boolean -} - -export interface Map -{ - Markers: MapMarker[] -} - -export interface MapMarker -{ - X: number - Y: number -} - -export interface Tag -{ - Color: number; - Name: string + On: boolean; } -export interface FaceShield +export interface Map +{ + Markers: MapMarker[]; +} + +export interface MapMarker +{ + X: number; + Y: number; +} + +export interface Tag +{ + Color: number; + Name: string; +} + +export interface FaceShield { Hits: number; } - -export interface Repairable + +export interface Repairable { - Durability: number - MaxDurability: number + Durability: number; + MaxDurability: number; } export interface RecodableComponent { - IsEncoded: boolean -} - -export interface MedKit -{ - HpResource: number -} - -export interface Sight -{ - ScopesCurrentCalibPointIndexes: number[] - ScopesSelectedModes: number[] - SelectedScope: number -} - -export interface Foldable -{ - Folded: boolean -} - -export interface FireMode -{ - FireMode: string -} - -export interface FoodDrink -{ - HpPercent: number -} - -export interface Key -{ - NumberOfUsages: number -} - -export interface Resource -{ - Value: number - UnitsConsumed: number -} - -export interface Light -{ - IsActive: boolean - SelectedMode: number -} - -export interface Dogtag -{ - AccountId: string - ProfileId: string - Nickname: string - Side: string - Level: number - Time: string - Status: string - KillerAccountId: string - KillerProfileId: string - KillerName: string - WeaponName: string + IsEncoded: boolean; } -export interface Location +export interface MedKit { - x: number - y: number - r: string | number - isSearched?: boolean + HpResource: number; +} + +export interface Sight +{ + ScopesCurrentCalibPointIndexes: number[]; + ScopesSelectedModes: number[]; + SelectedScope: number; +} + +export interface Foldable +{ + Folded: boolean; +} + +export interface FireMode +{ + FireMode: string; +} + +export interface FoodDrink +{ + HpPercent: number; +} + +export interface Key +{ + NumberOfUsages: number; +} + +export interface Resource +{ + Value: number; + UnitsConsumed: number; +} + +export interface Light +{ + IsActive: boolean; + SelectedMode: number; +} + +export interface Dogtag +{ + AccountId: string; + ProfileId: string; + Nickname: string; + Side: string; + Level: number; + Time: string; + Status: string; + KillerAccountId: string; + KillerProfileId: string; + KillerName: string; + WeaponName: string; +} + +export interface Location +{ + x: number; + y: number; + r: string | number; + isSearched?: boolean; /** SPT property? */ - rotation?: string | boolean + rotation?: string | boolean; } -export interface SideEffect +export interface SideEffect { - Value: number + Value: number; } export interface RepairKit { - Resource: number -} \ No newline at end of file + Resource: number; +} diff --git a/project/src/models/eft/common/tables/ILocationsBase.ts b/project/src/models/eft/common/tables/ILocationsBase.ts index fdb6327b..28eac6b8 100644 --- a/project/src/models/eft/common/tables/ILocationsBase.ts +++ b/project/src/models/eft/common/tables/ILocationsBase.ts @@ -1,14 +1,14 @@ -export interface ILocationsBase +export interface ILocationsBase { - locations: Locations - paths: Path[] + locations: Locations; + paths: Path[]; } -export interface Locations -{ } +export interface Locations +{} -export interface Path +export interface Path { - Source: string - Destination: string -} \ No newline at end of file + Source: string; + Destination: string; +} diff --git a/project/src/models/eft/common/tables/ILootBase.ts b/project/src/models/eft/common/tables/ILootBase.ts index 12169055..9d8f0493 100644 --- a/project/src/models/eft/common/tables/ILootBase.ts +++ b/project/src/models/eft/common/tables/ILootBase.ts @@ -1,83 +1,83 @@ import { Ixyz } from "@spt-aki/models/eft/common/Ixyz"; import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -export interface ILootBase +export interface ILootBase { - staticAmmo: Record - staticContainers: Record - staticLoot: Record + staticAmmo: Record; + staticContainers: Record; + staticLoot: Record; } -export interface IStaticAmmoDetails +export interface IStaticAmmoDetails { - tpl: string - relativeProbability: number + tpl: string; + relativeProbability: number; } -export interface IStaticContainerDetails +export interface IStaticContainerDetails { - staticWeapons: IStaticWeaponProps[] - staticContainers: IStaticContainerData[] - staticForced: IStaticForcedProps[] + staticWeapons: IStaticWeaponProps[]; + staticContainers: IStaticContainerData[]; + staticForced: IStaticForcedProps[]; } export interface IStaticContainerData { - probability: number - template: IStaticContainerProps + probability: number; + template: IStaticContainerProps; } export interface IStaticPropsBase { - Id: string - IsContainer: boolean - useGravity: boolean - randomRotation: boolean - Position: Ixyz - Rotation: Ixyz - IsGroupPosition: boolean - IsAlwaysSpawn: boolean - GroupPositions: any[] - Root: string - Items: any[] + Id: string; + IsContainer: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Ixyz; + Rotation: Ixyz; + IsGroupPosition: boolean; + IsAlwaysSpawn: boolean; + GroupPositions: any[]; + Root: string; + Items: any[]; } export interface IStaticWeaponProps extends IStaticPropsBase { - Items: Item[] + Items: Item[]; } export interface IStaticContainerProps extends IStaticPropsBase { - Items: StaticItem[] + Items: StaticItem[]; } -export interface StaticItem +export interface StaticItem { - _id: string - _tpl: string + _id: string; + _tpl: string; } -export interface IStaticForcedProps +export interface IStaticForcedProps { - containerId: string - itemTpl: string + containerId: string; + itemTpl: string; } -export interface IStaticLootDetails +export interface IStaticLootDetails { - itemcountDistribution: ItemCountDistribution[] - itemDistribution: ItemDistribution[] + itemcountDistribution: ItemCountDistribution[]; + itemDistribution: ItemDistribution[]; } -export interface ItemCountDistribution +export interface ItemCountDistribution { - count: number - relativeProbability: number + count: number; + relativeProbability: number; } -export interface ItemDistribution +export interface ItemDistribution { - tpl: string - relativeProbability: number -} \ No newline at end of file + tpl: string; + relativeProbability: number; +} diff --git a/project/src/models/eft/common/tables/IMatch.ts b/project/src/models/eft/common/tables/IMatch.ts index d4a60dca..59dafe72 100644 --- a/project/src/models/eft/common/tables/IMatch.ts +++ b/project/src/models/eft/common/tables/IMatch.ts @@ -1,14 +1,14 @@ export interface IMatch { - metrics: Metrics + metrics: Metrics; } export interface Metrics { - Keys: number[] - NetProcessingBins: number[] - RenderBins: number[] - GameUpdateBins: number[] - MemoryMeasureInterval: number - PauseReasons: number[] -} \ No newline at end of file + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; + PauseReasons: number[]; +} diff --git a/project/src/models/eft/common/tables/IProfileTemplate.ts b/project/src/models/eft/common/tables/IProfileTemplate.ts index cb89201a..d474ccc5 100644 --- a/project/src/models/eft/common/tables/IProfileTemplate.ts +++ b/project/src/models/eft/common/tables/IProfileTemplate.ts @@ -3,43 +3,43 @@ import { Dialogue, IUserBuilds } from "@spt-aki/models/eft/profile/IAkiProfile"; export interface IProfileTemplates { - Standard: IProfileSides + Standard: IProfileSides; // eslint-disable-next-line @typescript-eslint/naming-convention - "Left Behind": IProfileSides + "Left Behind": IProfileSides; // eslint-disable-next-line @typescript-eslint/naming-convention - "Prepare To Escape": IProfileSides + "Prepare To Escape": IProfileSides; // eslint-disable-next-line @typescript-eslint/naming-convention - "Edge Of Darkness": IProfileSides, + "Edge Of Darkness": IProfileSides; // eslint-disable-next-line @typescript-eslint/naming-convention - "SPT Developer": IProfileSides, + "SPT Developer": IProfileSides; // eslint-disable-next-line @typescript-eslint/naming-convention - "SPT Easy start": IProfileSides, + "SPT Easy start": IProfileSides; // eslint-disable-next-line @typescript-eslint/naming-convention - "SPT Zero to hero": IProfileSides + "SPT Zero to hero": IProfileSides; } export interface IProfileSides { - descriptionLocaleKey: string - usec: TemplateSide - bear: TemplateSide + descriptionLocaleKey: string; + usec: TemplateSide; + bear: TemplateSide; } export interface TemplateSide { - character: IPmcData - suits: string[] - dialogues: Record - userbuilds: IUserBuilds - trader: ProfileTraderTemplate + character: IPmcData; + suits: string[]; + dialogues: Record; + userbuilds: IUserBuilds; + trader: ProfileTraderTemplate; } export interface ProfileTraderTemplate { - initialLoyaltyLevel: number - setQuestsAvailableForStart?: boolean - setQuestsAvailableForFinish?: boolean - initialStanding: number - initialSalesSum: number - jaegerUnlocked: boolean -} \ No newline at end of file + initialLoyaltyLevel: number; + setQuestsAvailableForStart?: boolean; + setQuestsAvailableForFinish?: boolean; + initialStanding: number; + initialSalesSum: number; + jaegerUnlocked: boolean; +} diff --git a/project/src/models/eft/common/tables/IQuest.ts b/project/src/models/eft/common/tables/IQuest.ts index 89f90480..e0d2778a 100644 --- a/project/src/models/eft/common/tables/IQuest.ts +++ b/project/src/models/eft/common/tables/IQuest.ts @@ -3,146 +3,146 @@ import { QuestRewardType } from "@spt-aki/models/enums/QuestRewardType"; import { QuestStatus } from "@spt-aki/models/enums/QuestStatus"; import { QuestTypeEnum } from "@spt-aki/models/enums/QuestTypeEnum"; -export interface IQuest +export interface IQuest { /** SPT addition - human readable quest name */ - QuestName?: string - _id: string - canShowNotificationsInGame: boolean - conditions: Conditions - description: string - failMessageText: string - name: string - note: string - traderId: string - location: string - image: string - type: QuestTypeEnum - isKey: boolean + QuestName?: string; + _id: string; + canShowNotificationsInGame: boolean; + conditions: Conditions; + description: string; + failMessageText: string; + name: string; + note: string; + traderId: string; + location: string; + image: string; + type: QuestTypeEnum; + isKey: boolean; /** @deprecated - Likely not used, use 'status' instead */ - questStatus: QuestStatus - restartable: boolean - instantComplete: boolean - secretQuest: boolean - startedMessageText: string - successMessageText: string - templateId: string - rewards: Rewards + questStatus: QuestStatus; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + startedMessageText: string; + successMessageText: string; + templateId: string; + rewards: Rewards; /** Becomes 'AppearStatus' inside client */ - status: string | number - KeyQuest: boolean - changeQuestMessageText: string + status: string | number; + KeyQuest: boolean; + changeQuestMessageText: string; /** "Pmc" or "Scav" */ - side: string + side: string; /** Status of quest to player */ - sptStatus?: QuestStatus + sptStatus?: QuestStatus; } -export interface Conditions +export interface Conditions { - Started: AvailableForConditions[] - AvailableForFinish: AvailableForConditions[] - AvailableForStart: AvailableForConditions[] - Success: AvailableForConditions[] - Fail: AvailableForConditions[] + Started: AvailableForConditions[]; + AvailableForFinish: AvailableForConditions[]; + AvailableForStart: AvailableForConditions[]; + Success: AvailableForConditions[]; + Fail: AvailableForConditions[]; } - -export interface AvailableForConditions + +export interface AvailableForConditions { - _parent: string - _props: AvailableForProps - dynamicLocale?: boolean + _parent: string; + _props: AvailableForProps; + dynamicLocale?: boolean; } - -export interface AvailableForProps + +export interface AvailableForProps { - id: string - index: number - parentId: string - isEncoded: boolean - dynamicLocale: boolean - value?: string | number - compareMethod?: string - visibilityConditions?: VisibilityCondition[] - target?: string | string[] // TODO: split each availableForX object into each type: FindItem, HandoverItem, Level, Quest, TraderLoyalty etc - status?: QuestStatus[] - availableAfter?: number - dispersion?: number - onlyFoundInRaid?: boolean - oneSessionOnly?: boolean - doNotResetIfCounterCompleted?: boolean - dogtagLevel?: number - maxDurability?: number - minDurability?: number - counter?: AvailableForCounter - plantTime?: number - zoneId?: string - type?: boolean - countInRaid?: boolean - globalQuestCounterId?: any + id: string; + index: number; + parentId: string; + isEncoded: boolean; + dynamicLocale: boolean; + value?: string | number; + compareMethod?: string; + visibilityConditions?: VisibilityCondition[]; + target?: string | string[]; // TODO: split each availableForX object into each type: FindItem, HandoverItem, Level, Quest, TraderLoyalty etc + status?: QuestStatus[]; + availableAfter?: number; + dispersion?: number; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; + countInRaid?: boolean; + globalQuestCounterId?: any; } export interface AvailableForCounter { - id: string - conditions: CounterCondition[] + id: string; + conditions: CounterCondition[]; } export interface CounterCondition { - _parent: string - _props: CounterProps + _parent: string; + _props: CounterProps; } export interface CounterProps { - id: string - target: string[] | string // TODO: some objects have an array and some are just strings, thanks bsg very cool - compareMethod?: string - value?: string - weapon?: string[] - equipmentInclusive?: string[][] - weaponModsInclusive?: string[][] - status?: string[] - bodyPart?: string[] - daytime?: DaytimeCounter + id: string; + target: string[] | string; // TODO: some objects have an array and some are just strings, thanks bsg very cool + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; } export interface DaytimeCounter { - from: number - to: number + from: number; + to: number; } export interface VisibilityCondition { - id: string - value: number - dynamicLocale: boolean - oneSessionOnly: boolean + id: string; + value: number; + dynamicLocale: boolean; + oneSessionOnly: boolean; } - -export interface Rewards + +export interface Rewards { - AvailableForStart: Reward[] - AvailableForFinish: Reward[] - Started: Reward[] - Success: Reward[] - Fail: Reward[] - FailRestartable: Reward[] - Expired: Reward[] + AvailableForStart: Reward[]; + AvailableForFinish: Reward[]; + Started: Reward[]; + Success: Reward[]; + Fail: Reward[]; + FailRestartable: Reward[]; + Expired: Reward[]; } - + export interface Reward extends Item { - value?: string | number - id: string - type: QuestRewardType - index: number - target?: string - items?: Item[] - loyaltyLevel?: number - traderId?: string - unknown?: boolean - findInRaid?: boolean + value?: string | number; + id: string; + type: QuestRewardType; + index: number; + target?: string; + items?: Item[]; + loyaltyLevel?: number; + traderId?: string; + unknown?: boolean; + findInRaid?: boolean; } diff --git a/project/src/models/eft/common/tables/IRepeatableQuests.ts b/project/src/models/eft/common/tables/IRepeatableQuests.ts index 3d717604..21836a5c 100644 --- a/project/src/models/eft/common/tables/IRepeatableQuests.ts +++ b/project/src/models/eft/common/tables/IRepeatableQuests.ts @@ -1,364 +1,360 @@ import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -export interface IReward +export interface IReward { - index: number - type: string - value: number - target?: string - items?: Item[] + index: number; + type: string; + value: number; + target?: string; + items?: Item[]; } -export interface IRepeatableQuestDatabase +export interface IRepeatableQuestDatabase { - templates: ITemplates - rewards: IRewardOptions - data: IOptions - samples: ISampleQuests[] -} - -export interface ITemplates -{ - Elimination: IRepeatableQuest - Completion: IRepeatableQuest - Exploration: IRepeatableQuest + templates: ITemplates; + rewards: IRewardOptions; + data: IOptions; + samples: ISampleQuests[]; } -export interface IPmcDataRepeatableQuest +export interface ITemplates { - id?: string - name: string - activeQuests: IRepeatableQuest[] - inactiveQuests: IRepeatableQuest[] - endTime: number - changeRequirement: TChangeRequirementRecord // what it costs to reset redundant to change requirements within the IRepeatableQuest + Elimination: IRepeatableQuest; + Completion: IRepeatableQuest; + Exploration: IRepeatableQuest; } -export type TChangeRequirementRecord = Record +export interface IPmcDataRepeatableQuest +{ + id?: string; + name: string; + activeQuests: IRepeatableQuest[]; + inactiveQuests: IRepeatableQuest[]; + endTime: number; + changeRequirement: TChangeRequirementRecord; // what it costs to reset redundant to change requirements within the IRepeatableQuest +} + +export type TChangeRequirementRecord = Record; export interface IChangeRequirement { - changeCost: IChangeCost[] - changeStandingCost: number -} - -export interface IChangeCost -{ - templateId: string // what item it will take to reset daily - count: number // amount of item needed to reset + changeCost: IChangeCost[]; + changeStandingCost: number; } -export interface IRepeatableQuest +export interface IChangeCost { - _id: string - traderId: string - location: string - image: string - type: string - isKey: boolean - restartable: boolean - instantComplete: boolean - secretQuest: boolean - canShowNotificationsInGame: boolean - rewards: IRewards - conditions: IConditions - side: string - questStatus: any - name: string - note: string - description: string - successMessageText: string - failMessageText: string - startedMessageText: string - changeQuestMessageText: string - acceptPlayerMessage: string - declinePlayerMessage: string - completePlayerMessage: string - templateId: string - changeCost: IChangeCost[] - changeStandingCost: number + templateId: string; // what item it will take to reset daily + count: number; // amount of item needed to reset +} + +export interface IRepeatableQuest +{ + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + side: string; + questStatus: any; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + changeQuestMessageText: string; + acceptPlayerMessage: string; + declinePlayerMessage: string; + completePlayerMessage: string; + templateId: string; + changeCost: IChangeCost[]; + changeStandingCost: number; sptRepatableGroupName?: string; } -export interface IRewards +export interface IRewards { - Started: IReward[] - Success: IReward[] - Fail: IReward[] + Started: IReward[]; + Success: IReward[]; + Fail: IReward[]; } -export interface IConditions +export interface IConditions { - AvailableForStart: any[] - AvailableForFinish: IAvailableFor[] - Fail: any[] + AvailableForStart: any[]; + AvailableForFinish: IAvailableFor[]; + Fail: any[]; } -export interface IAvailableFor +export interface IAvailableFor { - _props: IAvailableForProps - _parent: string - dynamicLocale: boolean + _props: IAvailableForProps; + _parent: string; + dynamicLocale: boolean; } -export interface IAvailableForProps +export interface IAvailableForProps { - id: string - parentId: string - dynamicLocale: boolean - index: number - visibilityConditions: IVisibilityCondition[] - value: number + id: string; + parentId: string; + dynamicLocale: boolean; + index: number; + visibilityConditions: IVisibilityCondition[]; + value: number; } -export interface IVisibilityCondition +export interface IVisibilityCondition { - id: string - oneSessionOnly: boolean - value: number - index: number - dynamicLocale: boolean + id: string; + oneSessionOnly: boolean; + value: number; + index: number; + dynamicLocale: boolean; } -export interface IAvailableForPropsCounter extends IAvailableForProps +export interface IAvailableForPropsCounter extends IAvailableForProps { - type: string - oneSessionOnly: boolean - doNotResetIfCounterCompleted: boolean - counter?: ICounter + type: string; + oneSessionOnly: boolean; + doNotResetIfCounterCompleted: boolean; + counter?: ICounter; } -export interface ICounter +export interface ICounter { - id: string, - conditions: ICondition[] + id: string; + conditions: ICondition[]; } -export interface ICondition +export interface ICondition { - _props: IConditionProps, - _parent: string + _props: IConditionProps; + _parent: string; } -export interface IConditionProps +export interface IConditionProps { - id: string, - dynamicLocale: boolean, + id: string; + dynamicLocale: boolean; } - // Elimination -export interface IElimination extends IRepeatableQuest +export interface IElimination extends IRepeatableQuest { - conditions: IEliminationConditions + conditions: IEliminationConditions; } -export interface IEliminationConditions extends IConditions +export interface IEliminationConditions extends IConditions { - AvailableForFinish: IEliminationAvailableFor[] + AvailableForFinish: IEliminationAvailableFor[]; } -export interface IEliminationAvailableFor extends IAvailableFor +export interface IEliminationAvailableFor extends IAvailableFor { - _props: IEliminationAvailableForProps + _props: IEliminationAvailableForProps; } - -export interface IEliminationAvailableForProps extends IAvailableForPropsCounter +export interface IEliminationAvailableForProps extends IAvailableForPropsCounter { - counter: IEliminationCounter + counter: IEliminationCounter; } -export interface IEliminationCounter extends ICounter +export interface IEliminationCounter extends ICounter { - conditions: IEliminationCondition[] + conditions: IEliminationCondition[]; } -export interface IEliminationCondition extends ICondition +export interface IEliminationCondition extends ICondition { - _props: ILocationConditionProps | IKillConditionProps + _props: ILocationConditionProps | IKillConditionProps; } - + // Exploration -export interface IExploration extends IRepeatableQuest +export interface IExploration extends IRepeatableQuest { - conditions: IExplorationConditions + conditions: IExplorationConditions; } -export interface IExplorationConditions extends IConditions +export interface IExplorationConditions extends IConditions { - AvailableForFinish: IExplorationAvailableFor[] + AvailableForFinish: IExplorationAvailableFor[]; } -export interface IExplorationAvailableFor extends IAvailableFor +export interface IExplorationAvailableFor extends IAvailableFor { - _props: IExplorationAvailableForProps + _props: IExplorationAvailableForProps; } -export interface IExplorationAvailableForProps extends IAvailableForPropsCounter +export interface IExplorationAvailableForProps extends IAvailableForPropsCounter { - counter: IExplorationCounter + counter: IExplorationCounter; } -export interface IExplorationCounter extends ICounter +export interface IExplorationCounter extends ICounter { - conditions: IExplorationCondition[] + conditions: IExplorationCondition[]; } -export interface IExplorationCondition extends ICondition +export interface IExplorationCondition extends ICondition { - _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps + _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps; } // Pickup -export interface IPickup extends IRepeatableQuest +export interface IPickup extends IRepeatableQuest { - conditions: IPickupConditions + conditions: IPickupConditions; } -export interface IPickupConditions extends IConditions +export interface IPickupConditions extends IConditions { - AvailableForFinish: IPickupAvailableFor[] + AvailableForFinish: IPickupAvailableFor[]; } -export interface IPickupAvailableFor extends IAvailableFor +export interface IPickupAvailableFor extends IAvailableFor { - _props: IPickupAvailableForProps + _props: IPickupAvailableForProps; } -export interface IPickupAvailableForProps extends IAvailableForPropsCounter +export interface IPickupAvailableForProps extends IAvailableForPropsCounter { - target: string[] - counter?: IPickupCounter + target: string[]; + counter?: IPickupCounter; } -export interface IPickupCounter extends ICounter +export interface IPickupCounter extends ICounter { - conditions: IPickupCondition[] + conditions: IPickupCondition[]; } -export interface IPickupCondition extends ICondition +export interface IPickupCondition extends ICondition { - _props: IEquipmentConditionProps | ILocationConditionProps | IExitStatusConditionProps + _props: IEquipmentConditionProps | ILocationConditionProps | IExitStatusConditionProps; } // Completion -export interface ICompletion extends IRepeatableQuest +export interface ICompletion extends IRepeatableQuest { - conditions: ICompletionConditions + conditions: ICompletionConditions; } -export interface ICompletionConditions extends IConditions +export interface ICompletionConditions extends IConditions { - AvailableForFinish: ICompletionAvailableFor[] + AvailableForFinish: ICompletionAvailableFor[]; } -export interface ICompletionAvailableFor extends IAvailableFor +export interface ICompletionAvailableFor extends IAvailableFor { - _props: ICompletionAvailableForProps + _props: ICompletionAvailableForProps; } -export interface ICompletionAvailableForProps extends IAvailableForProps +export interface ICompletionAvailableForProps extends IAvailableForProps { - target: string[] - minDurability: number - maxDurability: number - dogtagLevel: number - onlyFoundInRaid: boolean + target: string[]; + minDurability: number; + maxDurability: number; + dogtagLevel: number; + onlyFoundInRaid: boolean; } - // Quest Conditions -export interface ILocationConditionProps extends IConditionProps +export interface ILocationConditionProps extends IConditionProps { - target: string[], - weapon?: string[] - weaponCategories?: string[] + target: string[]; + weapon?: string[]; + weaponCategories?: string[]; } export interface IEquipmentConditionProps extends IConditionProps { - equipmentInclusive: [string[]] - IncludeNotEquippedItems: boolean + equipmentInclusive: [string[]]; + IncludeNotEquippedItems: boolean; } -export interface IKillConditionProps extends IConditionProps +export interface IKillConditionProps extends IConditionProps { - target: string - value: number - savageRole?: string[] - bodyPart?: string[] - distance?: IDistanceCheck - weapon?: string[] - weaponCategories? : string[] + target: string; + value: number; + savageRole?: string[]; + bodyPart?: string[]; + distance?: IDistanceCheck; + weapon?: string[]; + weaponCategories?: string[]; } -export interface IDistanceCheck +export interface IDistanceCheck { - compareMethod: string - value: number -} - -export interface IExitStatusConditionProps extends IConditionProps -{ - status: string[], + compareMethod: string; + value: number; } -export interface IExitNameConditionProps extends IConditionProps +export interface IExitStatusConditionProps extends IConditionProps { - exitName: string, + status: string[]; } +export interface IExitNameConditionProps extends IConditionProps +{ + exitName: string; +} // Config Options - -export interface IRewardOptions + +export interface IRewardOptions { - itemsBlacklist: string[] + itemsBlacklist: string[]; } - -export interface IOptions + +export interface IOptions { - Completion: ICompletionFilter + Completion: ICompletionFilter; } - -export interface ICompletionFilter + +export interface ICompletionFilter { - itemsBlacklist: ItemsBlacklist[] - itemsWhitelist: ItemsWhitelist[] + itemsBlacklist: ItemsBlacklist[]; + itemsWhitelist: ItemsWhitelist[]; } - -export interface ItemsBlacklist + +export interface ItemsBlacklist { - minPlayerLevel: number - itemIds: string[] + minPlayerLevel: number; + itemIds: string[]; } - -export interface ItemsWhitelist + +export interface ItemsWhitelist { - minPlayerLevel: number - itemIds: string[] + minPlayerLevel: number; + itemIds: string[]; } - -export interface ISampleQuests + +export interface ISampleQuests { - _id: string - traderId: string - location: string - image: string - type: string - isKey: boolean - restartable: boolean - instantComplete: boolean - secretQuest: boolean - canShowNotificationsInGame: boolean - rewards: IRewards - conditions: IConditions - name: string - note: string - description: string - successMessageText: string - failMessageText: string - startedMessageText: string - templateId: string -} \ No newline at end of file + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + templateId: string; +} diff --git a/project/src/models/eft/common/tables/ITemplateItem.ts b/project/src/models/eft/common/tables/ITemplateItem.ts index c7b45aae..15e99135 100644 --- a/project/src/models/eft/common/tables/ITemplateItem.ts +++ b/project/src/models/eft/common/tables/ITemplateItem.ts @@ -1,534 +1,534 @@ import { Ixyz } from "@spt-aki/models/eft/common/Ixyz"; -export interface ITemplateItem +export interface ITemplateItem { - _id: string - _name: string - _parent: string - _type: string - _props: Props - _proto: string + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; } -export interface Props +export interface Props { - AllowSpawnOnLocations?: any[] - BeltMagazineRefreshCount?: number - ChangePriceCoef?: number - FixedPrice?: boolean - SendToClient?: boolean - Name?: string - ShortName?: string - Description?: string - Weight?: number - BackgroundColor?: string - Width?: number - Height?: number - StackMaxSize?: number - Rarity?: string - SpawnChance?: number - CreditsPrice?: number - ItemSound?: string - Prefab?: Prefab - UsePrefab?: Prefab - StackObjectsCount?: number - NotShownInSlot?: boolean - ExaminedByDefault?: boolean - ExamineTime?: number - IsUndiscardable?: boolean - IsUnsaleable?: boolean - IsUnbuyable?: boolean - IsUngivable?: boolean - IsUnremovable?: boolean - IsLockedafterEquip?: boolean - IsSpecialSlotOnly?: boolean - IsStationaryWeapon?: boolean - QuestItem?: boolean - QuestStashMaxCount?: number - LootExperience?: number - ExamineExperience?: number - HideEntrails?: boolean - InsuranceDisabled?: boolean - RepairCost?: number - RepairSpeed?: number - ExtraSizeLeft?: number - ExtraSizeRight?: number - ExtraSizeUp?: number - ExtraSizeDown?: number - ExtraSizeForceAdd?: boolean - MergesWithChildren?: boolean - CanSellOnRagfair?: boolean - CanRequireOnRagfair?: boolean - ConflictingItems?: string[] - Unlootable?: boolean - UnlootableFromSlot?: string - UnlootableFromSide?: string[] - AnimationVariantsNumber?: number - DiscardingBlock?: boolean - DropSoundType?: string - RagFairCommissionModifier?: number - IsAlwaysAvailableForInsurance?: boolean - DiscardLimit?: number - MaxResource?: number - Resource?: number - DogTagQualities?: boolean - Grids?: Grid[] - Slots?: Slot[] - CanPutIntoDuringTheRaid?: boolean - CantRemoveFromSlotsDuringRaid?: string[] - KeyIds?: string[] - TagColor?: number - TagName?: string - Durability?: number - Accuracy?: number - Recoil?: number - Loudness?: number - EffectiveDistance?: number - Ergonomics?: number - Velocity?: number - RaidModdable?: boolean - ToolModdable?: boolean - UniqueAnimationModID?: number - BlocksFolding?: boolean - BlocksCollapsible?: boolean - IsAnimated?: boolean - HasShoulderContact?: boolean - SightingRange?: number - DoubleActionAccuracyPenaltyMult?: number - ModesCount?: any - DurabilityBurnModificator?: number - HeatFactor?: number - CoolFactor?: number - muzzleModType?: string - CustomAimPlane?: string - sightModType?: string - aimingSensitivity?: number - SightModesCount?: number - OpticCalibrationDistances?: number[] - ScopesCount?: number - AimSensitivity?: number|number[][] - Zooms?: number[][] - CalibrationDistances?: number[][] - Intensity?: number - Mask?: string - MaskSize?: number - IsMagazineForStationaryWeapon?: boolean - NoiseIntensity?: number - NoiseScale?: number - Color?: IColor - DiffuseIntensity?: number - MagazineWithBelt?: boolean - HasHinge?: boolean - RampPalette?: string - DepthFade?: number - RoughnessCoef?: number - SpecularCoef?: number - MainTexColorCoef?: number - MinimumTemperatureValue?: number - RampShift?: number - HeatMin?: number - ColdMax?: number - IsNoisy?: boolean - IsFpsStuck?: boolean - IsGlitch?: boolean - IsMotionBlurred?: boolean - IsPixelated?: boolean - PixelationBlockCount?: number - ShiftsAimCamera?: number - magAnimationIndex?: number - Cartridges?: Slot[] - CanFast?: boolean - CanHit?: boolean - CanAdmin?: boolean - LoadUnloadModifier?: number - CheckTimeModifier?: number - CheckOverride?: number - ReloadMagType?: string - VisibleAmmoRangesString?: string - MalfunctionChance?: number - IsShoulderContact?: boolean - Foldable?: boolean - Retractable?: boolean - SizeReduceRight?: number - CenterOfImpact?: number - ShotgunDispersion?: number - IsSilencer?: boolean - DeviationCurve?: number - DeviationMax?: number - SearchSound?: string - BlocksArmorVest?: boolean - speedPenaltyPercent?: number - GridLayoutName?: string - SpawnFilter?: any[] - containType?: any[] - sizeWidth?: number - sizeHeight?: number - isSecured?: boolean - spawnTypes?: string - lootFilter?: any[] - spawnRarity?: string - minCountSpawn?: number - maxCountSpawn?: number - openedByKeyID?: any[] - RigLayoutName?: string - MaxDurability?: number - armorZone?: string[] - armorClass?: string | number - mousePenalty?: number - weaponErgonomicPenalty?: number - BluntThroughput?: number - ArmorMaterial?: string - ArmorType?: string - weapClass?: string - weapUseType?: string - ammoCaliber?: string - OperatingResource?: number - RepairComplexity?: number - durabSpawnMin?: number - durabSpawnMax?: number - isFastReload?: boolean - RecoilForceUp?: number - RecoilForceBack?: number - Convergence?: number - RecoilAngle?: number - weapFireType?: string[] - RecolDispersion?: number - SingleFireRate?: number - CanQueueSecondShot?: boolean - bFirerate?: number - bEffDist?: number - bHearDist?: number - isChamberLoad?: boolean - chamberAmmoCount?: number - isBoltCatch?: boolean - defMagType?: string - defAmmo?: string - AdjustCollimatorsToTrajectory?: boolean - shotgunDispersion?: number - Chambers?: Slot[] - CameraRecoil?: number - CameraSnap?: number - ReloadMode?: string - AimPlane?: number - TacticalReloadStiffnes?: Ixyz - TacticalReloadFixation?: number - RecoilCenter?: Ixyz - RotationCenter?: Ixyz - RotationCenterNoStock?: Ixyz - FoldedSlot?: string - CompactHandling?: boolean - MinRepairDegradation?: number - MaxRepairDegradation?: number - IronSightRange?: number - IsBeltMachineGun?: boolean - IsFlareGun?: boolean - IsGrenadeLauncher?: boolean - IsOneoff?: boolean - MustBoltBeOpennedForExternalReload?: boolean - MustBoltBeOpennedForInternalReload?: boolean - NoFiremodeOnBoltcatch?: boolean - BoltAction?: boolean - HipAccuracyRestorationDelay?: number - HipAccuracyRestorationSpeed?: number - HipInnaccuracyGain?: number - ManualBoltCatch?: boolean - BurstShotsCount?: number - BaseMalfunctionChance?: number - AllowJam?: boolean - AllowFeed?: boolean - AllowMisfire?: boolean - AllowSlide?: boolean - DurabilityBurnRatio?: number - HeatFactorGun?: number - CoolFactorGun?: number - CoolFactorGunMods?: number - HeatFactorByShot?: number - AllowOverheat?: boolean - DoubleActionAccuracyPenalty?: number - RecoilPosZMult?: number - MinRepairKitDegradation?: number - MaxRepairKitDegradation?: number - BlocksEarpiece?: boolean - BlocksEyewear?: boolean - BlocksHeadwear?: boolean - BlocksFaceCover?: boolean - Indestructibility?: number - headSegments?: string[] - FaceShieldComponent?: boolean - FaceShieldMask?: string - MaterialType?: string - RicochetParams?: Ixyz - DeafStrength?: string - BlindnessProtection?: number - Distortion?: number - CompressorTreshold?: number - CompressorAttack?: number - CompressorRelease?: number - CompressorGain?: number - CutoffFreq?: number - Resonance?: number - RolloffMultiplier?: number - ReverbVolume?: number - CompressorVolume?: number - AmbientVolume?: number - DryVolume?: number - HighFrequenciesGain?: number - foodUseTime?: number - foodEffectType?: string - StimulatorBuffs?: string + AllowSpawnOnLocations?: any[]; + BeltMagazineRefreshCount?: number; + ChangePriceCoef?: number; + FixedPrice?: boolean; + SendToClient?: boolean; + Name?: string; + ShortName?: string; + Description?: string; + Weight?: number; + BackgroundColor?: string; + Width?: number; + Height?: number; + StackMaxSize?: number; + Rarity?: string; + SpawnChance?: number; + CreditsPrice?: number; + ItemSound?: string; + Prefab?: Prefab; + UsePrefab?: Prefab; + StackObjectsCount?: number; + NotShownInSlot?: boolean; + ExaminedByDefault?: boolean; + ExamineTime?: number; + IsUndiscardable?: boolean; + IsUnsaleable?: boolean; + IsUnbuyable?: boolean; + IsUngivable?: boolean; + IsUnremovable?: boolean; + IsLockedafterEquip?: boolean; + IsSpecialSlotOnly?: boolean; + IsStationaryWeapon?: boolean; + QuestItem?: boolean; + QuestStashMaxCount?: number; + LootExperience?: number; + ExamineExperience?: number; + HideEntrails?: boolean; + InsuranceDisabled?: boolean; + RepairCost?: number; + RepairSpeed?: number; + ExtraSizeLeft?: number; + ExtraSizeRight?: number; + ExtraSizeUp?: number; + ExtraSizeDown?: number; + ExtraSizeForceAdd?: boolean; + MergesWithChildren?: boolean; + CanSellOnRagfair?: boolean; + CanRequireOnRagfair?: boolean; + ConflictingItems?: string[]; + Unlootable?: boolean; + UnlootableFromSlot?: string; + UnlootableFromSide?: string[]; + AnimationVariantsNumber?: number; + DiscardingBlock?: boolean; + DropSoundType?: string; + RagFairCommissionModifier?: number; + IsAlwaysAvailableForInsurance?: boolean; + DiscardLimit?: number; + MaxResource?: number; + Resource?: number; + DogTagQualities?: boolean; + Grids?: Grid[]; + Slots?: Slot[]; + CanPutIntoDuringTheRaid?: boolean; + CantRemoveFromSlotsDuringRaid?: string[]; + KeyIds?: string[]; + TagColor?: number; + TagName?: string; + Durability?: number; + Accuracy?: number; + Recoil?: number; + Loudness?: number; + EffectiveDistance?: number; + Ergonomics?: number; + Velocity?: number; + RaidModdable?: boolean; + ToolModdable?: boolean; + UniqueAnimationModID?: number; + BlocksFolding?: boolean; + BlocksCollapsible?: boolean; + IsAnimated?: boolean; + HasShoulderContact?: boolean; + SightingRange?: number; + DoubleActionAccuracyPenaltyMult?: number; + ModesCount?: any; + DurabilityBurnModificator?: number; + HeatFactor?: number; + CoolFactor?: number; + muzzleModType?: string; + CustomAimPlane?: string; + sightModType?: string; + aimingSensitivity?: number; + SightModesCount?: number; + OpticCalibrationDistances?: number[]; + ScopesCount?: number; + AimSensitivity?: number | number[][]; + Zooms?: number[][]; + CalibrationDistances?: number[][]; + Intensity?: number; + Mask?: string; + MaskSize?: number; + IsMagazineForStationaryWeapon?: boolean; + NoiseIntensity?: number; + NoiseScale?: number; + Color?: IColor; + DiffuseIntensity?: number; + MagazineWithBelt?: boolean; + HasHinge?: boolean; + RampPalette?: string; + DepthFade?: number; + RoughnessCoef?: number; + SpecularCoef?: number; + MainTexColorCoef?: number; + MinimumTemperatureValue?: number; + RampShift?: number; + HeatMin?: number; + ColdMax?: number; + IsNoisy?: boolean; + IsFpsStuck?: boolean; + IsGlitch?: boolean; + IsMotionBlurred?: boolean; + IsPixelated?: boolean; + PixelationBlockCount?: number; + ShiftsAimCamera?: number; + magAnimationIndex?: number; + Cartridges?: Slot[]; + CanFast?: boolean; + CanHit?: boolean; + CanAdmin?: boolean; + LoadUnloadModifier?: number; + CheckTimeModifier?: number; + CheckOverride?: number; + ReloadMagType?: string; + VisibleAmmoRangesString?: string; + MalfunctionChance?: number; + IsShoulderContact?: boolean; + Foldable?: boolean; + Retractable?: boolean; + SizeReduceRight?: number; + CenterOfImpact?: number; + ShotgunDispersion?: number; + IsSilencer?: boolean; + DeviationCurve?: number; + DeviationMax?: number; + SearchSound?: string; + BlocksArmorVest?: boolean; + speedPenaltyPercent?: number; + GridLayoutName?: string; + SpawnFilter?: any[]; + containType?: any[]; + sizeWidth?: number; + sizeHeight?: number; + isSecured?: boolean; + spawnTypes?: string; + lootFilter?: any[]; + spawnRarity?: string; + minCountSpawn?: number; + maxCountSpawn?: number; + openedByKeyID?: any[]; + RigLayoutName?: string; + MaxDurability?: number; + armorZone?: string[]; + armorClass?: string | number; + mousePenalty?: number; + weaponErgonomicPenalty?: number; + BluntThroughput?: number; + ArmorMaterial?: string; + ArmorType?: string; + weapClass?: string; + weapUseType?: string; + ammoCaliber?: string; + OperatingResource?: number; + RepairComplexity?: number; + durabSpawnMin?: number; + durabSpawnMax?: number; + isFastReload?: boolean; + RecoilForceUp?: number; + RecoilForceBack?: number; + Convergence?: number; + RecoilAngle?: number; + weapFireType?: string[]; + RecolDispersion?: number; + SingleFireRate?: number; + CanQueueSecondShot?: boolean; + bFirerate?: number; + bEffDist?: number; + bHearDist?: number; + isChamberLoad?: boolean; + chamberAmmoCount?: number; + isBoltCatch?: boolean; + defMagType?: string; + defAmmo?: string; + AdjustCollimatorsToTrajectory?: boolean; + shotgunDispersion?: number; + Chambers?: Slot[]; + CameraRecoil?: number; + CameraSnap?: number; + ReloadMode?: string; + AimPlane?: number; + TacticalReloadStiffnes?: Ixyz; + TacticalReloadFixation?: number; + RecoilCenter?: Ixyz; + RotationCenter?: Ixyz; + RotationCenterNoStock?: Ixyz; + FoldedSlot?: string; + CompactHandling?: boolean; + MinRepairDegradation?: number; + MaxRepairDegradation?: number; + IronSightRange?: number; + IsBeltMachineGun?: boolean; + IsFlareGun?: boolean; + IsGrenadeLauncher?: boolean; + IsOneoff?: boolean; + MustBoltBeOpennedForExternalReload?: boolean; + MustBoltBeOpennedForInternalReload?: boolean; + NoFiremodeOnBoltcatch?: boolean; + BoltAction?: boolean; + HipAccuracyRestorationDelay?: number; + HipAccuracyRestorationSpeed?: number; + HipInnaccuracyGain?: number; + ManualBoltCatch?: boolean; + BurstShotsCount?: number; + BaseMalfunctionChance?: number; + AllowJam?: boolean; + AllowFeed?: boolean; + AllowMisfire?: boolean; + AllowSlide?: boolean; + DurabilityBurnRatio?: number; + HeatFactorGun?: number; + CoolFactorGun?: number; + CoolFactorGunMods?: number; + HeatFactorByShot?: number; + AllowOverheat?: boolean; + DoubleActionAccuracyPenalty?: number; + RecoilPosZMult?: number; + MinRepairKitDegradation?: number; + MaxRepairKitDegradation?: number; + BlocksEarpiece?: boolean; + BlocksEyewear?: boolean; + BlocksHeadwear?: boolean; + BlocksFaceCover?: boolean; + Indestructibility?: number; + headSegments?: string[]; + FaceShieldComponent?: boolean; + FaceShieldMask?: string; + MaterialType?: string; + RicochetParams?: Ixyz; + DeafStrength?: string; + BlindnessProtection?: number; + Distortion?: number; + CompressorTreshold?: number; + CompressorAttack?: number; + CompressorRelease?: number; + CompressorGain?: number; + CutoffFreq?: number; + Resonance?: number; + RolloffMultiplier?: number; + ReverbVolume?: number; + CompressorVolume?: number; + AmbientVolume?: number; + DryVolume?: number; + HighFrequenciesGain?: number; + foodUseTime?: number; + foodEffectType?: string; + StimulatorBuffs?: string; // eslint-disable-next-line @typescript-eslint/naming-convention - effects_health?: IHealthEffect[] | Record> + effects_health?: IHealthEffect[] | Record>; // eslint-disable-next-line @typescript-eslint/naming-convention - effects_damage?: Record - MaximumNumberOfUsage?: number - knifeHitDelay?: number - knifeHitSlashRate?: number - knifeHitStabRate?: number - knifeHitRadius?: number - knifeHitSlashDam?: number - knifeHitStabDam?: number - knifeDurab?: number - PrimaryDistance?: number - SecondryDistance?: number - SlashPenetration?: number - StabPenetration?: number - PrimaryConsumption?: number - SecondryConsumption?: number - DeflectionConsumption?: number - AppliedTrunkRotation?: Ixyz - AppliedHeadRotation?: Ixyz - DisplayOnModel?: boolean - AdditionalAnimationLayer?: number - StaminaBurnRate?: number - ColliderScaleMultiplier?: Ixyz - ConfigPathStr?: string - MaxMarkersCount?: number - scaleMin?: number - scaleMax?: number - medUseTime?: number - medEffectType?: string - MaxHpResource?: number - hpResourceRate?: number - apResource?: number - krResource?: number - MaxOpticZoom?: number - MaxRepairResource?: number - TargetItemFilter?: string[] - RepairQuality?: number - RepairType?: string - StackMinRandom?: number - StackMaxRandom?: number - ammoType?: string - InitialSpeed?: number - BallisticCoeficient?: number - BulletMassGram?: number - BulletDiameterMilimeters?: number - Damage?: number - ammoAccr?: number - ammoRec?: number - ammoDist?: number - buckshotBullets?: number - PenetrationPower?: number - PenetrationPowerDiviation?: number - ammoHear?: number - ammoSfx?: string - MisfireChance?: number - MinFragmentsCount?: number - MaxFragmentsCount?: number - ammoShiftChance?: number - casingName?: string - casingEjectPower?: number - casingMass?: number - casingSounds?: string - ProjectileCount?: number - PenetrationChance?: number - RicochetChance?: number - FragmentationChance?: number - Deterioration?: number - SpeedRetardation?: number - Tracer?: boolean - TracerColor?: string - TracerDistance?: number - ArmorDamage?: number - Caliber?: string - StaminaBurnPerDamage?: number - HeavyBleedingDelta?: number - LightBleedingDelta?: number - ShowBullet?: boolean - HasGrenaderComponent?: boolean - FuzeArmTimeSec?: number - ExplosionStrength?: number - MinExplosionDistance?: number - MaxExplosionDistance?: number - FragmentsCount?: number - FragmentType?: string - ShowHitEffectOnExplode?: boolean - ExplosionType?: string - AmmoLifeTimeSec?: number - Contusion?: Ixyz - ArmorDistanceDistanceDamage?: Ixyz - Blindness?: Ixyz - IsLightAndSoundShot?: boolean - LightAndSoundShotAngle?: number - LightAndSoundShotSelfContusionTime?: number - LightAndSoundShotSelfContusionStrength?: number - MalfMisfireChance?: number - MalfFeedChance?: number - StackSlots?: StackSlot[] - type?: string - eqMin?: number - eqMax?: number - rate?: number - ThrowType?: string - ExplDelay?: number - Strength?: number - ContusionDistance?: number - throwDamMax?: number - explDelay?: number - EmitTime?: number - CanBeHiddenDuringThrow?: boolean - MinTimeToContactExplode?: number - ExplosionEffectType?: string - LinkedWeapon?: string - UseAmmoWithoutShell?: boolean - RandomLootSettings?: IRandomLootSettings + effects_damage?: Record; + MaximumNumberOfUsage?: number; + knifeHitDelay?: number; + knifeHitSlashRate?: number; + knifeHitStabRate?: number; + knifeHitRadius?: number; + knifeHitSlashDam?: number; + knifeHitStabDam?: number; + knifeDurab?: number; + PrimaryDistance?: number; + SecondryDistance?: number; + SlashPenetration?: number; + StabPenetration?: number; + PrimaryConsumption?: number; + SecondryConsumption?: number; + DeflectionConsumption?: number; + AppliedTrunkRotation?: Ixyz; + AppliedHeadRotation?: Ixyz; + DisplayOnModel?: boolean; + AdditionalAnimationLayer?: number; + StaminaBurnRate?: number; + ColliderScaleMultiplier?: Ixyz; + ConfigPathStr?: string; + MaxMarkersCount?: number; + scaleMin?: number; + scaleMax?: number; + medUseTime?: number; + medEffectType?: string; + MaxHpResource?: number; + hpResourceRate?: number; + apResource?: number; + krResource?: number; + MaxOpticZoom?: number; + MaxRepairResource?: number; + TargetItemFilter?: string[]; + RepairQuality?: number; + RepairType?: string; + StackMinRandom?: number; + StackMaxRandom?: number; + ammoType?: string; + InitialSpeed?: number; + BallisticCoeficient?: number; + BulletMassGram?: number; + BulletDiameterMilimeters?: number; + Damage?: number; + ammoAccr?: number; + ammoRec?: number; + ammoDist?: number; + buckshotBullets?: number; + PenetrationPower?: number; + PenetrationPowerDiviation?: number; + ammoHear?: number; + ammoSfx?: string; + MisfireChance?: number; + MinFragmentsCount?: number; + MaxFragmentsCount?: number; + ammoShiftChance?: number; + casingName?: string; + casingEjectPower?: number; + casingMass?: number; + casingSounds?: string; + ProjectileCount?: number; + PenetrationChance?: number; + RicochetChance?: number; + FragmentationChance?: number; + Deterioration?: number; + SpeedRetardation?: number; + Tracer?: boolean; + TracerColor?: string; + TracerDistance?: number; + ArmorDamage?: number; + Caliber?: string; + StaminaBurnPerDamage?: number; + HeavyBleedingDelta?: number; + LightBleedingDelta?: number; + ShowBullet?: boolean; + HasGrenaderComponent?: boolean; + FuzeArmTimeSec?: number; + ExplosionStrength?: number; + MinExplosionDistance?: number; + MaxExplosionDistance?: number; + FragmentsCount?: number; + FragmentType?: string; + ShowHitEffectOnExplode?: boolean; + ExplosionType?: string; + AmmoLifeTimeSec?: number; + Contusion?: Ixyz; + ArmorDistanceDistanceDamage?: Ixyz; + Blindness?: Ixyz; + IsLightAndSoundShot?: boolean; + LightAndSoundShotAngle?: number; + LightAndSoundShotSelfContusionTime?: number; + LightAndSoundShotSelfContusionStrength?: number; + MalfMisfireChance?: number; + MalfFeedChance?: number; + StackSlots?: StackSlot[]; + type?: string; + eqMin?: number; + eqMax?: number; + rate?: number; + ThrowType?: string; + ExplDelay?: number; + Strength?: number; + ContusionDistance?: number; + throwDamMax?: number; + explDelay?: number; + EmitTime?: number; + CanBeHiddenDuringThrow?: boolean; + MinTimeToContactExplode?: number; + ExplosionEffectType?: string; + LinkedWeapon?: string; + UseAmmoWithoutShell?: boolean; + RandomLootSettings?: IRandomLootSettings; } export interface IHealthEffect { - type: string - value: number + type: string; + value: number; } -export interface Prefab +export interface Prefab { - path: string - rcid: string + path: string; + rcid: string; } -export interface Grid +export interface Grid { - _name: string - _id: string - _parent: string - _props: GridProps - _proto: string + _name: string; + _id: string; + _parent: string; + _props: GridProps; + _proto: string; } -export interface GridProps +export interface GridProps { - filters: GridFilter[] - cellsH: number - cellsV: number - minCount: number - maxCount: number - maxWeight: number - isSortingTable: boolean + filters: GridFilter[]; + cellsH: number; + cellsV: number; + minCount: number; + maxCount: number; + maxWeight: number; + isSortingTable: boolean; } -export interface GridFilter +export interface GridFilter { - Filter: string[] - ExcludedFilter: string[] + Filter: string[]; + ExcludedFilter: string[]; } -export interface Slot +export interface Slot { - _name: string - _id: string - _parent: string - _props: SlotProps + _name: string; + _id: string; + _parent: string; + _props: SlotProps; // eslint-disable-next-line @typescript-eslint/naming-convention - _max_count?: number - _required?: boolean - _mergeSlotWithChildren?: boolean - _proto: string + _max_count?: number; + _required?: boolean; + _mergeSlotWithChildren?: boolean; + _proto: string; } -export interface SlotProps +export interface SlotProps { - filters: SlotFilter[] + filters: SlotFilter[]; } -export interface SlotFilter +export interface SlotFilter { - Shift?: number - Filter: string[] - AnimationIndex?: number + Shift?: number; + Filter: string[]; + AnimationIndex?: number; } export interface StackSlot { - _name?: string - _id: string - _parent: string + _name?: string; + _id: string; + _parent: string; // eslint-disable-next-line @typescript-eslint/naming-convention - _max_count: number - _props: StackSlotProps - _proto: string - upd: any + _max_count: number; + _props: StackSlotProps; + _proto: string; + upd: any; } -export interface StackSlotProps +export interface StackSlotProps { - filters: SlotFilter[] + filters: SlotFilter[]; } export interface IRandomLootSettings { - allowToSpawnIdenticalItems: boolean - allowToSpawnQuestItems: boolean - countByRarity: any[] - excluded: IRandomLootExcluded - filters: any[] - findInRaid: boolean - maxCount: number - minCount: number + allowToSpawnIdenticalItems: boolean; + allowToSpawnQuestItems: boolean; + countByRarity: any[]; + excluded: IRandomLootExcluded; + filters: any[]; + findInRaid: boolean; + maxCount: number; + minCount: number; } export interface IRandomLootExcluded { - categoryTemplates: any[] - rarity: string[] - templates: any[] + categoryTemplates: any[]; + rarity: string[]; + templates: any[]; } -export interface EffectsHealth +export interface EffectsHealth { - Energy: EffectsHealthProps - Hydration: EffectsHealthProps + Energy: EffectsHealthProps; + Hydration: EffectsHealthProps; } -export interface EffectsHealthProps +export interface EffectsHealthProps { - value: number + value: number; } -export interface EffectsDamage +export interface EffectsDamage { - Pain: IEffectDamageProps - LightBleeding: IEffectDamageProps - HeavyBleeding: IEffectDamageProps - Contusion: IEffectDamageProps - RadExposure: IEffectDamageProps - Fracture: IEffectDamageProps - DestroyedPart: IEffectDamageProps + Pain: IEffectDamageProps; + LightBleeding: IEffectDamageProps; + HeavyBleeding: IEffectDamageProps; + Contusion: IEffectDamageProps; + RadExposure: IEffectDamageProps; + Fracture: IEffectDamageProps; + DestroyedPart: IEffectDamageProps; } -export interface IEffectDamageProps +export interface IEffectDamageProps { - delay: number - duration: number - fadeOut: number - cost?: number - healthPenaltyMin?: number - healthPenaltyMax?: number + delay: number; + duration: number; + fadeOut: number; + cost?: number; + healthPenaltyMin?: number; + healthPenaltyMax?: number; } -export interface IColor +export interface IColor { - r: number - g: number - b: number - a: number -} \ No newline at end of file + r: number; + g: number; + b: number; + a: number; +} diff --git a/project/src/models/eft/common/tables/ITrader.ts b/project/src/models/eft/common/tables/ITrader.ts index 3487a9de..ffe8ada7 100644 --- a/project/src/models/eft/common/tables/ITrader.ts +++ b/project/src/models/eft/common/tables/ITrader.ts @@ -1,122 +1,122 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -export interface ITrader +export interface ITrader { - assort: ITraderAssort - base: ITraderBase - dialogue?: Record - questassort: Record> - suits?: ISuit[] + assort: ITraderAssort; + base: ITraderBase; + dialogue?: Record; + questassort: Record>; + suits?: ISuit[]; } -export interface ITraderBase +export interface ITraderBase { - refreshTraderRagfairOffers: boolean - _id: string - availableInRaid: boolean - avatar: string - balance_dol: number - balance_eur: number - balance_rub: number - buyer_up: boolean - currency: string - customization_seller: boolean - discount: number - discount_end: number - gridHeight: number - insurance: Insurance - items_buy: IItemBuyData - items_buy_prohibited: IItemBuyData - location: string - loyaltyLevels: LoyaltyLevel[] - medic: boolean - name: string - nextResupply: number - nickname: string - repair: Repair - sell_category: string[] - surname: string - unlockedByDefault: boolean + refreshTraderRagfairOffers: boolean; + _id: string; + availableInRaid: boolean; + avatar: string; + balance_dol: number; + balance_eur: number; + balance_rub: number; + buyer_up: boolean; + currency: string; + customization_seller: boolean; + discount: number; + discount_end: number; + gridHeight: number; + insurance: Insurance; + items_buy: IItemBuyData; + items_buy_prohibited: IItemBuyData; + location: string; + loyaltyLevels: LoyaltyLevel[]; + medic: boolean; + name: string; + nextResupply: number; + nickname: string; + repair: Repair; + sell_category: string[]; + surname: string; + unlockedByDefault: boolean; } export interface IItemBuyData { - category: string[] - id_list: string[] + category: string[]; + id_list: string[]; } -export interface Insurance +export interface Insurance { - availability: boolean - excluded_category: string[] - max_return_hour: number - max_storage_time: number - min_payment: number - min_return_hour: number + availability: boolean; + excluded_category: string[]; + max_return_hour: number; + max_storage_time: number; + min_payment: number; + min_return_hour: number; } -export interface LoyaltyLevel +export interface LoyaltyLevel { - buy_price_coef: number - exchange_price_coef: number - heal_price_coef: number - insurance_price_coef: number - minLevel: number - minSalesSum: number - minStanding: number - repair_price_coef: number + buy_price_coef: number; + exchange_price_coef: number; + heal_price_coef: number; + insurance_price_coef: number; + minLevel: number; + minSalesSum: number; + minStanding: number; + repair_price_coef: number; } -export interface Repair +export interface Repair { - availability: boolean - currency: string - currency_coefficient: number - excluded_category: string[] + availability: boolean; + currency: string; + currency_coefficient: number; + excluded_category: string[]; /** Doesn't exist in client object */ - excluded_id_list: any[] - quality: number + excluded_id_list: any[]; + quality: number; } -export interface ITraderAssort +export interface ITraderAssort { - nextResupply: number - items: Item[] - barter_scheme: Record - loyal_level_items: Record + nextResupply: number; + items: Item[]; + barter_scheme: Record; + loyal_level_items: Record; } -export interface IBarterScheme +export interface IBarterScheme { - count: number - _tpl: string - onlyFunctional?: boolean - sptQuestLocked?: boolean + count: number; + _tpl: string; + onlyFunctional?: boolean; + sptQuestLocked?: boolean; } -export interface ISuit +export interface ISuit { - _id: string - tid: string - suiteId: string - isActive: boolean - requirements: ISuitRequirements + _id: string; + tid: string; + suiteId: string; + isActive: boolean; + requirements: ISuitRequirements; } -export interface ISuitRequirements +export interface ISuitRequirements { - loyaltyLevel: number - profileLevel: number - standing: number - skillRequirements: string[] - questRequirements: string[] - itemRequirements: ItemRequirement[] + loyaltyLevel: number; + profileLevel: number; + standing: number; + skillRequirements: string[]; + questRequirements: string[]; + itemRequirements: ItemRequirement[]; } -export interface ItemRequirement +export interface ItemRequirement { - count: number - _tpl: string - onlyFunctional: boolean + count: number; + _tpl: string; + onlyFunctional: boolean; } diff --git a/project/src/models/eft/customization/IBuyClothingRequestData.ts b/project/src/models/eft/customization/IBuyClothingRequestData.ts index cbdf758b..c5e461e4 100644 --- a/project/src/models/eft/customization/IBuyClothingRequestData.ts +++ b/project/src/models/eft/customization/IBuyClothingRequestData.ts @@ -1,13 +1,13 @@ -export interface IBuyClothingRequestData +export interface IBuyClothingRequestData { - Action: "CustomizationBuy" - offer: string - items: ClothingItem[] + Action: "CustomizationBuy"; + offer: string; + items: ClothingItem[]; } -export interface ClothingItem +export interface ClothingItem { - del: boolean - id: string - count: number + del: boolean; + id: string; + count: number; } diff --git a/project/src/models/eft/customization/IGetSuitsResponse.ts b/project/src/models/eft/customization/IGetSuitsResponse.ts index 0598acdd..d0635c44 100644 --- a/project/src/models/eft/customization/IGetSuitsResponse.ts +++ b/project/src/models/eft/customization/IGetSuitsResponse.ts @@ -1,5 +1,5 @@ export interface IGetSuitsResponse { - _id: string - suites: string[] -} \ No newline at end of file + _id: string; + suites: string[]; +} diff --git a/project/src/models/eft/customization/IWearClothingRequestData.ts b/project/src/models/eft/customization/IWearClothingRequestData.ts index a68b48eb..b4660f94 100644 --- a/project/src/models/eft/customization/IWearClothingRequestData.ts +++ b/project/src/models/eft/customization/IWearClothingRequestData.ts @@ -1,5 +1,5 @@ -export interface IWearClothingRequestData +export interface IWearClothingRequestData { - Action: "CustomizationWear" - suites: string[] -} \ No newline at end of file + Action: "CustomizationWear"; + suites: string[]; +} diff --git a/project/src/models/eft/dialog/IAcceptFriendRequestData.ts b/project/src/models/eft/dialog/IAcceptFriendRequestData.ts index f6c811d5..a9d67f4c 100644 --- a/project/src/models/eft/dialog/IAcceptFriendRequestData.ts +++ b/project/src/models/eft/dialog/IAcceptFriendRequestData.ts @@ -1,17 +1,15 @@ -// rome-ignore lint/suspicious/noEmptyInterface: -export interface IAcceptFriendRequestData extends IBaseFriendRequest +// biome-ignore lint/suspicious/noEmptyInterface: +export interface IAcceptFriendRequestData extends IBaseFriendRequest { - } -// rome-ignore lint/suspicious/noEmptyInterface: -export interface ICancelFriendRequestData extends IBaseFriendRequest +// biome-ignore lint/suspicious/noEmptyInterface: +export interface ICancelFriendRequestData extends IBaseFriendRequest { - } export interface IBaseFriendRequest { // eslint-disable-next-line @typescript-eslint/naming-convention - request_id: string -} \ No newline at end of file + request_id: string; +} diff --git a/project/src/models/eft/dialog/IChatServer.ts b/project/src/models/eft/dialog/IChatServer.ts index a5cc9c98..fc44abcb 100644 --- a/project/src/models/eft/dialog/IChatServer.ts +++ b/project/src/models/eft/dialog/IChatServer.ts @@ -1,19 +1,19 @@ export interface IChatServer { - _id: string - RegistrationId: number - VersionId: string - Ip: string - Port: number - DateTime: number - Chats: IChat[] - Regions: string[] + _id: string; + RegistrationId: number; + VersionId: string; + Ip: string; + Port: number; + DateTime: number; + Chats: IChat[]; + Regions: string[]; /** Possibly removed */ - IsDeveloper?: boolean + IsDeveloper?: boolean; } export interface IChat { - _id: string - Members: number -} \ No newline at end of file + _id: string; + Members: number; +} diff --git a/project/src/models/eft/dialog/IClearMailMessageRequest.ts b/project/src/models/eft/dialog/IClearMailMessageRequest.ts index 8aae110a..00c5e33b 100644 --- a/project/src/models/eft/dialog/IClearMailMessageRequest.ts +++ b/project/src/models/eft/dialog/IClearMailMessageRequest.ts @@ -1,4 +1,4 @@ export interface IClearMailMessageRequest { - dialogId: string -} \ No newline at end of file + dialogId: string; +} diff --git a/project/src/models/eft/dialog/IDeleteFriendRequest.ts b/project/src/models/eft/dialog/IDeleteFriendRequest.ts index f0cd8260..8f2c5fcb 100644 --- a/project/src/models/eft/dialog/IDeleteFriendRequest.ts +++ b/project/src/models/eft/dialog/IDeleteFriendRequest.ts @@ -1,5 +1,5 @@ export interface IDeleteFriendRequest { // eslint-disable-next-line @typescript-eslint/naming-convention - friend_id: string -} \ No newline at end of file + friend_id: string; +} diff --git a/project/src/models/eft/dialog/IFriendRequestData.ts b/project/src/models/eft/dialog/IFriendRequestData.ts index 005536f3..63194e7b 100644 --- a/project/src/models/eft/dialog/IFriendRequestData.ts +++ b/project/src/models/eft/dialog/IFriendRequestData.ts @@ -1,4 +1,4 @@ -export interface IFriendRequestData +export interface IFriendRequestData { - to: string -} \ No newline at end of file + to: string; +} diff --git a/project/src/models/eft/dialog/IFriendRequestSendResponse.ts b/project/src/models/eft/dialog/IFriendRequestSendResponse.ts index 3f7fb066..d83579bb 100644 --- a/project/src/models/eft/dialog/IFriendRequestSendResponse.ts +++ b/project/src/models/eft/dialog/IFriendRequestSendResponse.ts @@ -1,6 +1,6 @@ export interface IFriendRequestSendResponse { - status: number - requestid: string - retryAfter: number -} \ No newline at end of file + status: number; + requestid: string; + retryAfter: number; +} diff --git a/project/src/models/eft/dialog/IGetAllAttachmentsRequestData.ts b/project/src/models/eft/dialog/IGetAllAttachmentsRequestData.ts index bb683b6f..5c74c142 100644 --- a/project/src/models/eft/dialog/IGetAllAttachmentsRequestData.ts +++ b/project/src/models/eft/dialog/IGetAllAttachmentsRequestData.ts @@ -1,4 +1,4 @@ -export interface IGetAllAttachmentsRequestData +export interface IGetAllAttachmentsRequestData { - dialogId: string -} \ No newline at end of file + dialogId: string; +} diff --git a/project/src/models/eft/dialog/IGetAllAttachmentsResponse.ts b/project/src/models/eft/dialog/IGetAllAttachmentsResponse.ts index 61cf21da..5ad1c2ef 100644 --- a/project/src/models/eft/dialog/IGetAllAttachmentsResponse.ts +++ b/project/src/models/eft/dialog/IGetAllAttachmentsResponse.ts @@ -2,7 +2,7 @@ import { Message } from "@spt-aki/models/eft/profile/IAkiProfile"; export interface IGetAllAttachmentsResponse { - messages: Message[] - profiles: any[] - hasMessagesWithRewards: boolean -} \ No newline at end of file + messages: Message[]; + profiles: any[]; + hasMessagesWithRewards: boolean; +} diff --git a/project/src/models/eft/dialog/IGetChatServerListRequestData.ts b/project/src/models/eft/dialog/IGetChatServerListRequestData.ts index e16a671d..34fece80 100644 --- a/project/src/models/eft/dialog/IGetChatServerListRequestData.ts +++ b/project/src/models/eft/dialog/IGetChatServerListRequestData.ts @@ -1,4 +1,4 @@ export interface IGetChatServerListRequestData { - VersionId: string -} \ No newline at end of file + VersionId: string; +} diff --git a/project/src/models/eft/dialog/IGetFriendListDataResponse.ts b/project/src/models/eft/dialog/IGetFriendListDataResponse.ts index 454dfd4e..4733ee11 100644 --- a/project/src/models/eft/dialog/IGetFriendListDataResponse.ts +++ b/project/src/models/eft/dialog/IGetFriendListDataResponse.ts @@ -2,7 +2,7 @@ import { IUserDialogInfo } from "@spt-aki/models/eft/profile/IAkiProfile"; export interface IGetFriendListDataResponse { - Friends: IUserDialogInfo[] - Ignore: string[] - InIgnoreList: string[] -} \ No newline at end of file + Friends: IUserDialogInfo[]; + Ignore: string[]; + InIgnoreList: string[]; +} diff --git a/project/src/models/eft/dialog/IGetMailDialogInfoRequestData.ts b/project/src/models/eft/dialog/IGetMailDialogInfoRequestData.ts index c48cddc9..d138cbb7 100644 --- a/project/src/models/eft/dialog/IGetMailDialogInfoRequestData.ts +++ b/project/src/models/eft/dialog/IGetMailDialogInfoRequestData.ts @@ -1,5 +1,4 @@ export interface IGetMailDialogInfoRequestData { dialogId: string; - -} \ No newline at end of file +} diff --git a/project/src/models/eft/dialog/IGetMailDialogListRequestData.ts b/project/src/models/eft/dialog/IGetMailDialogListRequestData.ts index 1a2dbd31..c4605996 100644 --- a/project/src/models/eft/dialog/IGetMailDialogListRequestData.ts +++ b/project/src/models/eft/dialog/IGetMailDialogListRequestData.ts @@ -1,5 +1,5 @@ -export interface IGetMailDialogListRequestData +export interface IGetMailDialogListRequestData { - limit: number - offset: number -} \ No newline at end of file + limit: number; + offset: number; +} diff --git a/project/src/models/eft/dialog/IGetMailDialogViewRequestData.ts b/project/src/models/eft/dialog/IGetMailDialogViewRequestData.ts index 6e07a2fe..3b8f443f 100644 --- a/project/src/models/eft/dialog/IGetMailDialogViewRequestData.ts +++ b/project/src/models/eft/dialog/IGetMailDialogViewRequestData.ts @@ -1,9 +1,9 @@ import { MessageType } from "@spt-aki/models/enums/MessageType"; -export interface IGetMailDialogViewRequestData +export interface IGetMailDialogViewRequestData { - type: MessageType - dialogId: string - limit: number - time: number // decimal -} \ No newline at end of file + type: MessageType; + dialogId: string; + limit: number; + time: number; // decimal +} diff --git a/project/src/models/eft/dialog/IGetMailDialogViewResponseData.ts b/project/src/models/eft/dialog/IGetMailDialogViewResponseData.ts index ef3e5af6..763737d7 100644 --- a/project/src/models/eft/dialog/IGetMailDialogViewResponseData.ts +++ b/project/src/models/eft/dialog/IGetMailDialogViewResponseData.ts @@ -1,8 +1,8 @@ import { IUserDialogInfo, Message } from "@spt-aki/models/eft/profile/IAkiProfile"; -export interface IGetMailDialogViewResponseData +export interface IGetMailDialogViewResponseData { - messages: Message[] - profiles: IUserDialogInfo[] - hasMessagesWithRewards: boolean -} \ No newline at end of file + messages: Message[]; + profiles: IUserDialogInfo[]; + hasMessagesWithRewards: boolean; +} diff --git a/project/src/models/eft/dialog/IPinDialogRequestData.ts b/project/src/models/eft/dialog/IPinDialogRequestData.ts index 68c9793e..6dc1222a 100644 --- a/project/src/models/eft/dialog/IPinDialogRequestData.ts +++ b/project/src/models/eft/dialog/IPinDialogRequestData.ts @@ -1,4 +1,4 @@ -export interface IPinDialogRequestData +export interface IPinDialogRequestData { - dialogId: string -} \ No newline at end of file + dialogId: string; +} diff --git a/project/src/models/eft/dialog/IRemoveDialogRequestData.ts b/project/src/models/eft/dialog/IRemoveDialogRequestData.ts index c2fc47ff..591145f4 100644 --- a/project/src/models/eft/dialog/IRemoveDialogRequestData.ts +++ b/project/src/models/eft/dialog/IRemoveDialogRequestData.ts @@ -1,5 +1,4 @@ -export interface IRemoveDialogRequestData +export interface IRemoveDialogRequestData { dialogId: string; - -} \ No newline at end of file +} diff --git a/project/src/models/eft/dialog/IRemoveMailMessageRequest.ts b/project/src/models/eft/dialog/IRemoveMailMessageRequest.ts index a8ccd80a..1594a15f 100644 --- a/project/src/models/eft/dialog/IRemoveMailMessageRequest.ts +++ b/project/src/models/eft/dialog/IRemoveMailMessageRequest.ts @@ -1,4 +1,4 @@ export interface IRemoveMailMessageRequest { - dialogId: string -} \ No newline at end of file + dialogId: string; +} diff --git a/project/src/models/eft/dialog/ISendMessageRequest.ts b/project/src/models/eft/dialog/ISendMessageRequest.ts index dfbee57a..b09a7e93 100644 --- a/project/src/models/eft/dialog/ISendMessageRequest.ts +++ b/project/src/models/eft/dialog/ISendMessageRequest.ts @@ -2,8 +2,8 @@ import { MessageType } from "@spt-aki/models/enums/MessageType"; export interface ISendMessageRequest { - dialogId: string - type: MessageType - text: string - replyTo: string -} \ No newline at end of file + dialogId: string; + type: MessageType; + text: string; + replyTo: string; +} diff --git a/project/src/models/eft/dialog/ISetDialogReadRequestData.ts b/project/src/models/eft/dialog/ISetDialogReadRequestData.ts index 2fc21721..244d34a8 100644 --- a/project/src/models/eft/dialog/ISetDialogReadRequestData.ts +++ b/project/src/models/eft/dialog/ISetDialogReadRequestData.ts @@ -1,4 +1,4 @@ -export interface ISetDialogReadRequestData +export interface ISetDialogReadRequestData { dialogs: string[]; -} \ No newline at end of file +} diff --git a/project/src/models/eft/game/ICheckVersionResponse.ts b/project/src/models/eft/game/ICheckVersionResponse.ts index 1ce55616..f1cda7bc 100644 --- a/project/src/models/eft/game/ICheckVersionResponse.ts +++ b/project/src/models/eft/game/ICheckVersionResponse.ts @@ -1,5 +1,5 @@ export interface ICheckVersionResponse { - isvalid: boolean, - latestVersion: string -} \ No newline at end of file + isvalid: boolean; + latestVersion: string; +} diff --git a/project/src/models/eft/game/ICurrentGroupResponse.ts b/project/src/models/eft/game/ICurrentGroupResponse.ts index f664d9a3..3b39739e 100644 --- a/project/src/models/eft/game/ICurrentGroupResponse.ts +++ b/project/src/models/eft/game/ICurrentGroupResponse.ts @@ -2,22 +2,22 @@ import { MemberCategory } from "@spt-aki/models/enums/MemberCategory"; export interface ICurrentGroupResponse { - squad: any[] + squad: any[]; } export interface ICurrentGroupSquadMember { - _id: string - aid: string - info: ICurrentGroupMemberInfo - isLeader: boolean - isReady: boolean + _id: string; + aid: string; + info: ICurrentGroupMemberInfo; + isLeader: boolean; + isReady: boolean; } export interface ICurrentGroupMemberInfo { - Nickname: string - Side: string - Level: string - MemberCategory: MemberCategory -} \ No newline at end of file + Nickname: string; + Side: string; + Level: string; + MemberCategory: MemberCategory; +} diff --git a/project/src/models/eft/game/IGameConfigResponse.ts b/project/src/models/eft/game/IGameConfigResponse.ts index 247db660..23672eba 100644 --- a/project/src/models/eft/game/IGameConfigResponse.ts +++ b/project/src/models/eft/game/IGameConfigResponse.ts @@ -1,26 +1,26 @@ export interface IGameConfigResponse { - aid: number - lang: string - languages: Record - ndaFree: boolean - taxonomy: number - activeProfileId: string - backend: Backend - useProtobuf: boolean + aid: number; + lang: string; + languages: Record; + ndaFree: boolean; + taxonomy: number; + activeProfileId: string; + backend: Backend; + useProtobuf: boolean; // eslint-disable-next-line @typescript-eslint/naming-convention - utc_time: number + utc_time: number; /** Total in game time */ - totalInGame: number - reportAvailable: boolean - twitchEventMember: boolean + totalInGame: number; + reportAvailable: boolean; + twitchEventMember: boolean; } - + export interface Backend { - Lobby: string - Trading: string - Messaging: string - Main: string - RagFair: string -} \ No newline at end of file + Lobby: string; + Trading: string; + Messaging: string; + Main: string; + RagFair: string; +} diff --git a/project/src/models/eft/game/IGameEmptyCrcRequestData.ts b/project/src/models/eft/game/IGameEmptyCrcRequestData.ts index 0b19da50..8518f9a7 100644 --- a/project/src/models/eft/game/IGameEmptyCrcRequestData.ts +++ b/project/src/models/eft/game/IGameEmptyCrcRequestData.ts @@ -1,4 +1,4 @@ -export interface IGameEmptyCrcRequestData +export interface IGameEmptyCrcRequestData { - crc: number -} \ No newline at end of file + crc: number; +} diff --git a/project/src/models/eft/game/IGameKeepAliveResponse.ts b/project/src/models/eft/game/IGameKeepAliveResponse.ts index 6ad9b738..48d631f8 100644 --- a/project/src/models/eft/game/IGameKeepAliveResponse.ts +++ b/project/src/models/eft/game/IGameKeepAliveResponse.ts @@ -1,6 +1,6 @@ export interface IGameKeepAliveResponse { - msg: string + msg: string; // eslint-disable-next-line @typescript-eslint/naming-convention - utc_time: number -} \ No newline at end of file + utc_time: number; +} diff --git a/project/src/models/eft/game/IGameLogoutResponseData.ts b/project/src/models/eft/game/IGameLogoutResponseData.ts index 81b9679b..f3374559 100644 --- a/project/src/models/eft/game/IGameLogoutResponseData.ts +++ b/project/src/models/eft/game/IGameLogoutResponseData.ts @@ -1,4 +1,4 @@ export interface IGameLogoutResponseData { - status: string -} \ No newline at end of file + status: string; +} diff --git a/project/src/models/eft/game/IGameStartResponse.ts b/project/src/models/eft/game/IGameStartResponse.ts index 0f176899..7172081f 100644 --- a/project/src/models/eft/game/IGameStartResponse.ts +++ b/project/src/models/eft/game/IGameStartResponse.ts @@ -1,5 +1,5 @@ export interface IGameStartResponse { // eslint-disable-next-line @typescript-eslint/naming-convention - utc_time: number -} \ No newline at end of file + utc_time: number; +} diff --git a/project/src/models/eft/game/IGetItemPricesResponse.ts b/project/src/models/eft/game/IGetItemPricesResponse.ts index 1878f9c3..ab2bc2db 100644 --- a/project/src/models/eft/game/IGetItemPricesResponse.ts +++ b/project/src/models/eft/game/IGetItemPricesResponse.ts @@ -1,6 +1,6 @@ export interface IGetItemPricesResponse { - supplyNextTime: number - prices: Record - currencyCourses: Record -} \ No newline at end of file + supplyNextTime: number; + prices: Record; + currencyCourses: Record; +} diff --git a/project/src/models/eft/game/IReportNicknameRequestData.ts b/project/src/models/eft/game/IReportNicknameRequestData.ts index cc94e79a..bbce9814 100644 --- a/project/src/models/eft/game/IReportNicknameRequestData.ts +++ b/project/src/models/eft/game/IReportNicknameRequestData.ts @@ -1,4 +1,4 @@ export interface IReportNicknameRequestData { - uid: string -} \ No newline at end of file + uid: string; +} diff --git a/project/src/models/eft/game/IServerDetails.ts b/project/src/models/eft/game/IServerDetails.ts index f534d678..7d082d3e 100644 --- a/project/src/models/eft/game/IServerDetails.ts +++ b/project/src/models/eft/game/IServerDetails.ts @@ -1,5 +1,5 @@ export interface IServerDetails { - ip: string - port: number -} \ No newline at end of file + ip: string; + port: number; +} diff --git a/project/src/models/eft/game/IVersionValidateRequestData.ts b/project/src/models/eft/game/IVersionValidateRequestData.ts index ef9770ab..35730eba 100644 --- a/project/src/models/eft/game/IVersionValidateRequestData.ts +++ b/project/src/models/eft/game/IVersionValidateRequestData.ts @@ -1,14 +1,14 @@ -export interface IVersionValidateRequestData +export interface IVersionValidateRequestData { - version: Version - develop: boolean + version: Version; + develop: boolean; } -export interface Version +export interface Version { - major: string - minor: string - game: string - backend: string - taxonomy: string -} \ No newline at end of file + major: string; + minor: string; + game: string; + backend: string; + taxonomy: string; +} diff --git a/project/src/models/eft/health/Effect.ts b/project/src/models/eft/health/Effect.ts index ed9ac7ec..b27f856a 100644 --- a/project/src/models/eft/health/Effect.ts +++ b/project/src/models/eft/health/Effect.ts @@ -1,8 +1,8 @@ export enum Effect - { +{ FRACTURE = "Fracture", LIGHT_BLEEDING = "LightBleeding", HEAVY_BLEEDING = "HeavyBleeding", MILD_MUSCLE_PAIN = "MildMusclePain", - SEVERE_MUSCLE_PAIN = "SevereMusclePain" -} \ No newline at end of file + SEVERE_MUSCLE_PAIN = "SevereMusclePain", +} diff --git a/project/src/models/eft/health/IHealthTreatmentRequestData.ts b/project/src/models/eft/health/IHealthTreatmentRequestData.ts index ddfb1182..ec5859d7 100644 --- a/project/src/models/eft/health/IHealthTreatmentRequestData.ts +++ b/project/src/models/eft/health/IHealthTreatmentRequestData.ts @@ -1,41 +1,41 @@ -export interface IHealthTreatmentRequestData +export interface IHealthTreatmentRequestData { - Action: "RestoreHealth" - trader: string - items: Cost[] - difference: Difference - timestamp: number + Action: "RestoreHealth"; + trader: string; + items: Cost[]; + difference: Difference; + timestamp: number; } -export interface Cost +export interface Cost { /** Id of stack to take money from */ - id: string + id: string; /** Amount of money to take off player for treatment */ - count: number + count: number; } -export interface Difference +export interface Difference { - BodyParts: BodyParts - Energy: number - Hydration: number + BodyParts: BodyParts; + Energy: number; + Hydration: number; } -export interface BodyParts +export interface BodyParts { - Head: BodyPart - Chest: BodyPart - Stomach: BodyPart - LeftArm: BodyPart - RightArm: BodyPart - LeftLeg: BodyPart - RightLeg: BodyPart + Head: BodyPart; + Chest: BodyPart; + Stomach: BodyPart; + LeftArm: BodyPart; + RightArm: BodyPart; + LeftLeg: BodyPart; + RightLeg: BodyPart; } -export interface BodyPart +export interface BodyPart { - Health: number + Health: number; /** Effects in array are to be removed */ - Effects: string[] -} \ No newline at end of file + Effects: string[]; +} diff --git a/project/src/models/eft/health/IOffraidEatRequestData.ts b/project/src/models/eft/health/IOffraidEatRequestData.ts index 11b6d41d..a327bea0 100644 --- a/project/src/models/eft/health/IOffraidEatRequestData.ts +++ b/project/src/models/eft/health/IOffraidEatRequestData.ts @@ -1,9 +1,9 @@ import { IBaseInteractionRequestData } from "@spt-aki/models/eft/common/request/IBaseInteractionRequestData"; -export interface IOffraidEatRequestData extends IBaseInteractionRequestData +export interface IOffraidEatRequestData extends IBaseInteractionRequestData { - Action: "Eat" - item: string - count: number - time: number -} \ No newline at end of file + Action: "Eat"; + item: string; + count: number; + time: number; +} diff --git a/project/src/models/eft/health/IOffraidHealRequestData.ts b/project/src/models/eft/health/IOffraidHealRequestData.ts index dd922b4d..db7570e9 100644 --- a/project/src/models/eft/health/IOffraidHealRequestData.ts +++ b/project/src/models/eft/health/IOffraidHealRequestData.ts @@ -1,16 +1,16 @@ import { IBaseInteractionRequestData } from "@spt-aki/models/eft/common/request/IBaseInteractionRequestData"; -export interface IOffraidHealRequestData extends IBaseInteractionRequestData +export interface IOffraidHealRequestData extends IBaseInteractionRequestData { - Action: "Heal" - item: string - part: BodyPart - count: number - time: number + Action: "Heal"; + item: string; + part: BodyPart; + count: number; + time: number; } -export enum BodyPart - { +export enum BodyPart +{ HEAD = "Head", CHEST = "Chest", STOMACH = "Stomach", @@ -18,5 +18,5 @@ export enum BodyPart RIGHT_ARM = "RightArm", LEFT_LEG = "LeftLeg", RIGHT_LEG = "RightLeg", - COMMON = "Common" -} \ No newline at end of file + COMMON = "Common", +} diff --git a/project/src/models/eft/health/ISyncHealthRequestData.ts b/project/src/models/eft/health/ISyncHealthRequestData.ts index 8d9ddd73..5b59155a 100644 --- a/project/src/models/eft/health/ISyncHealthRequestData.ts +++ b/project/src/models/eft/health/ISyncHealthRequestData.ts @@ -1,26 +1,26 @@ -export interface ISyncHealthRequestData +export interface ISyncHealthRequestData { - Health: Health - IsAlive: boolean - Hydration?: number - Energy?: number - Temperature?: number + Health: Health; + IsAlive: boolean; + Hydration?: number; + Energy?: number; + Temperature?: number; } -export interface Health +export interface Health { - Head?: BodyPartHealth - Chest?: BodyPartHealth - Stomach?: BodyPartHealth - LeftArm?: BodyPartHealth - RightArm?: BodyPartHealth - LeftLeg?: BodyPartHealth - RightLeg?: BodyPartHealth + Head?: BodyPartHealth; + Chest?: BodyPartHealth; + Stomach?: BodyPartHealth; + LeftArm?: BodyPartHealth; + RightArm?: BodyPartHealth; + LeftLeg?: BodyPartHealth; + RightLeg?: BodyPartHealth; } -export interface BodyPartHealth +export interface BodyPartHealth { - Maximum: number - Current: number - Effects: Record + Maximum: number; + Current: number; + Effects: Record; } diff --git a/project/src/models/eft/health/IWorkoutData.ts b/project/src/models/eft/health/IWorkoutData.ts index cea5b5e0..36080734 100644 --- a/project/src/models/eft/health/IWorkoutData.ts +++ b/project/src/models/eft/health/IWorkoutData.ts @@ -1,7 +1,7 @@ // TODO: Type this properly. -export interface IWorkoutData extends Record +export interface IWorkoutData extends Record { - skills: any - effects: any -} \ No newline at end of file + skills: any; + effects: any; +} diff --git a/project/src/models/eft/hideout/HideoutUpgradeCompleteRequestData.ts b/project/src/models/eft/hideout/HideoutUpgradeCompleteRequestData.ts index 6a5ec4bd..5c8035c2 100644 --- a/project/src/models/eft/hideout/HideoutUpgradeCompleteRequestData.ts +++ b/project/src/models/eft/hideout/HideoutUpgradeCompleteRequestData.ts @@ -1,6 +1,6 @@ -export interface HideoutUpgradeCompleteRequestData +export interface HideoutUpgradeCompleteRequestData { - Action: string - areaType: number - timestamp: number -} \ No newline at end of file + Action: string; + areaType: number; + timestamp: number; +} diff --git a/project/src/models/eft/hideout/IHandleQTEEventRequestData.ts b/project/src/models/eft/hideout/IHandleQTEEventRequestData.ts index aac182c4..b2692536 100644 --- a/project/src/models/eft/hideout/IHandleQTEEventRequestData.ts +++ b/project/src/models/eft/hideout/IHandleQTEEventRequestData.ts @@ -1,9 +1,9 @@ export interface IHandleQTEEventRequestData { - Action: string + Action: string; /** true if QTE was successful, otherwise false */ - results: boolean[] + results: boolean[]; /** Id of the QTE object used from db/hideout/qte.json */ - id: string - timestamp: number -} \ No newline at end of file + id: string; + timestamp: number; +} diff --git a/project/src/models/eft/hideout/IHideoutArea.ts b/project/src/models/eft/hideout/IHideoutArea.ts index 88d2eb37..b134eb72 100644 --- a/project/src/models/eft/hideout/IHideoutArea.ts +++ b/project/src/models/eft/hideout/IHideoutArea.ts @@ -1,91 +1,91 @@ -export interface IHideoutArea +export interface IHideoutArea { - _id: string - type: number - enabled: boolean - needsFuel: boolean - requirements: IAreaRequirement[] - takeFromSlotLocked: boolean - craftGivesExp: boolean - displayLevel: boolean - enableAreaRequirements: boolean - parentArea?: string - stages: Record + _id: string; + type: number; + enabled: boolean; + needsFuel: boolean; + requirements: IAreaRequirement[]; + takeFromSlotLocked: boolean; + craftGivesExp: boolean; + displayLevel: boolean; + enableAreaRequirements: boolean; + parentArea?: string; + stages: Record; } export interface IAreaRequirement { - areaType: number - requiredlevel: number - type: string + areaType: number; + requiredlevel: number; + type: string; } export interface Stage { - autoUpgrade: boolean - bonuses: StageBonus[] - constructionTime: number + autoUpgrade: boolean; + bonuses: StageBonus[]; + constructionTime: number; /** Containers inventory tpl */ - container?: string - description: string - displayInterface: boolean - improvements: IStageImprovement[] - requirements: IStageRequirement[] - slots: number + container?: string; + description: string; + displayInterface: boolean; + improvements: IStageImprovement[]; + requirements: IStageRequirement[]; + slots: number; } export interface IStageImprovement { - id: string - bonuses: IStageImprovementBonus[] - improvementTime: number - requirements: IStageImprovementRequirement[] + id: string; + bonuses: IStageImprovementBonus[]; + improvementTime: number; + requirements: IStageImprovementRequirement[]; } export interface IStageImprovementBonus { - passive: boolean, - production: boolean, - type: string - value: number, - visible: boolean + passive: boolean; + production: boolean; + type: string; + value: number; + visible: boolean; } export interface IStageImprovementRequirement { - count: number - isEncoded: boolean - isFunctional: boolean - templateId: string - type: string + count: number; + isEncoded: boolean; + isFunctional: boolean; + templateId: string; + type: string; } -export interface IStageRequirement +export interface IStageRequirement { - areaType?: number - requiredLevel?: number - type: string - templateId?: string - count?: number - isEncoded: false - isFunctional?: boolean - traderId?: string - loyaltyLevel?: number - skillName?: string - skillLevel?: number + areaType?: number; + requiredLevel?: number; + type: string; + templateId?: string; + count?: number; + isEncoded: false; + isFunctional?: boolean; + traderId?: string; + loyaltyLevel?: number; + skillName?: string; + skillLevel?: number; } -export interface StageBonus +export interface StageBonus { - value: number - passive: boolean - production: boolean - visible: boolean - skillType?: string - type: string - filter?: string[] - icon?: string + value: number; + passive: boolean; + production: boolean; + visible: boolean; + skillType?: string; + type: string; + filter?: string[]; + icon?: string; /** CHANGES PER DUMP */ - id?: string - templateId?: string -} \ No newline at end of file + id?: string; + templateId?: string; +} diff --git a/project/src/models/eft/hideout/IHideoutCancelProductionRequestData.ts b/project/src/models/eft/hideout/IHideoutCancelProductionRequestData.ts index e076acd7..c9986ac8 100644 --- a/project/src/models/eft/hideout/IHideoutCancelProductionRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutCancelProductionRequestData.ts @@ -1,6 +1,6 @@ -export interface IHideoutCancelProductionRequestData +export interface IHideoutCancelProductionRequestData { - Action: "HideoutCancelProductionCommand" - recipeId: string - timestamp: number + Action: "HideoutCancelProductionCommand"; + recipeId: string; + timestamp: number; } diff --git a/project/src/models/eft/hideout/IHideoutContinuousProductionStartRequestData.ts b/project/src/models/eft/hideout/IHideoutContinuousProductionStartRequestData.ts index 34d63171..8598c7a2 100644 --- a/project/src/models/eft/hideout/IHideoutContinuousProductionStartRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutContinuousProductionStartRequestData.ts @@ -1,6 +1,6 @@ -export interface IHideoutContinuousProductionStartRequestData +export interface IHideoutContinuousProductionStartRequestData { - Action: "HideoutContinuousProductionStart" - recipeId: string - timestamp: number -} \ No newline at end of file + Action: "HideoutContinuousProductionStart"; + recipeId: string; + timestamp: number; +} diff --git a/project/src/models/eft/hideout/IHideoutImproveAreaRequestData.ts b/project/src/models/eft/hideout/IHideoutImproveAreaRequestData.ts index cdb45648..5c033735 100644 --- a/project/src/models/eft/hideout/IHideoutImproveAreaRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutImproveAreaRequestData.ts @@ -1,16 +1,16 @@ export interface IHideoutImproveAreaRequestData { - Action: "HideoutImproveArea" + Action: "HideoutImproveArea"; /** Hideout area id from areas.json */ - id: string - areaType: number - items: HideoutItem[] - timestamp: number + id: string; + areaType: number; + items: HideoutItem[]; + timestamp: number; } export interface HideoutItem { /** Hideout inventory id that was used by improvement action */ - id: string - count: number -} \ No newline at end of file + id: string; + count: number; +} diff --git a/project/src/models/eft/hideout/IHideoutProduction.ts b/project/src/models/eft/hideout/IHideoutProduction.ts index 0e103bc5..d1e474b1 100644 --- a/project/src/models/eft/hideout/IHideoutProduction.ts +++ b/project/src/models/eft/hideout/IHideoutProduction.ts @@ -1,27 +1,27 @@ -export interface IHideoutProduction +export interface IHideoutProduction { - _id: string - areaType: number - requirements: Requirement[] - productionTime: number - endProduct: string - isEncoded: boolean - locked: boolean - needFuelForAllProductionTime: boolean - continuous: boolean - count: number - productionLimitCount: number + _id: string; + areaType: number; + requirements: Requirement[]; + productionTime: number; + endProduct: string; + isEncoded: boolean; + locked: boolean; + needFuelForAllProductionTime: boolean; + continuous: boolean; + count: number; + productionLimitCount: number; } -export interface Requirement +export interface Requirement { - templateId?: string - count?: number - isEncoded?: boolean - isFunctional?: boolean - type: string - areaType?: number - requiredLevel?: number - resource?: number - questId?: string -} \ No newline at end of file + templateId?: string; + count?: number; + isEncoded?: boolean; + isFunctional?: boolean; + type: string; + areaType?: number; + requiredLevel?: number; + resource?: number; + questId?: string; +} diff --git a/project/src/models/eft/hideout/IHideoutPutItemInRequestData.ts b/project/src/models/eft/hideout/IHideoutPutItemInRequestData.ts index eaf6a754..6f31cea3 100644 --- a/project/src/models/eft/hideout/IHideoutPutItemInRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutPutItemInRequestData.ts @@ -1,13 +1,13 @@ export interface IHideoutPutItemInRequestData { - Action: "HideoutPutItemsInAreaSlots" - areaType: number - items: Record - timestamp: number + Action: "HideoutPutItemsInAreaSlots"; + areaType: number; + items: Record; + timestamp: number; } - -export interface ItemDetails + +export interface ItemDetails { - count: number - id: string -} \ No newline at end of file + count: number; + id: string; +} diff --git a/project/src/models/eft/hideout/IHideoutScavCase.ts b/project/src/models/eft/hideout/IHideoutScavCase.ts index f3e939e4..55dc1abd 100644 --- a/project/src/models/eft/hideout/IHideoutScavCase.ts +++ b/project/src/models/eft/hideout/IHideoutScavCase.ts @@ -1,23 +1,23 @@ import { MinMax } from "@spt-aki/models/common/MinMax"; -export interface IHideoutScavCase +export interface IHideoutScavCase { - _id: string - ProductionTime: number - Requirements: Requirement[] - EndProducts: EndProducts + _id: string; + ProductionTime: number; + Requirements: Requirement[]; + EndProducts: EndProducts; } -export interface Requirement +export interface Requirement { - templateId: string - count: number - isFunctional: boolean - type: string + templateId: string; + count: number; + isFunctional: boolean; + type: string; } - -export interface EndProducts + +export interface EndProducts { - Common: MinMax - Rare: MinMax - Superrare: MinMax + Common: MinMax; + Rare: MinMax; + Superrare: MinMax; } diff --git a/project/src/models/eft/hideout/IHideoutScavCaseStartRequestData.ts b/project/src/models/eft/hideout/IHideoutScavCaseStartRequestData.ts index 399efa0f..a97a5655 100644 --- a/project/src/models/eft/hideout/IHideoutScavCaseStartRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutScavCaseStartRequestData.ts @@ -1,20 +1,20 @@ -export interface IHideoutScavCaseStartRequestData +export interface IHideoutScavCaseStartRequestData { - Action: "HideoutScavCaseProductionStart" - recipeId: string - items: HideoutItem[] - tools: Tool[] - timestamp: number + Action: "HideoutScavCaseProductionStart"; + recipeId: string; + items: HideoutItem[]; + tools: Tool[]; + timestamp: number; } -export interface HideoutItem +export interface HideoutItem { - id: string - count: number + id: string; + count: number; } export interface Tool { - id: string - count: number -} \ No newline at end of file + id: string; + count: number; +} diff --git a/project/src/models/eft/hideout/IHideoutSettingsBase.ts b/project/src/models/eft/hideout/IHideoutSettingsBase.ts index f7a57ac8..8432cd43 100644 --- a/project/src/models/eft/hideout/IHideoutSettingsBase.ts +++ b/project/src/models/eft/hideout/IHideoutSettingsBase.ts @@ -1,7 +1,7 @@ -export interface IHideoutSettingsBase +export interface IHideoutSettingsBase { - generatorSpeedWithoutFuel: number - generatorFuelFlowRate: number - airFilterUnitFlowRate: number - gpuBoostRate: number -} \ No newline at end of file + generatorSpeedWithoutFuel: number; + generatorFuelFlowRate: number; + airFilterUnitFlowRate: number; + gpuBoostRate: number; +} diff --git a/project/src/models/eft/hideout/IHideoutSingleProductionStartRequestData.ts b/project/src/models/eft/hideout/IHideoutSingleProductionStartRequestData.ts index 11f86cad..b63bd356 100644 --- a/project/src/models/eft/hideout/IHideoutSingleProductionStartRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutSingleProductionStartRequestData.ts @@ -1,13 +1,13 @@ -export interface IHideoutSingleProductionStartRequestData +export interface IHideoutSingleProductionStartRequestData { - Action: "HideoutSingleProductionStart" - recipeId: string - items: Item[] - timestamp: number + Action: "HideoutSingleProductionStart"; + recipeId: string; + items: Item[]; + timestamp: number; } -export interface Item +export interface Item { - id: string - count: number -} \ No newline at end of file + id: string; + count: number; +} diff --git a/project/src/models/eft/hideout/IHideoutTakeItemOutRequestData.ts b/project/src/models/eft/hideout/IHideoutTakeItemOutRequestData.ts index d96e34c7..28577924 100644 --- a/project/src/models/eft/hideout/IHideoutTakeItemOutRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutTakeItemOutRequestData.ts @@ -1,7 +1,7 @@ -export interface IHideoutTakeItemOutRequestData +export interface IHideoutTakeItemOutRequestData { - Action: "HideoutTakeItemsFromAreaSlots" - areaType: number - slots: number[] - timestamp: number -} \ No newline at end of file + Action: "HideoutTakeItemsFromAreaSlots"; + areaType: number; + slots: number[]; + timestamp: number; +} diff --git a/project/src/models/eft/hideout/IHideoutTakeProductionRequestData.ts b/project/src/models/eft/hideout/IHideoutTakeProductionRequestData.ts index 19861322..33b94f78 100644 --- a/project/src/models/eft/hideout/IHideoutTakeProductionRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutTakeProductionRequestData.ts @@ -1,6 +1,6 @@ -export interface IHideoutTakeProductionRequestData +export interface IHideoutTakeProductionRequestData { - Action: "HideoutTakeProduction" - recipeId: string - timestamp: number -} \ No newline at end of file + Action: "HideoutTakeProduction"; + recipeId: string; + timestamp: number; +} diff --git a/project/src/models/eft/hideout/IHideoutToggleAreaRequestData.ts b/project/src/models/eft/hideout/IHideoutToggleAreaRequestData.ts index 9a9eb906..036c53b5 100644 --- a/project/src/models/eft/hideout/IHideoutToggleAreaRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutToggleAreaRequestData.ts @@ -1,7 +1,7 @@ -export interface IHideoutToggleAreaRequestData +export interface IHideoutToggleAreaRequestData { - Action: "HideoutToggleArea" - areaType: number - enabled: boolean - timestamp: number -} \ No newline at end of file + Action: "HideoutToggleArea"; + areaType: number; + enabled: boolean; + timestamp: number; +} diff --git a/project/src/models/eft/hideout/IHideoutUpgradeCompleteRequestData.ts b/project/src/models/eft/hideout/IHideoutUpgradeCompleteRequestData.ts index feef6bf1..5b12263d 100644 --- a/project/src/models/eft/hideout/IHideoutUpgradeCompleteRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutUpgradeCompleteRequestData.ts @@ -1,6 +1,6 @@ -export interface IHideoutUpgradeCompleteRequestData +export interface IHideoutUpgradeCompleteRequestData { - Action: "HideoutUpgradeComplete" - areaType: number - timestamp: number -} \ No newline at end of file + Action: "HideoutUpgradeComplete"; + areaType: number; + timestamp: number; +} diff --git a/project/src/models/eft/hideout/IHideoutUpgradeRequestData.ts b/project/src/models/eft/hideout/IHideoutUpgradeRequestData.ts index f5661eaf..4e6c03a2 100644 --- a/project/src/models/eft/hideout/IHideoutUpgradeRequestData.ts +++ b/project/src/models/eft/hideout/IHideoutUpgradeRequestData.ts @@ -1,13 +1,13 @@ -export interface IHideoutUpgradeRequestData +export interface IHideoutUpgradeRequestData { - Action: "HideoutUpgrade" - areaType: number - items: HideoutItem[] - timestamp: number + Action: "HideoutUpgrade"; + areaType: number; + items: HideoutItem[]; + timestamp: number; } -export interface HideoutItem +export interface HideoutItem { - count: number - id: string -} \ No newline at end of file + count: number; + id: string; +} diff --git a/project/src/models/eft/hideout/IQteData.ts b/project/src/models/eft/hideout/IQteData.ts index 3523d1ea..6f1f9e37 100644 --- a/project/src/models/eft/hideout/IQteData.ts +++ b/project/src/models/eft/hideout/IQteData.ts @@ -1,48 +1,48 @@ export interface IQteData { - Id: string - Type: string - Area: string - AreaLevel: number - QuickTimeEvents: IQuickTimeEvent[] - Requirements: IQteRequirement[] - Results: Record + Id: string; + Type: string; + Area: string; + AreaLevel: number; + QuickTimeEvents: IQuickTimeEvent[]; + Requirements: IQteRequirement[]; + Results: Record; } export interface IQuickTimeEvent { - Type: string - Position: number - StartDelay: number - EndDelay: number - Speed: number - SuccessRange: string - Key: string + Type: string; + Position: number; + StartDelay: number; + EndDelay: number; + Speed: number; + SuccessRange: string; + Key: string; } export interface IQteRequirement { - type: string + type: string; } export interface IQteResult { - Energy: number - Hydration: number - RewardsRange: IQteEffect[] + Energy: number; + Hydration: number; + RewardsRange: IQteEffect[]; } export interface IQteEffect { - Type: string - SkillId: string - levelMultipliers: ISkillLevelMultiplier[] - Time: number - Weight: number - Result: string + Type: string; + SkillId: string; + levelMultipliers: ISkillLevelMultiplier[]; + Time: number; + Weight: number; + Result: string; } export interface ISkillLevelMultiplier { - level: number - multiplier: number -} \ No newline at end of file + level: number; + multiplier: number; +} diff --git a/project/src/models/eft/hideout/IRecordShootingRangePoints.ts b/project/src/models/eft/hideout/IRecordShootingRangePoints.ts index 6367b02d..9a872848 100644 --- a/project/src/models/eft/hideout/IRecordShootingRangePoints.ts +++ b/project/src/models/eft/hideout/IRecordShootingRangePoints.ts @@ -1,5 +1,5 @@ export interface IRecordShootingRangePoints { - Action: "RecordShootingRangePoints" - points: number -} \ No newline at end of file + Action: "RecordShootingRangePoints"; + points: number; +} diff --git a/project/src/models/eft/httpResponse/IGetBodyResponseData.ts b/project/src/models/eft/httpResponse/IGetBodyResponseData.ts index 6a2e0f34..feff4081 100644 --- a/project/src/models/eft/httpResponse/IGetBodyResponseData.ts +++ b/project/src/models/eft/httpResponse/IGetBodyResponseData.ts @@ -1,6 +1,6 @@ -export interface IGetBodyResponseData +export interface IGetBodyResponseData { - err: number - errmsg: any - (data: Type): Type -} \ No newline at end of file + err: number; + errmsg: any; + (data: Type): Type; +} diff --git a/project/src/models/eft/httpResponse/INullResponseData.ts b/project/src/models/eft/httpResponse/INullResponseData.ts index 938c1f3d..72038291 100644 --- a/project/src/models/eft/httpResponse/INullResponseData.ts +++ b/project/src/models/eft/httpResponse/INullResponseData.ts @@ -1,6 +1,6 @@ -export interface INullResponseData +export interface INullResponseData { - err: number - errmsg: any - data: null -} \ No newline at end of file + err: number; + errmsg: any; + data: null; +} diff --git a/project/src/models/eft/inRaid/IInsuredItemsData.ts b/project/src/models/eft/inRaid/IInsuredItemsData.ts index 55367fd0..037c3308 100644 --- a/project/src/models/eft/inRaid/IInsuredItemsData.ts +++ b/project/src/models/eft/inRaid/IInsuredItemsData.ts @@ -1,7 +1,7 @@ -export interface IInsuredItemsData +export interface IInsuredItemsData { - id: string - durability?: number - maxDurability?: number - hits?: number -} \ No newline at end of file + id: string; + durability?: number; + maxDurability?: number; + hits?: number; +} diff --git a/project/src/models/eft/inRaid/IRegisterPlayerRequestData.ts b/project/src/models/eft/inRaid/IRegisterPlayerRequestData.ts index 24fb8a8b..bec81afa 100644 --- a/project/src/models/eft/inRaid/IRegisterPlayerRequestData.ts +++ b/project/src/models/eft/inRaid/IRegisterPlayerRequestData.ts @@ -1,6 +1,6 @@ -export interface IRegisterPlayerRequestData +export interface IRegisterPlayerRequestData { - crc: number - locationId: string - variantId: number -} \ No newline at end of file + crc: number; + locationId: string; + variantId: number; +} diff --git a/project/src/models/eft/inRaid/ISaveProgressRequestData.ts b/project/src/models/eft/inRaid/ISaveProgressRequestData.ts index 4defa3d9..cf9a8964 100644 --- a/project/src/models/eft/inRaid/ISaveProgressRequestData.ts +++ b/project/src/models/eft/inRaid/ISaveProgressRequestData.ts @@ -3,11 +3,11 @@ import { ISyncHealthRequestData } from "@spt-aki/models/eft/health/ISyncHealthRe import { IInsuredItemsData } from "@spt-aki/models/eft/inRaid/IInsuredItemsData"; import { PlayerRaidEndState } from "@spt-aki/models/enums/PlayerRaidEndState"; -export interface ISaveProgressRequestData +export interface ISaveProgressRequestData { - exit: PlayerRaidEndState // survived" | "killed" | "left" | "runner" | "missinginaction - profile: IPostRaidPmcData - isPlayerScav: boolean - health: ISyncHealthRequestData - insurance: IInsuredItemsData[] -} \ No newline at end of file + exit: PlayerRaidEndState; // survived" | "killed" | "left" | "runner" | "missinginaction + profile: IPostRaidPmcData; + isPlayerScav: boolean; + health: ISyncHealthRequestData; + insurance: IInsuredItemsData[]; +} diff --git a/project/src/models/eft/insurance/IGetInsuranceCostRequestData.ts b/project/src/models/eft/insurance/IGetInsuranceCostRequestData.ts index db4c7642..99ee41a6 100644 --- a/project/src/models/eft/insurance/IGetInsuranceCostRequestData.ts +++ b/project/src/models/eft/insurance/IGetInsuranceCostRequestData.ts @@ -1,5 +1,5 @@ -export interface IGetInsuranceCostRequestData +export interface IGetInsuranceCostRequestData { - traders: string[] - items: string[] -} \ No newline at end of file + traders: string[]; + items: string[]; +} diff --git a/project/src/models/eft/insurance/IGetInsuranceCostResponseData.ts b/project/src/models/eft/insurance/IGetInsuranceCostResponseData.ts index 5d29b2d0..4579fdbe 100644 --- a/project/src/models/eft/insurance/IGetInsuranceCostResponseData.ts +++ b/project/src/models/eft/insurance/IGetInsuranceCostResponseData.ts @@ -1 +1 @@ -export type IGetInsuranceCostResponseData = Record> \ No newline at end of file +export type IGetInsuranceCostResponseData = Record>; diff --git a/project/src/models/eft/insurance/IInsureRequestData.ts b/project/src/models/eft/insurance/IInsureRequestData.ts index 34bbd0d2..04b309bd 100644 --- a/project/src/models/eft/insurance/IInsureRequestData.ts +++ b/project/src/models/eft/insurance/IInsureRequestData.ts @@ -1,8 +1,8 @@ import { IBaseInteractionRequestData } from "@spt-aki/models/eft/common/request/IBaseInteractionRequestData"; -export interface IInsureRequestData extends IBaseInteractionRequestData +export interface IInsureRequestData extends IBaseInteractionRequestData { - Action: "Insure" - tid: string - items: string[] -} \ No newline at end of file + Action: "Insure"; + tid: string; + items: string[]; +} diff --git a/project/src/models/eft/inventory/IAddItemRequestData.ts b/project/src/models/eft/inventory/IAddItemRequestData.ts index f3bbd14a..8c615082 100644 --- a/project/src/models/eft/inventory/IAddItemRequestData.ts +++ b/project/src/models/eft/inventory/IAddItemRequestData.ts @@ -11,4 +11,4 @@ export interface AddItem isPreset?: boolean; // eslint-disable-next-line @typescript-eslint/naming-convention item_id: string; -} \ No newline at end of file +} diff --git a/project/src/models/eft/inventory/IAddItemTempObject.ts b/project/src/models/eft/inventory/IAddItemTempObject.ts index 3e910e28..762ca648 100644 --- a/project/src/models/eft/inventory/IAddItemTempObject.ts +++ b/project/src/models/eft/inventory/IAddItemTempObject.ts @@ -2,10 +2,10 @@ import { Item, Location } from "@spt-aki/models/eft/common/tables/IItem"; export interface IAddItemTempObject { - itemRef: Item - count: number - isPreset: boolean - location?: Location + itemRef: Item; + count: number; + isPreset: boolean; + location?: Location; // Container item will be placed in - stash or sorting table - containerId?: string -} \ No newline at end of file + containerId?: string; +} diff --git a/project/src/models/eft/inventory/IInventoryAddRequestData.ts b/project/src/models/eft/inventory/IInventoryAddRequestData.ts index 8d272f66..9ca991a4 100644 --- a/project/src/models/eft/inventory/IInventoryAddRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryAddRequestData.ts @@ -1,8 +1,11 @@ -import { Container, IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; +import { + Container, + IInventoryBaseActionRequestData, +} from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData +export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData { - Action: "Add" - item: string - container: Container -} \ No newline at end of file + Action: "Add"; + item: string; + container: Container; +} diff --git a/project/src/models/eft/inventory/IInventoryBaseActionRequestData.ts b/project/src/models/eft/inventory/IInventoryBaseActionRequestData.ts index 658999be..08882a63 100644 --- a/project/src/models/eft/inventory/IInventoryBaseActionRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryBaseActionRequestData.ts @@ -1,39 +1,38 @@ import { IBaseInteractionRequestData } from "@spt-aki/models/eft/common/request/IBaseInteractionRequestData"; -export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData +export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData { - } -export interface To +export interface To { - id: string - container: string - location?: ToLocation | number // Hack - isSearched?: boolean + id: string; + container: string; + location?: ToLocation | number; // Hack + isSearched?: boolean; } -export interface ToLocation +export interface ToLocation { - x: number - y: number - r: string - rotation?: string - isSearched: boolean + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; } -export interface Container +export interface Container { - id: string - container: string - location?: Location | number // Hack - BSG data object shows it as Location only + id: string; + container: string; + location?: Location | number; // Hack - BSG data object shows it as Location only } - -export interface Location + +export interface Location { - x: number - y: number - r: string - rotation?: string - isSearched: boolean -} \ No newline at end of file + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} diff --git a/project/src/models/eft/inventory/IInventoryBindRequestData.ts b/project/src/models/eft/inventory/IInventoryBindRequestData.ts index 4fbd2756..84beaaaf 100644 --- a/project/src/models/eft/inventory/IInventoryBindRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryBindRequestData.ts @@ -1,8 +1,8 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData +export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData { - Action: "Bind" - item: string - index: number -} \ No newline at end of file + Action: "Bind"; + item: string; + index: number; +} diff --git a/project/src/models/eft/inventory/IInventoryCreateMarkerRequestData.ts b/project/src/models/eft/inventory/IInventoryCreateMarkerRequestData.ts index 842d653d..aa72e56b 100644 --- a/project/src/models/eft/inventory/IInventoryCreateMarkerRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryCreateMarkerRequestData.ts @@ -1,16 +1,16 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData +export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData { - Action: "CreateMapMarker" - item: string - mapMarker: MapMarker + Action: "CreateMapMarker"; + item: string; + mapMarker: MapMarker; } -export interface MapMarker +export interface MapMarker { - Type: string - X: number - Y: number - Note: string -} \ No newline at end of file + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/project/src/models/eft/inventory/IInventoryDeleteMarkerRequestData.ts b/project/src/models/eft/inventory/IInventoryDeleteMarkerRequestData.ts index a606fa6b..676f0b53 100644 --- a/project/src/models/eft/inventory/IInventoryDeleteMarkerRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryDeleteMarkerRequestData.ts @@ -1,9 +1,9 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData +export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData { - Action: "DeleteMapMarker" - item: string - X: number - Y: number -} \ No newline at end of file + Action: "DeleteMapMarker"; + item: string; + X: number; + Y: number; +} diff --git a/project/src/models/eft/inventory/IInventoryEditMarkerRequestData.ts b/project/src/models/eft/inventory/IInventoryEditMarkerRequestData.ts index 8344c5a9..033cc88a 100644 --- a/project/src/models/eft/inventory/IInventoryEditMarkerRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryEditMarkerRequestData.ts @@ -1,18 +1,18 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData +export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData { - Action: "EditMapMarker" - item: string - X: number - Y: number - mapMarker: MapMarker + Action: "EditMapMarker"; + item: string; + X: number; + Y: number; + mapMarker: MapMarker; } -export interface MapMarker +export interface MapMarker { - Type: string - X: number - Y: number - Note: string -} \ No newline at end of file + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/project/src/models/eft/inventory/IInventoryExamineRequestData.ts b/project/src/models/eft/inventory/IInventoryExamineRequestData.ts index 722f48fd..aac6e4bd 100644 --- a/project/src/models/eft/inventory/IInventoryExamineRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryExamineRequestData.ts @@ -1,9 +1,9 @@ import { OwnerInfo } from "@spt-aki/models/eft/common/request/IBaseInteractionRequestData"; import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData +export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData { - Action: "Examine" - item: string - fromOwner: OwnerInfo -} \ No newline at end of file + Action: "Examine"; + item: string; + fromOwner: OwnerInfo; +} diff --git a/project/src/models/eft/inventory/IInventoryFoldRequestData.ts b/project/src/models/eft/inventory/IInventoryFoldRequestData.ts index 6005d864..971f630b 100644 --- a/project/src/models/eft/inventory/IInventoryFoldRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryFoldRequestData.ts @@ -1,8 +1,8 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData +export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData { - Action: "Fold" - item: string - value: boolean -} \ No newline at end of file + Action: "Fold"; + item: string; + value: boolean; +} diff --git a/project/src/models/eft/inventory/IInventoryMergeRequestData.ts b/project/src/models/eft/inventory/IInventoryMergeRequestData.ts index 543606fd..68626ceb 100644 --- a/project/src/models/eft/inventory/IInventoryMergeRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryMergeRequestData.ts @@ -1,8 +1,8 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData +export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData { - Action: "Merge" - item: string - with: string -} \ No newline at end of file + Action: "Merge"; + item: string; + with: string; +} diff --git a/project/src/models/eft/inventory/IInventoryMoveRequestData.ts b/project/src/models/eft/inventory/IInventoryMoveRequestData.ts index 45f3512b..cbf83d68 100644 --- a/project/src/models/eft/inventory/IInventoryMoveRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryMoveRequestData.ts @@ -1,8 +1,8 @@ import { IInventoryBaseActionRequestData, To } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData +export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData { - Action: "Move" - item: string - to: To -} \ No newline at end of file + Action: "Move"; + item: string; + to: To; +} diff --git a/project/src/models/eft/inventory/IInventoryReadEncyclopediaRequestData.ts b/project/src/models/eft/inventory/IInventoryReadEncyclopediaRequestData.ts index c0171450..eac2a581 100644 --- a/project/src/models/eft/inventory/IInventoryReadEncyclopediaRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryReadEncyclopediaRequestData.ts @@ -1,7 +1,7 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData +export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData { - Action: "ReadEncyclopedia" - ids: string[] -} \ No newline at end of file + Action: "ReadEncyclopedia"; + ids: string[]; +} diff --git a/project/src/models/eft/inventory/IInventoryRemoveRequestData.ts b/project/src/models/eft/inventory/IInventoryRemoveRequestData.ts index 97440f51..633734c8 100644 --- a/project/src/models/eft/inventory/IInventoryRemoveRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryRemoveRequestData.ts @@ -1,7 +1,7 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData +export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData { - Action: "Remove" - item: string -} \ No newline at end of file + Action: "Remove"; + item: string; +} diff --git a/project/src/models/eft/inventory/IInventorySortRequestData.ts b/project/src/models/eft/inventory/IInventorySortRequestData.ts index cf98346e..e72d6439 100644 --- a/project/src/models/eft/inventory/IInventorySortRequestData.ts +++ b/project/src/models/eft/inventory/IInventorySortRequestData.ts @@ -1,26 +1,26 @@ import { Upd } from "@spt-aki/models/eft/common/tables/IItem"; import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventorySortRequestData extends IInventoryBaseActionRequestData +export interface IInventorySortRequestData extends IInventoryBaseActionRequestData { - Action: "ApplyInventoryChanges" - changedItems: ChangedItem[] + Action: "ApplyInventoryChanges"; + changedItems: ChangedItem[]; } -export interface ChangedItem +export interface ChangedItem { - _id: string - _tpl: string - parentId: string - slotId: string - location: Location - upd: Upd + _id: string; + _tpl: string; + parentId: string; + slotId: string; + location: Location; + upd: Upd; } -export interface Location +export interface Location { - x: number - y: number - r: string - isSearched: boolean -} \ No newline at end of file + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/project/src/models/eft/inventory/IInventorySplitRequestData.ts b/project/src/models/eft/inventory/IInventorySplitRequestData.ts index f087c3c9..abb447f3 100644 --- a/project/src/models/eft/inventory/IInventorySplitRequestData.ts +++ b/project/src/models/eft/inventory/IInventorySplitRequestData.ts @@ -1,14 +1,16 @@ -import { Container, IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; +import { + Container, + IInventoryBaseActionRequestData, +} from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData +export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData { - Action: "Split" + Action: "Split"; /** Id of item to split */ - splitItem: string + splitItem: string; /** Id of new item stack */ - newItem: string + newItem: string; /** Destination new item will be placed in */ - container: Container - count: number + container: Container; + count: number; } - \ No newline at end of file diff --git a/project/src/models/eft/inventory/IInventorySwapRequestData.ts b/project/src/models/eft/inventory/IInventorySwapRequestData.ts index a78598c9..5d65f4d9 100644 --- a/project/src/models/eft/inventory/IInventorySwapRequestData.ts +++ b/project/src/models/eft/inventory/IInventorySwapRequestData.ts @@ -1,13 +1,13 @@ import { OwnerInfo } from "@spt-aki/models/eft/common/request/IBaseInteractionRequestData"; import { IInventoryBaseActionRequestData, To } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData +export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData { - Action: "Swap" - item: string - to: To - item2: string - to2: To - fromOwner2: OwnerInfo - toOwner2: OwnerInfo -} \ No newline at end of file + Action: "Swap"; + item: string; + to: To; + item2: string; + to2: To; + fromOwner2: OwnerInfo; + toOwner2: OwnerInfo; +} diff --git a/project/src/models/eft/inventory/IInventoryTagRequestData.ts b/project/src/models/eft/inventory/IInventoryTagRequestData.ts index 97f008f0..4843764e 100644 --- a/project/src/models/eft/inventory/IInventoryTagRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryTagRequestData.ts @@ -1,9 +1,9 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData +export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData { - Action: "Tag" - item: string - TagName: string - TagColor: number -} \ No newline at end of file + Action: "Tag"; + item: string; + TagName: string; + TagColor: number; +} diff --git a/project/src/models/eft/inventory/IInventoryToggleRequestData.ts b/project/src/models/eft/inventory/IInventoryToggleRequestData.ts index 2d5c3151..02e6c3c5 100644 --- a/project/src/models/eft/inventory/IInventoryToggleRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryToggleRequestData.ts @@ -1,8 +1,8 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData +export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData { - Action: "Toggle" - item: string - value: boolean -} \ No newline at end of file + Action: "Toggle"; + item: string; + value: boolean; +} diff --git a/project/src/models/eft/inventory/IInventoryTransferRequestData.ts b/project/src/models/eft/inventory/IInventoryTransferRequestData.ts index 18bdc9be..0a286e67 100644 --- a/project/src/models/eft/inventory/IInventoryTransferRequestData.ts +++ b/project/src/models/eft/inventory/IInventoryTransferRequestData.ts @@ -1,9 +1,9 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData +export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData { - Action: "Transfer" - item: string - with: string - count: number -} \ No newline at end of file + Action: "Transfer"; + item: string; + with: string; + count: number; +} diff --git a/project/src/models/eft/inventory/IOpenRandomLootContainerRequestData.ts b/project/src/models/eft/inventory/IOpenRandomLootContainerRequestData.ts index c292202f..589ff034 100644 --- a/project/src/models/eft/inventory/IOpenRandomLootContainerRequestData.ts +++ b/project/src/models/eft/inventory/IOpenRandomLootContainerRequestData.ts @@ -1,15 +1,15 @@ import { IInventoryBaseActionRequestData } from "@spt-aki/models/eft/inventory/IInventoryBaseActionRequestData"; -export interface IOpenRandomLootContainerRequestData extends IInventoryBaseActionRequestData +export interface IOpenRandomLootContainerRequestData extends IInventoryBaseActionRequestData { - Action: "OpenRandomLootContainer" + Action: "OpenRandomLootContainer"; /** Container item opened */ - item: string - to: To[] + item: string; + to: To[]; } export interface To { /** Player character (pmc/scav) id items will be sent to */ - id: string -} \ No newline at end of file + id: string; +} diff --git a/project/src/models/eft/itemEvent/IItemEventRouterBase.ts b/project/src/models/eft/itemEvent/IItemEventRouterBase.ts index 1256bfd4..d3ceeea1 100644 --- a/project/src/models/eft/itemEvent/IItemEventRouterBase.ts +++ b/project/src/models/eft/itemEvent/IItemEventRouterBase.ts @@ -7,93 +7,93 @@ import { EquipmentBuildType } from "@spt-aki/models/enums/EquipmentBuildType"; export interface IItemEventRouterBase { - warnings: Warning[] - profileChanges: TProfileChanges | "" + warnings: Warning[]; + profileChanges: TProfileChanges | ""; } -export type TProfileChanges = Record +export type TProfileChanges = Record; export interface Warning { - index: number - errmsg: string - code?: string - data?: any + index: number; + errmsg: string; + code?: string; + data?: any; } export interface ProfileChange { - _id: string - experience: number - quests: IQuest[] - ragFairOffers: IRagfairOffer[] - weaponBuilds: IWeaponBuildChange[] - equipmentBuilds: IEquipmentBuildChange[] - items: ItemChanges - production: Record + _id: string; + experience: number; + quests: IQuest[]; + ragFairOffers: IRagfairOffer[]; + weaponBuilds: IWeaponBuildChange[]; + equipmentBuilds: IEquipmentBuildChange[]; + items: ItemChanges; + production: Record; /** Hideout area improvement id */ - improvements: Record - skills: Skills - health: Health - traderRelations: Record - repeatableQuests?: IPmcDataRepeatableQuest[] - recipeUnlocked: Record - changedHideoutStashes?: Record - questsStatus: IQuestStatus[] + improvements: Record; + skills: Skills; + health: Health; + traderRelations: Record; + repeatableQuests?: IPmcDataRepeatableQuest[]; + recipeUnlocked: Record; + changedHideoutStashes?: Record; + questsStatus: IQuestStatus[]; } export interface IHideoutStashItem { - Id: string - Tpl: string + Id: string; + Tpl: string; } export interface IWeaponBuildChange { - id: string - name: string - root: string - items: Item[] + id: string; + name: string; + root: string; + items: Item[]; } export interface IEquipmentBuildChange { - id: string - name: string - root: string - items: Item[] - type: string - fastpanel: any[] - buildType: EquipmentBuildType + id: string; + name: string; + root: string; + items: Item[]; + type: string; + fastpanel: any[]; + buildType: EquipmentBuildType; } -export interface ItemChanges +export interface ItemChanges { - new: Product[] - change: Product[] - del: Product[] + new: Product[]; + change: Product[]; + del: Product[]; } export interface Improvement { - completed: boolean, - improveCompleteTimestamp: number + completed: boolean; + improveCompleteTimestamp: number; } export interface Product { - _id: string - _tpl?: string - parentId?: string - slotId?: string - location?: ItemChangeLocation - upd?: Upd + _id: string; + _tpl?: string; + parentId?: string; + slotId?: string; + location?: ItemChangeLocation; + upd?: Upd; } export interface ItemChangeLocation { - x: number, - y: number, - r: number, - isSearched?: boolean -} \ No newline at end of file + x: number; + y: number; + r: number; + isSearched?: boolean; +} diff --git a/project/src/models/eft/itemEvent/IItemEventRouterRequest.ts b/project/src/models/eft/itemEvent/IItemEventRouterRequest.ts index e685f9bf..4fd8eb7b 100644 --- a/project/src/models/eft/itemEvent/IItemEventRouterRequest.ts +++ b/project/src/models/eft/itemEvent/IItemEventRouterRequest.ts @@ -1,29 +1,28 @@ export interface IItemEventRouterRequest { - data: Daum[] - tm: number - reload: number + data: Daum[]; + tm: number; + reload: number; } - -export interface Daum + +export interface Daum { - Action: string - item: string - to: To + Action: string; + item: string; + to: To; } - -export interface To + +export interface To { - id: string - container: string - location?: Location + id: string; + container: string; + location?: Location; } - -export interface Location + +export interface Location { - x: number - y: number - r: string - isSearched: boolean + x: number; + y: number; + r: string; + isSearched: boolean; } - \ No newline at end of file diff --git a/project/src/models/eft/itemEvent/IItemEventRouterResponse.ts b/project/src/models/eft/itemEvent/IItemEventRouterResponse.ts index 8af4406b..459ddca1 100644 --- a/project/src/models/eft/itemEvent/IItemEventRouterResponse.ts +++ b/project/src/models/eft/itemEvent/IItemEventRouterResponse.ts @@ -1,4 +1,4 @@ import { IItemEventRouterBase } from "@spt-aki/models/eft/itemEvent/IItemEventRouterBase"; export interface IItemEventRouterResponse extends IItemEventRouterBase -{} \ No newline at end of file +{} diff --git a/project/src/models/eft/launcher/IChangeRequestData.ts b/project/src/models/eft/launcher/IChangeRequestData.ts index 71b306df..6257e992 100644 --- a/project/src/models/eft/launcher/IChangeRequestData.ts +++ b/project/src/models/eft/launcher/IChangeRequestData.ts @@ -2,5 +2,5 @@ import { ILoginRequestData } from "@spt-aki/models/eft/launcher/ILoginRequestDat export interface IChangeRequestData extends ILoginRequestData { - change: string, -} \ No newline at end of file + change: string; +} diff --git a/project/src/models/eft/launcher/IGetMiniProfileRequestData.ts b/project/src/models/eft/launcher/IGetMiniProfileRequestData.ts index 2aaefcb0..152ae360 100644 --- a/project/src/models/eft/launcher/IGetMiniProfileRequestData.ts +++ b/project/src/models/eft/launcher/IGetMiniProfileRequestData.ts @@ -1,5 +1,5 @@ -export interface IGetMiniProfileRequestData +export interface IGetMiniProfileRequestData { - username: string - password: string -} \ No newline at end of file + username: string; + password: string; +} diff --git a/project/src/models/eft/launcher/ILoginRequestData.ts b/project/src/models/eft/launcher/ILoginRequestData.ts index 79470936..c124b8ae 100644 --- a/project/src/models/eft/launcher/ILoginRequestData.ts +++ b/project/src/models/eft/launcher/ILoginRequestData.ts @@ -1,5 +1,5 @@ export interface ILoginRequestData { - username: string, - password: string -} \ No newline at end of file + username: string; + password: string; +} diff --git a/project/src/models/eft/launcher/IMiniProfile.ts b/project/src/models/eft/launcher/IMiniProfile.ts index af0acb45..41205298 100644 --- a/project/src/models/eft/launcher/IMiniProfile.ts +++ b/project/src/models/eft/launcher/IMiniProfile.ts @@ -1,17 +1,17 @@ -export interface IMiniProfile +export interface IMiniProfile { - username: string - nickname: string - side: string - currlvl: number - currexp: number - prevexp: number - nextlvl: number - maxlvl: number - akiData: AkiData + username: string; + nickname: string; + side: string; + currlvl: number; + currexp: number; + prevexp: number; + nextlvl: number; + maxlvl: number; + akiData: AkiData; } -export interface AkiData +export interface AkiData { - version: string -} \ No newline at end of file + version: string; +} diff --git a/project/src/models/eft/launcher/IRegisterData.ts b/project/src/models/eft/launcher/IRegisterData.ts index 55727493..c66e87f0 100644 --- a/project/src/models/eft/launcher/IRegisterData.ts +++ b/project/src/models/eft/launcher/IRegisterData.ts @@ -2,5 +2,5 @@ import { ILoginRequestData } from "@spt-aki/models/eft/launcher/ILoginRequestDat export interface IRegisterData extends ILoginRequestData { - edition: string -} \ No newline at end of file + edition: string; +} diff --git a/project/src/models/eft/launcher/IRemoveProfileData.ts b/project/src/models/eft/launcher/IRemoveProfileData.ts index b88f5b7e..f8a12f7b 100644 --- a/project/src/models/eft/launcher/IRemoveProfileData.ts +++ b/project/src/models/eft/launcher/IRemoveProfileData.ts @@ -1,3 +1,3 @@ import { ILoginRequestData } from "@spt-aki/models/eft/launcher/ILoginRequestData"; -export type IRemoveProfileData = ILoginRequestData \ No newline at end of file +export type IRemoveProfileData = ILoginRequestData; diff --git a/project/src/models/eft/location/IAirdropLootResult.ts b/project/src/models/eft/location/IAirdropLootResult.ts index 7e68e9ac..78d03c7b 100644 --- a/project/src/models/eft/location/IAirdropLootResult.ts +++ b/project/src/models/eft/location/IAirdropLootResult.ts @@ -2,6 +2,6 @@ import { LootItem } from "@spt-aki/models/spt/services/LootItem"; export interface IAirdropLootResult { - dropType: string - loot: LootItem[] -} \ No newline at end of file + dropType: string; + loot: LootItem[]; +} diff --git a/project/src/models/eft/location/IGetLocationRequestData.ts b/project/src/models/eft/location/IGetLocationRequestData.ts index 30ea52b0..c56dea96 100644 --- a/project/src/models/eft/location/IGetLocationRequestData.ts +++ b/project/src/models/eft/location/IGetLocationRequestData.ts @@ -1,6 +1,6 @@ -export interface IGetLocationRequestData +export interface IGetLocationRequestData { - crc: number - locationId: string - variantId: number -} \ No newline at end of file + crc: number; + locationId: string; + variantId: number; +} diff --git a/project/src/models/eft/match/IAcceptGroupInviteRequest.ts b/project/src/models/eft/match/IAcceptGroupInviteRequest.ts index d13f1691..eb670d39 100644 --- a/project/src/models/eft/match/IAcceptGroupInviteRequest.ts +++ b/project/src/models/eft/match/IAcceptGroupInviteRequest.ts @@ -1,4 +1,4 @@ export interface IAcceptGroupInviteRequest { - requestId: string -} \ No newline at end of file + requestId: string; +} diff --git a/project/src/models/eft/match/IAcceptGroupInviteResponse.ts b/project/src/models/eft/match/IAcceptGroupInviteResponse.ts index 8eaa0dbf..d525c761 100644 --- a/project/src/models/eft/match/IAcceptGroupInviteResponse.ts +++ b/project/src/models/eft/match/IAcceptGroupInviteResponse.ts @@ -1,19 +1,19 @@ export interface IAcceptGroupInviteResponse { - _id: string - aid: number - Info: PlayerInviteInfo - isLeader: boolean - isReady: boolean + _id: string; + aid: number; + Info: PlayerInviteInfo; + isLeader: boolean; + isReady: boolean; } export interface PlayerInviteInfo { - Nickname: string - Side: string - Level: number - MemberCategory: number - GameVersion: string - SavageLockTime: number - SavageNickname: string -} \ No newline at end of file + Nickname: string; + Side: string; + Level: number; + MemberCategory: number; + GameVersion: string; + SavageLockTime: number; + SavageNickname: string; +} diff --git a/project/src/models/eft/match/ICancelGroupInviteRequest.ts b/project/src/models/eft/match/ICancelGroupInviteRequest.ts index 6e6246c4..d2adf46d 100644 --- a/project/src/models/eft/match/ICancelGroupInviteRequest.ts +++ b/project/src/models/eft/match/ICancelGroupInviteRequest.ts @@ -1,4 +1,4 @@ export interface ICancelGroupInviteRequest { - requestId: string -} \ No newline at end of file + requestId: string; +} diff --git a/project/src/models/eft/match/ICreateGroupRequestData.ts b/project/src/models/eft/match/ICreateGroupRequestData.ts index 2cb7350a..dd99d1aa 100644 --- a/project/src/models/eft/match/ICreateGroupRequestData.ts +++ b/project/src/models/eft/match/ICreateGroupRequestData.ts @@ -2,7 +2,7 @@ import { RaidMode } from "@spt-aki/models/enums/RaidMode"; export interface ICreateGroupRequestData { - location: string - raidMode: RaidMode - startInGroup: boolean -} \ No newline at end of file + location: string; + raidMode: RaidMode; + startInGroup: boolean; +} diff --git a/project/src/models/eft/match/IEndOfflineRaidRequestData.ts b/project/src/models/eft/match/IEndOfflineRaidRequestData.ts index 18903b93..49e0a710 100644 --- a/project/src/models/eft/match/IEndOfflineRaidRequestData.ts +++ b/project/src/models/eft/match/IEndOfflineRaidRequestData.ts @@ -1,7 +1,7 @@ -export interface IEndOfflineRaidRequestData +export interface IEndOfflineRaidRequestData { - crc: number - exitStatus: string - exitName: string - raidSeconds: number + crc: number; + exitStatus: string; + exitName: string; + raidSeconds: number; } diff --git a/project/src/models/eft/match/IGetGroupStatusRequestData.ts b/project/src/models/eft/match/IGetGroupStatusRequestData.ts index b25fb8bf..b657a426 100644 --- a/project/src/models/eft/match/IGetGroupStatusRequestData.ts +++ b/project/src/models/eft/match/IGetGroupStatusRequestData.ts @@ -2,10 +2,10 @@ import { RaidMode } from "@spt-aki/models/enums/RaidMode"; export interface IGetGroupStatusRequestData { - location: string - savage: boolean - dt: string - keyId: string - raidMode: RaidMode - spawnPlace: string -} \ No newline at end of file + location: string; + savage: boolean; + dt: string; + keyId: string; + raidMode: RaidMode; + spawnPlace: string; +} diff --git a/project/src/models/eft/match/IGetProfileRequestData.ts b/project/src/models/eft/match/IGetProfileRequestData.ts index c2ec0a50..cb530bca 100644 --- a/project/src/models/eft/match/IGetProfileRequestData.ts +++ b/project/src/models/eft/match/IGetProfileRequestData.ts @@ -1,4 +1,4 @@ export interface IGetProfileRequestData { profileId: string; -} \ No newline at end of file +} diff --git a/project/src/models/eft/match/IGetRaidConfigurationRequestData.ts b/project/src/models/eft/match/IGetRaidConfigurationRequestData.ts index f01a2697..59a34fae 100644 --- a/project/src/models/eft/match/IGetRaidConfigurationRequestData.ts +++ b/project/src/models/eft/match/IGetRaidConfigurationRequestData.ts @@ -1,15 +1,15 @@ export interface IGetRaidConfigurationRequestData { - keyId: string - side: string - location: string - timeVariant: string - raidMode: string - metabolismDisabled: boolean - playersSpawnPlace: string - timeAndWeatherSettings: TimeAndWeatherSettings - botSettings: BotSettings - wavesSettings: WavesSettings + keyId: string; + side: string; + location: string; + timeVariant: string; + raidMode: string; + metabolismDisabled: boolean; + playersSpawnPlace: string; + timeAndWeatherSettings: TimeAndWeatherSettings; + botSettings: BotSettings; + wavesSettings: WavesSettings; } // { @@ -41,31 +41,29 @@ export interface IGetRaidConfigurationRequestData // "isTaggedAndCursed": false // } // } - export interface TimeAndWeatherSettings { - isRandomTime: boolean - isRandomWeather: boolean - cloudinessType: string - rainType: string - windType: string - fogType: string - timeFlowType: string - hourOfDay: number + isRandomTime: boolean; + isRandomWeather: boolean; + cloudinessType: string; + rainType: string; + windType: string; + fogType: string; + timeFlowType: string; + hourOfDay: number; } - + export interface BotSettings { - isScavWars: boolean - botAmount: string + isScavWars: boolean; + botAmount: string; } - + export interface WavesSettings { - botAmount: string - botDifficulty: string - isBosses: boolean - isTaggedAndCursed: boolean + botAmount: string; + botDifficulty: string; + isBosses: boolean; + isTaggedAndCursed: boolean; } - \ No newline at end of file diff --git a/project/src/models/eft/match/IJoinMatchRequestData.ts b/project/src/models/eft/match/IJoinMatchRequestData.ts index a937e870..4ec07d3f 100644 --- a/project/src/models/eft/match/IJoinMatchRequestData.ts +++ b/project/src/models/eft/match/IJoinMatchRequestData.ts @@ -1,12 +1,12 @@ export interface IJoinMatchRequestData { - groupid: string - servers: Server[] + groupid: string; + servers: Server[]; } export interface Server { - ping: number - ip: string - port: string -} \ No newline at end of file + ping: number; + ip: string; + port: string; +} diff --git a/project/src/models/eft/match/IJoinMatchResult.ts b/project/src/models/eft/match/IJoinMatchResult.ts index 916c9822..873bb0ee 100644 --- a/project/src/models/eft/match/IJoinMatchResult.ts +++ b/project/src/models/eft/match/IJoinMatchResult.ts @@ -1,22 +1,22 @@ export interface IJoinMatchResult { - maxPveCountExceeded: boolean - profiles: IJoinMatchPlayerProfile[] + maxPveCountExceeded: boolean; + profiles: IJoinMatchPlayerProfile[]; } export interface IJoinMatchPlayerProfile { - profileid: string - profileToken: string - status: string - sid: string - ip: string - port: number - version: string - location: string - raidMode: string - mode: string - shortid: string + profileid: string; + profileToken: string; + status: string; + sid: string; + ip: string; + port: number; + version: string; + location: string; + raidMode: string; + mode: string; + shortid: string; // eslint-disable-next-line @typescript-eslint/naming-convention - additional_info: any[] -} \ No newline at end of file + additional_info: any[]; +} diff --git a/project/src/models/eft/match/IPutMetricsRequestData.ts b/project/src/models/eft/match/IPutMetricsRequestData.ts index 5739e3c3..0fb57f0d 100644 --- a/project/src/models/eft/match/IPutMetricsRequestData.ts +++ b/project/src/models/eft/match/IPutMetricsRequestData.ts @@ -1,11 +1,11 @@ export interface IPutMetricsRequestData { - sid: string - settings: any - SharedSettings: any - HardwareDescription: any - Location: string - Metrics: any - ClientEvents: any - SpikeSamples: any[] -} \ No newline at end of file + sid: string; + settings: any; + SharedSettings: any; + HardwareDescription: any; + Location: string; + Metrics: any; + ClientEvents: any; + SpikeSamples: any[]; +} diff --git a/project/src/models/eft/match/IRemovePlayerFromGroupRequest.ts b/project/src/models/eft/match/IRemovePlayerFromGroupRequest.ts index d4a9d63e..6dcb7103 100644 --- a/project/src/models/eft/match/IRemovePlayerFromGroupRequest.ts +++ b/project/src/models/eft/match/IRemovePlayerFromGroupRequest.ts @@ -1,4 +1,4 @@ export interface IRemovePlayerFromGroupRequest { - aidToKick: string -} \ No newline at end of file + aidToKick: string; +} diff --git a/project/src/models/eft/match/ISendGroupInviteRequest.ts b/project/src/models/eft/match/ISendGroupInviteRequest.ts index a35d13bf..50e016ab 100644 --- a/project/src/models/eft/match/ISendGroupInviteRequest.ts +++ b/project/src/models/eft/match/ISendGroupInviteRequest.ts @@ -1,5 +1,5 @@ export interface ISendGroupInviteRequest { - to: string - inLobby: boolean -} \ No newline at end of file + to: string; + inLobby: boolean; +} diff --git a/project/src/models/eft/match/ITransferGroupRequest.ts b/project/src/models/eft/match/ITransferGroupRequest.ts index ed80a208..ad725553 100644 --- a/project/src/models/eft/match/ITransferGroupRequest.ts +++ b/project/src/models/eft/match/ITransferGroupRequest.ts @@ -1,4 +1,4 @@ export interface ITransferGroupRequest { - aidToChange: string -} \ No newline at end of file + aidToChange: string; +} diff --git a/project/src/models/eft/match/IUpdatePingRequestData.ts b/project/src/models/eft/match/IUpdatePingRequestData.ts index ff5ec41a..22ce549e 100644 --- a/project/src/models/eft/match/IUpdatePingRequestData.ts +++ b/project/src/models/eft/match/IUpdatePingRequestData.ts @@ -1,4 +1,4 @@ export interface IUpdatePingRequestData { - servers: any[] -} \ No newline at end of file + servers: any[]; +} diff --git a/project/src/models/eft/notes/INoteActionData.ts b/project/src/models/eft/notes/INoteActionData.ts index a36d405a..d2e71b0b 100644 --- a/project/src/models/eft/notes/INoteActionData.ts +++ b/project/src/models/eft/notes/INoteActionData.ts @@ -1,14 +1,14 @@ import { IBaseInteractionRequestData } from "@spt-aki/models/eft/common/request/IBaseInteractionRequestData"; -export interface INoteActionData extends IBaseInteractionRequestData +export interface INoteActionData extends IBaseInteractionRequestData { Action: string; index: number; note: INote; } -export interface INote +export interface INote { - Time: number - Text: string -} \ No newline at end of file + Time: number; + Text: string; +} diff --git a/project/src/models/eft/notifier/INotifier.ts b/project/src/models/eft/notifier/INotifier.ts index bd1b9c94..0031ed76 100644 --- a/project/src/models/eft/notifier/INotifier.ts +++ b/project/src/models/eft/notifier/INotifier.ts @@ -2,25 +2,24 @@ import { Message } from "@spt-aki/models/eft/profile/IAkiProfile"; export interface INotifierChannel { - server: string + server: string; // eslint-disable-next-line @typescript-eslint/naming-convention - channel_id: string, - url: string - notifierServer: string - ws: string + channel_id: string; + url: string; + notifierServer: string; + ws: string; } - export interface INotification { type: NotificationType; - eventId: string - dialogId?: string - message?: Message + eventId: string; + dialogId?: string; + message?: Message; } export enum NotificationType - { +{ RAGFAIR_OFFER_SOLD = "RagfairOfferSold", RAGFAIR_RATING_CHANGE = "RagfairRatingChange", /** ChatMessageReceived */ @@ -28,5 +27,5 @@ export enum NotificationType PING = "ping", TRADER_SUPPLY = "TraderSupply", TRADER_STANDING = "TraderStanding", - UNLOCK_TRADER = "UnlockTrader" -} \ No newline at end of file + UNLOCK_TRADER = "UnlockTrader", +} diff --git a/project/src/models/eft/notifier/ISelectProfileRequestData.ts b/project/src/models/eft/notifier/ISelectProfileRequestData.ts index 305f28a5..d5d8b98b 100644 --- a/project/src/models/eft/notifier/ISelectProfileRequestData.ts +++ b/project/src/models/eft/notifier/ISelectProfileRequestData.ts @@ -1,4 +1,4 @@ -export interface ISelectProfileRequestData +export interface ISelectProfileRequestData { - uid: string -} \ No newline at end of file + uid: string; +} diff --git a/project/src/models/eft/notifier/ISelectProfileResponse.ts b/project/src/models/eft/notifier/ISelectProfileResponse.ts index 64c56955..ae14c2c8 100644 --- a/project/src/models/eft/notifier/ISelectProfileResponse.ts +++ b/project/src/models/eft/notifier/ISelectProfileResponse.ts @@ -1,4 +1,4 @@ export interface ISelectProfileResponse { - status: string -} \ No newline at end of file + status: string; +} diff --git a/project/src/models/eft/player/IPlayerIncrementSkillLevelRequestData.ts b/project/src/models/eft/player/IPlayerIncrementSkillLevelRequestData.ts index ab1b2016..90b8dd56 100644 --- a/project/src/models/eft/player/IPlayerIncrementSkillLevelRequestData.ts +++ b/project/src/models/eft/player/IPlayerIncrementSkillLevelRequestData.ts @@ -1,27 +1,27 @@ import { Skills } from "@spt-aki/models/eft/common/tables/IBotBase"; -export interface IPlayerIncrementSkillLevelRequestData +export interface IPlayerIncrementSkillLevelRequestData { - _id: string - experience: number - quests: any[] - ragFairOffers: any[] - builds: any[] - items: Items - production: Production - skills: Skills - traderRelations: TraderRelations + _id: string; + experience: number; + quests: any[]; + ragFairOffers: any[]; + builds: any[]; + items: Items; + production: Production; + skills: Skills; + traderRelations: TraderRelations; } -export interface Items +export interface Items { - new: any[] - change: any[] - del: any[] + new: any[]; + change: any[]; + del: any[]; } -export interface Production -{ } +export interface Production +{} -export interface TraderRelations -{ } \ No newline at end of file +export interface TraderRelations +{} diff --git a/project/src/models/eft/presetBuild/IPresetBuildActionRequestData.ts b/project/src/models/eft/presetBuild/IPresetBuildActionRequestData.ts index eb623026..d7f2e765 100644 --- a/project/src/models/eft/presetBuild/IPresetBuildActionRequestData.ts +++ b/project/src/models/eft/presetBuild/IPresetBuildActionRequestData.ts @@ -1,10 +1,10 @@ import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -export interface IPresetBuildActionRequestData +export interface IPresetBuildActionRequestData { - Action: string - id: string - name: string - root: string - items: Item[] -} \ No newline at end of file + Action: string; + id: string; + name: string; + root: string; + items: Item[]; +} diff --git a/project/src/models/eft/presetBuild/IRemoveBuildRequestData.ts b/project/src/models/eft/presetBuild/IRemoveBuildRequestData.ts index d4fc8ff4..fdfa7768 100644 --- a/project/src/models/eft/presetBuild/IRemoveBuildRequestData.ts +++ b/project/src/models/eft/presetBuild/IRemoveBuildRequestData.ts @@ -1,5 +1,5 @@ export interface IRemoveBuildRequestData { - Action: "RemoveBuild" - id: string -} \ No newline at end of file + Action: "RemoveBuild"; + id: string; +} diff --git a/project/src/models/eft/profile/GetProfileStatusResponseData.ts b/project/src/models/eft/profile/GetProfileStatusResponseData.ts index 1b93cebe..8b6f6698 100644 --- a/project/src/models/eft/profile/GetProfileStatusResponseData.ts +++ b/project/src/models/eft/profile/GetProfileStatusResponseData.ts @@ -1,22 +1,22 @@ export interface GetProfileStatusResponseData { - maxPveCountExceeded: false, - profiles: ProfileData[] + maxPveCountExceeded: false; + profiles: ProfileData[]; } export interface ProfileData { - profileid: string - profileToken: string - status: string - ip: string - port: number - sid: string - version?: string - location?: string - raidMode?: string - mode?: string - shortId?: string + profileid: string; + profileToken: string; + status: string; + ip: string; + port: number; + sid: string; + version?: string; + location?: string; + raidMode?: string; + mode?: string; + shortId?: string; // eslint-disable-next-line @typescript-eslint/naming-convention - additional_info?: any[] -} \ No newline at end of file + additional_info?: any[]; +} diff --git a/project/src/models/eft/profile/IAkiProfile.ts b/project/src/models/eft/profile/IAkiProfile.ts index 0c41f890..a2b7e5be 100644 --- a/project/src/models/eft/profile/IAkiProfile.ts +++ b/project/src/models/eft/profile/IAkiProfile.ts @@ -6,18 +6,18 @@ import { MessageType } from "@spt-aki/models/enums/MessageType"; export interface IAkiProfile { - info: Info - characters: Characters + info: Info; + characters: Characters; /** Clothing purchases */ - suits: string[] - userbuilds: IUserBuilds - dialogues: Record - aki: Aki - vitality: Vitality - inraid: Inraid - insurance: Insurance[] + suits: string[]; + userbuilds: IUserBuilds; + dialogues: Record; + aki: Aki; + vitality: Vitality; + inraid: Inraid; + insurance: Insurance[]; /** Assort purchases made by player since last trader refresh */ - traderPurchases?: Record> + traderPurchases?: Record>; } export class TraderPurchaseData @@ -28,252 +28,252 @@ export class TraderPurchaseData export interface Info { - id: string - aid: number - username: string - password: string - wipe: boolean - edition: string + id: string; + aid: number; + username: string; + password: string; + wipe: boolean; + edition: string; } export interface Characters { - pmc: IPmcData - scav: IPmcData + pmc: IPmcData; + scav: IPmcData; } export interface IUserBuilds { - weaponBuilds: IWeaponBuild[], - equipmentBuilds: IEquipmentBuild[] + weaponBuilds: IWeaponBuild[]; + equipmentBuilds: IEquipmentBuild[]; } -export interface IWeaponBuild -{ - id: string - name: string - root: string - items: Item[] - type: string +export interface IWeaponBuild +{ + id: string; + name: string; + root: string; + items: Item[]; + type: string; } export interface IEquipmentBuild { - id: string, - name: string, - root: string, - items: Item[], // same as PMC inventory items - type: string, - fastPanel: Record - buildType: EquipmentBuildType + id: string; + name: string; + root: string; + items: Item[]; // same as PMC inventory items + type: string; + fastPanel: Record; + buildType: EquipmentBuildType; } export interface Dialogue { - attachmentsNew: number - type: MessageType - new: number - _id: string - Users?: IUserDialogInfo[] - pinned: boolean - messages: Message[] + attachmentsNew: number; + type: MessageType; + new: number; + _id: string; + Users?: IUserDialogInfo[]; + pinned: boolean; + messages: Message[]; } export interface IUserDialogInfo { - _id: string - info: IUserDialogDetails + _id: string; + info: IUserDialogDetails; } export interface IUserDialogDetails { - Nickname: string - Side: string - Level: number - MemberCategory: MemberCategory + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; } // @Cleanup: Maybe the same as Dialogue? export interface DialogueInfo { - attachmentsNew: number - new: number - _id: string - type: MessageType - pinned: boolean - Users?: IUserDialogInfo[] - message: MessagePreview + attachmentsNew: number; + new: number; + _id: string; + type: MessageType; + pinned: boolean; + Users?: IUserDialogInfo[]; + message: MessagePreview; } export interface Message { - _id: string - uid: string - type: MessageType - dt: number - UtcDateTime?: number - Member?: IUpdatableChatMember - templateId?: string - text?: string - hasRewards?: boolean - rewardCollected: boolean - items?: MessageItems - maxStorageTime?: number - systemData?: ISystemData - profileChangeEvents?: any[] + _id: string; + uid: string; + type: MessageType; + dt: number; + UtcDateTime?: number; + Member?: IUpdatableChatMember; + templateId?: string; + text?: string; + hasRewards?: boolean; + rewardCollected: boolean; + items?: MessageItems; + maxStorageTime?: number; + systemData?: ISystemData; + profileChangeEvents?: any[]; } export interface MessagePreview { - uid: string - type: MessageType - dt: number - templateId: string - text?: string - systemData?: ISystemData + uid: string; + type: MessageType; + dt: number; + templateId: string; + text?: string; + systemData?: ISystemData; } export interface MessageItems { - stash?: string - data?: Item[] + stash?: string; + data?: Item[]; } export interface ISystemData { - date?: string - time?: string - location?: string - buyerNickname?: string - soldItem?: string - itemCount?: number + date?: string; + time?: string; + location?: string; + buyerNickname?: string; + soldItem?: string; + itemCount?: number; } export interface IUpdatableChatMember { - Nickname: string - Side: string - Level: number - MemberCategory: MemberCategory - Ignored: boolean - Banned: boolean + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; + Ignored: boolean; + Banned: boolean; } export interface DateTime { - date: string - time: string + date: string; + time: string; } export interface Aki { - version: string - mods?: ModDetails[] - receivedGifts: ReceivedGift[] + version: string; + mods?: ModDetails[]; + receivedGifts: ReceivedGift[]; } export interface ModDetails { - name: string - version: string - author: string - dateAdded: number + name: string; + version: string; + author: string; + dateAdded: number; } export interface ReceivedGift { - giftId: string - timestampAccepted: number + giftId: string; + timestampAccepted: number; } export interface Vitality { - health: Health - effects: Effects + health: Health; + effects: Effects; } export interface Health { - Hydration: number - Energy: number - Temperature: number - Head: number - Chest: number - Stomach: number - LeftArm: number - RightArm: number - LeftLeg: number - RightLeg: number + Hydration: number; + Energy: number; + Temperature: number; + Head: number; + Chest: number; + Stomach: number; + LeftArm: number; + RightArm: number; + LeftLeg: number; + RightLeg: number; } export interface Effects { - Head: Head - Chest: Chest - Stomach: Stomach - LeftArm: LeftArm - RightArm: RightArm - LeftLeg: LeftLeg - RightLeg: RightLeg + Head: Head; + Chest: Chest; + Stomach: Stomach; + LeftArm: LeftArm; + RightArm: RightArm; + LeftLeg: LeftLeg; + RightLeg: RightLeg; } -export interface Head -{ } +export interface Head +{} -export interface Chest -{ } +export interface Chest +{} -export interface Stomach -{ } +export interface Stomach +{} -export interface LeftArm +export interface LeftArm { - Fracture?: number + Fracture?: number; } -export interface RightArm +export interface RightArm { - Fracture?: number + Fracture?: number; } -export interface LeftLeg +export interface LeftLeg { - Fracture?: number + Fracture?: number; } -export interface RightLeg +export interface RightLeg { - Fracture?: number + Fracture?: number; } export interface Inraid { - location: string - character: string + location: string; + character: string; } export interface Insurance { - scheduledTime: number - traderId: string - messageContent: MessageContent - items: Item[] + scheduledTime: number; + traderId: string; + messageContent: MessageContent; + items: Item[]; } export interface MessageContent { - ragfair?: MessageContentRagfair - text?: string - templateId: string - type: MessageType - maxStorageTime?: number - profileChangeEvents?: any[] - systemData?: ISystemData + ragfair?: MessageContentRagfair; + text?: string; + templateId: string; + type: MessageType; + maxStorageTime?: number; + profileChangeEvents?: any[]; + systemData?: ISystemData; } -export interface MessageContentRagfair +export interface MessageContentRagfair { - offerId: string - count: number - handbookId: string -} \ No newline at end of file + offerId: string; + count: number; + handbookId: string; +} diff --git a/project/src/models/eft/profile/IConnectResponse.ts b/project/src/models/eft/profile/IConnectResponse.ts index e1ead5d4..54a561ac 100644 --- a/project/src/models/eft/profile/IConnectResponse.ts +++ b/project/src/models/eft/profile/IConnectResponse.ts @@ -1,7 +1,7 @@ export interface IConnectResponse { - backendUrl: string, - name: string, - editions: string[], - profileDescriptions: Record -} \ No newline at end of file + backendUrl: string; + name: string; + editions: string[]; + profileDescriptions: Record; +} diff --git a/project/src/models/eft/profile/IGetProfileSettingsRequest.ts b/project/src/models/eft/profile/IGetProfileSettingsRequest.ts index fa8e385d..0743d19b 100644 --- a/project/src/models/eft/profile/IGetProfileSettingsRequest.ts +++ b/project/src/models/eft/profile/IGetProfileSettingsRequest.ts @@ -1,4 +1,4 @@ export interface IGetProfileSettingsRequest { - squadInviteRestriction: boolean -} \ No newline at end of file + squadInviteRestriction: boolean; +} diff --git a/project/src/models/eft/profile/IProfileChangeNicknameRequestData.ts b/project/src/models/eft/profile/IProfileChangeNicknameRequestData.ts index 6bea622d..4538e42f 100644 --- a/project/src/models/eft/profile/IProfileChangeNicknameRequestData.ts +++ b/project/src/models/eft/profile/IProfileChangeNicknameRequestData.ts @@ -1,4 +1,4 @@ -export interface IProfileChangeNicknameRequestData +export interface IProfileChangeNicknameRequestData { - nickname: string -} \ No newline at end of file + nickname: string; +} diff --git a/project/src/models/eft/profile/IProfileChangeVoiceRequestData.ts b/project/src/models/eft/profile/IProfileChangeVoiceRequestData.ts index bd238354..b3654893 100644 --- a/project/src/models/eft/profile/IProfileChangeVoiceRequestData.ts +++ b/project/src/models/eft/profile/IProfileChangeVoiceRequestData.ts @@ -1,4 +1,4 @@ -export interface IProfileChangeVoiceRequestData +export interface IProfileChangeVoiceRequestData { - voice: string -} \ No newline at end of file + voice: string; +} diff --git a/project/src/models/eft/profile/IProfileCreateRequestData.ts b/project/src/models/eft/profile/IProfileCreateRequestData.ts index 21308a81..1c9a266b 100644 --- a/project/src/models/eft/profile/IProfileCreateRequestData.ts +++ b/project/src/models/eft/profile/IProfileCreateRequestData.ts @@ -1,7 +1,7 @@ -export interface IProfileCreateRequestData +export interface IProfileCreateRequestData { - side: string - nickname: string - headId: string - voiceId: string -} \ No newline at end of file + side: string; + nickname: string; + headId: string; + voiceId: string; +} diff --git a/project/src/models/eft/profile/ISearchFriendRequestData.ts b/project/src/models/eft/profile/ISearchFriendRequestData.ts index abbd540b..95e12c4b 100644 --- a/project/src/models/eft/profile/ISearchFriendRequestData.ts +++ b/project/src/models/eft/profile/ISearchFriendRequestData.ts @@ -1,4 +1,4 @@ export interface ISearchFriendRequestData { - nickname: string -} \ No newline at end of file + nickname: string; +} diff --git a/project/src/models/eft/profile/ISearchFriendResponse.ts b/project/src/models/eft/profile/ISearchFriendResponse.ts index 999bb178..dfb1676a 100644 --- a/project/src/models/eft/profile/ISearchFriendResponse.ts +++ b/project/src/models/eft/profile/ISearchFriendResponse.ts @@ -1,13 +1,12 @@ export interface ISearchFriendResponse { - _id: string - Info: Info + _id: string; + Info: Info; } - + export interface Info { - Nickname: string - Side: string - Level: number + Nickname: string; + Side: string; + Level: number; } - \ No newline at end of file diff --git a/project/src/models/eft/profile/IValidateNicknameRequestData.ts b/project/src/models/eft/profile/IValidateNicknameRequestData.ts index a93d4754..9807d254 100644 --- a/project/src/models/eft/profile/IValidateNicknameRequestData.ts +++ b/project/src/models/eft/profile/IValidateNicknameRequestData.ts @@ -1,4 +1,4 @@ -export interface IValidateNicknameRequestData +export interface IValidateNicknameRequestData { - nickname: string -} \ No newline at end of file + nickname: string; +} diff --git a/project/src/models/eft/quests/IAcceptQuestRequestData.ts b/project/src/models/eft/quests/IAcceptQuestRequestData.ts index 5abaa204..327c52ca 100644 --- a/project/src/models/eft/quests/IAcceptQuestRequestData.ts +++ b/project/src/models/eft/quests/IAcceptQuestRequestData.ts @@ -1,6 +1,6 @@ -export interface IAcceptQuestRequestData +export interface IAcceptQuestRequestData { - Action: "QuestAccept" - qid: string - type: string -} \ No newline at end of file + Action: "QuestAccept"; + qid: string; + type: string; +} diff --git a/project/src/models/eft/quests/ICompleteQuestRequestData.ts b/project/src/models/eft/quests/ICompleteQuestRequestData.ts index 5ab37aca..9886c81e 100644 --- a/project/src/models/eft/quests/ICompleteQuestRequestData.ts +++ b/project/src/models/eft/quests/ICompleteQuestRequestData.ts @@ -1,8 +1,8 @@ -export interface ICompleteQuestRequestData +export interface ICompleteQuestRequestData { - Action: string + Action: string; /** Quest Id */ - qid: string - removeExcessItems: boolean -} \ No newline at end of file + qid: string; + removeExcessItems: boolean; +} diff --git a/project/src/models/eft/quests/IFailQuestRequestData.ts b/project/src/models/eft/quests/IFailQuestRequestData.ts index 86d379a9..9beb44f5 100644 --- a/project/src/models/eft/quests/IFailQuestRequestData.ts +++ b/project/src/models/eft/quests/IFailQuestRequestData.ts @@ -1,6 +1,6 @@ -export interface IFailQuestRequestData +export interface IFailQuestRequestData { - Action: "QuestComplete" - qid: string - removeExcessItems: boolean -} \ No newline at end of file + Action: "QuestComplete"; + qid: string; + removeExcessItems: boolean; +} diff --git a/project/src/models/eft/quests/IHandoverQuestRequestData.ts b/project/src/models/eft/quests/IHandoverQuestRequestData.ts index df0e0f07..4543cd37 100644 --- a/project/src/models/eft/quests/IHandoverQuestRequestData.ts +++ b/project/src/models/eft/quests/IHandoverQuestRequestData.ts @@ -1,13 +1,13 @@ -export interface IHandoverQuestRequestData +export interface IHandoverQuestRequestData { - Action: "QuestHandover" - qid: string - conditionId: string - items: Item[] + Action: "QuestHandover"; + qid: string; + conditionId: string; + items: Item[]; } -export interface Item +export interface Item { - id: string - count: number -} \ No newline at end of file + id: string; + count: number; +} diff --git a/project/src/models/eft/quests/IListQuestsRequestData.ts b/project/src/models/eft/quests/IListQuestsRequestData.ts index 1ed88298..0598751e 100644 --- a/project/src/models/eft/quests/IListQuestsRequestData.ts +++ b/project/src/models/eft/quests/IListQuestsRequestData.ts @@ -1,4 +1,4 @@ -export interface IListQuestsRequestData +export interface IListQuestsRequestData { - completed: boolean -} \ No newline at end of file + completed: boolean; +} diff --git a/project/src/models/eft/quests/IRepeatableQuestChangeRequest.ts b/project/src/models/eft/quests/IRepeatableQuestChangeRequest.ts index ab08bdb0..58dc2140 100644 --- a/project/src/models/eft/quests/IRepeatableQuestChangeRequest.ts +++ b/project/src/models/eft/quests/IRepeatableQuestChangeRequest.ts @@ -1,5 +1,5 @@ export interface IRepeatableQuestChangeRequest { - Action: "RepeatableQuestChange" - qid: string -} \ No newline at end of file + Action: "RepeatableQuestChange"; + qid: string; +} diff --git a/project/src/models/eft/ragfair/IAddOfferRequestData.ts b/project/src/models/eft/ragfair/IAddOfferRequestData.ts index e08e64c5..18376a3a 100644 --- a/project/src/models/eft/ragfair/IAddOfferRequestData.ts +++ b/project/src/models/eft/ragfair/IAddOfferRequestData.ts @@ -1,16 +1,16 @@ -export interface IAddOfferRequestData +export interface IAddOfferRequestData { - Action: string - sellInOnePiece: boolean - items: string[] - requirements: Requirement[] + Action: string; + sellInOnePiece: boolean; + items: string[]; + requirements: Requirement[]; } -export interface Requirement +export interface Requirement { - _tpl: string - count: number - level: number - side: number - onlyFunctional: boolean -} \ No newline at end of file + _tpl: string; + count: number; + level: number; + side: number; + onlyFunctional: boolean; +} diff --git a/project/src/models/eft/ragfair/IExtendOfferRequestData.ts b/project/src/models/eft/ragfair/IExtendOfferRequestData.ts index 2359aa68..116ddebc 100644 --- a/project/src/models/eft/ragfair/IExtendOfferRequestData.ts +++ b/project/src/models/eft/ragfair/IExtendOfferRequestData.ts @@ -1,5 +1,5 @@ -export interface IExtendOfferRequestData +export interface IExtendOfferRequestData { - offerId: string - renewalTime: number -} \ No newline at end of file + offerId: string; + renewalTime: number; +} diff --git a/project/src/models/eft/ragfair/IGetItemPriceResult.ts b/project/src/models/eft/ragfair/IGetItemPriceResult.ts index 7e33d73e..0bb80f2b 100644 --- a/project/src/models/eft/ragfair/IGetItemPriceResult.ts +++ b/project/src/models/eft/ragfair/IGetItemPriceResult.ts @@ -2,5 +2,5 @@ import { MinMax } from "@spt-aki/models/common/MinMax"; export interface IGetItemPriceResult extends MinMax { - avg: number -} \ No newline at end of file + avg: number; +} diff --git a/project/src/models/eft/ragfair/IGetMarketPriceRequestData.ts b/project/src/models/eft/ragfair/IGetMarketPriceRequestData.ts index ca64aa0c..17b20561 100644 --- a/project/src/models/eft/ragfair/IGetMarketPriceRequestData.ts +++ b/project/src/models/eft/ragfair/IGetMarketPriceRequestData.ts @@ -1,4 +1,4 @@ export interface IGetMarketPriceRequestData { - templateId: string -} \ No newline at end of file + templateId: string; +} diff --git a/project/src/models/eft/ragfair/IGetOffersResult.ts b/project/src/models/eft/ragfair/IGetOffersResult.ts index e5a3d968..983680dd 100644 --- a/project/src/models/eft/ragfair/IGetOffersResult.ts +++ b/project/src/models/eft/ragfair/IGetOffersResult.ts @@ -1,9 +1,9 @@ import { IRagfairOffer } from "@spt-aki/models/eft/ragfair/IRagfairOffer"; -export interface IGetOffersResult +export interface IGetOffersResult { - categories?: Record - offers: IRagfairOffer[] - offersCount: number - selectedCategory: string -} \ No newline at end of file + categories?: Record; + offers: IRagfairOffer[]; + offersCount: number; + selectedCategory: string; +} diff --git a/project/src/models/eft/ragfair/IRagfairOffer.ts b/project/src/models/eft/ragfair/IRagfairOffer.ts index 100602c8..3ef94492 100644 --- a/project/src/models/eft/ragfair/IRagfairOffer.ts +++ b/project/src/models/eft/ragfair/IRagfairOffer.ts @@ -1,54 +1,54 @@ import { Item } from "@spt-aki/models/eft/common/tables/IItem"; import { MemberCategory } from "@spt-aki/models/enums/MemberCategory"; -export interface IRagfairOffer +export interface IRagfairOffer { - sellResult?: SellResult[] - _id: string - items: Item[] - requirements: OfferRequirement[] - root: string - intId: number + sellResult?: SellResult[]; + _id: string; + items: Item[]; + requirements: OfferRequirement[]; + root: string; + intId: number; /** Handbook price */ - itemsCost: number + itemsCost: number; /** Rouble price */ - requirementsCost: number - startTime: number - endTime: number - sellInOnePiece: boolean - loyaltyLevel: number - buyRestrictionMax?: number - buyRestrictionCurrent?: number - locked: boolean - unlimitedCount: boolean + requirementsCost: number; + startTime: number; + endTime: number; + sellInOnePiece: boolean; + loyaltyLevel: number; + buyRestrictionMax?: number; + buyRestrictionCurrent?: number; + locked: boolean; + unlimitedCount: boolean; /** Rouble price */ - summaryCost: number - user: IRagfairOfferUser - notAvailable: boolean + summaryCost: number; + user: IRagfairOfferUser; + notAvailable: boolean; /** TODO - implement this value - not currently used */ - CurrentItemCount: number - priority: boolean + CurrentItemCount: number; + priority: boolean; } -export interface OfferRequirement +export interface OfferRequirement { - _tpl: string - count: number - onlyFunctional: boolean + _tpl: string; + count: number; + onlyFunctional: boolean; } -export interface IRagfairOfferUser +export interface IRagfairOfferUser { - id: string - nickname?: string - rating?: number - memberType: MemberCategory - avatar?: string - isRatingGrowing?: boolean + id: string; + nickname?: string; + rating?: number; + memberType: MemberCategory; + avatar?: string; + isRatingGrowing?: boolean; } export interface SellResult { - sellTime: number - amount: number -} \ No newline at end of file + sellTime: number; + amount: number; +} diff --git a/project/src/models/eft/ragfair/IRemoveOfferRequestData.ts b/project/src/models/eft/ragfair/IRemoveOfferRequestData.ts index 576bd991..6bb8d2d3 100644 --- a/project/src/models/eft/ragfair/IRemoveOfferRequestData.ts +++ b/project/src/models/eft/ragfair/IRemoveOfferRequestData.ts @@ -1,5 +1,5 @@ -export interface IRemoveOfferRequestData +export interface IRemoveOfferRequestData { - Action: string - offerId: string -} \ No newline at end of file + Action: string; + offerId: string; +} diff --git a/project/src/models/eft/ragfair/ISearchRequestData.ts b/project/src/models/eft/ragfair/ISearchRequestData.ts index 155e4a54..8f11fe9f 100644 --- a/project/src/models/eft/ragfair/ISearchRequestData.ts +++ b/project/src/models/eft/ragfair/ISearchRequestData.ts @@ -2,37 +2,37 @@ import { RagfairSort } from "@spt-aki/models/enums/RagfairSort"; export interface ISearchRequestData { - page: number - limit: number - sortType: RagfairSort - sortDirection: number - currency: number - priceFrom: number - priceTo: number - quantityFrom: number - quantityTo: number - conditionFrom: number - conditionTo: number - oneHourExpiration: boolean - removeBartering: boolean - offerOwnerType: OfferOwnerType - onlyFunctional: boolean - updateOfferCount: boolean - handbookId: string - linkedSearchId: string - neededSearchId: string - buildItems: BuildItems - buildCount: number - tm: number - reload: number + page: number; + limit: number; + sortType: RagfairSort; + sortDirection: number; + currency: number; + priceFrom: number; + priceTo: number; + quantityFrom: number; + quantityTo: number; + conditionFrom: number; + conditionTo: number; + oneHourExpiration: boolean; + removeBartering: boolean; + offerOwnerType: OfferOwnerType; + onlyFunctional: boolean; + updateOfferCount: boolean; + handbookId: string; + linkedSearchId: string; + neededSearchId: string; + buildItems: BuildItems; + buildCount: number; + tm: number; + reload: number; } export enum OfferOwnerType - { +{ ANYOWNERTYPE = 0, TRADEROWNERTYPE = 1, - PLAYEROWNERTYPE = 2 + PLAYEROWNERTYPE = 2, } - -export interface BuildItems -{} \ No newline at end of file + +export interface BuildItems +{} diff --git a/project/src/models/eft/ragfair/ISendRagfairReportRequestData.ts b/project/src/models/eft/ragfair/ISendRagfairReportRequestData.ts index 09e17e72..f9deffa9 100644 --- a/project/src/models/eft/ragfair/ISendRagfairReportRequestData.ts +++ b/project/src/models/eft/ragfair/ISendRagfairReportRequestData.ts @@ -1,4 +1,4 @@ export interface ISendRagfairReportRequestData { - offerId: number -} \ No newline at end of file + offerId: number; +} diff --git a/project/src/models/eft/ragfair/IStorePlayerOfferTaxAmountRequestData.ts b/project/src/models/eft/ragfair/IStorePlayerOfferTaxAmountRequestData.ts index 89b22194..67aed9a5 100644 --- a/project/src/models/eft/ragfair/IStorePlayerOfferTaxAmountRequestData.ts +++ b/project/src/models/eft/ragfair/IStorePlayerOfferTaxAmountRequestData.ts @@ -1,7 +1,7 @@ export interface IStorePlayerOfferTaxAmountRequestData { - id: string - tpl: string - count: number - fee: number -} \ No newline at end of file + id: string; + tpl: string; + count: number; + fee: number; +} diff --git a/project/src/models/eft/repair/IBaseRepairActionDataRequest.ts b/project/src/models/eft/repair/IBaseRepairActionDataRequest.ts index e01e536b..67fe317f 100644 --- a/project/src/models/eft/repair/IBaseRepairActionDataRequest.ts +++ b/project/src/models/eft/repair/IBaseRepairActionDataRequest.ts @@ -1,4 +1,4 @@ export interface IBaseRepairActionDataRequest { - Action: string -} \ No newline at end of file + Action: string; +} diff --git a/project/src/models/eft/repair/IRepairActionDataRequest.ts b/project/src/models/eft/repair/IRepairActionDataRequest.ts index ad56e1f4..f22750a3 100644 --- a/project/src/models/eft/repair/IRepairActionDataRequest.ts +++ b/project/src/models/eft/repair/IRepairActionDataRequest.ts @@ -2,13 +2,13 @@ import { IBaseRepairActionDataRequest } from "@spt-aki/models/eft/repair/IBaseRe export interface IRepairActionDataRequest extends IBaseRepairActionDataRequest { - Action: "Repair" - repairKitsInfo: RepairKitsInfo[] - target: string // item to repair + Action: "Repair"; + repairKitsInfo: RepairKitsInfo[]; + target: string; // item to repair } export interface RepairKitsInfo { - _id: string // id of repair kit to use - count: number // amout of units to reduce kit by -} \ No newline at end of file + _id: string; // id of repair kit to use + count: number; // amout of units to reduce kit by +} diff --git a/project/src/models/eft/repair/ITraderRepairActionDataRequest.ts b/project/src/models/eft/repair/ITraderRepairActionDataRequest.ts index 586b177f..6aa6f5b5 100644 --- a/project/src/models/eft/repair/ITraderRepairActionDataRequest.ts +++ b/project/src/models/eft/repair/ITraderRepairActionDataRequest.ts @@ -2,13 +2,13 @@ import { IBaseRepairActionDataRequest } from "@spt-aki/models/eft/repair/IBaseRe export interface ITraderRepairActionDataRequest extends IBaseRepairActionDataRequest { - Action: "TraderRepair" - tid: string - repairItems: RepairItem[] + Action: "TraderRepair"; + tid: string; + repairItems: RepairItem[]; } - + export interface RepairItem { - _id: string - count: number -} \ No newline at end of file + _id: string; + count: number; +} diff --git a/project/src/models/eft/trade/IProcessBaseTradeRequestData.ts b/project/src/models/eft/trade/IProcessBaseTradeRequestData.ts index 5a93a75f..2d59e790 100644 --- a/project/src/models/eft/trade/IProcessBaseTradeRequestData.ts +++ b/project/src/models/eft/trade/IProcessBaseTradeRequestData.ts @@ -1,6 +1,6 @@ -export interface IProcessBaseTradeRequestData +export interface IProcessBaseTradeRequestData { - Action: string - type: string - tid: string -} \ No newline at end of file + Action: string; + type: string; + tid: string; +} diff --git a/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts b/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts index 36a03db6..d8663ebb 100644 --- a/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts +++ b/project/src/models/eft/trade/IProcessBuyTradeRequestData.ts @@ -1,21 +1,20 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { IProcessBaseTradeRequestData } from "@spt-aki/models/eft/trade/IProcessBaseTradeRequestData"; -export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData +export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { - Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | "" | "SptInsure" | "SptRepair" - type: string - tid: string - item_id: string - count: number - scheme_id: number - scheme_items: SchemeItem[] + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | "" | "SptInsure" | "SptRepair"; + type: string; + tid: string; + item_id: string; + count: number; + scheme_id: number; + scheme_items: SchemeItem[]; } - -export interface SchemeItem + +export interface SchemeItem { /** Id of stack to take money from, is money tpl when Action is `SptInsure` */ - id: string - count: number + id: string; + count: number; } - \ No newline at end of file diff --git a/project/src/models/eft/trade/IProcessRagfairTradeRequestData.ts b/project/src/models/eft/trade/IProcessRagfairTradeRequestData.ts index c258b75f..9b6567dc 100644 --- a/project/src/models/eft/trade/IProcessRagfairTradeRequestData.ts +++ b/project/src/models/eft/trade/IProcessRagfairTradeRequestData.ts @@ -1,18 +1,18 @@ -export interface IProcessRagfairTradeRequestData +export interface IProcessRagfairTradeRequestData { - Action: string - offers: Offer[] + Action: string; + offers: Offer[]; } -export interface Offer +export interface Offer { - id: string - count: number - items: Item[] + id: string; + count: number; + items: Item[]; } -export interface Item +export interface Item { - id: string - count: number -} \ No newline at end of file + id: string; + count: number; +} diff --git a/project/src/models/eft/trade/IProcessSellTradeRequestData.ts b/project/src/models/eft/trade/IProcessSellTradeRequestData.ts index 6790be15..6070c32b 100644 --- a/project/src/models/eft/trade/IProcessSellTradeRequestData.ts +++ b/project/src/models/eft/trade/IProcessSellTradeRequestData.ts @@ -1,18 +1,18 @@ import { IProcessBaseTradeRequestData } from "@spt-aki/models/eft/trade/IProcessBaseTradeRequestData"; -export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData +export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData { - Action: "sell_to_trader" - type: string - tid: string - price: number - items: Item[] + Action: "sell_to_trader"; + type: string; + tid: string; + price: number; + items: Item[]; } -export interface Item +export interface Item { - id: string - count: number + id: string; + count: number; // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_id: number -} \ No newline at end of file + scheme_id: number; +} diff --git a/project/src/models/eft/trade/ISellScavItemsToFenceRequestData.ts b/project/src/models/eft/trade/ISellScavItemsToFenceRequestData.ts index 8137685c..bb40b787 100644 --- a/project/src/models/eft/trade/ISellScavItemsToFenceRequestData.ts +++ b/project/src/models/eft/trade/ISellScavItemsToFenceRequestData.ts @@ -2,7 +2,7 @@ import { OwnerInfo } from "@spt-aki/models/eft/common/request/IBaseInteractionRe export interface ISellScavItemsToFenceRequestData { - Action: "SellAllFromSavage", - fromOwner: OwnerInfo - toOwner: OwnerInfo -} \ No newline at end of file + Action: "SellAllFromSavage"; + fromOwner: OwnerInfo; + toOwner: OwnerInfo; +} diff --git a/project/src/models/eft/weather/IWeatherData.ts b/project/src/models/eft/weather/IWeatherData.ts index a15d7e1a..37174465 100644 --- a/project/src/models/eft/weather/IWeatherData.ts +++ b/project/src/models/eft/weather/IWeatherData.ts @@ -5,10 +5,10 @@ export interface IWeatherData acceleration: number; time: string; date: string; - weather?: IWeather + weather?: IWeather; } -export interface IWeather +export interface IWeather { pressure: number; temp: number; @@ -26,4 +26,4 @@ export interface IWeather time: string; date: string; timestamp: number; -} \ No newline at end of file +} diff --git a/project/src/models/eft/wishlist/IWishlistActionData.ts b/project/src/models/eft/wishlist/IWishlistActionData.ts index a15007c2..0f54fcfa 100644 --- a/project/src/models/eft/wishlist/IWishlistActionData.ts +++ b/project/src/models/eft/wishlist/IWishlistActionData.ts @@ -1,6 +1,5 @@ -export interface IWishlistActionData +export interface IWishlistActionData { - Action: string - templateId: string + Action: string; + templateId: string; } - \ No newline at end of file diff --git a/project/src/models/enums/AccountTypes.ts b/project/src/models/enums/AccountTypes.ts index da0df455..991d0f8c 100644 --- a/project/src/models/enums/AccountTypes.ts +++ b/project/src/models/enums/AccountTypes.ts @@ -1,4 +1,4 @@ export enum AccountTypes - { - SPT_DEVELOPER = "spt developer" -} \ No newline at end of file +{ + SPT_DEVELOPER = "spt developer", +} diff --git a/project/src/models/enums/AirdropType.ts b/project/src/models/enums/AirdropType.ts index ba55ab40..e1a54b67 100644 --- a/project/src/models/enums/AirdropType.ts +++ b/project/src/models/enums/AirdropType.ts @@ -1,7 +1,7 @@ export enum AirdropTypeEnum - { +{ MIXED = "mixed", WEAPONARMOR = "weaponarmor", FOODMEDICAL = "foodmedical", - BARTER = "barter" -} \ No newline at end of file + BARTER = "barter", +} diff --git a/project/src/models/enums/AmmoTypes.ts b/project/src/models/enums/AmmoTypes.ts index 6d486ec0..5da5c574 100644 --- a/project/src/models/enums/AmmoTypes.ts +++ b/project/src/models/enums/AmmoTypes.ts @@ -1,74 +1,74 @@ -export enum Grenade - { +export enum Grenade +{ M386_HE_GRENADE = "5ede475b549eed7c6d5c18fb", M576_MP_APERS_GRENADE = "5ede475339ee016e8c534742", M433_HEDP_GRENADE = "5f0c892565703e5c461894e9", M406_HE_GRENADE = "5ede4739e0350d05467f73e8", M381_HE_GRENADE = "5ede474b0c226a66f5402622", - M441_HE_GRENADE = "5ede47405b097655935d7d16" + M441_HE_GRENADE = "5ede47405b097655935d7d16", } export enum Ammo762x51 - { +{ M62_TRACER = "5a608bf24f39f98ffc77720e", M80 = "58dd3ad986f77403051cba8f", M61 = "5a6086ea4f39f99cd479502f", BCP_FMJ = "5e023e53d4353e3302577c4c", ULTRA_NOSLER = "5e023e88277cce2b522ff2b1", TCW_SP = "5e023e6e34d52a55c3304f71", - M993 = "5efb0c1bd79ff02a1f5e68d9" + M993 = "5efb0c1bd79ff02a1f5e68d9", } export enum Ammo762x54 - { +{ SNB_GZH = "560d61e84bdc2da74d8b4571", LPS_GZH = "5887431f2459777e1612938f", PS_GZH = "59e77a2386f7742ee578960a", T46M_GZH = "5e023cf8186a883be655e54f", BT_GZH = "5e023d34e8a400319a28ed44", - BS_GZH = "5e023d48186a883be655e551" + BS_GZH = "5e023d48186a883be655e551", } export enum Ammo86x70 - { +{ TAC_X = "5fc382b6d6fa9c00c571bbc3", UCW = "5fc382c1016cce60e8341b20", AP = "5fc382a9d724d907e2077dab", - FMJ = "5fc275cf85fd526b824a571a" + FMJ = "5fc275cf85fd526b824a571a", } export enum Ammo46x30 - { +{ AP_SX = "5ba26835d4351e0035628ff5", ACTION_SX = "5ba26812d4351e003201fef1", FMJ_SX = "5ba2678ad4351e44f824b344", - SUBSONIC_SX = "5ba26844d4351e00334c9475" + SUBSONIC_SX = "5ba26844d4351e00334c9475", } export enum Ammo57x28 - { +{ SS198LF = "5cc80f79e4a949033c7343b2", R37_F = "5cc86832d7f00c000d3a6e6c", SS190 = "5cc80f38e4a949001152b560", R37_X = "5cc86840d7f00c002412c56c", L191 = "5cc80f53e4a949000e1ea4f8", SS197SR = "5cc80f8fe4a949033b0224a2", - SB193 = "5cc80f67e4a949035e43bbba" + SB193 = "5cc80f67e4a949035e43bbba", } export enum Ammo762x25 - { +{ FMJ43 = "5735ff5c245977640e39ba7e", LRN = "573601b42459776410737435", P_GL = "5736026a245977644601dc61", PST_GZH = "573603562459776430731618", LRNPC = "573602322459776445391df1", AKBS = "5735fdcd2459776445391d61", - PT_GZH = "573603c924597764442bd9cb" + PT_GZH = "573603c924597764442bd9cb", } export enum Ammo9x18 - { +{ PM_SP8_GZH = "5737218f245977612125ba51", P_GZH = "573719762459775a626ccbc1", PSTM_GZH = "57371aab2459775a77142f22", @@ -82,11 +82,11 @@ export enum Ammo9x18 PS_GS_PPO = "57371f2b24597761224311f1", PRS_GS = "57371eb62459776125652ac1", PPT_GZH = "57371e4124597760ff7b25f1", - PPE_GZH = "57371b192459775a9f58a5e0" + PPE_GZH = "57371b192459775a9f58a5e0", } export enum Ammo9x19 - { +{ PSO_GZH = "58864a4f2459770fcc257101", PST_GZH = "56d59d3ad2720bdb418b4577", GREEN_TRACER = "5c3df7d588a4501f290594e5", @@ -94,36 +94,36 @@ export enum Ammo9x19 AP_63 = "5c925fa22e221601da359b7b", LUGER_CCI = "5a3c16fe86f77452b62de32a", PBP_GZH = "5efb0da7a29a85116f6ea05f", - QUAKEMAKER = "5efb0e16aeb21837e749c7ff" + QUAKEMAKER = "5efb0e16aeb21837e749c7ff", } export enum Ammo9x21 - { +{ P_GZH = "5a26abfac4a28232980eabff", PS_GZH = "5a269f97c4a282000b151807", PE_GZH = "5a26ac06c4a282000c5a90a8", - BT_GZH = "5a26ac0ec4a28200741e1e18" + BT_GZH = "5a26ac0ec4a28200741e1e18", } export enum Ammo9x33R - { +{ FMJ = "62330b3ed4dc74626d570b95", HOLLOW_POINT = "62330bfadc5883093563729b", SOFT_POINT = "62330c40bdd19b369e1e53d1", - JACKET_HP = "62330c18744e5e31df12f516" + JACKET_HP = "62330c18744e5e31df12f516", } export enum Ammo1143x23ACP - { +{ MATCH_FMJ = "5e81f423763d9f754677bf2e", HYDRA_SHOK = "5efb0fc6aeb21837e749c801", LASERMATCH_FMJ = "5efb0d4f4bc50b58e81710f3", AP = "5efb0cabfb3e451d70735af5", - RIP = "5ea2a8e200685063ec28c05a" + RIP = "5ea2a8e200685063ec28c05a", } export enum Ammo545x39 - { +{ PS_GS = "56dff3afd2720bba668b4567", SP = "56dff421d2720b5f5a8b4567", PPBS_GS_IGOLNIK = "5c0d5e4486f77478390952fe", @@ -136,11 +136,11 @@ export enum Ammo545x39 BS_GS = "56dff026d2720bb8668b4567", T_GS = "56dff4a2d2720bbd668b456a", PP_GS = "56dff2ced2720bb4668b4567", - FMJ = "56dff0bed2720bb0668b4567" + FMJ = "56dff0bed2720bb0668b4567", } export enum Ammo556x45 - { +{ M856 = "59e68f6f86f7746c9f75e846", MK255_MOD_0_RRLP = "59e6918f86f7746c9f75e849", M995 = "59e690b686f7746c9f75e848", @@ -151,54 +151,54 @@ export enum Ammo556x45 FMJ = "59e6920f86f77411d82aa167", WARMAGEDDON = "5c0d5ae286f7741e46554302", MK_318_MOD_0_SOST = "60194943740c5d77f6705eea", - SSA_AP = "601949593ae8f707c4608daa" + SSA_AP = "601949593ae8f707c4608daa", } export enum Ammo762x35 - { +{ M62_TRACER = "619636be6db0f2477964e710", BCP_FMJ = "5fbe3ffdf8b6a877a729ea82", AP = "5fd20ff893a8961fc660a954", V_MAX = "6196364158ef8c428c287d9f", - WHISPER = "6196365d58ef8c428c287da1" + WHISPER = "6196365d58ef8c428c287da1", } export enum Ammo762x39 - { +{ PS_GZH = "5656d7c34bdc2d9d198b4587", HP = "59e4d3d286f774176a36250a", US_GZH = "59e4d24686f7741776641ac7", T45M1_GZH = "59e4cf5286f7741778269d8a", BP_GZH = "59e0d99486f7744a32234762", - MAI_AP = "601aa3d2b2bcb34913271e6d" + MAI_AP = "601aa3d2b2bcb34913271e6d", } export enum Ammo9x39 - { +{ SP5_GS = "57a0dfb82459774d3078b56c", BP_GS = "5c0d688c86f77413ae3407b2", SP6_GS = "57a0e5022459774d1673f889", SPP_GS = "5c0d668f86f7747ccb7f13b2", - PAB9_GS = "61962d879bb3d20b0946d385" + PAB9_GS = "61962d879bb3d20b0946d385", } export enum Ammo366TKM - { +{ FMJ = "59e6542b86f77411dc52a77a", GEKSA = "59e6658b86f77411d949b250", EKO = "59e655cb86f77411dc52a77b", - APM = "5f0596629e22f464da6bbdd9" + APM = "5f0596629e22f464da6bbdd9", } export enum Ammo127x55 - { +{ PS12 = "5cadf6ddae9215051e1c23b2", PS12B = "5cadf6eeae921500134b2799", - PS12A = "5cadf6e5ae921500113bb973" + PS12A = "5cadf6e5ae921500113bb973", } export enum Ammo12Gauge - { +{ BUCKSHOT_7MM = "560d5e524bdc2d25448b4571", MAGNUM_85MM = "5d6e6806a4b936088465b17e", RIP = "5c0d591486f7744c505b416f", @@ -214,11 +214,11 @@ export enum Ammo12Gauge GRIZZLY_40_SLUG = "5d6e6869a4b9361c140bcfde", SUPERFORMANCE_HP_SLUG = "5d6e68d1a4b93622fe60e845", COPPER_SABOT_PREMIER_HP_SLUG = "5d6e68b3a4b9361bca7e50b5", - LEAD_SLUG = "58820d1224597753c90aeb13" + LEAD_SLUG = "58820d1224597753c90aeb13", } export enum Ammo20Gauge - { +{ BUCKSHOT_75MM = "5a38ebd9c4a282000d722a5b", STAR_SLUG = "5d6e6a05a4b93618084f58d0", BUCKSHOT_73MM = "5d6e69c7a4b9360b6c0d54e4", @@ -226,32 +226,32 @@ export enum Ammo20Gauge BUCKSHOT_56MM = "5d6e695fa4b936359b35d852", POLEVA_6U_SLUG = "5d6e6a42a4b9364f07165f52", POLEVA_3_SLUG = "5d6e6a53a4b9361bd473feec", - BUCKSHOT_62MM = "5d6e69b9a4b9361bc8618958" + BUCKSHOT_62MM = "5d6e69b9a4b9361bc8618958", } export enum Ammo23x75 - { +{ SHRAPNEL10_BUCKSHOT = "5e85a9a6eacf8c039e4e2ac1", SHRAPNEL25_BUCKSHOT = "5f647f31b6238e5dd066e196", ZVEZDA_FLASHBANG = "5e85a9f4add9fe03027d9bf1", - BARRIKADA_SLUG = "5e85aa1a988a8701445df1f5" + BARRIKADA_SLUG = "5e85aa1a988a8701445df1f5", } export enum Ammo30x29 - { - VOG_30 = "5d70e500a4b9364de70d38ce" +{ + VOG_30 = "5d70e500a4b9364de70d38ce", } export enum Ammo127x108 - { +{ B32 = "5cde8864d7f00c0010373be1", - BZT_44M = "5d2f2ab648f03550091993ca" + BZT_44M = "5d2f2ab648f03550091993ca", } export enum Ammo26x75 - { +{ GREEN_FLARE = "62389aaba63f32501b1b444f", RED_FLARE = "62389ba9a63f32501b1b4451", WHITE_FLARE = "62389bc9423ed1685422dc57", - YELLOW_FLARE = "62389be94d5d474bf712e709" -} \ No newline at end of file + YELLOW_FLARE = "62389be94d5d474bf712e709", +} diff --git a/project/src/models/enums/BackendErrorCodes.ts b/project/src/models/enums/BackendErrorCodes.ts index 299deee9..81f00650 100644 --- a/project/src/models/enums/BackendErrorCodes.ts +++ b/project/src/models/enums/BackendErrorCodes.ts @@ -1,5 +1,5 @@ export enum BackendErrorCodes - { +{ NONE = 0, UNKNOWN_ERROR = 200, NOT_AUTHORIZED = 201, @@ -78,9 +78,9 @@ export enum BackendErrorCodes PLAYERFORBIDDENGROUPINVITES = 502011, LEADERALREADYREADY = 502012, GROUPSENDINVITEERROR = 502013, - PLAYERISOFFLINE = 502014, + PLAYERISOFFLINE = 502014, PLAYERISNOTSEARCHINGFORGROUP = 502018, PLAYERALREADYLOOKINGFORGAME = 503001, PLAYERINRAID = 503002, - LIMITFORPRESETSREACHED = 504001 -} \ No newline at end of file + LIMITFORPRESETSREACHED = 504001, +} diff --git a/project/src/models/enums/BaseClasses.ts b/project/src/models/enums/BaseClasses.ts index 117e9441..b8411ce2 100644 --- a/project/src/models/enums/BaseClasses.ts +++ b/project/src/models/enums/BaseClasses.ts @@ -1,5 +1,5 @@ export enum BaseClasses - { +{ WEAPON = "5422acb9af1c889c16000029", UBGL = "55818b014bdc2ddc698b456b", ARMOR = "5448e54d4bdc2dcc718b4568", @@ -19,13 +19,13 @@ export enum BaseClasses INFO = "5448ecbe4bdc2d60728b4568", MEDKIT = "5448f39d4bdc2d0a728b4568", DRUGS = "5448f3a14bdc2d27728b4569", - STIMULATOR= "5448f3a64bdc2d60728b456a", + STIMULATOR = "5448f3a64bdc2d60728b456a", MEDICAL = "5448f3ac4bdc2dce718b4569", - MEDICAL_SUPPLIES= "57864c8c245977548867e7f1", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", MOD = "5448fe124bdc2da5018b4567", FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", FUEL = "5d650c3e815116009f6201d2", - GEAR_MOD= "55802f3e4bdc2de7118b4584", + GEAR_MOD = "55802f3e4bdc2de7118b4584", STOCK = "55818a594bdc2db9688b456a", FOREGRIP = "55818af64bdc2d5b648b4570", MASTER_MOD = "55802f4a4bdc2ddb688b4569", @@ -51,7 +51,7 @@ export enum BaseClasses SHOTGUN = "5447b6094bdc2dc3278b4567", MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", - MACHINE_GUN ="5447bed64bdc2d97278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", SPEC_ITEM = "5447e0e74bdc2d3c308b4567", @@ -73,31 +73,31 @@ export enum BaseClasses DOG_TAG_BEAR = "59f32bb586f774757e1e8442", JEWELRY = "57864a3d24597754843f8721", ELECTRONICS = "57864a66245977548f04a81f", - BUILDING_MATERIAL= "57864ada245977548638de91", - TOOL= "57864bb7245977548b3b66c2", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", HOUSEHOLD_GOODS = "57864c322459775490116fbf", LUBRICANT = "57864e4c24597754843f8723", - BATTERY= "57864ee62459775490116fc1", + BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", - MAGAZINE= "5448bc234bdc2d3c308b4569", - LIGHT_LASER_DESIGNATOR= "55818b0e4bdc2dde698b456e", - FLASH_HIDER= "550aa4bf4bdc2dd6348b456b", - COLLIMATOR= "55818ad54bdc2ddc698b4569", - IRON_SIGHT= "55818ac54bdc2d5b648b456e", - COMPACT_COLLIMATOR= "55818acf4bdc2dde698b456b", - COMPENSATOR= "550aa4af4bdc2dd4348b456e", - OPTIC_SCOPE= "55818ae44bdc2dde698b456c", - SPECIAL_SCOPE= "55818aeb4bdc2ddc698b456a", - OTHER= "590c745b86f7743cc433c5f2", - SILENCER= "550aa4cd4bdc2dd8348b456c", - PORTABLE_RANGE_FINDER= "61605ddea09d851a0a0c1bbc", - ITEM= "54009119af1c881c07000029", - CYLINDER_MAGAZINE= "610720f290b75a49ff2e5e25", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER_DESIGNATOR = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + IRON_SIGHT = "55818ac54bdc2d5b648b456e", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25", AUXILARY_MOD = "5a74651486f7744e73386dd1", BIPOD = "55818afb4bdc2dde698b456d", HEADPHONES = "5645bcb74bdc2ded0b8b4578", RANDOM_LOOT_CONTAINER = "62f109593b54472778797866", - STACKABLE_ITEM = "5661632d4bdc2d903d8b456b" -} \ No newline at end of file + STACKABLE_ITEM = "5661632d4bdc2d903d8b456b", +} diff --git a/project/src/models/enums/BotAmount.ts b/project/src/models/enums/BotAmount.ts index 9948d222..80ad9233 100644 --- a/project/src/models/enums/BotAmount.ts +++ b/project/src/models/enums/BotAmount.ts @@ -1,8 +1,8 @@ export enum BotAmount - { +{ AS_ONLINE = "AsOnline", LOW = "Low", MEDIUM = "Medium", HIGH = "High", - HORDE = "Horde" -} \ No newline at end of file + HORDE = "Horde", +} diff --git a/project/src/models/enums/BotDifficulty.ts b/project/src/models/enums/BotDifficulty.ts index 3e72c9cc..fd21a78b 100644 --- a/project/src/models/enums/BotDifficulty.ts +++ b/project/src/models/enums/BotDifficulty.ts @@ -1,9 +1,9 @@ export enum BotDifficulty - { +{ AS_ONLINE = "AsOnline", EASY = "Easy", MEDIUM = "Medium", HARD = "Hard", IMPOSSIBLE = "Impossible", - RANDOM = "Random" -} \ No newline at end of file + RANDOM = "Random", +} diff --git a/project/src/models/enums/ConfigTypes.ts b/project/src/models/enums/ConfigTypes.ts index 118fbf12..3cc2aed3 100644 --- a/project/src/models/enums/ConfigTypes.ts +++ b/project/src/models/enums/ConfigTypes.ts @@ -1,5 +1,5 @@ export enum ConfigTypes - { +{ AIRDROP = "aki-airdrop", BOT = "aki-bot", PMC = "aki-pmc", @@ -25,5 +25,5 @@ export enum ConfigTypes WEATHER = "aki-weather", SEASONAL_EVENT = "aki-seasonalevents", LOST_ON_DEATH = "aki-lostondeath", - GIFTS = "aki-gifts" -} \ No newline at end of file + GIFTS = "aki-gifts", +} diff --git a/project/src/models/enums/ContainerTypes.ts b/project/src/models/enums/ContainerTypes.ts index 114395ec..8f4de42b 100644 --- a/project/src/models/enums/ContainerTypes.ts +++ b/project/src/models/enums/ContainerTypes.ts @@ -1,5 +1,5 @@ -export enum CommonContainers - { +export enum CommonContainers +{ AMMO_CASE = "5aafbde786f774389d0cbc0f", DOCUMENTS_CASE = "590c60fc86f77412b13fddcf", DOGTAG_CASE = "5c093e3486f77430cb02e593", @@ -19,14 +19,14 @@ export enum CommonContainers THICC_ITEM_CASE = "5c0a840b86f7742ffa4f2482", THICC_WEAPON_CASE = "5b6d9ce188a4501afc1b2b25", WEAPON_CASE = "59fb023c86f7746d0d4b423c", - WZ_WALLET = "60b0f6c058e0b0481a09ad11" + WZ_WALLET = "60b0f6c058e0b0481a09ad11", } export enum SecuredContainers - { +{ ALPHA = "544a11ac4bdc2d470e8b456a", BETA = "5857a8b324597729ab0a0e7d", EPSILON = "59db794186f77448bc595262", GAMMA = "5857a8bc2459772bad15db29", - KAPPA = "5c093ca986f7740a1867ab12" -} \ No newline at end of file + KAPPA = "5c093ca986f7740a1867ab12", +} diff --git a/project/src/models/enums/ELocationName.ts b/project/src/models/enums/ELocationName.ts index c92b4153..9469f4c9 100644 --- a/project/src/models/enums/ELocationName.ts +++ b/project/src/models/enums/ELocationName.ts @@ -1,5 +1,5 @@ -export enum ELocationName - { +export enum ELocationName +{ FACTORY_DAY = "factory4_day", FACTORY_NIGHT = "factory4_night", BIGMAP = "bigmap", @@ -10,5 +10,5 @@ export enum ELocationName LABORATORY = "laboratory", RESERVE = "RezervBase", STREETS = "TarkovStreets", - ANY = "any" -} \ No newline at end of file + ANY = "any", +} diff --git a/project/src/models/enums/EquipmentBuildType.ts b/project/src/models/enums/EquipmentBuildType.ts index 9d7bb9e8..f309a9ea 100644 --- a/project/src/models/enums/EquipmentBuildType.ts +++ b/project/src/models/enums/EquipmentBuildType.ts @@ -1,5 +1,5 @@ export enum EquipmentBuildType - { +{ CUSTOM = 0, - STANDARD = 1 -} \ No newline at end of file + STANDARD = 1, +} diff --git a/project/src/models/enums/EquipmentSlots.ts b/project/src/models/enums/EquipmentSlots.ts index 24f332d9..510e97be 100644 --- a/project/src/models/enums/EquipmentSlots.ts +++ b/project/src/models/enums/EquipmentSlots.ts @@ -1,5 +1,5 @@ export enum EquipmentSlots - { +{ HEADWEAR = "Headwear", EARPIECE = "Earpiece", FACE_COVER = "FaceCover", @@ -13,5 +13,5 @@ export enum EquipmentSlots FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", HOLSTER = "Holster", - SCABBARD = "Scabbard" -} \ No newline at end of file + SCABBARD = "Scabbard", +} diff --git a/project/src/models/enums/ExitStatis.ts b/project/src/models/enums/ExitStatis.ts index 4333e2cf..547afa60 100644 --- a/project/src/models/enums/ExitStatis.ts +++ b/project/src/models/enums/ExitStatis.ts @@ -1,8 +1,8 @@ export enum ExitStatus - { +{ SURVIVED = 0, KILLED = 1, LEFT = 2, RUNNER = 3, - MISSINGINACTION = 4 -} \ No newline at end of file + MISSINGINACTION = 4, +} diff --git a/project/src/models/enums/GiftSenderType.ts b/project/src/models/enums/GiftSenderType.ts index 793d0bd3..9bf3f3a2 100644 --- a/project/src/models/enums/GiftSenderType.ts +++ b/project/src/models/enums/GiftSenderType.ts @@ -1,6 +1,6 @@ export enum GiftSenderType - { +{ SYSTEM = "System", TRADER = "Trader", - USER = "User" -} \ No newline at end of file + USER = "User", +} diff --git a/project/src/models/enums/GiftSentResult.ts b/project/src/models/enums/GiftSentResult.ts index 7c1295dd..3e68390c 100644 --- a/project/src/models/enums/GiftSentResult.ts +++ b/project/src/models/enums/GiftSentResult.ts @@ -1,7 +1,7 @@ export enum GiftSentResult - { +{ FAILED_UNKNOWN = 1, FAILED_GIFT_ALREADY_RECEIVED = 2, FAILED_GIFT_DOESNT_EXIST = 3, - SUCCESS = 4 -} \ No newline at end of file + SUCCESS = 4, +} diff --git a/project/src/models/enums/HideoutAreas.ts b/project/src/models/enums/HideoutAreas.ts index 7e86ef7b..ba46a3cf 100644 --- a/project/src/models/enums/HideoutAreas.ts +++ b/project/src/models/enums/HideoutAreas.ts @@ -1,5 +1,5 @@ -export enum HideoutAreas - { +export enum HideoutAreas +{ NOTSET = -1, VENTS = 0, SECURITY = 1, @@ -26,5 +26,5 @@ export enum HideoutAreas EMERGENCY_WALL = 22, GYM = 23, WEAPON_STAND = 24, - WEAPON_STAND_SECONDARY = 25 -} \ No newline at end of file + WEAPON_STAND_SECONDARY = 25, +} diff --git a/project/src/models/enums/HideoutEventActions.ts b/project/src/models/enums/HideoutEventActions.ts index fc0424e8..4037bdf0 100644 --- a/project/src/models/enums/HideoutEventActions.ts +++ b/project/src/models/enums/HideoutEventActions.ts @@ -1,5 +1,5 @@ export enum HideoutEventActions - { +{ HIDEOUT_UPGRADE = "HideoutUpgrade", HIDEOUT_UPGRADE_COMPLETE = "HideoutUpgradeComplete", HIDEOUT_PUT_ITEMS_IN_AREA_SLOTS = "HideoutPutItemsInAreaSlots", @@ -11,5 +11,5 @@ export enum HideoutEventActions HIDEOUT_TAKE_PRODUCTION = "HideoutTakeProduction", HIDEOUT_RECORD_SHOOTING_RANGE_POINTS = "RecordShootingRangePoints", HIDEOUT_IMPROVE_AREA = "HideoutImproveArea", - HIDEOUT_CANCEL_PRODUCTION_COMMAND = "HideoutCancelProductionCommand" -} \ No newline at end of file + HIDEOUT_CANCEL_PRODUCTION_COMMAND = "HideoutCancelProductionCommand", +} diff --git a/project/src/models/enums/ItemAddedResult.ts b/project/src/models/enums/ItemAddedResult.ts index 2dca874a..72ad247d 100644 --- a/project/src/models/enums/ItemAddedResult.ts +++ b/project/src/models/enums/ItemAddedResult.ts @@ -1,5 +1,5 @@ export enum ItemAddedResult - { +{ SUCCESS = 1, - NO_SPACE = 2 -} \ No newline at end of file + NO_SPACE = 2, +} diff --git a/project/src/models/enums/ItemEventActions.ts b/project/src/models/enums/ItemEventActions.ts index 6c96a540..6d805c03 100644 --- a/project/src/models/enums/ItemEventActions.ts +++ b/project/src/models/enums/ItemEventActions.ts @@ -1,5 +1,5 @@ export enum ItemEventActions - { +{ MOVE = "Move", REMOVE = "Remove", SPLIT = "Split", @@ -23,5 +23,5 @@ export enum ItemEventActions REMOVE_WEAPON_BUILD = "RemoveWeaponBuild", REMOVE_BUILD = "RemoveBuild", SAVE_EQUIPMENT_BUILD = "SaveEquipmentBuild", - REMOVE_EQUIPMENT_BUILD = "RemoveEquipmentBuild" -} \ No newline at end of file + REMOVE_EQUIPMENT_BUILD = "RemoveEquipmentBuild", +} diff --git a/project/src/models/enums/MemberCategory.ts b/project/src/models/enums/MemberCategory.ts index 267363f8..fc97de1f 100644 --- a/project/src/models/enums/MemberCategory.ts +++ b/project/src/models/enums/MemberCategory.ts @@ -1,6 +1,5 @@ - export enum MemberCategory // player type - { +{ DEFAULT = 0, DEVELOPER = 1, UNIQUE_ID = 2, @@ -11,5 +10,5 @@ export enum MemberCategory // player type CHAT_MODERATOR_WITH_PERMANENT_BAN = 64, UNIT_TEST = 128, SHERPA = 256, - EMISSARY = 512 + EMISSARY = 512, } diff --git a/project/src/models/enums/MessageType.ts b/project/src/models/enums/MessageType.ts index f61b9d21..55d08945 100644 --- a/project/src/models/enums/MessageType.ts +++ b/project/src/models/enums/MessageType.ts @@ -1,6 +1,5 @@ - export enum MessageType - { +{ // if this variables are supposed to be strings for the type // then the equals value should be the name that should be // required by the client instead of an int @@ -18,5 +17,5 @@ export enum MessageType QUEST_FAIL = 11, QUEST_SUCCESS = 12, MESSAGE_WITH_ITEMS = 13, - INITIAL_SUPPORT = 14 -} \ No newline at end of file + INITIAL_SUPPORT = 14, +} diff --git a/project/src/models/enums/Money.ts b/project/src/models/enums/Money.ts index 72d61744..9fde164c 100644 --- a/project/src/models/enums/Money.ts +++ b/project/src/models/enums/Money.ts @@ -1,6 +1,6 @@ export enum Money - { +{ ROUBLES = "5449016a4bdc2d6f028b456f", EUROS = "569668774bdc2da2298b4568", - DOLLARS = "5696686a4bdc2da3298b456a" -} \ No newline at end of file + DOLLARS = "5696686a4bdc2da3298b456a", +} diff --git a/project/src/models/enums/PlayerRaidEndState.ts b/project/src/models/enums/PlayerRaidEndState.ts index f06f2090..bb170ca2 100644 --- a/project/src/models/enums/PlayerRaidEndState.ts +++ b/project/src/models/enums/PlayerRaidEndState.ts @@ -1,8 +1,8 @@ export enum PlayerRaidEndState - { +{ SURVIVED = "survived", LEFT = "left", RUNNER = "runner", MISSING_IN_ACTION = "missinginaction", - KILLED = "killed" -} \ No newline at end of file + KILLED = "killed", +} diff --git a/project/src/models/enums/QuestRewardType.ts b/project/src/models/enums/QuestRewardType.ts index 72cba3bc..b4e74188 100644 --- a/project/src/models/enums/QuestRewardType.ts +++ b/project/src/models/enums/QuestRewardType.ts @@ -1,5 +1,5 @@ export enum QuestRewardType - { +{ SKILL = "Skill", EXPERIENCE = "Experience", TRADER_STANDING = "TraderStanding", @@ -9,5 +9,5 @@ export enum QuestRewardType PRODUCTIONS_SCHEME = "ProductionScheme", TRADER_STANDING_RESET = "TraderStandingReset", TRADER_STANDING_RESTORE = "TraderStandingRestore", - STASH_ROWS = "StashRows" -} \ No newline at end of file + STASH_ROWS = "StashRows", +} diff --git a/project/src/models/enums/QuestStatus.ts b/project/src/models/enums/QuestStatus.ts index 0545c28b..bb837224 100644 --- a/project/src/models/enums/QuestStatus.ts +++ b/project/src/models/enums/QuestStatus.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/naming-convention */ export enum QuestStatus - { +{ Locked = 0, AvailableForStart = 1, Started = 2, @@ -10,5 +10,5 @@ export enum QuestStatus FailRestartable = 6, MarkedAsFailed = 7, Expired = 8, - AvailableAfter = 9 -} \ No newline at end of file + AvailableAfter = 9, +} diff --git a/project/src/models/enums/QuestTypeEnum.ts b/project/src/models/enums/QuestTypeEnum.ts index 38b0fcdd..c26eae7a 100644 --- a/project/src/models/enums/QuestTypeEnum.ts +++ b/project/src/models/enums/QuestTypeEnum.ts @@ -1,6 +1,5 @@ - -export enum QuestTypeEnum - { +export enum QuestTypeEnum +{ PICKUP = "PickUp", ELIMINATION = "Elimination", DISCOVER = "Discover", @@ -13,5 +12,5 @@ export enum QuestTypeEnum MERCHANT = "Merchant", SKILL = "Skill", MULTI = "Multi", - WEAPON_ASSEMBLY = "WeaponAssembly" + WEAPON_ASSEMBLY = "WeaponAssembly", } diff --git a/project/src/models/enums/RagfairSort.ts b/project/src/models/enums/RagfairSort.ts index 35b4482a..49c768f6 100644 --- a/project/src/models/enums/RagfairSort.ts +++ b/project/src/models/enums/RagfairSort.ts @@ -1,8 +1,8 @@ export enum RagfairSort - { +{ ID = 0, RATING = 3, OFFER_TITLE = 4, PRICE = 5, - EXPIRY = 6 -} \ No newline at end of file + EXPIRY = 6, +} diff --git a/project/src/models/enums/RaidMode.ts b/project/src/models/enums/RaidMode.ts index a0c96ef0..2d9ac5aa 100644 --- a/project/src/models/enums/RaidMode.ts +++ b/project/src/models/enums/RaidMode.ts @@ -1,6 +1,6 @@ export enum RaidMode - { +{ ONLINE = "Online", LOCAL = "Local", - COOP = "Coop" -} \ No newline at end of file + COOP = "Coop", +} diff --git a/project/src/models/enums/SeasonalEventType.ts b/project/src/models/enums/SeasonalEventType.ts index 158b4df8..ebc93a94 100644 --- a/project/src/models/enums/SeasonalEventType.ts +++ b/project/src/models/enums/SeasonalEventType.ts @@ -1,8 +1,8 @@ export enum SeasonalEventType - { +{ NONE = "None", CHRISTMAS = "Christmas", HALLOWEEN = "Halloween", NEW_YEARS = "NewYears", - PROMO = "Promo" -} \ No newline at end of file + PROMO = "Promo", +} diff --git a/project/src/models/enums/SkillTypes.ts b/project/src/models/enums/SkillTypes.ts index 6ff377ba..ea94c754 100644 --- a/project/src/models/enums/SkillTypes.ts +++ b/project/src/models/enums/SkillTypes.ts @@ -1,5 +1,5 @@ export enum SkillTypes - { +{ BOT_RELOAD = "BotReload", BOT_SOUND = "BotSound", HIDEOUT_MANAGEMENT = "HideoutManagement", @@ -53,5 +53,5 @@ export enum SkillTypes USEC_DEEP_WEAPON_MOD = "UsecDeepweaponmodding_Settings", USEC_LONG_RANGE_OPTICS = "UsecLongrangeoptics_Settings", USEC_NEGOTIATIONS = "UsecNegotiations", - USEC_TACTICS = "UsecTactics" -} \ No newline at end of file + USEC_TACTICS = "UsecTactics", +} diff --git a/project/src/models/enums/Traders.ts b/project/src/models/enums/Traders.ts index 172fcfaa..2a668cfd 100644 --- a/project/src/models/enums/Traders.ts +++ b/project/src/models/enums/Traders.ts @@ -1,6 +1,6 @@ export enum Traders - { - PRAPOR = "54cb50c76803fa8b248b4571", +{ + PRAPOR = "54cb50c76803fa8b248b4571", THERAPIST = "54cb57776803fa99248b456e", FENCE = "579dc571d53a0658a154fbec", SKIER = "58330581ace78e27b8b10cee", @@ -8,5 +8,5 @@ export enum Traders MECHANIC = "5a7c2eca46aef81a7ca2145d", RAGMAN = "5ac3b934156ae10c4430e83c", JAEGER = "5c0647fdd443bc2504c2d371", - LIGHTHOUSEKEEPER = "638f541a29ffd1183d187f57" -} \ No newline at end of file + LIGHTHOUSEKEEPER = "638f541a29ffd1183d187f57", +} diff --git a/project/src/models/enums/WeaponSkillTypes.ts b/project/src/models/enums/WeaponSkillTypes.ts index 6458865a..e2b5fe06 100644 --- a/project/src/models/enums/WeaponSkillTypes.ts +++ b/project/src/models/enums/WeaponSkillTypes.ts @@ -1,5 +1,5 @@ export enum WeaponSkillTypes - { +{ PISTOL = "Pistol", REVOLVER = "Revolver", SMG = "SMG", @@ -11,5 +11,5 @@ export enum WeaponSkillTypes DMR = "DMR", LAUNCHER = "Launcher", ATTACHED_LAUNCHER = "AttachedLauncher", - MELEE = "Melee" -} \ No newline at end of file + MELEE = "Melee", +} diff --git a/project/src/models/enums/WeaponTypes.ts b/project/src/models/enums/WeaponTypes.ts index 660ee688..873c26e9 100644 --- a/project/src/models/enums/WeaponTypes.ts +++ b/project/src/models/enums/WeaponTypes.ts @@ -1,31 +1,31 @@ export enum Weapons127x55 - { - ASH_12 = "5cadfbf7ae92152ac412eeef" +{ + ASH_12 = "5cadfbf7ae92152ac412eeef", } export enum Weapons86x70 - { +{ MK_18 = "5fc22d7c187fea44d52eda44", - AXMC = "627e14b21713922ded6f2c15" + AXMC = "627e14b21713922ded6f2c15", } export enum Weapons9x39 - { +{ AS_VAL = "57c44b372459772d2b39b8ce", - VSS_VINTOREZ = "57838ad32459774a17445cd2" + VSS_VINTOREZ = "57838ad32459774a17445cd2", } export enum Weapons762x54R - { +{ SVDS = "5c46fbd72e2216398b5a8c9c", MP_18 = "61f7c9e189e6fb1a5e3ea78d", MOSIN_INFANTRY = "5bfd297f0db834001a669119", MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", - SV_98 = "55801eed4bdc2d89578b4588" + SV_98 = "55801eed4bdc2d89578b4588", } export enum Weapons762x51 - { +{ VPO_101 = "5c501a4d2e221602b412b540", DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", SA_58 = "5b0bbe4e5acfc40dc528a72d", @@ -38,17 +38,17 @@ export enum Weapons762x51 SR_25 = "5df8ce05b11454561e39243b", DVL_10 = "588892092459774ac91d4b11", M700 = "5bfea6e90db834001b7347f3", - T5000M = "5df24cf80dee1b22f862e9bc" + T5000M = "5df24cf80dee1b22f862e9bc", } export enum Weapons366TKM - { +{ VPO_209 = "59e6687d86f77411d949b251", - VPO_215 = "5de652c31b7e3716273428be" + VPO_215 = "5de652c31b7e3716273428be", } export enum Weapons762x39 - { +{ OP_SKS = "587e02ff24597743df3deaeb", SKS = "574d967124597745970e7c94", AK_103 = "5ac66d2e5acfc43b321d4b53", @@ -59,16 +59,16 @@ export enum Weapons762x39 AKMSN = "5abcbc27d8ce8700182eceeb", MK47_MUTANT = "606587252535c57a13424cfd", RD_704 = "628a60ae6b1d481ff772e9c8", - VPO_136 = "59e6152586f77473dc057aa1" + VPO_136 = "59e6152586f77473dc057aa1", } export enum Weapons762x35 - { - MCX = "5fbcc1d9016cce60e8341ab3" +{ + MCX = "5fbcc1d9016cce60e8341ab3", } export enum Weapons556x45 - { +{ ADAR_2_15 = "5c07c60e0db834002330051f", AK_101 = "5ac66cb05acfc40198510a10", AK_102 = "5ac66d015acfc400180ae6e4", @@ -78,11 +78,11 @@ export enum Weapons556x45 M4A1 = "5447a9cd4bdc2dbd208b4567", SCARL_BLACK = "6184055050224f204c1da540", SCARL_FDE = "618428466ef05c2ce828f218", - TX15_DML = "5d43021ca4b9362eab4b5e25" + TX15_DML = "5d43021ca4b9362eab4b5e25", } export enum Weapons545x39 - { +{ AK_105 = "5ac66d9b5acfc4001633997a", AK_74 = "5bf3e03b0db834001d2c4a9c", AK_74M = "5ac4cd105acfc40016339859", @@ -94,43 +94,43 @@ export enum Weapons545x39 AKS_74UN = "583990e32459771419544dd2", SAG_AK = "628b5638ad252a16da6dd245", SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", - RPK_16 = "5beed0f50db834001c062b12" + RPK_16 = "5beed0f50db834001c062b12", } export enum Weapons57x28FN - { +{ FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", FN_57_FDE = "5d67abc1a4b93614ec50137f", - FN_P90 = "5cc82d76e24e8d00134b4b83" + FN_P90 = "5cc82d76e24e8d00134b4b83", } export enum Weapons46x30HK - { +{ MP7A1 = "5ba26383d4351e00334c93d9", - MP7A2 = "5bd70322209c4d00d7167b8f" + MP7A2 = "5bd70322209c4d00d7167b8f", } export enum Weapons1143x23 - { +{ M1911A1 = "5e81c3cbac2bb513793cdc75", M45A1 = "5f36a0e5fbf956000b716b65", USP45 = "6193a720f8ee7e52e42109ed", UMP45 = "5fc3e272f8b6a877a729eac5", - VECTOR45 = "5fb64bc92b1b027b1f50bcf2" + VECTOR45 = "5fb64bc92b1b027b1f50bcf2", } export enum Weapons9x33R - { - CR_50DS = "61a4c8884f95bc3b2c5dc96f" +{ + CR_50DS = "61a4c8884f95bc3b2c5dc96f", } export enum Weapons9x21 - { - SR_1MP = "59f98b4986f7746f546d2cef" +{ + SR_1MP = "59f98b4986f7746f546d2cef", } export enum Weapons9x19 - { +{ GLOCK_17 = "5a7ae0c351dfba0017554310", GLOCK_18C = "5b1fa9b25acfc40018633c01", M9A3 = "5cadc190ae921500103bb3b6", @@ -146,30 +146,30 @@ export enum Weapons9x19 PP_19_01 = "59984ab886f7743e98271174", SAIGA_9 = "59f9cabd86f7743a10721f46", STM_9 = "60339954d62c9b14ed777c06", - VECTOR_9MM = "5fc3f2d5900b1d5091531e57" + VECTOR_9MM = "5fc3f2d5900b1d5091531e57", } export enum Weapons9x18 - { +{ APB = "5abccb7dd8ce87001773e277", - APS = "5a17f98cfcdbcb0980087290", + APS = "5a17f98cfcdbcb0980087290", PB_SILENCED = "56e0598dd2720bb5668b45a6", PM = "5448bd6b4bdc2dfc2f8b4569", PM_T = "579204f224597773d619e051", PP9_KLIN = "57f4c844245977379d5c14d1", PP91_KEDR = "57d14d2524597714373db789", - PP91_KEDRB = "57f3c6bd24597738e730fa2f" + PP91_KEDRB = "57f3c6bd24597738e730fa2f", } export enum Weapons762x25 - { +{ TT = "571a12c42459771f627b58a0", TT_GOLD = "5b3b713c5acfc4330140bd8d", - PPSH_41 = "5ea03f7400685063ec28bfa8" + PPSH_41 = "5ea03f7400685063ec28bfa8", } export enum Weapons12Gauge - { +{ M3_SUPER90 = "6259b864ebedf17603599e88", M590A1 = "5e870397991fd70db46995c8", M870 = "5a7828548dc32e5a9c28b516", @@ -178,15 +178,15 @@ export enum Weapons12Gauge MP_155 = "606dae0ab0e443224b421bb7", MP_43_1C = "5580223e4bdc2d1c128b457f", MTS_255_12 = "60db29ce99594040e04c4a27", - SAIGA_12GA = "576165642459773c7a400233" + SAIGA_12GA = "576165642459773c7a400233", } export enum Weapons20Gauge - { - TOZ_106 = "5a38e6bac4a2826c6e06d79b" +{ + TOZ_106 = "5a38e6bac4a2826c6e06d79b", } export enum Weapons23x75 - { - KS_23M = "5e848cc2988a8701445df1e8" +{ + KS_23M = "5e848cc2988a8701445df1e8", } diff --git a/project/src/models/enums/WeatherType.ts b/project/src/models/enums/WeatherType.ts index 0ca55ebe..e5627a8f 100644 --- a/project/src/models/enums/WeatherType.ts +++ b/project/src/models/enums/WeatherType.ts @@ -1,5 +1,5 @@ export enum WeatherType - { +{ CLEAR_DAY = 0, CLEAR_WIND = 1, CLEAR_NIGHT = 2, @@ -16,5 +16,5 @@ export enum WeatherType CLOUD_WIND_RAIN = 13, FULL_CLOUD = 14, THUNDER_CLOUD = 15, - NONE = 16 -} \ No newline at end of file + NONE = 16, +} diff --git a/project/src/models/enums/WildSpawnTypeNumber.ts b/project/src/models/enums/WildSpawnTypeNumber.ts index 6376e9c0..9fdfd9fb 100644 --- a/project/src/models/enums/WildSpawnTypeNumber.ts +++ b/project/src/models/enums/WildSpawnTypeNumber.ts @@ -1,5 +1,5 @@ export enum WildSpawnTypeNumber - { +{ MARKSMAN = 0, ASSAULT = 1, BOSSTEST = 2, @@ -38,5 +38,5 @@ export enum WildSpawnTypeNumber BOSSBOARSNIPER = 36, CRAZYASSAULTEVENT = 37, SPTUSEC = 38, - SPTBEAR = 39 -} \ No newline at end of file + SPTBEAR = 39, +} diff --git a/project/src/models/enums/WindDirection.ts b/project/src/models/enums/WindDirection.ts index 9480a0a0..1e03f9b8 100644 --- a/project/src/models/enums/WindDirection.ts +++ b/project/src/models/enums/WindDirection.ts @@ -1,5 +1,5 @@ export enum WindDirection - { +{ EAST = 1, NORTH = 2, WEST = 3, @@ -7,5 +7,5 @@ export enum WindDirection SE = 5, SW = 6, NW = 7, - NE = 8 -} \ No newline at end of file + NE = 8, +} diff --git a/project/src/models/external/HttpFramework.ts b/project/src/models/external/HttpFramework.ts index 8fabeac2..59a00384 100644 --- a/project/src/models/external/HttpFramework.ts +++ b/project/src/models/external/HttpFramework.ts @@ -13,7 +13,7 @@ export type HandleFn = (_: string, req: IncomingMessage, resp: ServerResponse) = */ export const Listen = (basePath: string) => { - return (Base: T): T => + return (Base: T): T => { // Used for the base class to be able to use DI injectable()(Base); @@ -28,23 +28,32 @@ export const Listen = (basePath: string) => this.handlers = {}; // Retrieve all handlers - const handlersArray = Base.prototype["handlers"]; - if (!handlersArray) return; + const handlersArray = Base.prototype.handlers; + if (!handlersArray) + { + return; + } // Add each flagged handler to the Record handlersArray.forEach(({ handlerName, path, httpMethod }) => { - if (!this.handlers[httpMethod]) this.handlers[httpMethod] = {}; + if (!this.handlers[httpMethod]) + { + this.handlers[httpMethod] = {}; + } if (this[handlerName] !== undefined && typeof this[handlerName] === "function") { - if (!path || path === "") this.handlers[httpMethod][`/${basePath}`] = this[handlerName]; + if (!path || path === "") + { + this.handlers[httpMethod][`/${basePath}`] = this[handlerName]; + } this.handlers[httpMethod][`/${basePath}/${path}`] = this[handlerName]; } }); // Cleanup the handlers list - Base.prototype["handlers"] = []; + Base.prototype.handlers = []; } // The canHandle method is used to check if the Listener handles a request @@ -53,14 +62,17 @@ export const Listen = (basePath: string) => { const routesHandles = this.handlers[req.method]; - return Object.keys(this.handlers).some(meth => meth === req.method) && - Object.keys(routesHandles).some(route => (new RegExp(route)).test(req.url)); + return Object.keys(this.handlers).some((meth) => meth === req.method) + && Object.keys(routesHandles).some((route) => (new RegExp(route)).test(req.url)); }; // The actual handle method dispatches the request to the registered handlers handle = (sessionID: string, req: IncomingMessage, resp: ServerResponse): void => { - if (Object.keys(this.handlers).length === 0) return; + if (Object.keys(this.handlers).length === 0) + { + return; + } // Get all routes for the HTTP method and sort them so that // The more precise is selected (eg. "/test/A" is selected over "/test") @@ -70,8 +82,11 @@ export const Listen = (basePath: string) => routes.sort((routeA, routeB) => routeB.length - routeA.length); // Filter to select valid routes but only use the first element since it's the most precise - const validRoutes = routes.filter(handlerKey => (new RegExp(handlerKey)).test(route)); - if (validRoutes.length > 0) routesHandles[validRoutes[0]](sessionID, req, resp); + const validRoutes = routes.filter((handlerKey) => (new RegExp(handlerKey)).test(route)); + if (validRoutes.length > 0) + { + routesHandles[validRoutes[0]](sessionID, req, resp); + } }; }; }; @@ -90,14 +105,13 @@ const createHttpDecorator = (httpMethod: HttpMethods) => return (target: any, propertyKey: string) => { // If the handlers array has not been initialized yet - if (!target["handlers"]) target["handlers"] = []; + if (!target.handlers) + { + target.handlers = []; + } // Flag the method as a HTTP handler - target["handlers"].push({ - handlerName: propertyKey, - path, - httpMethod - }); + target.handlers.push({ handlerName: propertyKey, path, httpMethod }); }; }; }; @@ -130,4 +144,4 @@ export const Post = createHttpDecorator(HttpMethods.POST); /** * HTTP PUT decorator */ -export const Put = createHttpDecorator(HttpMethods.PUT); \ No newline at end of file +export const Put = createHttpDecorator(HttpMethods.PUT); diff --git a/project/src/models/external/IPostAkiLoadMod.ts b/project/src/models/external/IPostAkiLoadMod.ts index 0558350e..77c999fc 100644 --- a/project/src/models/external/IPostAkiLoadMod.ts +++ b/project/src/models/external/IPostAkiLoadMod.ts @@ -3,4 +3,4 @@ import { DependencyContainer } from "@spt-aki/models/external/tsyringe"; export interface IPostAkiLoadMod { postAkiLoad(container: DependencyContainer): void; -} \ No newline at end of file +} diff --git a/project/src/models/external/IPostAkiLoadModAsync.ts b/project/src/models/external/IPostAkiLoadModAsync.ts index 2a6419ac..5cc456af 100644 --- a/project/src/models/external/IPostAkiLoadModAsync.ts +++ b/project/src/models/external/IPostAkiLoadModAsync.ts @@ -3,4 +3,4 @@ import { DependencyContainer } from "@spt-aki/models/external/tsyringe"; export interface IPostAkiLoadModAsync { postAkiLoadAsync(container: DependencyContainer): Promise; -} \ No newline at end of file +} diff --git a/project/src/models/external/IPostDBLoadMod.ts b/project/src/models/external/IPostDBLoadMod.ts index a42c899c..18e2c949 100644 --- a/project/src/models/external/IPostDBLoadMod.ts +++ b/project/src/models/external/IPostDBLoadMod.ts @@ -3,4 +3,4 @@ import { DependencyContainer } from "@spt-aki/models/external/tsyringe"; export interface IPostDBLoadMod { postDBLoad(container: DependencyContainer): void; -} \ No newline at end of file +} diff --git a/project/src/models/external/IPostDBLoadModAsync.ts b/project/src/models/external/IPostDBLoadModAsync.ts index afe261bc..9b273a45 100644 --- a/project/src/models/external/IPostDBLoadModAsync.ts +++ b/project/src/models/external/IPostDBLoadModAsync.ts @@ -3,4 +3,4 @@ import { DependencyContainer } from "@spt-aki/models/external/tsyringe"; export interface IPostDBLoadModAsync { postDBLoadAsync(container: DependencyContainer): Promise; -} \ No newline at end of file +} diff --git a/project/src/models/external/IPreAkiLoadMod.ts b/project/src/models/external/IPreAkiLoadMod.ts index f78b9273..9934e181 100644 --- a/project/src/models/external/IPreAkiLoadMod.ts +++ b/project/src/models/external/IPreAkiLoadMod.ts @@ -3,4 +3,4 @@ import { DependencyContainer } from "@spt-aki/models/external/tsyringe"; export interface IPreAkiLoadMod { preAkiLoad(container: DependencyContainer): void; -} \ No newline at end of file +} diff --git a/project/src/models/external/IPreAkiLoadModAsync.ts b/project/src/models/external/IPreAkiLoadModAsync.ts index 9ae3b1e1..72931dcf 100644 --- a/project/src/models/external/IPreAkiLoadModAsync.ts +++ b/project/src/models/external/IPreAkiLoadModAsync.ts @@ -3,4 +3,4 @@ import { DependencyContainer } from "@spt-aki/models/external/tsyringe"; export interface IPreAkiLoadModAsync { preAkiLoadAsync(container: DependencyContainer): Promise; -} \ No newline at end of file +} diff --git a/project/src/models/external/tsyringe.ts b/project/src/models/external/tsyringe.ts index 11cc2351..3be95e9a 100644 --- a/project/src/models/external/tsyringe.ts +++ b/project/src/models/external/tsyringe.ts @@ -1,2 +1,2 @@ import type { DependencyContainer } from "tsyringe"; -export type { DependencyContainer } ; \ No newline at end of file +export type {DependencyContainer}; diff --git a/project/src/models/spt/bindings/Route.ts b/project/src/models/spt/bindings/Route.ts index 14224b74..be18924e 100644 --- a/project/src/models/spt/bindings/Route.ts +++ b/project/src/models/spt/bindings/Route.ts @@ -1,4 +1,4 @@ export interface IRoute { - aki: any -} \ No newline at end of file + aki: any; +} diff --git a/project/src/models/spt/bots/BotGenerationDetails.ts b/project/src/models/spt/bots/BotGenerationDetails.ts index f6893f16..ea0ed14b 100644 --- a/project/src/models/spt/bots/BotGenerationDetails.ts +++ b/project/src/models/spt/bots/BotGenerationDetails.ts @@ -1,19 +1,19 @@ export interface BotGenerationDetails { /** Should the bot be generated as a PMC */ - isPmc: boolean + isPmc: boolean; /** assault/pmcBot etc */ - role: string + role: string; /** Side of bot */ - side: string + side: string; /** Active players current level */ - playerLevel: number + playerLevel: number; /** Delta of highest level of bot */ - botRelativeLevelDeltaMax: number + botRelativeLevelDeltaMax: number; /** How many to create and store */ - botCountToGenerate: number + botCountToGenerate: number; /** Desired difficulty of the bot */ - botDifficulty: string + botDifficulty: string; /** Will the generated bot be a player scav */ - isPlayerScav: boolean -} \ No newline at end of file + isPlayerScav: boolean; +} diff --git a/project/src/models/spt/bots/GenerateWeaponResult.ts b/project/src/models/spt/bots/GenerateWeaponResult.ts index a53f26e4..c720383e 100644 --- a/project/src/models/spt/bots/GenerateWeaponResult.ts +++ b/project/src/models/spt/bots/GenerateWeaponResult.ts @@ -9,4 +9,4 @@ export class GenerateWeaponResult chosenUbglAmmoTpl: string; weaponMods: Mods; weaponTemplate: ITemplateItem; -} \ No newline at end of file +} diff --git a/project/src/models/spt/bots/IBotLootCache.ts b/project/src/models/spt/bots/IBotLootCache.ts index 9460a094..83735fca 100644 --- a/project/src/models/spt/bots/IBotLootCache.ts +++ b/project/src/models/spt/bots/IBotLootCache.ts @@ -2,20 +2,20 @@ import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem"; export interface IBotLootCache { - backpackLoot: ITemplateItem[] - pocketLoot: ITemplateItem[] - vestLoot: ITemplateItem[] - combinedPoolLoot: ITemplateItem[] + backpackLoot: ITemplateItem[]; + pocketLoot: ITemplateItem[]; + vestLoot: ITemplateItem[]; + combinedPoolLoot: ITemplateItem[]; - specialItems: ITemplateItem[] - healingItems: ITemplateItem[] - drugItems: ITemplateItem[] - stimItems: ITemplateItem[] - grenadeItems: ITemplateItem[] + specialItems: ITemplateItem[]; + healingItems: ITemplateItem[]; + drugItems: ITemplateItem[]; + stimItems: ITemplateItem[]; + grenadeItems: ITemplateItem[]; } export enum LootCacheType - { +{ SPECIAL = "Special", BACKPACK = "Backpack", POCKET = "Pocket", @@ -24,6 +24,5 @@ export enum LootCacheType HEALING_ITEMS = "HealingItems", DRUG_ITEMS = "DrugItems", STIM_ITEMS = "StimItems", - GRENADE_ITEMS = "GrenadeItems" - -} \ No newline at end of file + GRENADE_ITEMS = "GrenadeItems", +} diff --git a/project/src/models/spt/callbacks/IBundleCallbacks.ts b/project/src/models/spt/callbacks/IBundleCallbacks.ts index a99cadfa..1f0354df 100644 --- a/project/src/models/spt/callbacks/IBundleCallbacks.ts +++ b/project/src/models/spt/callbacks/IBundleCallbacks.ts @@ -1,6 +1,6 @@ export interface IBundleCallbacks { - sendBundle(sessionID: string, req: any, resp: any, body: any): any - getBundles(url: string, info: any, sessionID: string): string - getBundle(url: string, info: any, sessionID: string): string + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; } diff --git a/project/src/models/spt/callbacks/ICustomizationCallbacks.ts b/project/src/models/spt/callbacks/ICustomizationCallbacks.ts index bbb0303e..0398f5af 100644 --- a/project/src/models/spt/callbacks/ICustomizationCallbacks.ts +++ b/project/src/models/spt/callbacks/ICustomizationCallbacks.ts @@ -11,4 +11,4 @@ export interface ICustomizationCallbacks getTraderSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; -} \ No newline at end of file +} diff --git a/project/src/models/spt/callbacks/IDataCallbacks.ts b/project/src/models/spt/callbacks/IDataCallbacks.ts index a4d08185..6f970b76 100644 --- a/project/src/models/spt/callbacks/IDataCallbacks.ts +++ b/project/src/models/spt/callbacks/IDataCallbacks.ts @@ -15,11 +15,27 @@ export interface IDataCallbacks getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; - getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData; getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; - gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; - getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; - getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + gethideoutProduction( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData; + getHideoutScavcase( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData; + getLocalesLanguages( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData>; getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; } diff --git a/project/src/models/spt/callbacks/IDialogueCallbacks.ts b/project/src/models/spt/callbacks/IDialogueCallbacks.ts index 818c5db2..66f83179 100644 --- a/project/src/models/spt/callbacks/IDialogueCallbacks.ts +++ b/project/src/models/spt/callbacks/IDialogueCallbacks.ts @@ -18,16 +18,32 @@ import { DialogueInfo } from "@spt-aki/models/eft/profile/IAkiProfile"; export interface IDialogueCallbacks { - getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getFriendList( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData; getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; - getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; - getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList( + url: string, + info: IGetMailDialogListRequestData, + sessionID: string, + ): IGetBodyResponseData; + getMailDialogView( + url: string, + info: IGetMailDialogViewRequestData, + sessionID: string, + ): IGetBodyResponseData; getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; - getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments( + url: string, + info: IGetAllAttachmentsRequestData, + sessionID: string, + ): IGetBodyResponseData; listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; sendFriendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; diff --git a/project/src/models/spt/callbacks/IGameCallbacks.ts b/project/src/models/spt/callbacks/IGameCallbacks.ts index 15d07c67..bb08f360 100644 --- a/project/src/models/spt/callbacks/IGameCallbacks.ts +++ b/project/src/models/spt/callbacks/IGameCallbacks.ts @@ -10,7 +10,11 @@ export interface IGameCallbacks versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; - getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig( + url: string, + info: IGameEmptyCrcRequestData, + sessionID: string, + ): IGetBodyResponseData; getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/project/src/models/spt/callbacks/IHideoutCallbacks.ts b/project/src/models/spt/callbacks/IHideoutCallbacks.ts index 2ef57ab0..3746d364 100644 --- a/project/src/models/spt/callbacks/IHideoutCallbacks.ts +++ b/project/src/models/spt/callbacks/IHideoutCallbacks.ts @@ -13,13 +13,41 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve export interface IHideoutCallbacks { upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; - upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; - putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; - takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete( + pmcData: IPmcData, + body: IHideoutUpgradeCompleteRequestData, + sessionID: string, + ): IItemEventRouterResponse; + putItemsInAreaSlots( + pmcData: IPmcData, + body: IHideoutPutItemInRequestData, + sessionID: string, + ): IItemEventRouterResponse; + takeItemsFromAreaSlots( + pmcData: IPmcData, + body: IHideoutTakeItemOutRequestData, + sessionID: string, + ): IItemEventRouterResponse; toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; - singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; - scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; - continuousProductionStart(pmcData: IPmcData, body: IHideoutContinuousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; - takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart( + pmcData: IPmcData, + body: IHideoutSingleProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse; + scavCaseProductionStart( + pmcData: IPmcData, + body: IHideoutScavCaseStartRequestData, + sessionID: string, + ): IItemEventRouterResponse; + continuousProductionStart( + pmcData: IPmcData, + body: IHideoutContinuousProductionStartRequestData, + sessionID: string, + ): IItemEventRouterResponse; + takeProduction( + pmcData: IPmcData, + body: IHideoutTakeProductionRequestData, + sessionID: string, + ): IItemEventRouterResponse; update(timeSinceLastRun: number): boolean; -} \ No newline at end of file +} diff --git a/project/src/models/spt/callbacks/IInventoryCallbacks.ts b/project/src/models/spt/callbacks/IInventoryCallbacks.ts index e7aa62be..92640338 100644 --- a/project/src/models/spt/callbacks/IInventoryCallbacks.ts +++ b/project/src/models/spt/callbacks/IInventoryCallbacks.ts @@ -30,9 +30,25 @@ export interface IInventoryCallbacks tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; - readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia( + pmcData: IPmcData, + body: IInventoryReadEncyclopediaRequestData, + sessionID: string, + ): IItemEventRouterResponse; sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; - createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; - deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; - editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker( + pmcData: IPmcData, + body: IInventoryCreateMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse; + deleteMapMarker( + pmcData: IPmcData, + body: IInventoryDeleteMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse; + editMapMarker( + pmcData: IPmcData, + body: IInventoryEditMarkerRequestData, + sessionID: string, + ): IItemEventRouterResponse; } diff --git a/project/src/models/spt/callbacks/IItemEventCallbacks.ts b/project/src/models/spt/callbacks/IItemEventCallbacks.ts index ccfabaea..5b02f663 100644 --- a/project/src/models/spt/callbacks/IItemEventCallbacks.ts +++ b/project/src/models/spt/callbacks/IItemEventCallbacks.ts @@ -4,5 +4,9 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve export interface IItemEventCallbacks { - handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; + handleEvents( + url: string, + info: IItemEventRouterRequest, + sessionID: string, + ): IGetBodyResponseData; } diff --git a/project/src/models/spt/callbacks/INotifierCallbacks.ts b/project/src/models/spt/callbacks/INotifierCallbacks.ts index 45148f28..1dd6a6c0 100644 --- a/project/src/models/spt/callbacks/INotifierCallbacks.ts +++ b/project/src/models/spt/callbacks/INotifierCallbacks.ts @@ -13,7 +13,11 @@ export interface INotifierCallbacks */ sendNotification(sessionID: string, req: any, resp: any, data: any): void; getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; - createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + createNotifierChannel( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData; selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; notify(url: string, info: any, sessionID: string): string; -} \ No newline at end of file +} diff --git a/project/src/models/spt/callbacks/IPresetBuildCallbacks.ts b/project/src/models/spt/callbacks/IPresetBuildCallbacks.ts index 33bc01b6..fc1cdc48 100644 --- a/project/src/models/spt/callbacks/IPresetBuildCallbacks.ts +++ b/project/src/models/spt/callbacks/IPresetBuildCallbacks.ts @@ -7,8 +7,24 @@ import { IWeaponBuild } from "@spt-aki/models/eft/profile/IAkiProfile"; export interface IPresetBuildCallbacks { getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; - saveWeaponBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; - removeWeaponBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; - saveEquipmentBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; - removeEquipmentBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + saveWeaponBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse; + removeWeaponBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse; + saveEquipmentBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse; + removeEquipmentBuild( + pmcData: IPmcData, + body: IPresetBuildActionRequestData, + sessionID: string, + ): IItemEventRouterResponse; } diff --git a/project/src/models/spt/callbacks/IProfileCallbacks.ts b/project/src/models/spt/callbacks/IProfileCallbacks.ts index ff687972..41ffecbe 100644 --- a/project/src/models/spt/callbacks/IProfileCallbacks.ts +++ b/project/src/models/spt/callbacks/IProfileCallbacks.ts @@ -19,5 +19,9 @@ export interface IProfileCallbacks validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; - searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; + searchFriend( + url: string, + info: ISearchFriendRequestData, + sessionID: string, + ): IGetBodyResponseData; } diff --git a/project/src/models/spt/callbacks/IQuestCallbacks.ts b/project/src/models/spt/callbacks/IQuestCallbacks.ts index e3a7c782..f68105f6 100644 --- a/project/src/models/spt/callbacks/IQuestCallbacks.ts +++ b/project/src/models/spt/callbacks/IQuestCallbacks.ts @@ -12,10 +12,18 @@ import { IRepeatableQuestChangeRequest } from "@spt-aki/models/eft/quests/IRepea export interface IQuestCallbacks { - changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + changeRepeatableQuest( + pmcData: IPmcData, + body: IRepeatableQuestChangeRequest, + sessionID: string, + ): IItemEventRouterResponse; acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; - activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods( + url: string, + info: IEmptyRequestData, + sessionID: string, + ): IGetBodyResponseData; } diff --git a/project/src/models/spt/callbacks/IRagfairCallbacks.ts b/project/src/models/spt/callbacks/IRagfairCallbacks.ts index 4b0a8269..5550e6b5 100644 --- a/project/src/models/spt/callbacks/IRagfairCallbacks.ts +++ b/project/src/models/spt/callbacks/IRagfairCallbacks.ts @@ -9,11 +9,15 @@ import { IGetMarketPriceRequestData } from "@spt-aki/models/eft/ragfair/IGetMark import { IRemoveOfferRequestData } from "@spt-aki/models/eft/ragfair/IRemoveOfferRequestData"; import { ISearchRequestData } from "@spt-aki/models/eft/ragfair/ISearchRequestData"; -export interface IRagfairCallbacks +export interface IRagfairCallbacks { load(): void; search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; - getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice( + url: string, + info: IGetMarketPriceRequestData, + sessionID: string, + ): IGetBodyResponseData; getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/project/src/models/spt/callbacks/ITradeCallbacks.ts b/project/src/models/spt/callbacks/ITradeCallbacks.ts index 95882807..d4ef386c 100644 --- a/project/src/models/spt/callbacks/ITradeCallbacks.ts +++ b/project/src/models/spt/callbacks/ITradeCallbacks.ts @@ -6,5 +6,9 @@ import { IProcessRagfairTradeRequestData } from "@spt-aki/models/eft/trade/IProc export interface ITradeCallbacks { processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; - processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade( + pmcData: IPmcData, + body: IProcessRagfairTradeRequestData, + sessionID: string, + ): IItemEventRouterResponse; } diff --git a/project/src/models/spt/callbacks/ITraderCallbacks.ts b/project/src/models/spt/callbacks/ITraderCallbacks.ts index 2ca11af9..33a854e3 100644 --- a/project/src/models/spt/callbacks/ITraderCallbacks.ts +++ b/project/src/models/spt/callbacks/ITraderCallbacks.ts @@ -1,17 +1,16 @@ /* * File generated by Interface generator (dotup.dotup-vscode-interface-generator) - * Date: 2022-04-28 14:22:44 -*/ + * Date: 2022-04-28 14:22:44 + */ import { IEmptyRequestData } from "@spt-aki/models/eft/common/IEmptyRequestData"; import { ITraderAssort, ITraderBase } from "@spt-aki/models/eft/common/tables/ITrader"; import { IGetBodyResponseData } from "@spt-aki/models/eft/httpResponse/IGetBodyResponseData"; export interface ITraderCallbacks { - load(): void - getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData - getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData - getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData - update(): boolean - + load(): void; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + update(): boolean; } diff --git a/project/src/models/spt/config/IAirdropConfig.ts b/project/src/models/spt/config/IAirdropConfig.ts index e09fe1e1..dc385675 100644 --- a/project/src/models/spt/config/IAirdropConfig.ts +++ b/project/src/models/spt/config/IAirdropConfig.ts @@ -4,61 +4,60 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IAirdropConfig extends IBaseConfig { - kind: "aki-airdrop" - airdropChancePercent: AirdropChancePercent - airdropTypeWeightings: Record + kind: "aki-airdrop"; + airdropChancePercent: AirdropChancePercent; + airdropTypeWeightings: Record; /** Lowest point plane will fly at */ - planeMinFlyHeight: number + planeMinFlyHeight: number; /** Highest point plane will fly at */ - planeMaxFlyHeight: number + planeMaxFlyHeight: number; /** Loudness of plane engine */ - planeVolume: number + planeVolume: number; /** Speed plane flies overhead */ - planeSpeed: number + planeSpeed: number; /** Speed loot crate falls after being dropped */ - crateFallSpeed: number + crateFallSpeed: number; /** Container tpls to use when spawning crate - affects container size, keyed by drop type e.g. mixed/weaponArmor/foodMedical/barter */ - containerIds: Record + containerIds: Record; /** Earliest time aircraft will spawn in raid */ - airdropMinStartTimeSeconds: number + airdropMinStartTimeSeconds: number; /** Latest time aircraft will spawn in raid */ - airdropMaxStartTimeSeconds: number + airdropMaxStartTimeSeconds: number; /** What rewards will the loot crate contain, keyed by drop type e.g. mixed/weaponArmor/foodMedical/barter */ - loot: Record + loot: Record; } /** Chance map will have an airdrop occur out of 100 - locations not included count as 0% */ export interface AirdropChancePercent { - bigmap: number - woods: number - lighthouse: number - shoreline: number - interchange: number - reserve: number - tarkovStreets: number + bigmap: number; + woods: number; + lighthouse: number; + shoreline: number; + interchange: number; + reserve: number; + tarkovStreets: number; } /** Loot inside crate */ export interface AirdropLoot { /** Min/max of weapons inside crate */ - presetCount?: MinMax + presetCount?: MinMax; /** Min/max of items inside crate */ - itemCount: MinMax + itemCount: MinMax; /** Min/max of sealed weapon boxes inside crate */ - weaponCrateCount: MinMax + weaponCrateCount: MinMax; /** Items to never allow - tpls */ - itemBlacklist: string[] + itemBlacklist: string[]; /** Item type (parentId) to allow inside crate */ - itemTypeWhitelist: string[] + itemTypeWhitelist: string[]; /** Item type/ item tpls to limit count of inside crate - key: item base type: value: max count */ - itemLimits: Record + itemLimits: Record; /** Items to limit stack size of key: item tpl value: min/max stack size */ - itemStackLimits: Record + itemStackLimits: Record; /** Armor levels to allow inside crate e.g. [4,5,6] */ - armorLevelWhitelist?: number[] + armorLevelWhitelist?: number[]; /** Should boss items be added to airdrop crate */ allowBossItems: boolean; } - \ No newline at end of file diff --git a/project/src/models/spt/config/IBaseConfig.ts b/project/src/models/spt/config/IBaseConfig.ts index d1f15405..c35b6fa6 100644 --- a/project/src/models/spt/config/IBaseConfig.ts +++ b/project/src/models/spt/config/IBaseConfig.ts @@ -1,4 +1,4 @@ export interface IBaseConfig { - kind: string -} \ No newline at end of file + kind: string; +} diff --git a/project/src/models/spt/config/IBotConfig.ts b/project/src/models/spt/config/IBotConfig.ts index 035fa869..bc699547 100644 --- a/project/src/models/spt/config/IBotConfig.ts +++ b/project/src/models/spt/config/IBotConfig.ts @@ -5,89 +5,89 @@ import { IBotDurability } from "@spt-aki/models/spt/config/IBotDurability"; export interface IBotConfig extends IBaseConfig { - kind: "aki-bot" + kind: "aki-bot"; /** How many variants of each bot should be generated on raid start */ - presetBatch: PresetBatch + presetBatch: PresetBatch; /** What bot types should be classified as bosses */ - bosses: string[] + bosses: string[]; /** Control weapon/armor durability min/max values for each bot type */ - durability: IBotDurability + durability: IBotDurability; /** Controls the percentage values of randomization item resources */ - lootItemResourceRandomization: Record + lootItemResourceRandomization: Record; /** Control the weighting of how expensive an average loot item is on a PMC or Scav */ - lootNValue: LootNvalue + lootNValue: LootNvalue; /** Control what bots are added to a bots revenge list key: bottype, value: bottypes to revenge on seeing their death */ - revenge: Record + revenge: Record; /** Control how many items are allowed to spawn on a bot * key: bottype, value: */ - itemSpawnLimits: Record> + itemSpawnLimits: Record>; /** Blacklist/whitelist items on a bot */ - equipment: Record + equipment: Record; /** Show a bots botType value after their name */ - showTypeInNickname: boolean + showTypeInNickname: boolean; /** What ai brain should a normal scav use per map */ - assaultBrainType: Record> + assaultBrainType: Record>; /** Max number of bots that can be spawned in a raid at any one time */ - maxBotCap: Record + maxBotCap: Record; /** Chance scav has fake pscav name e.g. Scav name (player name) */ chanceAssaultScavHasPlayerScavName: number; /** How many stacks of secret ammo should a bot have in its bot secure container */ - secureContainerAmmoStackCount: number + secureContainerAmmoStackCount: number; } /** Number of bots to generate and store in cache on raid start per bot type */ -export interface PresetBatch +export interface PresetBatch { - assault: number - bossBully: number - bossGluhar: number - bossKilla: number - bossKojaniy: number - bossSanitar: number - bossTagilla: number - bossKnight: number - bossTest: number - cursedAssault: number - followerBully: number - followerGluharAssault: number - followerGluharScout: number - followerGluharSecurity: number - followerGluharSnipe: number - followerKojaniy: number - followerSanitar: number - followerTagilla: number - followerBirdEye: number - followerBigPipe: number - followerTest: number, - followerBoar: number - marksman: number - pmcBot: number - sectantPriest: number - sectantWarrior: number - gifter: number - test: number - exUsec: number, - arenaFighterEvent: number, - arenaFighter: number, - crazyAssaultEvent: number, - bossBoar: number, - bossBoarSniper: number, - sptUsec: number, - sptBear: number + assault: number; + bossBully: number; + bossGluhar: number; + bossKilla: number; + bossKojaniy: number; + bossSanitar: number; + bossTagilla: number; + bossKnight: number; + bossTest: number; + cursedAssault: number; + followerBully: number; + followerGluharAssault: number; + followerGluharScout: number; + followerGluharSecurity: number; + followerGluharSnipe: number; + followerKojaniy: number; + followerSanitar: number; + followerTagilla: number; + followerBirdEye: number; + followerBigPipe: number; + followerTest: number; + followerBoar: number; + marksman: number; + pmcBot: number; + sectantPriest: number; + sectantWarrior: number; + gifter: number; + test: number; + exUsec: number; + arenaFighterEvent: number; + arenaFighter: number; + crazyAssaultEvent: number; + bossBoar: number; + bossBoarSniper: number; + sptUsec: number; + sptBear: number; } -export interface LootNvalue +export interface LootNvalue { - scav: number - pmc: number + scav: number; + pmc: number; } export interface EquipmentFilters { /** Limits for mod types per weapon .e.g. scopes */ - weaponModLimits: ModLimits + weaponModLimits: ModLimits; /** Whitelist for weapon sight types allowed per gun */ - weaponSightWhitelist: Record + weaponSightWhitelist: Record; /** Chance face shield is down/active */ faceShieldIsActiveChancePercent?: number; /** Chance gun flashlight is active during the day */ @@ -101,79 +101,79 @@ export interface EquipmentFilters /** Chance NODS are down/active during the night */ nvgIsActiveChanceNightPercent?: number; /** Adjust weighting/chances of items on bot by level of bot */ - randomisation: RandomisationDetails[] + randomisation: RandomisationDetails[]; /** Blacklist equipment by level of bot */ - blacklist: EquipmentFilterDetails[] + blacklist: EquipmentFilterDetails[]; /** Whitelist equipment by level of bot */ - whitelist: EquipmentFilterDetails[] + whitelist: EquipmentFilterDetails[]; /** Adjust equipment/ammo */ - weightingAdjustmentsByBotLevel: WeightingAdjustmentDetails[] + weightingAdjustmentsByBotLevel: WeightingAdjustmentDetails[]; /** Same as weightingAdjustments but based on player level instead of bot level */ - weightingAdjustmentsByPlayerLevel?: WeightingAdjustmentDetails[] + weightingAdjustmentsByPlayerLevel?: WeightingAdjustmentDetails[]; /** Should the stock mod be forced to spawn on bot */ - forceStock: boolean + forceStock: boolean; } export interface ModLimits { /** How many scopes are allowed on a weapon - hard coded to work with OPTIC_SCOPE, ASSAULT_SCOPE, COLLIMATOR, COMPACT_COLLIMATOR */ - scopeLimit?: number + scopeLimit?: number; /** How many lasers or lights are allowed on a weapon - hard coded to work with TACTICAL_COMBO, and FLASHLIGHT */ - lightLaserLimit?: number + lightLaserLimit?: number; } export interface RandomisationDetails { /** Between what levels do these randomisation setting apply to */ - levelRange: MinMax - generation?: Record + levelRange: MinMax; + generation?: Record; /** Mod slots that should be fully randomisate -ignores mods from bottype.json */ - randomisedWeaponModSlots?: string[] + randomisedWeaponModSlots?: string[]; /** Armor slots that should be randomised e.g. 'Headwear, Armband' */ - randomisedArmorSlots?: string[] + randomisedArmorSlots?: string[]; /** Equipment chances */ - equipment?: Record + equipment?: Record; /** Mod chances */ - mods?: Record + mods?: Record; } export interface EquipmentFilterDetails { /** Between what levels do these equipment filter setting apply to */ - levelRange: MinMax + levelRange: MinMax; /** Key: mod slot name e.g. mod_magazine, value: item tpls */ - equipment: Record + equipment: Record; /** Key: cartridge type e.g. Caliber23x75, value: item tpls */ - cartridge: Record + cartridge: Record; } export interface WeightingAdjustmentDetails { /** Between what levels do these weight settings apply to */ - levelRange: MinMax + levelRange: MinMax; /** Key: ammo type e.g. Caliber556x45NATO, value: item tpl + weight */ - ammo?: AdjustmentDetails + ammo?: AdjustmentDetails; /** Key: equipment slot e.g. TacticalVest, value: item tpl + weight */ - equipment?: AdjustmentDetails + equipment?: AdjustmentDetails; /** Key: clothing slot e.g. feet, value: item tpl + weight */ - clothing?: AdjustmentDetails + clothing?: AdjustmentDetails; } export interface AdjustmentDetails { - add: Record> - edit: Record> + add: Record>; + edit: Record>; } export interface IRandomisedResourceDetails { - food: IRandomisedResourceValues - meds: IRandomisedResourceValues + food: IRandomisedResourceValues; + meds: IRandomisedResourceValues; } export interface IRandomisedResourceValues { /** Minimum percent of item to randomized between min and max resource*/ - resourcePercent: number + resourcePercent: number; /** Chance for randomization to not occur */ - chanceMaxResourcePercent: number + chanceMaxResourcePercent: number; } diff --git a/project/src/models/spt/config/IBotDurability.ts b/project/src/models/spt/config/IBotDurability.ts index e3447a8b..c831f204 100644 --- a/project/src/models/spt/config/IBotDurability.ts +++ b/project/src/models/spt/config/IBotDurability.ts @@ -1,58 +1,58 @@ -export interface IBotDurability +export interface IBotDurability { - default: DefaultDurability - pmc: PmcDurability - boss: BotDurability - follower: BotDurability - assault: BotDurability - cursedassault: BotDurability - marksman: BotDurability - pmcbot: BotDurability - exusec: BotDurability - gifter: BotDurability - sectantpriest: BotDurability - sectantwarrior: BotDurability + default: DefaultDurability; + pmc: PmcDurability; + boss: BotDurability; + follower: BotDurability; + assault: BotDurability; + cursedassault: BotDurability; + marksman: BotDurability; + pmcbot: BotDurability; + exusec: BotDurability; + gifter: BotDurability; + sectantpriest: BotDurability; + sectantwarrior: BotDurability; } /** Durability values to be used when a more specific bot type cant be found */ -export interface DefaultDurability +export interface DefaultDurability { - armor: ArmorDurability - weapon: WeaponDurability + armor: ArmorDurability; + weapon: WeaponDurability; } -export interface PmcDurability +export interface PmcDurability { - armor: PmcDurabilityArmor - weapon: WeaponDurability + armor: PmcDurabilityArmor; + weapon: WeaponDurability; } -export interface PmcDurabilityArmor +export interface PmcDurabilityArmor { - lowestMaxPercent: number - highestMaxPercent: number - maxDelta: number - minDelta: number + lowestMaxPercent: number; + highestMaxPercent: number; + maxDelta: number; + minDelta: number; } -export interface BotDurability +export interface BotDurability { - armor: ArmorDurability - weapon: WeaponDurability + armor: ArmorDurability; + weapon: WeaponDurability; } -export interface ArmorDurability +export interface ArmorDurability { - maxDelta: number - minDelta: number - minLimitPercent: number + maxDelta: number; + minDelta: number; + minLimitPercent: number; } -export interface WeaponDurability +export interface WeaponDurability { - lowestMax: number - highestMax: number - maxDelta: number - minDelta: number - minLimitPercent: number -} \ No newline at end of file + lowestMax: number; + highestMax: number; + maxDelta: number; + minDelta: number; + minLimitPercent: number; +} diff --git a/project/src/models/spt/config/ICoreConfig.ts b/project/src/models/spt/config/ICoreConfig.ts index 20d6be99..9c20726b 100644 --- a/project/src/models/spt/config/ICoreConfig.ts +++ b/project/src/models/spt/config/ICoreConfig.ts @@ -25,8 +25,8 @@ export interface IGameFixes removeModItemsFromProfile: boolean; } -export interface IServerFeatures +export interface IServerFeatures { /* Controls whether or not the server attempts to download mod dependencies not included in the server's executable */ autoInstallModDependencies: boolean; -} \ No newline at end of file +} diff --git a/project/src/models/spt/config/IGiftsConfig.ts b/project/src/models/spt/config/IGiftsConfig.ts index 95887014..f772f91b 100644 --- a/project/src/models/spt/config/IGiftsConfig.ts +++ b/project/src/models/spt/config/IGiftsConfig.ts @@ -7,26 +7,26 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IGiftsConfig extends IBaseConfig { - kind: "aki-gifts" - gifts: Record + kind: "aki-gifts"; + gifts: Record; } export interface Gift { /** Items to send to player */ - items: Item[] + items: Item[]; /** Who is sending the gift to player */ - sender: GiftSenderType + sender: GiftSenderType; /** Optinal - supply a users id to send from, not necessary when sending from SYSTEM or TRADER */ - senderId?: string - senderDetails: IUserDialogInfo, + senderId?: string; + senderDetails: IUserDialogInfo; /** Optional - supply a trader type to send from, not necessary when sending from SYSTEM or USER */ - trader?: Traders - messageText: string + trader?: Traders; + messageText: string; /** Optional - if sending text from the client locale file */ - localeTextId?: string + localeTextId?: string; /** Optional - Used by Seasonal events to send on specific day */ - timestampToSend?: number - associatedEvent: SeasonalEventType - collectionTimeHours: number -} \ No newline at end of file + timestampToSend?: number; + associatedEvent: SeasonalEventType; + collectionTimeHours: number; +} diff --git a/project/src/models/spt/config/IHealthConfig.ts b/project/src/models/spt/config/IHealthConfig.ts index e31de433..33a62d96 100644 --- a/project/src/models/spt/config/IHealthConfig.ts +++ b/project/src/models/spt/config/IHealthConfig.ts @@ -2,19 +2,19 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IHealthConfig extends IBaseConfig { - kind: "aki-health" - healthMultipliers: HealthMultipliers - save: Save + kind: "aki-health"; + healthMultipliers: HealthMultipliers; + save: Save; } -export interface HealthMultipliers +export interface HealthMultipliers { - death: number - blacked: number + death: number; + blacked: number; } -export interface Save +export interface Save { - health: boolean - effects: boolean -} \ No newline at end of file + health: boolean; + effects: boolean; +} diff --git a/project/src/models/spt/config/IHideoutConfig.ts b/project/src/models/spt/config/IHideoutConfig.ts index 05eea7fc..06b199b0 100644 --- a/project/src/models/spt/config/IHideoutConfig.ts +++ b/project/src/models/spt/config/IHideoutConfig.ts @@ -2,8 +2,8 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IHideoutConfig extends IBaseConfig { - kind: "aki-hideout" - runIntervalSeconds: number - hoursForSkillCrafting: number + kind: "aki-hideout"; + runIntervalSeconds: number; + hoursForSkillCrafting: number; expCraftAmount: number; -} \ No newline at end of file +} diff --git a/project/src/models/spt/config/IHttpConfig.ts b/project/src/models/spt/config/IHttpConfig.ts index 7a78105d..e1ddb9d5 100644 --- a/project/src/models/spt/config/IHttpConfig.ts +++ b/project/src/models/spt/config/IHttpConfig.ts @@ -2,11 +2,11 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IHttpConfig extends IBaseConfig { - webSocketPingDelayMs: number - kind: "aki-http" - ip: string - port: number - logRequests: boolean + webSocketPingDelayMs: number; + kind: "aki-http"; + ip: string; + port: number; + logRequests: boolean; /** e.g. "Aki_Data/Server/images/traders/579dc571d53a0658a154fbec.png": "Aki_Data/Server/images/traders/NewTraderImage.png" */ - serverImagePathOverride: Record -} \ No newline at end of file + serverImagePathOverride: Record; +} diff --git a/project/src/models/spt/config/IInRaidConfig.ts b/project/src/models/spt/config/IInRaidConfig.ts index 9a4d5f16..baebaf6b 100644 --- a/project/src/models/spt/config/IInRaidConfig.ts +++ b/project/src/models/spt/config/IInRaidConfig.ts @@ -2,39 +2,39 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IInRaidConfig extends IBaseConfig { - kind: "aki-inraid" - MIAOnRaidEnd: boolean + kind: "aki-inraid"; + MIAOnRaidEnd: boolean; /** Overrides to apply to the pre-raid settings screen */ - raidMenuSettings: RaidMenuSettings + raidMenuSettings: RaidMenuSettings; /** What effects should be saved post-raid */ - save: Save + save: Save; /** Names of car extracts */ - carExtracts: string[] + carExtracts: string[]; /** Names of coop extracts */ - coopExtracts: string[] + coopExtracts: string[]; /** Fence rep gain from a single car extract */ - carExtractBaseStandingGain: number + carExtractBaseStandingGain: number; /** Fence rep gain from a single coop extract */ - coopExtractBaseStandingGain: number + coopExtractBaseStandingGain: number; /** Fence rep gain when successfully extracting as pscav */ - scavExtractGain: number + scavExtractGain: number; /** On death should items in your secure keep their Find in raid status regardless of how you finished the raid */ - keepFiRSecureContainerOnDeath: boolean + keepFiRSecureContainerOnDeath: boolean; } -export interface RaidMenuSettings +export interface RaidMenuSettings { - aiAmount: string - aiDifficulty: string - bossEnabled: boolean - scavWars: boolean - taggedAndCursed: boolean - enablePve: boolean + aiAmount: string; + aiDifficulty: string; + bossEnabled: boolean; + scavWars: boolean; + taggedAndCursed: boolean; + enablePve: boolean; } -export interface Save +export interface Save { /** Should loot gained from raid be saved */ - loot: boolean - durability: boolean -} \ No newline at end of file + loot: boolean; + durability: boolean; +} diff --git a/project/src/models/spt/config/IInsuranceConfig.ts b/project/src/models/spt/config/IInsuranceConfig.ts index 42174269..50014421 100644 --- a/project/src/models/spt/config/IInsuranceConfig.ts +++ b/project/src/models/spt/config/IInsuranceConfig.ts @@ -2,15 +2,15 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IInsuranceConfig extends IBaseConfig { - kind: "aki-insurance" + kind: "aki-insurance"; /** Insurance price multiplier */ - insuranceMultiplier: Record + insuranceMultiplier: Record; /** Chance item is returned as insurance, keyed by trader id */ - returnChancePercent: Record + returnChancePercent: Record; /** Item slots that should never be returned as insurance */ - blacklistedEquipment: string[] + blacklistedEquipment: string[]; /** Override to control how quickly insurance is processed/returned in second */ - returnTimeOverrideSeconds: number + returnTimeOverrideSeconds: number; /** How often server should process insurance in seconds */ - runIntervalSeconds: number + runIntervalSeconds: number; } diff --git a/project/src/models/spt/config/IInventoryConfig.ts b/project/src/models/spt/config/IInventoryConfig.ts index 1a187a34..7d3580c9 100644 --- a/project/src/models/spt/config/IInventoryConfig.ts +++ b/project/src/models/spt/config/IInventoryConfig.ts @@ -3,31 +3,31 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IInventoryConfig extends IBaseConfig { - kind: "aki-inventory" + kind: "aki-inventory"; /** Should new items purchased by flagged as found in raid */ - newItemsMarkedFound: boolean - randomLootContainers: Record - sealedAirdropContainer: ISealedAirdropContainerSettings + newItemsMarkedFound: boolean; + randomLootContainers: Record; + sealedAirdropContainer: ISealedAirdropContainerSettings; /** Contains item tpls that the server should consider money and treat the same as roubles/euros/dollars */ - customMoneyTpls: string[] + customMoneyTpls: string[]; } export interface RewardDetails { - rewardCount: number - foundInRaid: boolean - rewardTplPool?: Record - rewardTypePool?: Record + rewardCount: number; + foundInRaid: boolean; + rewardTplPool?: Record; + rewardTypePool?: Record; } export interface ISealedAirdropContainerSettings { - weaponRewardWeight: Record - defaultPresetsOnly: boolean + weaponRewardWeight: Record; + defaultPresetsOnly: boolean; /** Should contents be flagged as found in raid when opened */ foundInRaid: boolean; - weaponModRewardLimits: Record - rewardTypeLimits: Record - ammoBoxWhitelist: string[] - allowBossItems: boolean -} \ No newline at end of file + weaponModRewardLimits: Record; + rewardTypeLimits: Record; + ammoBoxWhitelist: string[]; + allowBossItems: boolean; +} diff --git a/project/src/models/spt/config/IItemConfig.ts b/project/src/models/spt/config/IItemConfig.ts index 55518842..610cd8ee 100644 --- a/project/src/models/spt/config/IItemConfig.ts +++ b/project/src/models/spt/config/IItemConfig.ts @@ -2,9 +2,9 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IItemConfig extends IBaseConfig { - kind: "aki-item" + kind: "aki-item"; /** Items that should be globally blacklisted */ - blacklist: string[], + blacklist: string[]; /** Items that can only be found on bosses */ - bossItems: string[] -} \ No newline at end of file + bossItems: string[]; +} diff --git a/project/src/models/spt/config/ILocaleConfig.ts b/project/src/models/spt/config/ILocaleConfig.ts index a3c6307e..b1dc7aef 100644 --- a/project/src/models/spt/config/ILocaleConfig.ts +++ b/project/src/models/spt/config/ILocaleConfig.ts @@ -2,11 +2,11 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface ILocaleConfig extends IBaseConfig { - kind: "aki-locale" + kind: "aki-locale"; /** e.g. ru/en/cn/fr etc, or 'system', will take computer locale setting */ - gameLocale: string + gameLocale: string; /** e.g. ru/en/cn/fr etc, or 'system', will take computer locale setting */ - serverLocale: string + serverLocale: string; /** Languages server can be translated into */ - serverSupportedLocales: string[] + serverSupportedLocales: string[]; } diff --git a/project/src/models/spt/config/ILocationConfig.ts b/project/src/models/spt/config/ILocationConfig.ts index c1f8c985..91803ad2 100644 --- a/project/src/models/spt/config/ILocationConfig.ts +++ b/project/src/models/spt/config/ILocationConfig.ts @@ -4,103 +4,103 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface ILocationConfig extends IBaseConfig { - kind: "aki-location" + kind: "aki-location"; /** Waves with a min/max of the same value don't spawn any bots, bsg only spawn the difference between min and max */ fixEmptyBotWavesSettings: IFixEmptyBotWavesSettings; /** Rogues are classified as bosses and spawn immediatly, this can result in no scavs spawning, delay rogues spawning to allow scavs to spawn first */ - rogueLighthouseSpawnTimeSettings: IRogueLighthouseSpawnTimeSettings + rogueLighthouseSpawnTimeSettings: IRogueLighthouseSpawnTimeSettings; /** When a map has hit max alive bots, any wave that should spawn will be reduced to 1 bot in size and placed in a spawn queue, this splits waves into smaller sizes to reduce the impact of this behaviour */ - splitWaveIntoSingleSpawnsSettings: ISplitWaveSettings - looseLootMultiplier: LootMultiplier - staticLootMultiplier: LootMultiplier + splitWaveIntoSingleSpawnsSettings: ISplitWaveSettings; + looseLootMultiplier: LootMultiplier; + staticLootMultiplier: LootMultiplier; /** Custom bot waves to add to a locations base json on game start if addCustomBotWavesToMaps is true */ - customWaves: CustomWaves + customWaves: CustomWaves; /** Open zones to add to map */ - openZones: Record + openZones: Record; /** Key = map id, value = item tpls that should only have one forced loot spawn position */ - forcedLootSingleSpawnById: Record + forcedLootSingleSpawnById: Record; /** How many attempts should be taken to fit an item into a container before giving up */ fitLootIntoContainerAttempts: number; /** Add all possible zones to each maps `OpenZones` property */ - addOpenZonesToAllMaps: boolean + addOpenZonesToAllMaps: boolean; /** Allow addition of custom bot waves designed by SPT to be added to maps - defined in configs/location.json.customWaves*/ - addCustomBotWavesToMaps: boolean + addCustomBotWavesToMaps: boolean; /** Should the limits defined inside botTypeLimits to appled to locations on game start */ - enableBotTypeLimits: boolean + enableBotTypeLimits: boolean; /** Add limits to a locations base.MinMaxBots array if enableBotTypeLimits is true*/ - botTypeLimits: Record + botTypeLimits: Record; /** container randomisation settings */ containerRandomisationSettings: IContainerRandomistionSettings; /** How full must a random loose magazine be %*/ - minFillLooseMagazinePercent: number + minFillLooseMagazinePercent: number; /** How full must a random static magazine be %*/ - minFillStaticMagazinePercent: number - allowDuplicateItemsInStaticContainers: boolean + minFillStaticMagazinePercent: number; + allowDuplicateItemsInStaticContainers: boolean; /** Key: map, value: loose loot ids to ignore */ - looseLootBlacklist: Record + looseLootBlacklist: Record; } export interface IContainerRandomistionSettings { - enabled: boolean + enabled: boolean; /** What maps can use the container randomisation feature */ - maps: Record + maps: Record; /** Some container types don't work when randomised */ - containerTypesToNotRandomise: string[] - containerGroupMinSizeMultiplier: number - containerGroupMaxSizeMultiplier: number + containerTypesToNotRandomise: string[]; + containerGroupMinSizeMultiplier: number; + containerGroupMaxSizeMultiplier: number; } export interface IFixEmptyBotWavesSettings { - enabled: boolean, + enabled: boolean; ignoreMaps: string[]; } export interface IRogueLighthouseSpawnTimeSettings { - enabled: boolean - waitTimeSeconds: number + enabled: boolean; + waitTimeSeconds: number; } export interface ISplitWaveSettings { - enabled: boolean + enabled: boolean; ignoreMaps: string[]; - waveSizeThreshold: number + waveSizeThreshold: number; } export interface CustomWaves { /** Bosses spawn on raid start */ - boss: Record - normal: Record + boss: Record; + normal: Record; } export interface IBotTypeLimit extends MinMax { - type: string + type: string; } /** Multiplier to apply to the loot count for a given map */ -export interface LootMultiplier +export interface LootMultiplier { - bigmap: number - develop: number + bigmap: number; + develop: number; // eslint-disable-next-line @typescript-eslint/naming-convention - factory4_day: number + factory4_day: number; // eslint-disable-next-line @typescript-eslint/naming-convention - factory4_night: number - interchange: number - laboratory: number - rezervbase: number - shoreline: number - woods: number - hideout: number - lighthouse: number - privatearea: number - suburbs: number - tarkovstreets: number - terminal: number - town: number + factory4_night: number; + interchange: number; + laboratory: number; + rezervbase: number; + shoreline: number; + woods: number; + hideout: number; + lighthouse: number; + privatearea: number; + suburbs: number; + tarkovstreets: number; + terminal: number; + town: number; } diff --git a/project/src/models/spt/config/ILootConfig.ts b/project/src/models/spt/config/ILootConfig.ts index aaf6ba1b..d8ac9cab 100644 --- a/project/src/models/spt/config/ILootConfig.ts +++ b/project/src/models/spt/config/ILootConfig.ts @@ -3,9 +3,9 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface ILootConfig extends IBaseConfig { - kind: "aki-loot" + kind: "aki-loot"; /** Spawn positions to add into a map, key=mapid */ - looseLoot: Record + looseLoot: Record; /** Loose loot probability adjustments to apply on game start */ looseLootSpawnPointAdjustments: Record>; -} \ No newline at end of file +} diff --git a/project/src/models/spt/config/ILostOnDeathConfig.ts b/project/src/models/spt/config/ILostOnDeathConfig.ts index 8ebff4c1..db5eb4c3 100644 --- a/project/src/models/spt/config/ILostOnDeathConfig.ts +++ b/project/src/models/spt/config/ILostOnDeathConfig.ts @@ -2,27 +2,27 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface ILostOnDeathConfig extends IBaseConfig { - kind: "aki-lostondeath" + kind: "aki-lostondeath"; /** What equipment in each slot should be lost on death */ - equipment: Equipment + equipment: Equipment; /** Should special slot items be removed from quest inventory on death e.g. wifi camera/markers */ specialSlotItems: boolean; /** Should quest items be removed from quest inventory on death */ - questItems: boolean + questItems: boolean; } export interface Equipment { - ArmBand: boolean - Headwear: boolean - Earpiece: boolean - FaceCover: boolean - ArmorVest: boolean - Eyewear: boolean - TacticalVest: boolean - Backpack: boolean - Holster: boolean - FirstPrimaryWeapon: boolean - SecondPrimaryWeapon: boolean - Scabbard: boolean -} \ No newline at end of file + ArmBand: boolean; + Headwear: boolean; + Earpiece: boolean; + FaceCover: boolean; + ArmorVest: boolean; + Eyewear: boolean; + TacticalVest: boolean; + Backpack: boolean; + Holster: boolean; + FirstPrimaryWeapon: boolean; + SecondPrimaryWeapon: boolean; + Scabbard: boolean; +} diff --git a/project/src/models/spt/config/IMatchConfig.ts b/project/src/models/spt/config/IMatchConfig.ts index 7034b308..6b42237a 100644 --- a/project/src/models/spt/config/IMatchConfig.ts +++ b/project/src/models/spt/config/IMatchConfig.ts @@ -2,6 +2,6 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IMatchConfig extends IBaseConfig { - kind: "aki-match" - enabled: boolean -} \ No newline at end of file + kind: "aki-match"; + enabled: boolean; +} diff --git a/project/src/models/spt/config/IPlayerScavConfig.ts b/project/src/models/spt/config/IPlayerScavConfig.ts index fa981245..f21a436a 100644 --- a/project/src/models/spt/config/IPlayerScavConfig.ts +++ b/project/src/models/spt/config/IPlayerScavConfig.ts @@ -3,31 +3,31 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IPlayerScavConfig extends IBaseConfig { - kind: "aki-playerscav" - karmaLevel: Record + kind: "aki-playerscav"; + karmaLevel: Record; } export interface KarmaLevel { - botTypeForLoot: string - modifiers: Modifiers - itemLimits: ItemLimits - equipmentBlacklist: Record - labsAccessCardChancePercent: number + botTypeForLoot: string; + modifiers: Modifiers; + itemLimits: ItemLimits; + equipmentBlacklist: Record; + labsAccessCardChancePercent: number; } export interface Modifiers { - equipment: Record - mod: Record + equipment: Record; + mod: Record; } export interface ItemLimits { - healing: GenerationData - drugs: GenerationData - stims: GenerationData - looseLoot: GenerationData - magazines: GenerationData - grenades: GenerationData + healing: GenerationData; + drugs: GenerationData; + stims: GenerationData; + looseLoot: GenerationData; + magazines: GenerationData; + grenades: GenerationData; } diff --git a/project/src/models/spt/config/IPmChatResponse.ts b/project/src/models/spt/config/IPmChatResponse.ts index ef40efe9..5aebb6cd 100644 --- a/project/src/models/spt/config/IPmChatResponse.ts +++ b/project/src/models/spt/config/IPmChatResponse.ts @@ -2,16 +2,16 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IPmcChatResponse extends IBaseConfig { - kind: "aki-pmcchatresponse" - victim: IResponseSettings - killer: IResponseSettings + kind: "aki-pmcchatresponse"; + victim: IResponseSettings; + killer: IResponseSettings; } export interface IResponseSettings { - responseChancePercent: number - responseTypeWeights: Record - stripCapitalisationChancePercent: number + responseChancePercent: number; + responseTypeWeights: Record; + stripCapitalisationChancePercent: number; allCapsChancePercent: number; appendBroToMessageEndChancePercent: number; -} \ No newline at end of file +} diff --git a/project/src/models/spt/config/IPmcConfig.ts b/project/src/models/spt/config/IPmcConfig.ts index 2fc551e5..fff537e1 100644 --- a/project/src/models/spt/config/IPmcConfig.ts +++ b/project/src/models/spt/config/IPmcConfig.ts @@ -4,66 +4,66 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IPmcConfig extends IBaseConfig { - kind: "aki-pmc" + kind: "aki-pmc"; /** What game version should the PMC have */ - gameVersionWeight: Record + gameVersionWeight: Record; /** What account type should the PMC have */ - accountTypeWeight: Record + accountTypeWeight: Record; /** Global whitelist/blacklist of vest loot for PMCs */ - vestLoot: SlotLootSettings + vestLoot: SlotLootSettings; /** Global whitelist/blacklist of pocket loot for PMCs */ - pocketLoot: SlotLootSettings + pocketLoot: SlotLootSettings; /** Global whitelist/blacklist of backpack loot for PMCs */ - backpackLoot: SlotLootSettings - dynamicLoot: DynamicLoot + backpackLoot: SlotLootSettings; + dynamicLoot: DynamicLoot; /** Use difficulty defined in config/bot.json/difficulty instead of chosen difficulty dropdown value */ - useDifficultyOverride: boolean + useDifficultyOverride: boolean; /** Difficulty override e.g. "AsOnline/Hard" */ - difficulty: string + difficulty: string; /** Chance out of 100 to have a complete gun in backpack */ - looseWeaponInBackpackChancePercent: number + looseWeaponInBackpackChancePercent: number; /** Chance out of 100 to have an enhancement applied to PMC weapon */ - weaponHasEnhancementChancePercent: number + weaponHasEnhancementChancePercent: number; /** MinMax count of weapons to have in backpack */ - looseWeaponInBackpackLootMinMax: MinMax + looseWeaponInBackpackLootMinMax: MinMax; /** Percentage chance PMC will be USEC */ - isUsec: number + isUsec: number; /** WildSpawnType enum value USEC PMCs use */ - usecType: string + usecType: string; /** WildSpawnType enum value BEAR PMCs use */ - bearType: string - chanceSameSideIsHostilePercent: number + bearType: string; + chanceSameSideIsHostilePercent: number; /** What 'brain' does a PMC use, keyed by map and side (USEC/BEAR) key: map location, value: type for usec/bear */ - pmcType: Record>> - maxBackpackLootTotalRub: number - maxPocketLootTotalRub: number - maxVestLootTotalRub: number + pmcType: Record>>; + maxBackpackLootTotalRub: number; + maxPocketLootTotalRub: number; + maxVestLootTotalRub: number; /** Percentage chance a bot from a wave is converted into a PMC, key = bot wildspawn tpye (assault/exusec), value: min+max chance to be converted */ - convertIntoPmcChance: Record + convertIntoPmcChance: Record; /** WildSpawnType bots PMCs should see as hostile */ - enemyTypes: string[] + enemyTypes: string[]; /** How many levels above player level can a PMC be */ - botRelativeLevelDeltaMax: number + botRelativeLevelDeltaMax: number; /** Force a number of healing items into PMCs secure container to ensure they can heal */ - forceHealingItemsIntoSecure: boolean - addPrefixToSameNamePMCAsPlayerChance: number - allPMCsHavePlayerNameWithRandomPrefixChance: number + forceHealingItemsIntoSecure: boolean; + addPrefixToSameNamePMCAsPlayerChance: number; + allPMCsHavePlayerNameWithRandomPrefixChance: number; } export interface PmcTypes { - usec: string - bear: string + usec: string; + bear: string; } -export interface SlotLootSettings +export interface SlotLootSettings { - whitelist: string[] - blacklist: string[] - moneyStackLimits: Record + whitelist: string[]; + blacklist: string[]; + moneyStackLimits: Record; } -export interface DynamicLoot +export interface DynamicLoot { - moneyStackLimits: Record -} \ No newline at end of file + moneyStackLimits: Record; +} diff --git a/project/src/models/spt/config/IQuestConfig.ts b/project/src/models/spt/config/IQuestConfig.ts index 1c157684..5e664496 100644 --- a/project/src/models/spt/config/IQuestConfig.ts +++ b/project/src/models/spt/config/IQuestConfig.ts @@ -5,174 +5,174 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IQuestConfig extends IBaseConfig { - kind: "aki-quest" + kind: "aki-quest"; // Hours to get/redeem items from quest mail - redeemTime: number - questTemplateIds: IPlayerTypeQuestIds + redeemTime: number; + questTemplateIds: IPlayerTypeQuestIds; /** Show non-seasonal quests be shown to player */ - showNonSeasonalEventQuests: boolean - eventQuests: Record - repeatableQuests: IRepeatableQuestConfig[] - locationIdMap: Record - bearOnlyQuests: string[] - usecOnlyQuests: string[] + showNonSeasonalEventQuests: boolean; + eventQuests: Record; + repeatableQuests: IRepeatableQuestConfig[]; + locationIdMap: Record; + bearOnlyQuests: string[]; + usecOnlyQuests: string[]; } export interface IPlayerTypeQuestIds { - pmc: IQuestTypeIds - scav: IQuestTypeIds + pmc: IQuestTypeIds; + scav: IQuestTypeIds; } export interface IQuestTypeIds { - Elimination: string - Completion: string - Exploration: string + Elimination: string; + Completion: string; + Exploration: string; } export interface IEventQuestData { - name: string - season: SeasonalEventType - startTimestamp: number - endTimestamp: number - yearly: boolean + name: string; + season: SeasonalEventType; + startTimestamp: number; + endTimestamp: number; + yearly: boolean; } - -export interface IRepeatableQuestConfig + +export interface IRepeatableQuestConfig { id: string; - name: string - side: string - types: string[] - resetTime: number - numQuests: number - minPlayerLevel: number - rewardScaling: IRewardScaling - locations: Record - traderWhitelist: ITraderWhitelist[] - questConfig: IRepeatableQuestTypesConfig + name: string; + side: string; + types: string[]; + resetTime: number; + numQuests: number; + minPlayerLevel: number; + rewardScaling: IRewardScaling; + locations: Record; + traderWhitelist: ITraderWhitelist[]; + questConfig: IRepeatableQuestTypesConfig; /** Item base types to block when generating rewards */ - rewardBaseTypeBlacklist: string[] + rewardBaseTypeBlacklist: string[]; /** Item tplIds to ignore when generating rewards */ - rewardBlacklist: string[] + rewardBlacklist: string[]; rewardAmmoStackMinSize: number; } - -export interface IRewardScaling + +export interface IRewardScaling { - levels: number[] - experience: number[] - roubles: number[] - items: number[] - reputation: number[] - rewardSpread: number - skillRewardChance: number[] - skillPointReward: number[] + levels: number[]; + experience: number[]; + roubles: number[]; + items: number[]; + reputation: number[]; + rewardSpread: number; + skillRewardChance: number[]; + skillPointReward: number[]; } - -export interface ITraderWhitelist + +export interface ITraderWhitelist { - traderId: string - questTypes: string[] - rewardBaseWhitelist: string[] + traderId: string; + questTypes: string[]; + rewardBaseWhitelist: string[]; } - -export interface IRepeatableQuestTypesConfig + +export interface IRepeatableQuestTypesConfig { - Exploration: IExploration - Completion: ICompletion + Exploration: IExploration; + Completion: ICompletion; Pickup: IPickup; - Elimination: IEliminationConfig[] + Elimination: IEliminationConfig[]; } - + export interface IExploration extends IBaseQuestConfig { - maxExtracts: number - specificExits: ISpecificExits + maxExtracts: number; + specificExits: ISpecificExits; } - -export interface ISpecificExits + +export interface ISpecificExits { - probability: number - passageRequirementWhitelist: string[] + probability: number; + passageRequirementWhitelist: string[]; } - + export interface ICompletion extends IBaseQuestConfig { - minRequestedAmount: number - maxRequestedAmount: number - minRequestedBulletAmount: number - maxRequestedBulletAmount: number - useWhitelist: boolean - useBlacklist: boolean + minRequestedAmount: number; + maxRequestedAmount: number; + minRequestedBulletAmount: number; + maxRequestedBulletAmount: number; + useWhitelist: boolean; + useBlacklist: boolean; } export interface IPickup extends IBaseQuestConfig { - ItemTypeToFetchWithMaxCount: IPickupTypeWithMaxCount[] + ItemTypeToFetchWithMaxCount: IPickupTypeWithMaxCount[]; } export interface IPickupTypeWithMaxCount { - itemType: string - maxPickupCount: number - minPickupCount: number + itemType: string; + maxPickupCount: number; + minPickupCount: number; } - + export interface IEliminationConfig extends IBaseQuestConfig { - levelRange: MinMax - targets: ITarget[] - bodyPartProb: number - bodyParts: IBodyPart[] - specificLocationProb: number - distLocationBlacklist: string[] - distProb: number - maxDist: number - minDist: number - maxKills: number - minKills: number - minBossKills: number - maxBossKills: number - minPmcKills: number - maxPmcKills: number - weaponCategoryRequirementProb: number - weaponCategoryRequirements: IWeaponRequirement[] - weaponRequirementProb: number - weaponRequirements: IWeaponRequirement[] + levelRange: MinMax; + targets: ITarget[]; + bodyPartProb: number; + bodyParts: IBodyPart[]; + specificLocationProb: number; + distLocationBlacklist: string[]; + distProb: number; + maxDist: number; + minDist: number; + maxKills: number; + minKills: number; + minBossKills: number; + maxBossKills: number; + minPmcKills: number; + maxPmcKills: number; + weaponCategoryRequirementProb: number; + weaponCategoryRequirements: IWeaponRequirement[]; + weaponRequirementProb: number; + weaponRequirements: IWeaponRequirement[]; } export interface IBaseQuestConfig { - possibleSkillRewards: string[] + possibleSkillRewards: string[]; } export interface ITarget extends IProbabilityObject { - data: IBossInfo + data: IBossInfo; } -export interface IBossInfo +export interface IBossInfo { - isBoss: boolean - isPmc: boolean + isBoss: boolean; + isPmc: boolean; } -export interface IBodyPart extends IProbabilityObject +export interface IBodyPart extends IProbabilityObject { - data: string[] + data: string[]; } -export interface IWeaponRequirement extends IProbabilityObject +export interface IWeaponRequirement extends IProbabilityObject { - data: string[] + data: string[]; } -export interface IProbabilityObject +export interface IProbabilityObject { - key: string - relativeProbability: number - data?: any -} \ No newline at end of file + key: string; + relativeProbability: number; + data?: any; +} diff --git a/project/src/models/spt/config/IRagfairConfig.ts b/project/src/models/spt/config/IRagfairConfig.ts index 1755dcb3..dcffc7c8 100644 --- a/project/src/models/spt/config/IRagfairConfig.ts +++ b/project/src/models/spt/config/IRagfairConfig.ts @@ -3,128 +3,127 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IRagfairConfig extends IBaseConfig { - kind: "aki-ragfair" + kind: "aki-ragfair"; /** How many seconds should pass before expired offers and procesed + player offers checked if sold */ - runIntervalSeconds: number + runIntervalSeconds: number; /** Player listing settings */ - sell: Sell + sell: Sell; /** Trader ids + should their assorts be listed on flea*/ - traders: Record - dynamic: Dynamic + traders: Record; + dynamic: Dynamic; } - -export interface Sell + +export interface Sell { /** Should a fee be deducted from player when liting an item for sale */ - fees: boolean + fees: boolean; /** Settings to control chances of offer being sold */ - chance: Chance + chance: Chance; /** Settings to control how long it takes for a player offer to sell */ - time: Time + time: Time; /** Player offer reputation gain/loss settings */ - reputation: Reputation + reputation: Reputation; /** How many hours are simulated to figure out if player offer was sold */ - simulatedSellHours: number + simulatedSellHours: number; /**Seconds from clicking remove to remove offer from market */ - expireSeconds: number + expireSeconds: number; } - -export interface Chance + +export interface Chance { - base: number - overpriced: number - underpriced: number + base: number; + overpriced: number; + underpriced: number; } - + export interface Time extends MinMax { - base: number + base: number; } - -export interface Reputation + +export interface Reputation { - gain: number - loss: number + gain: number; + loss: number; } - -export interface Dynamic +export interface Dynamic { // Should a purchased dynamic offers items be flagged as found in raid - purchasesAreFoundInRaid: boolean + purchasesAreFoundInRaid: boolean; /** Use the highest trader price for an offer if its greater than the price in templates/prices.json */ useTraderPriceForOffersIfHigher: boolean; /** Barter offer specific settings */ - barter: IBarterDetails - pack: IPackDetails + barter: IBarterDetails; + pack: IPackDetails; /** Dynamic offer price below handbook adjustment values */ - offerAdjustment: OfferAdjustment + offerAdjustment: OfferAdjustment; /** How many offers should expire before an offer regeneration occurs */ - expiredOfferThreshold: number + expiredOfferThreshold: number; /** How many offers should be listed */ - offerItemCount: MinMax + offerItemCount: MinMax; /** How much should the price of an offer vary by (percent 0.8 = 80%, 1.2 = 120%) */ - priceRanges: IPriceRanges + priceRanges: IPriceRanges; /** Should default presets to listed only or should non-standard presets found in globals.json be listed too */ - showDefaultPresetsOnly: boolean - endTimeSeconds: MinMax + showDefaultPresetsOnly: boolean; + endTimeSeconds: MinMax; /** Settings to control the durability range of item items listed on flea */ - condition: Condition + condition: Condition; /** Size stackable items should be listed for in percent of max stack size */ - stackablePercent: MinMax + stackablePercent: MinMax; /** Items that cannot be stacked can have multiples sold in one offer, what range of values can be listed */ - nonStackableCount: MinMax + nonStackableCount: MinMax; /** Range of rating offers for items being listed */ - rating: MinMax + rating: MinMax; /** Percentages to sell offers in each currency */ - currencies: Record + currencies: Record; /** Item tpls that should be forced to sell as a single item */ - showAsSingleStack: string[] + showAsSingleStack: string[]; /** Should christmas/halloween items be removed from flea when not within the seasonal bounds */ - removeSeasonalItemsWhenNotInEvent: boolean + removeSeasonalItemsWhenNotInEvent: boolean; /** Flea blacklist settings */ - blacklist: Blacklist + blacklist: Blacklist; /** Dict of price limits keyed by item type */ - unreasonableModPrices: Record + unreasonableModPrices: Record; } export interface IPriceRanges { - default: MinMax - preset: MinMax - pack: MinMax + default: MinMax; + preset: MinMax; + pack: MinMax; } export interface IBarterDetails { /** Should barter offers be generated */ - enable: boolean + enable: boolean; /** Percentage change an offer is listed as a barter */ - chancePercent: number + chancePercent: number; /** Min number of required items for a barter requirement */ - itemCountMin: number + itemCountMin: number; /** Max number of required items for a barter requirement */ - itemCountMax: number + itemCountMax: number; /** How much can the total price of requested items vary from the item offered */ - priceRangeVariancePercent: number + priceRangeVariancePercent: number; /** Min rouble price for an offer to be considered for turning into a barter */ - minRoubleCostToBecomeBarter: number + minRoubleCostToBecomeBarter: number; /** Item Tpls to never be turned into a barter */ - itemTypeBlacklist: string[] + itemTypeBlacklist: string[]; } export interface IPackDetails { /** Should pack offers be generated */ - enable: boolean + enable: boolean; /** Percentage change an offer is listed as a pack */ - chancePercent: number + chancePercent: number; /** Min number of required items for a pack */ - itemCountMin: number + itemCountMin: number; /** Max number of required items for a pack */ - itemCountMax: number + itemCountMax: number; /** item types to allow being a pack */ - itemTypeWhitelist: string[] + itemTypeWhitelist: string[]; } export interface OfferAdjustment @@ -132,37 +131,36 @@ export interface OfferAdjustment /** Shuld offer price be adjusted when below handbook price */ adjustPriceWhenBelowHandbookPrice: boolean; /** How big a percentage difference does price need to vary from handbook to be considered for adjustment */ - maxPriceDifferenceBelowHandbookPercent: number + maxPriceDifferenceBelowHandbookPercent: number; /** How much to multiply the handbook price to get the new price */ - handbookPriceMultipier: number + handbookPriceMultipier: number; /** What is the minimum rouble price to consider adjusting price of item */ - priceThreshholdRub: number + priceThreshholdRub: number; } - + export interface Condition extends MinMax { /** Percentage change durability is altered */ - conditionChance: number + conditionChance: number; } - -export interface Blacklist + +export interface Blacklist { /** Damaged ammo packs */ - damagedAmmoPacks: boolean + damagedAmmoPacks: boolean; /** Custom blacklist for item Tpls */ - custom: string[] + custom: string[]; /** BSG blacklist a large number of items from flea, true = use blacklist */ - enableBsgList: boolean + enableBsgList: boolean; /** Should quest items be blacklisted from flea */ - enableQuestList: boolean + enableQuestList: boolean; /** Should trader items that are blacklisted by bsg */ - traderItems: boolean + traderItems: boolean; } export interface IUnreasonableModPrices { - enabled: boolean - handbookPriceOverMultiplier: number - newPriceHandbookMultiplier: number + enabled: boolean; + handbookPriceOverMultiplier: number; + newPriceHandbookMultiplier: number; } - \ No newline at end of file diff --git a/project/src/models/spt/config/IRepairConfig.ts b/project/src/models/spt/config/IRepairConfig.ts index 0b65b465..d004147f 100644 --- a/project/src/models/spt/config/IRepairConfig.ts +++ b/project/src/models/spt/config/IRepairConfig.ts @@ -3,60 +3,60 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IRepairConfig extends IBaseConfig { - kind: "aki-repair" - priceMultiplier: number - applyRandomizeDurabilityLoss: boolean - weaponSkillRepairGain: number - armorKitSkillPointGainPerRepairPointMultiplier: number + kind: "aki-repair"; + priceMultiplier: number; + applyRandomizeDurabilityLoss: boolean; + weaponSkillRepairGain: number; + armorKitSkillPointGainPerRepairPointMultiplier: number; /** INT gain multiplier per repaired item type */ - repairKitIntellectGainMultiplier: IIntellectGainValues - //** How much INT can be given to player per repair action */ + repairKitIntellectGainMultiplier: IIntellectGainValues; + // ** How much INT can be given to player per repair action */ maxIntellectGainPerRepair: IMaxIntellectGainValues; weaponTreatment: IWeaponTreatmentRepairValues; - repairKit: RepairKit + repairKit: RepairKit; } export interface IIntellectGainValues { - weapon: number - armor: number + weapon: number; + armor: number; } export interface IMaxIntellectGainValues { - kit: number - trader: number + kit: number; + trader: number; } export interface IWeaponTreatmentRepairValues { /** The chance to gain more weapon maintenance skill */ - critSuccessChance: number - critSuccessAmount: number + critSuccessChance: number; + critSuccessAmount: number; /** The chance to gain less weapon maintenance skill */ - critFailureChance: number - critFailureAmount: number + critFailureChance: number; + critFailureAmount: number; /** The multiplier used for calculating weapon maintenance XP */ - pointGainMultiplier: number + pointGainMultiplier: number; } export interface RepairKit { - armor: BonusSettings - weapon: BonusSettings + armor: BonusSettings; + weapon: BonusSettings; } export interface BonusSettings { - rarityWeight: Record - bonusTypeWeight: Record - common: Record - rare: Record + rarityWeight: Record; + bonusTypeWeight: Record; + common: Record; + rare: Record; } export interface BonusValues { - valuesMinMax: MinMax + valuesMinMax: MinMax; /** What dura is buff active between (min max of current max) */ - activeDurabilityPercentMinMax: MinMax -} \ No newline at end of file + activeDurabilityPercentMinMax: MinMax; +} diff --git a/project/src/models/spt/config/IScavCaseConfig.ts b/project/src/models/spt/config/IScavCaseConfig.ts index 6ceaeb6e..0d3c8265 100644 --- a/project/src/models/spt/config/IScavCaseConfig.ts +++ b/project/src/models/spt/config/IScavCaseConfig.ts @@ -3,36 +3,36 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IScavCaseConfig extends IBaseConfig { - kind: "aki-scavcase" - rewardItemValueRangeRub: Record - moneyRewards: MoneyRewards - ammoRewards: AmmoRewards - rewardItemParentBlacklist: string[] - rewardItemBlacklist: string[] - allowMultipleMoneyRewardsPerRarity: boolean - allowMultipleAmmoRewardsPerRarity: boolean - allowBossItemsAsRewards: boolean + kind: "aki-scavcase"; + rewardItemValueRangeRub: Record; + moneyRewards: MoneyRewards; + ammoRewards: AmmoRewards; + rewardItemParentBlacklist: string[]; + rewardItemBlacklist: string[]; + allowMultipleMoneyRewardsPerRarity: boolean; + allowMultipleAmmoRewardsPerRarity: boolean; + allowBossItemsAsRewards: boolean; } -export interface MoneyRewards +export interface MoneyRewards { - moneyRewardChancePercent: number - rubCount: MoneyLevels - usdCount: MoneyLevels - eurCount: MoneyLevels + moneyRewardChancePercent: number; + rubCount: MoneyLevels; + usdCount: MoneyLevels; + eurCount: MoneyLevels; } export interface MoneyLevels { - common: MinMax - rare: MinMax - superrare: MinMax + common: MinMax; + rare: MinMax; + superrare: MinMax; } -export interface AmmoRewards +export interface AmmoRewards { - ammoRewardChancePercent: number - ammoRewardBlacklist: Record - ammoRewardValueRangeRub: Record - minStackSize: number -} \ No newline at end of file + ammoRewardChancePercent: number; + ammoRewardBlacklist: Record; + ammoRewardValueRangeRub: Record; + minStackSize: number; +} diff --git a/project/src/models/spt/config/ISeasonalEventConfig.ts b/project/src/models/spt/config/ISeasonalEventConfig.ts index 0bbcd8f9..bd5d2883 100644 --- a/project/src/models/spt/config/ISeasonalEventConfig.ts +++ b/project/src/models/spt/config/ISeasonalEventConfig.ts @@ -3,27 +3,27 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface ISeasonalEventConfig extends IBaseConfig { - kind: "aki-seasonalevents" - enableSeasonalEventDetection: boolean + kind: "aki-seasonalevents"; + enableSeasonalEventDetection: boolean; /** event / botType / equipSlot / itemid */ - eventGear: Record>>> - events: ISeasonalEvent[] - gifterSettings: GifterSetting[] + eventGear: Record>>>; + events: ISeasonalEvent[]; + gifterSettings: GifterSetting[]; } export interface ISeasonalEvent { - name: string - type: SeasonalEventType - startDay: number - startMonth: number - endDay: number - endMonth: number + name: string; + type: SeasonalEventType; + startDay: number; + startMonth: number; + endDay: number; + endMonth: number; } export interface GifterSetting { - map: string - zones: string - spawnChance: number -} \ No newline at end of file + map: string; + zones: string; + spawnChance: number; +} diff --git a/project/src/models/spt/config/ITraderConfig.ts b/project/src/models/spt/config/ITraderConfig.ts index 93b4329b..be48cf3b 100644 --- a/project/src/models/spt/config/ITraderConfig.ts +++ b/project/src/models/spt/config/ITraderConfig.ts @@ -4,57 +4,57 @@ import { LootRequest } from "@spt-aki/models/spt/services/LootRequest"; export interface ITraderConfig extends IBaseConfig { - kind: "aki-trader" - updateTime: UpdateTime[] + kind: "aki-trader"; + updateTime: UpdateTime[]; purchasesAreFoundInRaid: boolean; - updateTimeDefault: number - traderPriceMultipler: number + updateTimeDefault: number; + traderPriceMultipler: number; /** Keep track of purchased trader-limited items beyond server restarts to prevent server-restart item scumming */ - persistPurchaseDataInProfile: boolean - fence: FenceConfig + persistPurchaseDataInProfile: boolean; + fence: FenceConfig; } -export interface UpdateTime +export interface UpdateTime { - traderId: string - seconds: number + traderId: string; + seconds: number; } export interface FenceConfig { - discountOptions: DiscountOptions - partialRefreshTimeSeconds: number - partialRefreshChangePercent: number - assortSize: number - maxPresetsPercent: number - itemPriceMult: number - presetPriceMult: number - armorMaxDurabilityPercentMinMax: MinMax - presetMaxDurabilityPercentMinMax: MinMax + discountOptions: DiscountOptions; + partialRefreshTimeSeconds: number; + partialRefreshChangePercent: number; + assortSize: number; + maxPresetsPercent: number; + itemPriceMult: number; + presetPriceMult: number; + armorMaxDurabilityPercentMinMax: MinMax; + presetMaxDurabilityPercentMinMax: MinMax; /** Key: item tpl */ - itemStackSizeOverrideMinMax: Record - itemTypeLimits: Record - regenerateAssortsOnRefresh: boolean + itemStackSizeOverrideMinMax: Record; + itemTypeLimits: Record; + regenerateAssortsOnRefresh: boolean; /** Max rouble price before item is not listed on flea */ - itemCategoryRoublePriceLimit: Record + itemCategoryRoublePriceLimit: Record; /** Each slotid with % to be removed prior to listing on fence */ - presetSlotsToRemoveChancePercent: Record + presetSlotsToRemoveChancePercent: Record; /** Block seasonal items from appearing when season is inactive */ blacklistSeasonalItems: boolean; - blacklist: string[], - coopExtractGift: CoopExtractReward + blacklist: string[]; + coopExtractGift: CoopExtractReward; } export interface CoopExtractReward extends LootRequest { - sendGift: boolean - messageLocaleIds: string[] - giftExpiryHours: number + sendGift: boolean; + messageLocaleIds: string[]; + giftExpiryHours: number; } export interface DiscountOptions { - assortSize: number - itemPriceMult: number - presetPriceMult: number -} \ No newline at end of file + assortSize: number; + itemPriceMult: number; + presetPriceMult: number; +} diff --git a/project/src/models/spt/config/IWeatherConfig.ts b/project/src/models/spt/config/IWeatherConfig.ts index 9fac2f88..08c738b2 100644 --- a/project/src/models/spt/config/IWeatherConfig.ts +++ b/project/src/models/spt/config/IWeatherConfig.ts @@ -4,26 +4,26 @@ import { IBaseConfig } from "@spt-aki/models/spt/config/IBaseConfig"; export interface IWeatherConfig extends IBaseConfig { - kind: "aki-weather" - acceleration: number - weather: Weather + kind: "aki-weather"; + acceleration: number; + weather: Weather; } - -export interface Weather + +export interface Weather { - clouds: WeatherSettings - windSpeed: WeatherSettings - windDirection: WeatherSettings - windGustiness: MinMax - rain: WeatherSettings - rainIntensity: MinMax - fog: WeatherSettings - temp: MinMax - pressure: MinMax + clouds: WeatherSettings; + windSpeed: WeatherSettings; + windDirection: WeatherSettings; + windGustiness: MinMax; + rain: WeatherSettings; + rainIntensity: MinMax; + fog: WeatherSettings; + temp: MinMax; + pressure: MinMax; } export interface WeatherSettings { - values: T[] - weights: number[] + values: T[]; + weights: number[]; } diff --git a/project/src/models/spt/controllers/IBotController.ts b/project/src/models/spt/controllers/IBotController.ts index 20c9b6ec..0d8dc3e3 100644 --- a/project/src/models/spt/controllers/IBotController.ts +++ b/project/src/models/spt/controllers/IBotController.ts @@ -3,7 +3,7 @@ import { IBotBase } from "@spt-aki/models/eft/common/tables/IBotBase"; import { IBotCore } from "@spt-aki/models/eft/common/tables/IBotCore"; import { Difficulty } from "@spt-aki/models/eft/common/tables/IBotType"; -export interface IBotController +export interface IBotController { getBotLimit(type: string): number; getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; diff --git a/project/src/models/spt/dialog/ISendMessageDetails.ts b/project/src/models/spt/dialog/ISendMessageDetails.ts index c574f2e0..1365dfbc 100644 --- a/project/src/models/spt/dialog/ISendMessageDetails.ts +++ b/project/src/models/spt/dialog/ISendMessageDetails.ts @@ -3,30 +3,30 @@ import { ISystemData, IUserDialogInfo, MessageContentRagfair } from "@spt-aki/mo import { MessageType } from "@spt-aki/models/enums/MessageType"; import { Traders } from "@spt-aki/models/enums/Traders"; -export interface ISendMessageDetails +export interface ISendMessageDetails { /** Player id */ - recipientId: string + recipientId: string; /** Who is sending this message */ - sender: MessageType + sender: MessageType; /** Optional - leave blank to use sender value */ - dialogType?: MessageType + dialogType?: MessageType; /** Optional - if sender is USER these details are used */ - senderDetails?: IUserDialogInfo + senderDetails?: IUserDialogInfo; /** Optional - the trader sending the message */ - trader?: Traders + trader?: Traders; /** Optional - used in player/system messages, otherwise templateId is used */ - messageText?: string + messageText?: string; /** Optinal - Items to send to player */ items?: Item[]; /** Optional - How long items will be stored in mail before expiry */ - itemsMaxStorageLifetimeSeconds?: number + itemsMaxStorageLifetimeSeconds?: number; /** Optional - Used when sending messages from traders who send text from locale json */ - templateId?: string + templateId?: string; /** Optional - ragfair related */ - systemData?: ISystemData + systemData?: ISystemData; /** Optional - Used by ragfair messages */ - ragfairDetails?: MessageContentRagfair + ragfairDetails?: MessageContentRagfair; /** Optional - Usage not known, unsure of purpose, even dumps dont have it */ - profileChangeEvents?: any[] + profileChangeEvents?: any[]; } diff --git a/project/src/models/spt/generators/IBotGenerator.ts b/project/src/models/spt/generators/IBotGenerator.ts index a15fb52a..0fa0f3a4 100644 --- a/project/src/models/spt/generators/IBotGenerator.ts +++ b/project/src/models/spt/generators/IBotGenerator.ts @@ -3,7 +3,13 @@ import { Chances, Generation, Inventory } from "@spt-aki/models/eft/common/table export interface IBotGenerator { - generateInventory(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + generateInventory( + templateInventory: Inventory, + equipmentChances: Chances, + generation: Generation, + botRole: string, + isPmc: boolean, + ): PmcInventory; } export interface IExhaustableArray diff --git a/project/src/models/spt/generators/ILocationGenerator.ts b/project/src/models/spt/generators/ILocationGenerator.ts index 195a8a8b..9ddcb24f 100644 --- a/project/src/models/spt/generators/ILocationGenerator.ts +++ b/project/src/models/spt/generators/ILocationGenerator.ts @@ -1,8 +1,23 @@ import { ILooseLoot, SpawnpointTemplate } from "@spt-aki/models/eft/common/ILooseLoot"; -import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "@spt-aki/models/eft/common/tables/ILootBase"; +import { + IStaticAmmoDetails, + IStaticContainerProps, + IStaticForcedProps, + IStaticLootDetails, +} from "@spt-aki/models/eft/common/tables/ILootBase"; export interface ILocationGenerator { - generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; - generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; + generateContainerLoot( + containerIn: IStaticContainerProps, + staticForced: IStaticForcedProps[], + staticLootDist: Record, + staticAmmoDist: Record, + locationName: string, + ): IStaticContainerProps; + generateDynamicLoot( + dynamicLootDist: ILooseLoot, + staticAmmoDist: Record, + locationName: string, + ): SpawnpointTemplate[]; } diff --git a/project/src/models/spt/generators/IRagfairOfferGenerator.ts b/project/src/models/spt/generators/IRagfairOfferGenerator.ts index 0ab65f07..a6aa2906 100644 --- a/project/src/models/spt/generators/IRagfairOfferGenerator.ts +++ b/project/src/models/spt/generators/IRagfairOfferGenerator.ts @@ -4,5 +4,13 @@ import { IRagfairOffer } from "@spt-aki/models/eft/ragfair/IRagfairOffer"; export interface IRagfairOfferGenerator { - createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece: boolean): IRagfairOffer; + createOffer( + userID: string, + time: number, + items: Item[], + barterScheme: IBarterScheme[], + loyalLevel: number, + price: number, + sellInOnePiece: boolean, + ): IRagfairOffer; } diff --git a/project/src/models/spt/hideout/ScavCaseRewardCountsAndPrices.ts b/project/src/models/spt/hideout/ScavCaseRewardCountsAndPrices.ts index bf9d1794..8a25efa0 100644 --- a/project/src/models/spt/hideout/ScavCaseRewardCountsAndPrices.ts +++ b/project/src/models/spt/hideout/ScavCaseRewardCountsAndPrices.ts @@ -1,14 +1,14 @@ export interface ScavCaseRewardCountsAndPrices { - Common: RewardCountAndPriceDetails, - Rare: RewardCountAndPriceDetails, - Superrare: RewardCountAndPriceDetails + Common: RewardCountAndPriceDetails; + Rare: RewardCountAndPriceDetails; + Superrare: RewardCountAndPriceDetails; } export interface RewardCountAndPriceDetails { - minCount: number, - maxCount: number, - minPriceRub: number, - maxPriceRub: number -} \ No newline at end of file + minCount: number; + maxCount: number; + minPriceRub: number; + maxPriceRub: number; +} diff --git a/project/src/models/spt/logging/IClientLogRequest.ts b/project/src/models/spt/logging/IClientLogRequest.ts index fab6e8d7..7fe31dc1 100644 --- a/project/src/models/spt/logging/IClientLogRequest.ts +++ b/project/src/models/spt/logging/IClientLogRequest.ts @@ -1,10 +1,10 @@ import { LogLevel } from "@spt-aki/models/spt/logging/LogLevel"; -export interface IClientLogRequest +export interface IClientLogRequest { - Source: string - Level: LogLevel | string - Message: string - Color?: string - BackgroundColor?: string -} \ No newline at end of file + Source: string; + Level: LogLevel | string; + Message: string; + Color?: string; + BackgroundColor?: string; +} diff --git a/project/src/models/spt/logging/LogBackgroundColor.ts b/project/src/models/spt/logging/LogBackgroundColor.ts index 880656a8..56dd102a 100644 --- a/project/src/models/spt/logging/LogBackgroundColor.ts +++ b/project/src/models/spt/logging/LogBackgroundColor.ts @@ -1,5 +1,5 @@ export enum LogBackgroundColor - { +{ DEFAULT = "", BLACK = "blackBG", RED = "redBG", @@ -8,5 +8,5 @@ export enum LogBackgroundColor BLUE = "blueBG", MAGENTA = "magentaBG", CYAN = "cyanBG", - WHITE = "whiteBG" -} \ No newline at end of file + WHITE = "whiteBG", +} diff --git a/project/src/models/spt/logging/LogLevel.ts b/project/src/models/spt/logging/LogLevel.ts index a7517d9b..0723f167 100644 --- a/project/src/models/spt/logging/LogLevel.ts +++ b/project/src/models/spt/logging/LogLevel.ts @@ -1,9 +1,9 @@ -export enum LogLevel - { +export enum LogLevel +{ ERROR = 0, WARN = 1, SUCCESS = 2, INFO = 3, CUSTOM = 4, - DEBUG = 5 -} \ No newline at end of file + DEBUG = 5, +} diff --git a/project/src/models/spt/logging/LogTextColor.ts b/project/src/models/spt/logging/LogTextColor.ts index a5dfbf43..a99a4a1b 100644 --- a/project/src/models/spt/logging/LogTextColor.ts +++ b/project/src/models/spt/logging/LogTextColor.ts @@ -1,5 +1,5 @@ export enum LogTextColor - { +{ BLACK = "black", RED = "red", GREEN = "green", @@ -8,5 +8,5 @@ export enum LogTextColor MAGENTA = "magenta", CYAN = "cyan", WHITE = "white", - GRAY = "" -} \ No newline at end of file + GRAY = "", +} diff --git a/project/src/models/spt/logging/SptLogger.ts b/project/src/models/spt/logging/SptLogger.ts index e41338a9..34bf845b 100644 --- a/project/src/models/spt/logging/SptLogger.ts +++ b/project/src/models/spt/logging/SptLogger.ts @@ -1,8 +1,8 @@ export interface SptLogger { - error: (msg: string | Record) => void - warn: (msg: string | Record) => void - succ?: (msg: string | Record) => void - info: (msg: string | Record) => void - debug: (msg: string | Record) => void -} \ No newline at end of file + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} diff --git a/project/src/models/spt/mod/IModLoader.ts b/project/src/models/spt/mod/IModLoader.ts index c9c41adb..786bdd2e 100644 --- a/project/src/models/spt/mod/IModLoader.ts +++ b/project/src/models/spt/mod/IModLoader.ts @@ -5,4 +5,4 @@ export interface IModLoader load(container: DependencyContainer): void; getModPath(mod: string): string; -} \ No newline at end of file +} diff --git a/project/src/models/spt/mod/NewItemDetails.ts b/project/src/models/spt/mod/NewItemDetails.ts index 4e911d8f..3b9c60c5 100644 --- a/project/src/models/spt/mod/NewItemDetails.ts +++ b/project/src/models/spt/mod/NewItemDetails.ts @@ -9,7 +9,7 @@ export abstract class NewItemDetailsBase handbookPriceRoubles: number; /** Handbook ParentId for the new item */ - handbookParentId : string; + handbookParentId: string; /** * A dictionary for locale settings, key = langauge (e.g. en,cn,es-mx,jp,fr) @@ -29,7 +29,7 @@ export class NewItemFromCloneDetails extends NewItemDetailsBase /** ParentId for the new item (item type) */ parentId: string; - /** + /** * the id the new item should have, leave blank to have one generated for you * This is often known as the TplId, or TemplateId */ @@ -58,4 +58,4 @@ export class CreateItemResult success: boolean; itemId: string; errors: string[]; -} \ No newline at end of file +} diff --git a/project/src/models/spt/ragfair/IRagfairServerPrices.ts b/project/src/models/spt/ragfair/IRagfairServerPrices.ts index 64f50674..aa385dc3 100644 --- a/project/src/models/spt/ragfair/IRagfairServerPrices.ts +++ b/project/src/models/spt/ragfair/IRagfairServerPrices.ts @@ -1,5 +1,5 @@ -export interface IRagfairServerPrices +export interface IRagfairServerPrices { - static: Record - dynamic: Record -} \ No newline at end of file + static: Record; + dynamic: Record; +} diff --git a/project/src/models/spt/repeatable/IQuestTypePool.ts b/project/src/models/spt/repeatable/IQuestTypePool.ts index d724536e..185fbcd9 100644 --- a/project/src/models/spt/repeatable/IQuestTypePool.ts +++ b/project/src/models/spt/repeatable/IQuestTypePool.ts @@ -2,43 +2,43 @@ import { ELocationName } from "@spt-aki/models/enums/ELocationName"; export interface IQuestTypePool { - types: string[], - pool: IQuestPool + types: string[]; + pool: IQuestPool; } export interface IQuestPool { - Exploration: IExplorationPool - Elimination: IEliminationPool - Pickup: IExplorationPool + Exploration: IExplorationPool; + Elimination: IEliminationPool; + Pickup: IExplorationPool; } export interface IExplorationPool { - locations: Partial> + locations: Partial>; } export interface IEliminationPool { - targets: IEliminationTargetPool + targets: IEliminationTargetPool; } export interface IEliminationTargetPool { - Savage?: ITargetLocation - AnyPmc?: ITargetLocation - bossBully?: ITargetLocation - bossGluhar?: ITargetLocation - bossKilla?: ITargetLocation - bossSanitar?: ITargetLocation - bossTagilla?: ITargetLocation - bossKnight?: ITargetLocation - bossZryachiy?: ITargetLocation - bossBoar?: ITargetLocation - bossBoarSniper?: ITargetLocation + Savage?: ITargetLocation; + AnyPmc?: ITargetLocation; + bossBully?: ITargetLocation; + bossGluhar?: ITargetLocation; + bossKilla?: ITargetLocation; + bossSanitar?: ITargetLocation; + bossTagilla?: ITargetLocation; + bossKnight?: ITargetLocation; + bossZryachiy?: ITargetLocation; + bossBoar?: ITargetLocation; + bossBoarSniper?: ITargetLocation; } export interface ITargetLocation { - locations: string[] -} \ No newline at end of file + locations: string[]; +} diff --git a/project/src/models/spt/server/IDatabaseTables.ts b/project/src/models/spt/server/IDatabaseTables.ts index d80ba637..acd72d6e 100644 --- a/project/src/models/spt/server/IDatabaseTables.ts +++ b/project/src/models/spt/server/IDatabaseTables.ts @@ -22,44 +22,40 @@ import { ILocations } from "@spt-aki/models/spt/server/ILocations"; import { IServerBase } from "@spt-aki/models/spt/server/IServerBase"; import { ISettingsBase } from "@spt-aki/models/spt/server/ISettingsBase"; -export interface IDatabaseTables +export interface IDatabaseTables { - bots?: { - types: Record - base: IBotBase - core: IBotCore - } + bots?: { types: Record; base: IBotBase; core: IBotCore; }; hideout?: { - areas: IHideoutArea[] - production: IHideoutProduction[] - scavcase: IHideoutScavCase[] - settings: IHideoutSettingsBase - qte: IQteData[] - } - locales?: ILocaleBase - locations?: ILocations - loot?: ILootBase - match?: IMatch + areas: IHideoutArea[]; + production: IHideoutProduction[]; + scavcase: IHideoutScavCase[]; + settings: IHideoutSettingsBase; + qte: IQteData[]; + }; + locales?: ILocaleBase; + locations?: ILocations; + loot?: ILootBase; + match?: IMatch; templates?: { - character: string[] - items: Record - quests: Record - repeatableQuests: IRepeatableQuestDatabase - handbook: IHandbookBase - customization: Record + character: string[]; + items: Record; + quests: Record; + repeatableQuests: IRepeatableQuestDatabase; + handbook: IHandbookBase; + customization: Record; /** The profile templates listed in the launcher on profile creation, split by account type (e.g. Standard) then side (e.g. bear/usec) */ - profiles: IProfileTemplates + profiles: IProfileTemplates; /** Flea prices of items - gathered from online flea market dump */ - prices: Record + prices: Record; /** Default equipment loadouts that show on main inventory screen */ - defaultEquipmentPresets: IEquipmentBuild[] - } - traders?: Record + defaultEquipmentPresets: IEquipmentBuild[]; + }; + traders?: Record; - globals?: IGlobals - server?: IServerBase - settings?: ISettingsBase -} \ No newline at end of file + globals?: IGlobals; + server?: IServerBase; + settings?: ISettingsBase; +} diff --git a/project/src/models/spt/server/ILocaleBase.ts b/project/src/models/spt/server/ILocaleBase.ts index 611d99b5..46498aec 100644 --- a/project/src/models/spt/server/ILocaleBase.ts +++ b/project/src/models/spt/server/ILocaleBase.ts @@ -1,7 +1,7 @@ -export interface ILocaleBase +export interface ILocaleBase { - global: Record> - menu: Record - languages: Record - server: Record> -} \ No newline at end of file + global: Record>; + menu: Record; + languages: Record; + server: Record>; +} diff --git a/project/src/models/spt/server/ILocations.ts b/project/src/models/spt/server/ILocations.ts index b663341b..c8798863 100644 --- a/project/src/models/spt/server/ILocations.ts +++ b/project/src/models/spt/server/ILocations.ts @@ -2,31 +2,31 @@ import { ILocationBase } from "@spt-aki/models/eft/common/ILocationBase"; import { ILooseLoot } from "@spt-aki/models/eft/common/ILooseLoot"; import { ILocationsBase } from "@spt-aki/models/eft/common/tables/ILocationsBase"; -export interface ILocations +export interface ILocations { - bigmap?: ILocationData - develop?: ILocationData + bigmap?: ILocationData; + develop?: ILocationData; // eslint-disable-next-line @typescript-eslint/naming-convention - factory4_day?: ILocationData + factory4_day?: ILocationData; // eslint-disable-next-line @typescript-eslint/naming-convention - factory4_night?: ILocationData - hideout?: ILocationData - interchange?: ILocationData - laboratory?: ILocationData - lighthouse?: ILocationData - privatearea?: ILocationData - rezervbase?: ILocationData - shoreline?: ILocationData - suburbs?: ILocationData - tarkovstreets?: ILocationData - terminal?: ILocationData - town?: ILocationData - woods?: ILocationData - base?: ILocationsBase + factory4_night?: ILocationData; + hideout?: ILocationData; + interchange?: ILocationData; + laboratory?: ILocationData; + lighthouse?: ILocationData; + privatearea?: ILocationData; + rezervbase?: ILocationData; + shoreline?: ILocationData; + suburbs?: ILocationData; + tarkovstreets?: ILocationData; + terminal?: ILocationData; + town?: ILocationData; + woods?: ILocationData; + base?: ILocationsBase; } export interface ILocationData { - base: ILocationBase - looseLoot?: ILooseLoot -} \ No newline at end of file + base: ILocationBase; + looseLoot?: ILooseLoot; +} diff --git a/project/src/models/spt/server/IServerBase.ts b/project/src/models/spt/server/IServerBase.ts index a5d1b98c..ebaf84ad 100644 --- a/project/src/models/spt/server/IServerBase.ts +++ b/project/src/models/spt/server/IServerBase.ts @@ -1,5 +1,5 @@ -export interface IServerBase +export interface IServerBase { - ip: string - port: number -} \ No newline at end of file + ip: string; + port: number; +} diff --git a/project/src/models/spt/server/ISettingsBase.ts b/project/src/models/spt/server/ISettingsBase.ts index acaef969..0fd27a0d 100644 --- a/project/src/models/spt/server/ISettingsBase.ts +++ b/project/src/models/spt/server/ISettingsBase.ts @@ -1,64 +1,64 @@ export interface ISettingsBase { - config: Config + config: Config; } export interface Config { - AFKTimeoutSeconds: number - AdditionalRandomDelaySeconds: number - ClientSendRateLimit: number - CriticalRetriesCount: number - DefaultRetriesCount: number - FirstCycleDelaySeconds: number - FramerateLimit: FramerateLimit - GroupStatusInterval: number - GroupStatusButtonInterval: number - KeepAliveInterval: number - LobbyKeepAliveInterval: number - Mark502and504AsNonImportant: boolean - MemoryManagementSettings: MemoryManagementSettings - NVidiaHighlights: boolean - NextCycleDelaySeconds: number - PingServerResultSendInterval: number - PingServersInterval: number - ReleaseProfiler: ReleaseProfiler - RequestConfirmationTimeouts: number[] - RequestsMadeThroughLobby: string[] - SecondCycleDelaySeconds: number - ShouldEstablishLobbyConnection: boolean - TurnOffLogging: boolean - WeaponOverlapDistanceCulling: number - WebDiagnosticsEnabled: boolean - NetworkStateView: INetworkStateView + AFKTimeoutSeconds: number; + AdditionalRandomDelaySeconds: number; + ClientSendRateLimit: number; + CriticalRetriesCount: number; + DefaultRetriesCount: number; + FirstCycleDelaySeconds: number; + FramerateLimit: FramerateLimit; + GroupStatusInterval: number; + GroupStatusButtonInterval: number; + KeepAliveInterval: number; + LobbyKeepAliveInterval: number; + Mark502and504AsNonImportant: boolean; + MemoryManagementSettings: MemoryManagementSettings; + NVidiaHighlights: boolean; + NextCycleDelaySeconds: number; + PingServerResultSendInterval: number; + PingServersInterval: number; + ReleaseProfiler: ReleaseProfiler; + RequestConfirmationTimeouts: number[]; + RequestsMadeThroughLobby: string[]; + SecondCycleDelaySeconds: number; + ShouldEstablishLobbyConnection: boolean; + TurnOffLogging: boolean; + WeaponOverlapDistanceCulling: number; + WebDiagnosticsEnabled: boolean; + NetworkStateView: INetworkStateView; } export interface FramerateLimit { - MaxFramerateGameLimit: number - MaxFramerateLobbyLimit: number - MinFramerateLimit: number + MaxFramerateGameLimit: number; + MaxFramerateLobbyLimit: number; + MinFramerateLimit: number; } export interface MemoryManagementSettings { - AggressiveGC: boolean - GigabytesRequiredToDisableGCDuringRaid: number - HeapPreAllocationEnabled: boolean - HeapPreAllocationMB: number - OverrideRamCleanerSettings: boolean - RamCleanerEnabled: boolean + AggressiveGC: boolean; + GigabytesRequiredToDisableGCDuringRaid: number; + HeapPreAllocationEnabled: boolean; + HeapPreAllocationMB: number; + OverrideRamCleanerSettings: boolean; + RamCleanerEnabled: boolean; } export interface ReleaseProfiler { - Enabled: boolean - MaxRecords: number - RecordTriggerValue: number + Enabled: boolean; + MaxRecords: number; + RecordTriggerValue: number; } export interface INetworkStateView { - LossThreshold: number - RttThreshold: number -} \ No newline at end of file + LossThreshold: number; + RttThreshold: number; +} diff --git a/project/src/models/spt/services/CustomPreset.ts b/project/src/models/spt/services/CustomPreset.ts index e4d865b2..b385f928 100644 --- a/project/src/models/spt/services/CustomPreset.ts +++ b/project/src/models/spt/services/CustomPreset.ts @@ -2,6 +2,6 @@ import { IPreset } from "@spt-aki/models/eft/common/IGlobals"; export interface CustomPreset { - key: string, - preset: IPreset -} \ No newline at end of file + key: string; + preset: IPreset; +} diff --git a/project/src/models/spt/services/CustomTraderAssortData.ts b/project/src/models/spt/services/CustomTraderAssortData.ts index 18058d78..19ecc32c 100644 --- a/project/src/models/spt/services/CustomTraderAssortData.ts +++ b/project/src/models/spt/services/CustomTraderAssortData.ts @@ -3,6 +3,6 @@ import { Traders } from "@spt-aki/models/enums/Traders"; export interface CustomTraderAssortData { - traderId: Traders, - assorts: ITraderAssort -} \ No newline at end of file + traderId: Traders; + assorts: ITraderAssort; +} diff --git a/project/src/models/spt/services/LootItem.ts b/project/src/models/spt/services/LootItem.ts index 0bd736dd..e75dd0d8 100644 --- a/project/src/models/spt/services/LootItem.ts +++ b/project/src/models/spt/services/LootItem.ts @@ -4,4 +4,4 @@ export class LootItem tpl: string; isPreset: boolean; stackCount: number; -} \ No newline at end of file +} diff --git a/project/src/models/spt/services/LootRequest.ts b/project/src/models/spt/services/LootRequest.ts index 6420d794..442b9659 100644 --- a/project/src/models/spt/services/LootRequest.ts +++ b/project/src/models/spt/services/LootRequest.ts @@ -2,14 +2,14 @@ import { MinMax } from "@spt-aki/models/common/MinMax"; export interface LootRequest { - presetCount: MinMax - itemCount: MinMax - weaponCrateCount: MinMax - itemBlacklist: string[] - itemTypeWhitelist: string[] + presetCount: MinMax; + itemCount: MinMax; + weaponCrateCount: MinMax; + itemBlacklist: string[]; + itemTypeWhitelist: string[]; /** key: item base type: value: max count */ - itemLimits: Record - itemStackLimits: Record - armorLevelWhitelist: number[] - allowBossItems: boolean -} \ No newline at end of file + itemLimits: Record; + itemStackLimits: Record; + armorLevelWhitelist: number[]; + allowBossItems: boolean; +} diff --git a/project/src/models/spt/utils/IAsyncQueue.ts b/project/src/models/spt/utils/IAsyncQueue.ts index d511b050..c962f3cf 100644 --- a/project/src/models/spt/utils/IAsyncQueue.ts +++ b/project/src/models/spt/utils/IAsyncQueue.ts @@ -1,6 +1,6 @@ import { ICommand } from "@spt-aki/models/spt/utils/ICommand"; -export interface IAsyncQueue +export interface IAsyncQueue { - waitFor(command: ICommand): Promise -} \ No newline at end of file + waitFor(command: ICommand): Promise; +} diff --git a/project/src/models/spt/utils/ICommand.ts b/project/src/models/spt/utils/ICommand.ts index 9d13fd67..87c7692f 100644 --- a/project/src/models/spt/utils/ICommand.ts +++ b/project/src/models/spt/utils/ICommand.ts @@ -1,5 +1,5 @@ -export interface ICommand +export interface ICommand { - uuid: string - cmd: () => Promise -} \ No newline at end of file + uuid: string; + cmd: () => Promise; +} diff --git a/project/src/models/spt/utils/ILogger.ts b/project/src/models/spt/utils/ILogger.ts index a1e42404..f41acb17 100644 --- a/project/src/models/spt/utils/ILogger.ts +++ b/project/src/models/spt/utils/ILogger.ts @@ -2,11 +2,15 @@ import { Daum } from "@spt-aki/models/eft/itemEvent/IItemEventRouterRequest"; import { LogBackgroundColor } from "@spt-aki/models/spt/logging/LogBackgroundColor"; import { LogTextColor } from "@spt-aki/models/spt/logging/LogTextColor"; -export interface ILogger +export interface ILogger { writeToLogFile(data: string | Daum): void; log(data: string | Record | Error, color: string, backgroundColor?: string): void; - logWithColor(data: string | Record, textColor: LogTextColor, backgroundColor?: LogBackgroundColor): void; + logWithColor( + data: string | Record, + textColor: LogTextColor, + backgroundColor?: LogBackgroundColor, + ): void; error(data: string): void; @@ -14,5 +18,5 @@ export interface ILogger success(data: string): void; info(data: string): void; - debug(data: string| Record, onlyShowInConsole?: boolean): void; + debug(data: string | Record, onlyShowInConsole?: boolean): void; } diff --git a/project/src/models/spt/utils/IUuidGenerator.ts b/project/src/models/spt/utils/IUuidGenerator.ts index 05d8b025..da5e1fec 100644 --- a/project/src/models/spt/utils/IUuidGenerator.ts +++ b/project/src/models/spt/utils/IUuidGenerator.ts @@ -1,4 +1,4 @@ -export interface IUUidGenerator +export interface IUUidGenerator { - generate(): string -} \ No newline at end of file + generate(): string; +} diff --git a/project/src/routers/EventOutputHolder.ts b/project/src/routers/EventOutputHolder.ts index b3b1a079..3903a037 100644 --- a/project/src/routers/EventOutputHolder.ts +++ b/project/src/routers/EventOutputHolder.ts @@ -12,20 +12,17 @@ import { TimeUtil } from "@spt-aki/utils/TimeUtil"; export class EventOutputHolder { /** What has client been informed of this game session */ - protected clientActiveSessionStorage: Record = {}; + protected clientActiveSessionStorage: Record = {}; constructor( @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("ProfileHelper") protected profileHelper: ProfileHelper, - @inject("TimeUtil") protected timeUtil: TimeUtil + @inject("TimeUtil") protected timeUtil: TimeUtil, ) {} // TODO REMEMBER TO CHANGE OUTPUT - protected output: IItemEventRouterResponse = { - warnings: [], - profileChanges: {} - }; + protected output: IItemEventRouterResponse = { warnings: [], profileChanges: {} }; public getOutput(sessionID: string): IItemEventRouterResponse { @@ -54,23 +51,15 @@ export class EventOutputHolder ragFairOffers: [], weaponBuilds: [], equipmentBuilds: [], - items: { - new: [], - change: [], - del: [] - }, + items: { new: [], change: [], del: [] }, production: {}, improvements: {}, - skills: { - Common: [], - Mastering: [], - Points: 0 - }, + skills: { Common: [], Mastering: [], Points: 0 }, health: this.jsonUtil.clone(pmcData.Health), traderRelations: {}, - //changedHideoutStashes: {}, + // changedHideoutStashes: {}, recipeUnlocked: {}, - questsStatus: [] + questsStatus: [], }; } @@ -89,7 +78,9 @@ export class EventOutputHolder profileChanges.skills.Mastering = this.jsonUtil.clone(pmcData.Skills.Mastering); // Clone productions to ensure we preseve the profile jsons data - profileChanges.production = this.getProductionsFromProfileAndFlagComplete(this.jsonUtil.clone(pmcData.Hideout.Production)); + profileChanges.production = this.getProductionsFromProfileAndFlagComplete( + this.jsonUtil.clone(pmcData.Hideout.Production), + ); profileChanges.improvements = this.jsonUtil.clone(this.getImprovementsFromProfileAndFlagComplete(pmcData)); profileChanges.traderRelations = this.constructTraderRelations(pmcData.TradersInfo); @@ -114,13 +105,13 @@ export class EventOutputHolder disabled: baseData.disabled, loyalty: baseData.loyaltyLevel, standing: baseData.standing, - unlocked: baseData.unlocked + unlocked: baseData.unlocked, }; } return result; } - + /** * Return all hideout Improvements from player profile, adjust completed Improvements' completed property to be true * @param pmcData Player profile @@ -152,7 +143,9 @@ export class EventOutputHolder * @param pmcData Player profile * @returns dictionary of hideout productions */ - protected getProductionsFromProfileAndFlagComplete(productions: Record): Record + protected getProductionsFromProfileAndFlagComplete( + productions: Record, + ): Record { for (const productionKey in productions) { diff --git a/project/src/routers/HttpRouter.ts b/project/src/routers/HttpRouter.ts index 407f2d7a..a635e9ae 100644 --- a/project/src/routers/HttpRouter.ts +++ b/project/src/routers/HttpRouter.ts @@ -1,5 +1,5 @@ import { IncomingMessage } from "node:http"; -import { injectable, injectAll } from "tsyringe"; +import { injectAll, injectable } from "tsyringe"; import { DynamicRouter, Router, StaticRouter } from "@spt-aki/di/Router"; @@ -8,11 +8,11 @@ export class HttpRouter { constructor( @injectAll("StaticRoutes") protected staticRouters: StaticRouter[], - @injectAll("DynamicRoutes") protected dynamicRoutes: DynamicRouter[] + @injectAll("DynamicRoutes") protected dynamicRoutes: DynamicRouter[], ) - { } + {} - protected groupBy(list: T[], keyGetter: (t:T) => string): Map + protected groupBy(list: T[], keyGetter: (t: T) => string): Map { const map: Map = new Map(); list.forEach((item) => @@ -56,7 +56,14 @@ export class HttpRouter return wrapper.output; } - protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean + protected handleRoute( + url: string, + info: any, + sessionID: string, + wrapper: ResponseWrapper, + routers: Router[], + dynamic: boolean, + ): boolean { let matched = false; for (const route of routers) @@ -80,8 +87,6 @@ export class HttpRouter class ResponseWrapper { - constructor( - public output: string - ) + constructor(public output: string) {} -} \ No newline at end of file +} diff --git a/project/src/routers/ImageRouter.ts b/project/src/routers/ImageRouter.ts index 4fc8fe38..6e6b49ee 100644 --- a/project/src/routers/ImageRouter.ts +++ b/project/src/routers/ImageRouter.ts @@ -11,9 +11,9 @@ export class ImageRouter constructor( @inject("VFS") protected vfs: VFS, @inject("ImageRouteService") protected imageRouteService: ImageRouteService, - @inject("HttpFileUtil") protected httpFileUtil: HttpFileUtil + @inject("HttpFileUtil") protected httpFileUtil: HttpFileUtil, ) - { } + {} public addRoute(key: string, valueToAdd: string): void { @@ -37,4 +37,4 @@ export class ImageRouter { return "IMAGE"; } -} \ No newline at end of file +} diff --git a/project/src/routers/ItemEventRouter.ts b/project/src/routers/ItemEventRouter.ts index 84fa77d5..a1bf45fb 100644 --- a/project/src/routers/ItemEventRouter.ts +++ b/project/src/routers/ItemEventRouter.ts @@ -1,4 +1,4 @@ -import { inject, injectable, injectAll } from "tsyringe"; +import { inject, injectAll, injectable } from "tsyringe"; import { ItemEventRouterDefinition } from "@spt-aki/di/Router"; import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper"; @@ -9,24 +9,23 @@ import { EventOutputHolder } from "@spt-aki/routers/EventOutputHolder"; import { LocalisationService } from "@spt-aki/services/LocalisationService"; @injectable() -export class ItemEventRouter +export class ItemEventRouter { constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("ProfileHelper") protected profileHelper: ProfileHelper, @injectAll("IERouters") protected itemEventRouters: ItemEventRouterDefinition[], @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder - ) - { } + @inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder, + ) + {} /** - * * @param info Event request * @param sessionID Session id * @returns Item response */ - public handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse + public handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse { this.eventOutputHolder.resetOutput(sessionID); @@ -36,13 +35,13 @@ export class ItemEventRouter { const pmcData = this.profileHelper.getPmcProfile(sessionID); - const eventRouter = this.itemEventRouters.find(r => r.canHandle(body.Action)); - if (eventRouter) + const eventRouter = this.itemEventRouters.find((r) => r.canHandle(body.Action)); + if (eventRouter) { this.logger.debug(`event: ${body.Action}`); result = eventRouter.handleItemEvent(body.Action, pmcData, body, sessionID); } - else + else { this.logger.error(this.localisationService.getText("event-unhandled_event", body.Action)); this.logger.writeToLogFile(body); diff --git a/project/src/routers/dynamic/BotDynamicRouter.ts b/project/src/routers/dynamic/BotDynamicRouter.ts index 50e110f3..b1b6ca32 100644 --- a/project/src/routers/dynamic/BotDynamicRouter.ts +++ b/project/src/routers/dynamic/BotDynamicRouter.ts @@ -4,47 +4,43 @@ import { BotCallbacks } from "@spt-aki/callbacks/BotCallbacks"; import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class BotDynamicRouter extends DynamicRouter +export class BotDynamicRouter extends DynamicRouter { - constructor( - @inject("BotCallbacks") protected botCallbacks: BotCallbacks - ) + constructor(@inject("BotCallbacks") protected botCallbacks: BotCallbacks) { - super( - [ - new RouteAction( - "/singleplayer/settings/bot/limit/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.botCallbacks.getBotLimit(url, info, sessionID); - } - ), - new RouteAction( - "/singleplayer/settings/bot/difficulty/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.botCallbacks.getBotDifficulty(url, info, sessionID); - } - ), - new RouteAction( - "/singleplayer/settings/bot/maxCap", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.botCallbacks.getBotCap(); - } - ), - new RouteAction( - "/singleplayer/settings/bot/getBotBehaviours/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.botCallbacks.getBotBehaviours(); - } - ) - ] - ); + super([ + new RouteAction( + "/singleplayer/settings/bot/limit/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.botCallbacks.getBotLimit(url, info, sessionID); + }, + ), + new RouteAction( + "/singleplayer/settings/bot/difficulty/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.botCallbacks.getBotDifficulty(url, info, sessionID); + }, + ), + new RouteAction( + "/singleplayer/settings/bot/maxCap", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.botCallbacks.getBotCap(); + }, + ), + new RouteAction( + "/singleplayer/settings/bot/getBotBehaviours/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.botCallbacks.getBotBehaviours(); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/BundleDynamicRouter.ts b/project/src/routers/dynamic/BundleDynamicRouter.ts index 1d8f3a06..51a425a5 100644 --- a/project/src/routers/dynamic/BundleDynamicRouter.ts +++ b/project/src/routers/dynamic/BundleDynamicRouter.ts @@ -4,23 +4,19 @@ import { BundleCallbacks } from "@spt-aki/callbacks/BundleCallbacks"; import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class BundleDynamicRouter extends DynamicRouter +export class BundleDynamicRouter extends DynamicRouter { - constructor( - @inject("BundleCallbacks") protected bundleCallbacks: BundleCallbacks - ) + constructor(@inject("BundleCallbacks") protected bundleCallbacks: BundleCallbacks) { - super( - [ - new RouteAction( - ".bundle", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.bundleCallbacks.getBundle(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + ".bundle", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.bundleCallbacks.getBundle(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/CustomizationDynamicRouter.ts b/project/src/routers/dynamic/CustomizationDynamicRouter.ts index 0110d63e..5ef5034f 100644 --- a/project/src/routers/dynamic/CustomizationDynamicRouter.ts +++ b/project/src/routers/dynamic/CustomizationDynamicRouter.ts @@ -4,24 +4,19 @@ import { CustomizationCallbacks } from "@spt-aki/callbacks/CustomizationCallback import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class CustomizationDynamicRouter extends DynamicRouter +export class CustomizationDynamicRouter extends DynamicRouter { - constructor( - @inject("CustomizationCallbacks") protected customizationCallbacks: CustomizationCallbacks - ) + constructor(@inject("CustomizationCallbacks") protected customizationCallbacks: CustomizationCallbacks) { - super( - [ - new RouteAction( - "/client/trading/customization/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.customizationCallbacks.getTraderSuits(url, info, sessionID); - } - ) - - ] - ); + super([ + new RouteAction( + "/client/trading/customization/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.customizationCallbacks.getTraderSuits(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/DataDynamicRouter.ts b/project/src/routers/dynamic/DataDynamicRouter.ts index cf71b6bc..aa7917e3 100644 --- a/project/src/routers/dynamic/DataDynamicRouter.ts +++ b/project/src/routers/dynamic/DataDynamicRouter.ts @@ -4,38 +4,35 @@ import { DataCallbacks } from "@spt-aki/callbacks/DataCallbacks"; import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class DataDynamicRouter extends DynamicRouter +export class DataDynamicRouter extends DynamicRouter { - constructor( - @inject("DataCallbacks") protected dataCallbacks: DataCallbacks - ) + constructor(@inject("DataCallbacks") protected dataCallbacks: DataCallbacks) { - super( - [ - new RouteAction( - "/client/menu/locale/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getLocalesMenu(url, info, sessionID); - } - ), - new RouteAction( - "/client/locale/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getLocalesGlobal(url, info, sessionID); - } - ), - new RouteAction( - "/client/items/prices/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getItemPrices(url, info, sessionID); - }) - ] - ); + super([ + new RouteAction( + "/client/menu/locale/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getLocalesMenu(url, info, sessionID); + }, + ), + new RouteAction( + "/client/locale/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getLocalesGlobal(url, info, sessionID); + }, + ), + new RouteAction( + "/client/items/prices/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getItemPrices(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/HttpDynamicRouter.ts b/project/src/routers/dynamic/HttpDynamicRouter.ts index f46a4252..03f1119e 100644 --- a/project/src/routers/dynamic/HttpDynamicRouter.ts +++ b/project/src/routers/dynamic/HttpDynamicRouter.ts @@ -4,40 +4,35 @@ import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; import { ImageRouter } from "@spt-aki/routers/ImageRouter"; @injectable() -export class HttpDynamicRouter extends DynamicRouter +export class HttpDynamicRouter extends DynamicRouter { - constructor( - @inject("ImageRouter") protected imageRouter: ImageRouter - ) + constructor(@inject("ImageRouter") protected imageRouter: ImageRouter) { - super( - [ - new RouteAction( - ".jpg", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.imageRouter.getImage(); - } - ), - new RouteAction( - ".png", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.imageRouter.getImage(); - } - ), - new RouteAction( - ".ico", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.imageRouter.getImage(); - } - ) - - ] - ); + super([ + new RouteAction( + ".jpg", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.imageRouter.getImage(); + }, + ), + new RouteAction( + ".png", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.imageRouter.getImage(); + }, + ), + new RouteAction( + ".ico", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.imageRouter.getImage(); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/InraidDynamicRouter.ts b/project/src/routers/dynamic/InraidDynamicRouter.ts index e8e9eac0..134a8eb5 100644 --- a/project/src/routers/dynamic/InraidDynamicRouter.ts +++ b/project/src/routers/dynamic/InraidDynamicRouter.ts @@ -4,28 +4,24 @@ import { InraidCallbacks } from "@spt-aki/callbacks/InraidCallbacks"; import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class InraidDynamicRouter extends DynamicRouter +export class InraidDynamicRouter extends DynamicRouter { - constructor( - @inject("InraidCallbacks") protected inraidCallbacks: InraidCallbacks - ) + constructor(@inject("InraidCallbacks") protected inraidCallbacks: InraidCallbacks) { - super( - [ - new RouteAction( - "/client/location/getLocalloot", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.inraidCallbacks.registerPlayer(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/location/getLocalloot", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.inraidCallbacks.registerPlayer(url, info, sessionID); + }, + ), + ]); } - public override getTopLevelRoute(): string + public override getTopLevelRoute(): string { return "aki-name"; } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/LocationDynamicRouter.ts b/project/src/routers/dynamic/LocationDynamicRouter.ts index 06e41c30..a5061ed1 100644 --- a/project/src/routers/dynamic/LocationDynamicRouter.ts +++ b/project/src/routers/dynamic/LocationDynamicRouter.ts @@ -4,28 +4,24 @@ import { LocationCallbacks } from "@spt-aki/callbacks/LocationCallbacks"; import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class LocationDynamicRouter extends DynamicRouter +export class LocationDynamicRouter extends DynamicRouter { - constructor( - @inject("LocationCallbacks") protected locationCallbacks: LocationCallbacks - ) + constructor(@inject("LocationCallbacks") protected locationCallbacks: LocationCallbacks) { - super( - [ - new RouteAction( - "/client/location/getLocalloot", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, _output: string): any => - { - return this.locationCallbacks.getLocation(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/location/getLocalloot", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, _output: string): any => + { + return this.locationCallbacks.getLocation(url, info, sessionID); + }, + ), + ]); } - public override getTopLevelRoute(): string + public override getTopLevelRoute(): string { return "aki-loot"; } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/NotifierDynamicRouter.ts b/project/src/routers/dynamic/NotifierDynamicRouter.ts index f7a4e0d3..b2a00f33 100644 --- a/project/src/routers/dynamic/NotifierDynamicRouter.ts +++ b/project/src/routers/dynamic/NotifierDynamicRouter.ts @@ -4,48 +4,43 @@ import { NotifierCallbacks } from "@spt-aki/callbacks/NotifierCallbacks"; import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class NotifierDynamicRouter extends DynamicRouter +export class NotifierDynamicRouter extends DynamicRouter { - constructor( - @inject("NotifierCallbacks") protected notifierCallbacks: NotifierCallbacks - ) + constructor(@inject("NotifierCallbacks") protected notifierCallbacks: NotifierCallbacks) { - super( - [ - new RouteAction( - "/?last_id", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.notifierCallbacks.notify(url, info, sessionID); - } - ), - new RouteAction( - "/notifierServer", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.notifierCallbacks.notify(url, info, sessionID); - } - ), - new RouteAction( - "/push/notifier/get/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.notifierCallbacks.getNotifier(url, info, sessionID); - } - ), - new RouteAction( - "/push/notifier/getwebsocket/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.notifierCallbacks.getNotifier(url, info, sessionID); - } - ) - ] - ); - + super([ + new RouteAction( + "/?last_id", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.notifierCallbacks.notify(url, info, sessionID); + }, + ), + new RouteAction( + "/notifierServer", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.notifierCallbacks.notify(url, info, sessionID); + }, + ), + new RouteAction( + "/push/notifier/get/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.notifierCallbacks.getNotifier(url, info, sessionID); + }, + ), + new RouteAction( + "/push/notifier/getwebsocket/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.notifierCallbacks.getNotifier(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/dynamic/TraderDynamicRouter.ts b/project/src/routers/dynamic/TraderDynamicRouter.ts index c1bc2118..d6e20f93 100644 --- a/project/src/routers/dynamic/TraderDynamicRouter.ts +++ b/project/src/routers/dynamic/TraderDynamicRouter.ts @@ -4,31 +4,27 @@ import { TraderCallbacks } from "@spt-aki/callbacks/TraderCallbacks"; import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; @injectable() -export class TraderDynamicRouter extends DynamicRouter +export class TraderDynamicRouter extends DynamicRouter { - constructor( - @inject("TraderCallbacks") protected traderCallbacks: TraderCallbacks - ) + constructor(@inject("TraderCallbacks") protected traderCallbacks: TraderCallbacks) { - super( - [ - new RouteAction( - "/client/trading/api/getTrader/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.traderCallbacks.getTrader(url, info, sessionID); - } - ), - new RouteAction( - "/client/trading/api/getTraderAssort/", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.traderCallbacks.getAssort(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/trading/api/getTrader/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.traderCallbacks.getTrader(url, info, sessionID); + }, + ), + new RouteAction( + "/client/trading/api/getTraderAssort/", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.traderCallbacks.getAssort(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/CustomizationItemEventRouter.ts b/project/src/routers/item_events/CustomizationItemEventRouter.ts index 5f56ffa6..f944fed4 100644 --- a/project/src/routers/item_events/CustomizationItemEventRouter.ts +++ b/project/src/routers/item_events/CustomizationItemEventRouter.ts @@ -6,24 +6,26 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; @injectable() -export class CustomizationItemEventRouter extends ItemEventRouterDefinition +export class CustomizationItemEventRouter extends ItemEventRouterDefinition { constructor( - @inject("CustomizationCallbacks") protected customizationCallbacks: CustomizationCallbacks // TODO: delay required - ) + @inject("CustomizationCallbacks") protected customizationCallbacks: CustomizationCallbacks, // TODO: delay required + ) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { - return [ - new HandledRoute("CustomizationWear", false), - new HandledRoute("CustomizationBuy", false) - ]; + return [new HandledRoute("CustomizationWear", false), new HandledRoute("CustomizationBuy", false)]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -33,4 +35,4 @@ export class CustomizationItemEventRouter extends ItemEventRouterDefinition return this.customizationCallbacks.buyClothing(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/HealthItemEventRouter.ts b/project/src/routers/item_events/HealthItemEventRouter.ts index b287ac1d..807e9877 100644 --- a/project/src/routers/item_events/HealthItemEventRouter.ts +++ b/project/src/routers/item_events/HealthItemEventRouter.ts @@ -6,25 +6,30 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; @injectable() -export class HealthItemEventRouter extends ItemEventRouterDefinition +export class HealthItemEventRouter extends ItemEventRouterDefinition { constructor( - @inject("HealthCallbacks") protected healthCallbacks: HealthCallbacks // TODO: delay required - ) + @inject("HealthCallbacks") protected healthCallbacks: HealthCallbacks, // TODO: delay required + ) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute("Eat", false), new HandledRoute("Heal", false), - new HandledRoute("RestoreHealth", false) + new HandledRoute("RestoreHealth", false), ]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -36,4 +41,4 @@ export class HealthItemEventRouter extends ItemEventRouterDefinition return this.healthCallbacks.healthTreatment(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/HideoutItemEventRouter.ts b/project/src/routers/item_events/HideoutItemEventRouter.ts index 0dd12165..4fba95f4 100644 --- a/project/src/routers/item_events/HideoutItemEventRouter.ts +++ b/project/src/routers/item_events/HideoutItemEventRouter.ts @@ -7,16 +7,14 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve import { HideoutEventActions } from "@spt-aki/models/enums/HideoutEventActions"; @injectable() -export class HideoutItemEventRouter extends ItemEventRouterDefinition +export class HideoutItemEventRouter extends ItemEventRouterDefinition { - constructor( - @inject("HideoutCallbacks") protected hideoutCallbacks: HideoutCallbacks - ) + constructor(@inject("HideoutCallbacks") protected hideoutCallbacks: HideoutCallbacks) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute(HideoutEventActions.HIDEOUT_UPGRADE, false), @@ -30,11 +28,16 @@ export class HideoutItemEventRouter extends ItemEventRouterDefinition new HandledRoute(HideoutEventActions.HIDEOUT_TAKE_PRODUCTION, false), new HandledRoute(HideoutEventActions.HIDEOUT_RECORD_SHOOTING_RANGE_POINTS, false), new HandledRoute(HideoutEventActions.HIDEOUT_IMPROVE_AREA, false), - new HandledRoute(HideoutEventActions.HIDEOUT_CANCEL_PRODUCTION_COMMAND, false) + new HandledRoute(HideoutEventActions.HIDEOUT_CANCEL_PRODUCTION_COMMAND, false), ]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -64,4 +67,4 @@ export class HideoutItemEventRouter extends ItemEventRouterDefinition return this.hideoutCallbacks.cancelProduction(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/InsuranceItemEventRouter.ts b/project/src/routers/item_events/InsuranceItemEventRouter.ts index bce4aaba..087d8145 100644 --- a/project/src/routers/item_events/InsuranceItemEventRouter.ts +++ b/project/src/routers/item_events/InsuranceItemEventRouter.ts @@ -6,29 +6,31 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; @injectable() -export class InsuranceItemEventRouter extends ItemEventRouterDefinition +export class InsuranceItemEventRouter extends ItemEventRouterDefinition { constructor( - @inject("InsuranceCallbacks") protected insuranceCallbacks: InsuranceCallbacks // TODO: delay required - ) + @inject("InsuranceCallbacks") protected insuranceCallbacks: InsuranceCallbacks, // TODO: delay required + ) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { - return [ - new HandledRoute("Insure", false) - ]; + return [new HandledRoute("Insure", false)]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { case "Insure": return this.insuranceCallbacks.insure(pmcData, body, sessionID); - } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/InventoryItemEventRouter.ts b/project/src/routers/item_events/InventoryItemEventRouter.ts index 54d19728..6793be7e 100644 --- a/project/src/routers/item_events/InventoryItemEventRouter.ts +++ b/project/src/routers/item_events/InventoryItemEventRouter.ts @@ -8,18 +8,17 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve import { ItemEventActions } from "@spt-aki/models/enums/ItemEventActions"; @injectable() -export class InventoryItemEventRouter extends ItemEventRouterDefinition +export class InventoryItemEventRouter extends ItemEventRouterDefinition { constructor( @inject("InventoryCallbacks") protected inventoryCallbacks: InventoryCallbacks, - @inject("HideoutCallbacks") protected hideoutCallbacks: HideoutCallbacks - - ) + @inject("HideoutCallbacks") protected hideoutCallbacks: HideoutCallbacks, + ) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute(ItemEventActions.MOVE, false), @@ -40,11 +39,16 @@ export class InventoryItemEventRouter extends ItemEventRouterDefinition new HandledRoute(ItemEventActions.DELETE_MAP_MARKER, false), new HandledRoute(ItemEventActions.EDIT_MAP_MARKER, false), new HandledRoute(ItemEventActions.OPEN_RANDOM_LOOT_CONTAINER, false), - new HandledRoute(ItemEventActions.HIDEOUT_QTE_EVENT, false) + new HandledRoute(ItemEventActions.HIDEOUT_QTE_EVENT, false), ]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -90,4 +94,4 @@ export class InventoryItemEventRouter extends ItemEventRouterDefinition throw new Error(`Unhandled event ${url}`); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/NoteItemEventRouter.ts b/project/src/routers/item_events/NoteItemEventRouter.ts index 179ed61b..ce0b79de 100644 --- a/project/src/routers/item_events/NoteItemEventRouter.ts +++ b/project/src/routers/item_events/NoteItemEventRouter.ts @@ -7,34 +7,39 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve import { INoteActionData } from "@spt-aki/models/eft/notes/INoteActionData"; @injectable() -export class NoteItemEventRouter extends ItemEventRouterDefinition +export class NoteItemEventRouter extends ItemEventRouterDefinition { constructor( - @inject("NoteCallbacks") protected noteCallbacks: NoteCallbacks // TODO: delay required - ) + @inject("NoteCallbacks") protected noteCallbacks: NoteCallbacks, // TODO: delay required + ) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute("AddNote", false), new HandledRoute("EditNote", false), - new HandledRoute("DeleteNote", false) + new HandledRoute("DeleteNote", false), ]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: INoteActionData, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { case "AddNote": return this.noteCallbacks.addNote(pmcData, body, sessionID); case "EditNote": - return this.noteCallbacks.editNote(pmcData, body, sessionID); + return this.noteCallbacks.editNote(pmcData, body, sessionID); case "DeleteNote": - return this.noteCallbacks.deleteNote(pmcData, body, sessionID); + return this.noteCallbacks.deleteNote(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/PresetBuildItemEventRouter.ts b/project/src/routers/item_events/PresetBuildItemEventRouter.ts index 4fa1b4e4..577464e0 100644 --- a/project/src/routers/item_events/PresetBuildItemEventRouter.ts +++ b/project/src/routers/item_events/PresetBuildItemEventRouter.ts @@ -7,27 +7,30 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve import { ItemEventActions } from "@spt-aki/models/enums/ItemEventActions"; @injectable() -export class PresetBuildItemEventRouter extends ItemEventRouterDefinition +export class PresetBuildItemEventRouter extends ItemEventRouterDefinition { - constructor( - @inject("PresetBuildCallbacks") protected presetBuildCallbacks: PresetBuildCallbacks - ) + constructor(@inject("PresetBuildCallbacks") protected presetBuildCallbacks: PresetBuildCallbacks) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute(ItemEventActions.SAVE_WEAPON_BUILD, false), new HandledRoute(ItemEventActions.REMOVE_WEAPON_BUILD, false), new HandledRoute(ItemEventActions.SAVE_EQUIPMENT_BUILD, false), new HandledRoute(ItemEventActions.REMOVE_EQUIPMENT_BUILD, false), - new HandledRoute(ItemEventActions.REMOVE_BUILD, false) + new HandledRoute(ItemEventActions.REMOVE_BUILD, false), ]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -43,4 +46,4 @@ export class PresetBuildItemEventRouter extends ItemEventRouterDefinition return this.presetBuildCallbacks.removeEquipmentBuild(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/QuestItemEventRouter.ts b/project/src/routers/item_events/QuestItemEventRouter.ts index 1e881404..7138e81b 100644 --- a/project/src/routers/item_events/QuestItemEventRouter.ts +++ b/project/src/routers/item_events/QuestItemEventRouter.ts @@ -7,27 +7,32 @@ import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEve import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; @injectable() -export class QuestItemEventRouter extends ItemEventRouterDefinition +export class QuestItemEventRouter extends ItemEventRouterDefinition { constructor( @inject("WinstonLogger") protected logger: ILogger, - @inject("QuestCallbacks") protected questCallbacks: QuestCallbacks - ) + @inject("QuestCallbacks") protected questCallbacks: QuestCallbacks, + ) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute("QuestAccept", false), new HandledRoute("QuestComplete", false), new HandledRoute("QuestHandover", false), - new HandledRoute("RepeatableQuestChange", false) + new HandledRoute("RepeatableQuestChange", false), ]; } - public override handleItemEvent(eventAction: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + eventAction: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { this.logger.debug(`${eventAction} ${body.qid}`); switch (eventAction) @@ -35,11 +40,11 @@ export class QuestItemEventRouter extends ItemEventRouterDefinition case "QuestAccept": return this.questCallbacks.acceptQuest(pmcData, body, sessionID); case "QuestComplete": - return this.questCallbacks.completeQuest(pmcData, body, sessionID); + return this.questCallbacks.completeQuest(pmcData, body, sessionID); case "QuestHandover": - return this.questCallbacks.handoverQuest(pmcData, body, sessionID); + return this.questCallbacks.handoverQuest(pmcData, body, sessionID); case "RepeatableQuestChange": - return this.questCallbacks.changeRepeatableQuest(pmcData, body, sessionID); + return this.questCallbacks.changeRepeatableQuest(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/RagfairItemEventRouter.ts b/project/src/routers/item_events/RagfairItemEventRouter.ts index 7c62eae1..ae65e463 100644 --- a/project/src/routers/item_events/RagfairItemEventRouter.ts +++ b/project/src/routers/item_events/RagfairItemEventRouter.ts @@ -6,25 +6,28 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; @injectable() -export class RagfairItemEventRouter extends ItemEventRouterDefinition +export class RagfairItemEventRouter extends ItemEventRouterDefinition { - constructor( - @inject("RagfairCallbacks") protected ragfairCallbacks: RagfairCallbacks - ) + constructor(@inject("RagfairCallbacks") protected ragfairCallbacks: RagfairCallbacks) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute("RagFairAddOffer", false), new HandledRoute("RagFairRemoveOffer", false), - new HandledRoute("RagFairRenewOffer", false) + new HandledRoute("RagFairRenewOffer", false), ]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -36,4 +39,4 @@ export class RagfairItemEventRouter extends ItemEventRouterDefinition return this.ragfairCallbacks.extendOffer(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/RepairItemEventRouter.ts b/project/src/routers/item_events/RepairItemEventRouter.ts index 1333ea2c..af906ef2 100644 --- a/project/src/routers/item_events/RepairItemEventRouter.ts +++ b/project/src/routers/item_events/RepairItemEventRouter.ts @@ -6,24 +6,24 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; @injectable() -export class RepairItemEventRouter extends ItemEventRouterDefinition +export class RepairItemEventRouter extends ItemEventRouterDefinition { - constructor( - @inject("RepairCallbacks") protected repairCallbacks: RepairCallbacks - ) + constructor(@inject("RepairCallbacks") protected repairCallbacks: RepairCallbacks) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { - return [ - new HandledRoute("Repair", false), - new HandledRoute("TraderRepair", false) - ]; + return [new HandledRoute("Repair", false), new HandledRoute("TraderRepair", false)]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -33,4 +33,4 @@ export class RepairItemEventRouter extends ItemEventRouterDefinition return this.repairCallbacks.traderRepair(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/TradeItemEventRouter.ts b/project/src/routers/item_events/TradeItemEventRouter.ts index 36a737fd..c36ba60f 100644 --- a/project/src/routers/item_events/TradeItemEventRouter.ts +++ b/project/src/routers/item_events/TradeItemEventRouter.ts @@ -6,25 +6,28 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; @injectable() -export class TradeItemEventRouter extends ItemEventRouterDefinition +export class TradeItemEventRouter extends ItemEventRouterDefinition { - constructor( - @inject("TradeCallbacks") protected tradeCallbacks: TradeCallbacks - ) + constructor(@inject("TradeCallbacks") protected tradeCallbacks: TradeCallbacks) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { return [ new HandledRoute("TradingConfirm", false), new HandledRoute("RagFairBuyOffer", false), - new HandledRoute("SellAllFromSavage", false) + new HandledRoute("SellAllFromSavage", false), ]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -36,4 +39,4 @@ export class TradeItemEventRouter extends ItemEventRouterDefinition return this.tradeCallbacks.sellAllFromSavage(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/item_events/WishlistItemEventRouter.ts b/project/src/routers/item_events/WishlistItemEventRouter.ts index e18c1ebc..dd15eae4 100644 --- a/project/src/routers/item_events/WishlistItemEventRouter.ts +++ b/project/src/routers/item_events/WishlistItemEventRouter.ts @@ -6,24 +6,24 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; @injectable() -export class WishlistItemEventRouter extends ItemEventRouterDefinition +export class WishlistItemEventRouter extends ItemEventRouterDefinition { - constructor( - @inject("WishlistCallbacks") protected wishlistCallbacks: WishlistCallbacks - ) + constructor(@inject("WishlistCallbacks") protected wishlistCallbacks: WishlistCallbacks) { super(); } - public override getHandledRoutes(): HandledRoute[] + public override getHandledRoutes(): HandledRoute[] { - return [ - new HandledRoute("AddToWishList", false), - new HandledRoute("RemoveFromWishList", false) - ]; + return [new HandledRoute("AddToWishList", false), new HandledRoute("RemoveFromWishList", false)]; } - public override handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse + public override handleItemEvent( + url: string, + pmcData: IPmcData, + body: any, + sessionID: string, + ): IItemEventRouterResponse { switch (url) { @@ -33,4 +33,4 @@ export class WishlistItemEventRouter extends ItemEventRouterDefinition return this.wishlistCallbacks.removeFromWishlist(pmcData, body, sessionID); } } -} \ No newline at end of file +} diff --git a/project/src/routers/save_load/HealthSaveLoadRouter.ts b/project/src/routers/save_load/HealthSaveLoadRouter.ts index 3ebb5506..b32f49ce 100644 --- a/project/src/routers/save_load/HealthSaveLoadRouter.ts +++ b/project/src/routers/save_load/HealthSaveLoadRouter.ts @@ -4,28 +4,18 @@ import { HandledRoute, SaveLoadRouter } from "@spt-aki/di/Router"; import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile"; @injectable() -export class HealthSaveLoadRouter extends SaveLoadRouter +export class HealthSaveLoadRouter extends SaveLoadRouter { - constructor() + public override getHandledRoutes(): HandledRoute[] { - super(); + return [new HandledRoute("aki-health", false)]; } - public override getHandledRoutes(): HandledRoute[] + public override handleLoad(profile: IAkiProfile): IAkiProfile { - return [ - new HandledRoute("aki-health", false) - ]; - } - - public override handleLoad(profile: IAkiProfile): IAkiProfile - { - if (!profile.vitality) // Occurs on newly created profiles - { - profile.vitality = { - health: null, - effects: null - }; + if (!profile.vitality) + { // Occurs on newly created profiles + profile.vitality = { health: null, effects: null }; } profile.vitality.health = { Hydration: 0, @@ -37,7 +27,7 @@ export class HealthSaveLoadRouter extends SaveLoadRouter LeftArm: 0, RightArm: 0, LeftLeg: 0, - RightLeg: 0 + RightLeg: 0, }; profile.vitality.effects = { @@ -47,9 +37,9 @@ export class HealthSaveLoadRouter extends SaveLoadRouter LeftArm: {}, RightArm: {}, LeftLeg: {}, - RightLeg: {} + RightLeg: {}, }; return profile; } -} \ No newline at end of file +} diff --git a/project/src/routers/save_load/InraidSaveLoadRouter.ts b/project/src/routers/save_load/InraidSaveLoadRouter.ts index 6b6c2441..241300dd 100644 --- a/project/src/routers/save_load/InraidSaveLoadRouter.ts +++ b/project/src/routers/save_load/InraidSaveLoadRouter.ts @@ -4,30 +4,20 @@ import { HandledRoute, SaveLoadRouter } from "@spt-aki/di/Router"; import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile"; @injectable() -export class InraidSaveLoadRouter extends SaveLoadRouter +export class InraidSaveLoadRouter extends SaveLoadRouter { - constructor() + public override getHandledRoutes(): HandledRoute[] { - super(); + return [new HandledRoute("aki-inraid", false)]; } - public override getHandledRoutes(): HandledRoute[] - { - return [ - new HandledRoute("aki-inraid", false) - ]; - } - - public override handleLoad(profile: IAkiProfile): IAkiProfile + public override handleLoad(profile: IAkiProfile): IAkiProfile { if (profile.inraid === undefined) { - profile.inraid = { - location: "none", - character: "none" - }; + profile.inraid = { location: "none", character: "none" }; } return profile; } -} \ No newline at end of file +} diff --git a/project/src/routers/save_load/InsuranceSaveLoadRouter.ts b/project/src/routers/save_load/InsuranceSaveLoadRouter.ts index fc1170e1..433b8a49 100644 --- a/project/src/routers/save_load/InsuranceSaveLoadRouter.ts +++ b/project/src/routers/save_load/InsuranceSaveLoadRouter.ts @@ -4,21 +4,14 @@ import { HandledRoute, SaveLoadRouter } from "@spt-aki/di/Router"; import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile"; @injectable() -export class InsuranceSaveLoadRouter extends SaveLoadRouter +export class InsuranceSaveLoadRouter extends SaveLoadRouter { - constructor() + public override getHandledRoutes(): HandledRoute[] { - super(); + return [new HandledRoute("aki-insurance", false)]; } - public override getHandledRoutes(): HandledRoute[] - { - return [ - new HandledRoute("aki-insurance", false) - ]; - } - - public override handleLoad(profile: IAkiProfile): IAkiProfile + public override handleLoad(profile: IAkiProfile): IAkiProfile { if (profile.insurance === undefined) { @@ -26,4 +19,4 @@ export class InsuranceSaveLoadRouter extends SaveLoadRouter } return profile; } -} \ No newline at end of file +} diff --git a/project/src/routers/save_load/ProfileSaveLoadRouter.ts b/project/src/routers/save_load/ProfileSaveLoadRouter.ts index af7725a1..97d1309f 100644 --- a/project/src/routers/save_load/ProfileSaveLoadRouter.ts +++ b/project/src/routers/save_load/ProfileSaveLoadRouter.ts @@ -5,29 +5,19 @@ import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile"; @injectable() -export class ProfileSaveLoadRouter extends SaveLoadRouter +export class ProfileSaveLoadRouter extends SaveLoadRouter { - constructor() + public override getHandledRoutes(): HandledRoute[] { - super(); + return [new HandledRoute("aki-profile", false)]; } - public override getHandledRoutes(): HandledRoute[] - { - return [ - new HandledRoute("aki-profile", false) - ]; - } - - public override handleLoad(profile: IAkiProfile): IAkiProfile + public override handleLoad(profile: IAkiProfile): IAkiProfile { if (profile.characters === null) { - profile.characters = { - pmc: {} as IPmcData, - scav: {} as IPmcData - }; + profile.characters = { pmc: {} as IPmcData, scav: {} as IPmcData }; } return profile; } -} \ No newline at end of file +} diff --git a/project/src/routers/serializers/BundleSerializer.ts b/project/src/routers/serializers/BundleSerializer.ts index 326733f0..880d4071 100644 --- a/project/src/routers/serializers/BundleSerializer.ts +++ b/project/src/routers/serializers/BundleSerializer.ts @@ -9,11 +9,10 @@ import { HttpFileUtil } from "@spt-aki/utils/HttpFileUtil"; @injectable() export class BundleSerializer extends Serializer { - constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("BundleLoader") protected bundleLoader: BundleLoader, - @inject("HttpFileUtil") protected httpFileUtil: HttpFileUtil + @inject("HttpFileUtil") protected httpFileUtil: HttpFileUtil, ) { super(); @@ -35,4 +34,4 @@ export class BundleSerializer extends Serializer { return route === "BUNDLE"; } -} \ No newline at end of file +} diff --git a/project/src/routers/serializers/ImageSerializer.ts b/project/src/routers/serializers/ImageSerializer.ts index be3d7d7a..90a0ccec 100644 --- a/project/src/routers/serializers/ImageSerializer.ts +++ b/project/src/routers/serializers/ImageSerializer.ts @@ -5,16 +5,14 @@ import { Serializer } from "@spt-aki/di/Serializer"; import { ImageRouter } from "@spt-aki/routers/ImageRouter"; @injectable() -export class ImageSerializer extends Serializer +export class ImageSerializer extends Serializer { - constructor( - @inject("ImageRouter") protected imageRouter: ImageRouter - ) + constructor(@inject("ImageRouter") protected imageRouter: ImageRouter) { super(); } - public override serialize(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any): void + public override serialize(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any): void { this.imageRouter.sendImage(sessionID, req, resp, body); } @@ -23,4 +21,4 @@ export class ImageSerializer extends Serializer { return route === "IMAGE"; } -} \ No newline at end of file +} diff --git a/project/src/routers/serializers/NotifySerializer.ts b/project/src/routers/serializers/NotifySerializer.ts index b0960af1..a64624bb 100644 --- a/project/src/routers/serializers/NotifySerializer.ts +++ b/project/src/routers/serializers/NotifySerializer.ts @@ -9,16 +9,15 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; @injectable() export class NotifySerializer extends Serializer { - constructor( @inject("NotifierController") protected notifierController: NotifierController, @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper + @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper, ) { super(); } - + // eslint-disable-next-line @typescript-eslint/no-unused-vars public override serialize(_sessionID: string, req: IncomingMessage, resp: ServerResponse, _: any): void { @@ -29,13 +28,13 @@ export class NotifySerializer extends Serializer * Take our array of JSON message objects and cast them to JSON strings, so that they can then * be sent to client as NEWLINE separated strings... yup. */ - this.notifierController.notifyAsync(tmpSessionID) - .then((messages: any) => messages.map((message: any) => this.jsonUtil.serialize(message)).join("\n")) - .then((text) => this.httpServerHelper.sendTextJson(resp, text)); + this.notifierController.notifyAsync(tmpSessionID).then((messages: any) => + messages.map((message: any) => this.jsonUtil.serialize(message)).join("\n") + ).then((text) => this.httpServerHelper.sendTextJson(resp, text)); } public override canHandle(route: string): boolean { return route.toUpperCase() === "NOTIFY"; } -} \ No newline at end of file +} diff --git a/project/src/routers/static/BotStaticRouter.ts b/project/src/routers/static/BotStaticRouter.ts index dde4ba98..bc61b798 100644 --- a/project/src/routers/static/BotStaticRouter.ts +++ b/project/src/routers/static/BotStaticRouter.ts @@ -4,23 +4,19 @@ import { BotCallbacks } from "@spt-aki/callbacks/BotCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class BotStaticRouter extends StaticRouter +export class BotStaticRouter extends StaticRouter { - constructor( - @inject("BotCallbacks") protected botCallbacks: BotCallbacks - ) + constructor(@inject("BotCallbacks") protected botCallbacks: BotCallbacks) { - super( - [ - new RouteAction( - "/client/game/bot/generate", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.botCallbacks.generateBots(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/game/bot/generate", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.botCallbacks.generateBots(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/BundleStaticRouter.ts b/project/src/routers/static/BundleStaticRouter.ts index b608362c..cfadd014 100644 --- a/project/src/routers/static/BundleStaticRouter.ts +++ b/project/src/routers/static/BundleStaticRouter.ts @@ -4,23 +4,19 @@ import { BundleCallbacks } from "@spt-aki/callbacks/BundleCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class BundleStaticRouter extends StaticRouter +export class BundleStaticRouter extends StaticRouter { - constructor( - @inject("BundleCallbacks") protected bundleCallbacks: BundleCallbacks - ) + constructor(@inject("BundleCallbacks") protected bundleCallbacks: BundleCallbacks) { - super( - [ - new RouteAction( - "/singleplayer/bundles", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.bundleCallbacks.getBundles(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/singleplayer/bundles", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.bundleCallbacks.getBundles(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/ClientLogStaticRouter.ts b/project/src/routers/static/ClientLogStaticRouter.ts index 3df61bd5..842b4d53 100644 --- a/project/src/routers/static/ClientLogStaticRouter.ts +++ b/project/src/routers/static/ClientLogStaticRouter.ts @@ -6,21 +6,17 @@ import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() export class ClientLogStaticRouter extends StaticRouter { - constructor( - @inject("ClientLogCallbacks") protected clientLogCallbacks: ClientLogCallbacks - ) + constructor(@inject("ClientLogCallbacks") protected clientLogCallbacks: ClientLogCallbacks) { - super( - [ - new RouteAction( - "/singleplayer/log", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.clientLogCallbacks.clientLog(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/singleplayer/log", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.clientLogCallbacks.clientLog(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/CustomizationStaticRouter.ts b/project/src/routers/static/CustomizationStaticRouter.ts index 56d6c94f..55bcfe3b 100644 --- a/project/src/routers/static/CustomizationStaticRouter.ts +++ b/project/src/routers/static/CustomizationStaticRouter.ts @@ -4,23 +4,19 @@ import { CustomizationCallbacks } from "@spt-aki/callbacks/CustomizationCallback import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class CustomizationStaticRouter extends StaticRouter +export class CustomizationStaticRouter extends StaticRouter { - constructor( - @inject("CustomizationCallbacks") protected customizationCallbacks: CustomizationCallbacks - ) + constructor(@inject("CustomizationCallbacks") protected customizationCallbacks: CustomizationCallbacks) { - super( - [ - new RouteAction( - "/client/trading/customization/storage", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.customizationCallbacks.getSuits(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/trading/customization/storage", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.customizationCallbacks.getSuits(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/DataStaticRouter.ts b/project/src/routers/static/DataStaticRouter.ts index c4ab65f1..a3caa4de 100644 --- a/project/src/routers/static/DataStaticRouter.ts +++ b/project/src/routers/static/DataStaticRouter.ts @@ -4,111 +4,107 @@ import { DataCallbacks } from "@spt-aki/callbacks/DataCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class DataStaticRouter extends StaticRouter +export class DataStaticRouter extends StaticRouter { - constructor( - @inject("DataCallbacks") protected dataCallbacks: DataCallbacks - ) + constructor(@inject("DataCallbacks") protected dataCallbacks: DataCallbacks) { - super( - [ - new RouteAction( - "/client/settings", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getSettings(url, info, sessionID); - } - ), - new RouteAction( - "/client/globals", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getGlobals(url, info, sessionID); - } - ), - new RouteAction( - "/client/items", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getTemplateItems(url, info, sessionID); - } - ), - new RouteAction( - "/client/handbook/templates", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getTemplateHandbook(url, info, sessionID); - } - ), - new RouteAction( - "/client/customization", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getTemplateSuits(url, info, sessionID); - } - ), - new RouteAction( - "/client/account/customization", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getTemplateCharacter(url, info, sessionID); - } - ), - new RouteAction( - "/client/hideout/production/recipes", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.gethideoutProduction(url, info, sessionID); - } - ), - new RouteAction( - "/client/hideout/settings", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getHideoutSettings(url, info, sessionID); - } - ), - new RouteAction( - "/client/hideout/areas", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getHideoutAreas(url, info, sessionID); - } - ), - new RouteAction( - "/client/hideout/production/scavcase/recipes", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getHideoutScavcase(url, info, sessionID); - } - ), - new RouteAction( - "/client/languages", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getLocalesLanguages(url, info, sessionID); - } - ), - new RouteAction( - "/client/hideout/qte/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dataCallbacks.getQteList(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/settings", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getSettings(url, info, sessionID); + }, + ), + new RouteAction( + "/client/globals", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getGlobals(url, info, sessionID); + }, + ), + new RouteAction( + "/client/items", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getTemplateItems(url, info, sessionID); + }, + ), + new RouteAction( + "/client/handbook/templates", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getTemplateHandbook(url, info, sessionID); + }, + ), + new RouteAction( + "/client/customization", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getTemplateSuits(url, info, sessionID); + }, + ), + new RouteAction( + "/client/account/customization", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getTemplateCharacter(url, info, sessionID); + }, + ), + new RouteAction( + "/client/hideout/production/recipes", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.gethideoutProduction(url, info, sessionID); + }, + ), + new RouteAction( + "/client/hideout/settings", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getHideoutSettings(url, info, sessionID); + }, + ), + new RouteAction( + "/client/hideout/areas", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getHideoutAreas(url, info, sessionID); + }, + ), + new RouteAction( + "/client/hideout/production/scavcase/recipes", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getHideoutScavcase(url, info, sessionID); + }, + ), + new RouteAction( + "/client/languages", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getLocalesLanguages(url, info, sessionID); + }, + ), + new RouteAction( + "/client/hideout/qte/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dataCallbacks.getQteList(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/DialogStaticRouter.ts b/project/src/routers/static/DialogStaticRouter.ts index 0bd64f73..ee7cb746 100644 --- a/project/src/routers/static/DialogStaticRouter.ts +++ b/project/src/routers/static/DialogStaticRouter.ts @@ -4,183 +4,179 @@ import { DialogueCallbacks } from "@spt-aki/callbacks/DialogueCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class DialogStaticRouter extends StaticRouter +export class DialogStaticRouter extends StaticRouter { - constructor( - @inject("DialogueCallbacks") protected dialogueCallbacks: DialogueCallbacks - ) + constructor(@inject("DialogueCallbacks") protected dialogueCallbacks: DialogueCallbacks) { - super( - [ - new RouteAction( - "/client/chatServer/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.getChatServerList(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.getMailDialogList(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/view", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.getMailDialogView(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/info", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.getMailDialogInfo(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/remove", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.removeDialog(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/pin", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.pinDialog(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/unpin", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.unpinDialog(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/read", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.setRead(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/remove", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.removeMail(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/getAllAttachments", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.getAllAttachments(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/msg/send", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.sendMessage(url, info, sessionID); - } - ), - new RouteAction( - "/client/mail/dialog/clear", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.clearMail(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.getFriendList(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/request/list/outbox", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.listOutbox(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/request/list/inbox", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.listInbox(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/request/send", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.sendFriendRequest(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/request/accept", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.acceptFriendRequest(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/request/cancel", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.cancelFriendRequest(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/delete", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.deleteFriend(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/ignore/set", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.ignoreFriend(url, info, sessionID); - } - ), - new RouteAction( - "/client/friend/ignore/remove", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.dialogueCallbacks.unIgnoreFriend(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/chatServer/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.getChatServerList(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.getMailDialogList(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/view", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.getMailDialogView(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/info", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.getMailDialogInfo(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/remove", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.removeDialog(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/pin", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.pinDialog(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/unpin", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.unpinDialog(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/read", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.setRead(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/remove", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.removeMail(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/getAllAttachments", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.getAllAttachments(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/msg/send", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.sendMessage(url, info, sessionID); + }, + ), + new RouteAction( + "/client/mail/dialog/clear", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.clearMail(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.getFriendList(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/request/list/outbox", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.listOutbox(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/request/list/inbox", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.listInbox(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/request/send", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.sendFriendRequest(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/request/accept", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.acceptFriendRequest(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/request/cancel", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.cancelFriendRequest(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/delete", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.deleteFriend(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/ignore/set", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.ignoreFriend(url, info, sessionID); + }, + ), + new RouteAction( + "/client/friend/ignore/remove", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.dialogueCallbacks.unIgnoreFriend(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/GameStaticRouter.ts b/project/src/routers/static/GameStaticRouter.ts index e9d9d788..26ccb883 100644 --- a/project/src/routers/static/GameStaticRouter.ts +++ b/project/src/routers/static/GameStaticRouter.ts @@ -4,95 +4,91 @@ import { GameCallbacks } from "@spt-aki/callbacks/GameCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class GameStaticRouter extends StaticRouter +export class GameStaticRouter extends StaticRouter { - constructor( - @inject("GameCallbacks") protected gameCallbacks: GameCallbacks - ) + constructor(@inject("GameCallbacks") protected gameCallbacks: GameCallbacks) { - super( - [ - new RouteAction( - "/client/game/config", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.getGameConfig(url, info, sessionID); - } - ), - new RouteAction( - "/client/server/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.getServer(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/current", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.getCurrentGroup(url, info, sessionID); - } - ), - new RouteAction( - "/client/game/version/validate", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.versionValidate(url, info, sessionID); - } - ), - new RouteAction( - "/client/game/start", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.gameStart(url, info, sessionID); - } - ), - new RouteAction( - "/client/game/logout", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.gameLogout(url, info, sessionID); - } - ), - new RouteAction( - "/client/checkVersion", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.validateGameVersion(url, info, sessionID); - } - ), - new RouteAction( - "/client/game/keepalive", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.gameKeepalive(url, info, sessionID); - } - ), - new RouteAction( - "/singleplayer/settings/version", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.getVersion(url, info, sessionID); - } - ), - new RouteAction( - "/client/reports/lobby/send", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.gameCallbacks.reportNickname(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/game/config", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.getGameConfig(url, info, sessionID); + }, + ), + new RouteAction( + "/client/server/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.getServer(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/current", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.getCurrentGroup(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/version/validate", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.versionValidate(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/start", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.gameStart(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/logout", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.gameLogout(url, info, sessionID); + }, + ), + new RouteAction( + "/client/checkVersion", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.validateGameVersion(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/keepalive", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.gameKeepalive(url, info, sessionID); + }, + ), + new RouteAction( + "/singleplayer/settings/version", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.getVersion(url, info, sessionID); + }, + ), + new RouteAction( + "/client/reports/lobby/send", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.gameCallbacks.reportNickname(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/HealthStaticRouter.ts b/project/src/routers/static/HealthStaticRouter.ts index 2f4471ed..0f0b2808 100644 --- a/project/src/routers/static/HealthStaticRouter.ts +++ b/project/src/routers/static/HealthStaticRouter.ts @@ -4,31 +4,27 @@ import { HealthCallbacks } from "@spt-aki/callbacks/HealthCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class HealthStaticRouter extends StaticRouter +export class HealthStaticRouter extends StaticRouter { - constructor( - @inject("HealthCallbacks") protected healthCallbacks: HealthCallbacks - ) + constructor(@inject("HealthCallbacks") protected healthCallbacks: HealthCallbacks) { - super( - [ - new RouteAction( - "/player/health/sync", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.healthCallbacks.syncHealth(url, info, sessionID); - } - ), - new RouteAction( - "/client/hideout/workout", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.healthCallbacks.handleWorkoutEffects(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/player/health/sync", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.healthCallbacks.syncHealth(url, info, sessionID); + }, + ), + new RouteAction( + "/client/hideout/workout", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.healthCallbacks.handleWorkoutEffects(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/InraidStaticRouter.ts b/project/src/routers/static/InraidStaticRouter.ts index 4bcf2b67..9c69cf88 100644 --- a/project/src/routers/static/InraidStaticRouter.ts +++ b/project/src/routers/static/InraidStaticRouter.ts @@ -4,55 +4,51 @@ import { InraidCallbacks } from "@spt-aki/callbacks/InraidCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class InraidStaticRouter extends StaticRouter +export class InraidStaticRouter extends StaticRouter { - constructor( - @inject("InraidCallbacks") protected inraidCallbacks: InraidCallbacks - ) + constructor(@inject("InraidCallbacks") protected inraidCallbacks: InraidCallbacks) { - super( - [ - new RouteAction( - "/raid/profile/save", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.inraidCallbacks.saveProgress(url, info, sessionID); - } - ), - new RouteAction( - "/singleplayer/settings/raid/endstate", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.inraidCallbacks.getRaidEndState(); - } - ), - new RouteAction( - "/singleplayer/settings/weapon/durability", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.inraidCallbacks.getWeaponDurability(); - } - ), - new RouteAction( - "/singleplayer/settings/raid/menu", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.inraidCallbacks.getRaidMenuSettings(); - } - ), - new RouteAction( - "/singleplayer/airdrop/config", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.inraidCallbacks.getAirdropConfig(); - } - ) - ] - ); + super([ + new RouteAction( + "/raid/profile/save", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.inraidCallbacks.saveProgress(url, info, sessionID); + }, + ), + new RouteAction( + "/singleplayer/settings/raid/endstate", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.inraidCallbacks.getRaidEndState(); + }, + ), + new RouteAction( + "/singleplayer/settings/weapon/durability", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.inraidCallbacks.getWeaponDurability(); + }, + ), + new RouteAction( + "/singleplayer/settings/raid/menu", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.inraidCallbacks.getRaidMenuSettings(); + }, + ), + new RouteAction( + "/singleplayer/airdrop/config", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.inraidCallbacks.getAirdropConfig(); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/InsuranceStaticRouter.ts b/project/src/routers/static/InsuranceStaticRouter.ts index d9c5bc00..68214fe0 100644 --- a/project/src/routers/static/InsuranceStaticRouter.ts +++ b/project/src/routers/static/InsuranceStaticRouter.ts @@ -4,23 +4,19 @@ import { InsuranceCallbacks } from "@spt-aki/callbacks/InsuranceCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class InsuranceStaticRouter extends StaticRouter +export class InsuranceStaticRouter extends StaticRouter { - constructor( - @inject("InsuranceCallbacks") protected insuranceCallbacks: InsuranceCallbacks - ) + constructor(@inject("InsuranceCallbacks") protected insuranceCallbacks: InsuranceCallbacks) { - super( - [ - new RouteAction( - "/client/insurance/items/list/cost", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.insuranceCallbacks.getInsuranceCost(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/insurance/items/list/cost", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.insuranceCallbacks.getInsuranceCost(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/ItemEventStaticRouter.ts b/project/src/routers/static/ItemEventStaticRouter.ts index 9dc0e46f..e764b696 100644 --- a/project/src/routers/static/ItemEventStaticRouter.ts +++ b/project/src/routers/static/ItemEventStaticRouter.ts @@ -4,23 +4,19 @@ import { ItemEventCallbacks } from "@spt-aki/callbacks/ItemEventCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class ItemEventStaticRouter extends StaticRouter +export class ItemEventStaticRouter extends StaticRouter { - constructor( - @inject("ItemEventCallbacks") protected itemEventCallbacks: ItemEventCallbacks - ) + constructor(@inject("ItemEventCallbacks") protected itemEventCallbacks: ItemEventCallbacks) { - super( - [ - new RouteAction( - "/client/game/profile/items/moving", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.itemEventCallbacks.handleEvents(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/game/profile/items/moving", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.itemEventCallbacks.handleEvents(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/LauncherStaticRouter.ts b/project/src/routers/static/LauncherStaticRouter.ts index b471723e..7d51398f 100644 --- a/project/src/routers/static/LauncherStaticRouter.ts +++ b/project/src/routers/static/LauncherStaticRouter.ts @@ -4,119 +4,115 @@ import { LauncherCallbacks } from "@spt-aki/callbacks/LauncherCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class LauncherStaticRouter extends StaticRouter +export class LauncherStaticRouter extends StaticRouter { - constructor( - @inject("LauncherCallbacks") protected launcherCallbacks: LauncherCallbacks - ) + constructor(@inject("LauncherCallbacks") protected launcherCallbacks: LauncherCallbacks) { - super( - [ - new RouteAction( - "/launcher/ping", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.ping(url, info, sessionID); - } - ), - new RouteAction( - "/launcher/server/connect", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.connect(); - } - ), - new RouteAction( - "/launcher/profile/login", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.login(url, info,sessionID); - } - ), - new RouteAction( - "/launcher/profile/register", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.register(url, info, sessionID); - } - ), - new RouteAction( - "/launcher/profile/get", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.get(url, info, sessionID); - } - ), - new RouteAction( - "/launcher/profile/change/username", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.changeUsername(url, info, sessionID); - } - ), - new RouteAction( - "/launcher/profile/change/password", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.changePassword(url, info, sessionID); - } - ), - new RouteAction( - "/launcher/profile/change/wipe", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.wipe(url, info, sessionID); - } - ), - new RouteAction( - "/launcher/profile/remove", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.removeProfile(url, info, sessionID); - } - ), - new RouteAction( - "/launcher/profile/compatibleTarkovVersion", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.getCompatibleTarkovVersion(); - } - ), - new RouteAction( - "/launcher/server/version", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.getServerVersion(); - } - ), - new RouteAction( - "/launcher/server/loadedServerMods", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.getLoadedServerMods(); - } - ), - new RouteAction( - "/launcher/server/serverModsUsedByProfile", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.launcherCallbacks.getServerModsProfileUsed(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/launcher/ping", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.ping(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/server/connect", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.connect(); + }, + ), + new RouteAction( + "/launcher/profile/login", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.login(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/register", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.register(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/get", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.get(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/change/username", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.changeUsername(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/change/password", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.changePassword(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/change/wipe", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.wipe(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/remove", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.removeProfile(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/compatibleTarkovVersion", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.getCompatibleTarkovVersion(); + }, + ), + new RouteAction( + "/launcher/server/version", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.getServerVersion(); + }, + ), + new RouteAction( + "/launcher/server/loadedServerMods", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.getLoadedServerMods(); + }, + ), + new RouteAction( + "/launcher/server/serverModsUsedByProfile", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.launcherCallbacks.getServerModsProfileUsed(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/LocationStaticRouter.ts b/project/src/routers/static/LocationStaticRouter.ts index 73295bec..9213f1e4 100644 --- a/project/src/routers/static/LocationStaticRouter.ts +++ b/project/src/routers/static/LocationStaticRouter.ts @@ -4,31 +4,27 @@ import { LocationCallbacks } from "@spt-aki/callbacks/LocationCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class LocationStaticRouter extends StaticRouter +export class LocationStaticRouter extends StaticRouter { - constructor( - @inject("LocationCallbacks") protected locationCallbacks: LocationCallbacks - ) + constructor(@inject("LocationCallbacks") protected locationCallbacks: LocationCallbacks) { - super( - [ - new RouteAction( - "/client/locations", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.locationCallbacks.getLocationData(url, info, sessionID); - } - ), - new RouteAction( - "/client/location/getAirdropLoot", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, _output: string): any => - { - return this.locationCallbacks.getAirdropLoot(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/locations", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.locationCallbacks.getLocationData(url, info, sessionID); + }, + ), + new RouteAction( + "/client/location/getAirdropLoot", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, _output: string): any => + { + return this.locationCallbacks.getAirdropLoot(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/MatchStaticRouter.ts b/project/src/routers/static/MatchStaticRouter.ts index 1731fc49..20280f72 100644 --- a/project/src/routers/static/MatchStaticRouter.ts +++ b/project/src/routers/static/MatchStaticRouter.ts @@ -4,200 +4,195 @@ import { MatchCallbacks } from "@spt-aki/callbacks/MatchCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class MatchStaticRouter extends StaticRouter +export class MatchStaticRouter extends StaticRouter { - constructor( - @inject("MatchCallbacks") protected matchCallbacks: MatchCallbacks - ) + constructor(@inject("MatchCallbacks") protected matchCallbacks: MatchCallbacks) { - super( - [ - new RouteAction( - "/raid/profile/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.getProfile(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/available", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.serverAvailable(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/updatePing", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.updatePing(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/join", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.joinMatch(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/exit", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.exitMatch(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/create", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.createGroup(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/delete", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this. matchCallbacks.deleteGroup(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/leave", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this. matchCallbacks.leaveGroup(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/status", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.getGroupStatus(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/start_game", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.joinMatch(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/exit_from_menu", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.exitToMenu(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/looking/start", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.startGroupSearch(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/looking/stop", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.stopGroupSearch(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/invite/send", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.sendGroupInvite(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/invite/accept", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.acceptGroupInvite(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/invite/cancel", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.cancelGroupInvite(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/invite/cancel-all", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.cancelAllGroupInvite(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/transfer", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.transferGroup(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/offline/end", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.endOfflineRaid(url, info, sessionID); - - } - ), - new RouteAction( - "/client/putMetrics", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.putMetrics(url, info, sessionID); - } - ), - new RouteAction( - "/client/getMetricsConfig", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.getMetrics(url, info, sessionID); - } - ), - new RouteAction( - "/client/raid/configuration", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.getRaidConfiguration(url, info, sessionID); - } - ), - new RouteAction( - "/client/match/group/player/remove", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.matchCallbacks.removePlayerFromGroup(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/raid/profile/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.getProfile(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/available", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.serverAvailable(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/updatePing", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.updatePing(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/join", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.joinMatch(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/exit", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.exitMatch(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/create", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.createGroup(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/delete", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.deleteGroup(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/leave", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.leaveGroup(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/status", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.getGroupStatus(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/start_game", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.joinMatch(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/exit_from_menu", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.exitToMenu(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/looking/start", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.startGroupSearch(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/looking/stop", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.stopGroupSearch(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/invite/send", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.sendGroupInvite(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/invite/accept", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.acceptGroupInvite(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/invite/cancel", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.cancelGroupInvite(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/invite/cancel-all", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.cancelAllGroupInvite(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/transfer", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.transferGroup(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/offline/end", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.endOfflineRaid(url, info, sessionID); + }, + ), + new RouteAction( + "/client/putMetrics", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.putMetrics(url, info, sessionID); + }, + ), + new RouteAction( + "/client/getMetricsConfig", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.getMetrics(url, info, sessionID); + }, + ), + new RouteAction( + "/client/raid/configuration", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.getRaidConfiguration(url, info, sessionID); + }, + ), + new RouteAction( + "/client/match/group/player/remove", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.matchCallbacks.removePlayerFromGroup(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/NotifierStaticRouter.ts b/project/src/routers/static/NotifierStaticRouter.ts index c065ffeb..f4e0da2a 100644 --- a/project/src/routers/static/NotifierStaticRouter.ts +++ b/project/src/routers/static/NotifierStaticRouter.ts @@ -4,31 +4,27 @@ import { NotifierCallbacks } from "@spt-aki/callbacks/NotifierCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class NotifierStaticRouter extends StaticRouter +export class NotifierStaticRouter extends StaticRouter { - constructor( - @inject("NotifierCallbacks") protected notifierCallbacks: NotifierCallbacks - ) + constructor(@inject("NotifierCallbacks") protected notifierCallbacks: NotifierCallbacks) { - super( - [ - new RouteAction( - "/client/notifier/channel/create", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.notifierCallbacks.createNotifierChannel(url, info, sessionID); - } - ), - new RouteAction( - "/client/game/profile/select", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.notifierCallbacks.selectProfile(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/notifier/channel/create", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.notifierCallbacks.createNotifierChannel(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/select", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.notifierCallbacks.selectProfile(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/PresetStaticRouter.ts b/project/src/routers/static/PresetStaticRouter.ts index 860695cc..c40c2de2 100644 --- a/project/src/routers/static/PresetStaticRouter.ts +++ b/project/src/routers/static/PresetStaticRouter.ts @@ -4,23 +4,19 @@ import { PresetBuildCallbacks } from "@spt-aki/callbacks/PresetBuildCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class PresetStaticRouter extends StaticRouter +export class PresetStaticRouter extends StaticRouter { - constructor( - @inject("PresetBuildCallbacks") protected presetCallbacks: PresetBuildCallbacks - ) + constructor(@inject("PresetBuildCallbacks") protected presetCallbacks: PresetBuildCallbacks) { - super( - [ - new RouteAction( - "/client/handbook/builds/my/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.presetCallbacks.getHandbookUserlist(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/handbook/builds/my/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.presetCallbacks.getHandbookUserlist(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/ProfileStaticRouter.ts b/project/src/routers/static/ProfileStaticRouter.ts index a2cd71b0..083b3926 100644 --- a/project/src/routers/static/ProfileStaticRouter.ts +++ b/project/src/routers/static/ProfileStaticRouter.ts @@ -4,99 +4,107 @@ import { ProfileCallbacks } from "@spt-aki/callbacks/ProfileCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class ProfileStaticRouter extends StaticRouter +export class ProfileStaticRouter extends StaticRouter { - constructor( - @inject("ProfileCallbacks") protected profileCallbacks: ProfileCallbacks - ) + constructor(@inject("ProfileCallbacks") protected profileCallbacks: ProfileCallbacks) { - super( - [ - new RouteAction( - "/client/game/profile/create", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.createProfile(url, info, sessionID); - }), - new RouteAction( - "/client/game/profile/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.getProfileData(url, info, sessionID); - }), - new RouteAction( - "/client/game/profile/savage/regenerate", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.regenerateScav(url, info, sessionID); - }), - new RouteAction( - "/client/game/profile/voice/change", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.changeVoice(url, info, sessionID); - }), - new RouteAction( - "/client/game/profile/nickname/change", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.changeNickname(url, info, sessionID); - }), - new RouteAction( - "/client/game/profile/nickname/validate", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.validateNickname(url, info, sessionID); - }), - new RouteAction( - "/client/game/profile/nickname/reserved", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.getReservedNickname(url, info, sessionID); - }), - new RouteAction( - "/client/profile/status", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.getProfileStatus(url, info, sessionID); - }), - new RouteAction( - "/client/profile/settings", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.getProfileSettings(url, info, sessionID); - }), - new RouteAction( - "/client/game/profile/search", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.searchFriend(url, info, sessionID); - }), - new RouteAction( - "/launcher/profile/info", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.getMiniProfile(url, info, sessionID); - }), - new RouteAction( - "/launcher/profiles", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.profileCallbacks.getAllMiniProfiles(url, info, sessionID); - }) - ] - ); + super([ + new RouteAction( + "/client/game/profile/create", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.createProfile(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.getProfileData(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/savage/regenerate", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.regenerateScav(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/voice/change", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.changeVoice(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/nickname/change", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.changeNickname(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/nickname/validate", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.validateNickname(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/nickname/reserved", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.getReservedNickname(url, info, sessionID); + }, + ), + new RouteAction( + "/client/profile/status", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.getProfileStatus(url, info, sessionID); + }, + ), + new RouteAction( + "/client/profile/settings", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.getProfileSettings(url, info, sessionID); + }, + ), + new RouteAction( + "/client/game/profile/search", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.searchFriend(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profile/info", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.getMiniProfile(url, info, sessionID); + }, + ), + new RouteAction( + "/launcher/profiles", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.profileCallbacks.getAllMiniProfiles(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/QuestStaticRouter.ts b/project/src/routers/static/QuestStaticRouter.ts index 8d4caa42..2f305c19 100644 --- a/project/src/routers/static/QuestStaticRouter.ts +++ b/project/src/routers/static/QuestStaticRouter.ts @@ -4,29 +4,27 @@ import { QuestCallbacks } from "@spt-aki/callbacks/QuestCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class QuestStaticRouter extends StaticRouter +export class QuestStaticRouter extends StaticRouter { - constructor( - @inject("QuestCallbacks") protected questCallbacks: QuestCallbacks - ) + constructor(@inject("QuestCallbacks") protected questCallbacks: QuestCallbacks) { - super( - [ - new RouteAction( - "/client/quest/list", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.questCallbacks.listQuests(url, info, sessionID); - }), - new RouteAction( - "/client/repeatalbeQuests/activityPeriods", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.questCallbacks.activityPeriods(url, info, sessionID); - }) - ] - ); + super([ + new RouteAction( + "/client/quest/list", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.questCallbacks.listQuests(url, info, sessionID); + }, + ), + new RouteAction( + "/client/repeatalbeQuests/activityPeriods", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.questCallbacks.activityPeriods(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/RagfairStaticRouter.ts b/project/src/routers/static/RagfairStaticRouter.ts index 4da872f0..05af24b8 100644 --- a/project/src/routers/static/RagfairStaticRouter.ts +++ b/project/src/routers/static/RagfairStaticRouter.ts @@ -4,58 +4,59 @@ import { RagfairCallbacks } from "@spt-aki/callbacks/RagfairCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class RagfairStaticRouter extends StaticRouter +export class RagfairStaticRouter extends StaticRouter { - constructor( - @inject("RagfairCallbacks") protected ragfairCallbacks: RagfairCallbacks - ) + constructor(@inject("RagfairCallbacks") protected ragfairCallbacks: RagfairCallbacks) { - super( - [ - new RouteAction( - "/client/ragfair/search", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.ragfairCallbacks.search(url, info, sessionID); - }), - new RouteAction( - "/client/ragfair/find", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.ragfairCallbacks.search(url, info, sessionID); - }), - new RouteAction( - "/client/ragfair/itemMarketPrice", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.ragfairCallbacks.getMarketPrice(url, info, sessionID); - }), - new RouteAction( - "/client/ragfair/offerfees", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.ragfairCallbacks.storePlayerOfferTaxAmount(url, info, sessionID); - }), - new RouteAction( - "/client/reports/ragfair/send", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.ragfairCallbacks.sendReport(url, info, sessionID); - }), - new RouteAction( - "/client/items/prices", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.ragfairCallbacks.getFleaPrices(url, info, sessionID); - }) - ] - ); + super([ + new RouteAction( + "/client/ragfair/search", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.ragfairCallbacks.search(url, info, sessionID); + }, + ), + new RouteAction( + "/client/ragfair/find", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.ragfairCallbacks.search(url, info, sessionID); + }, + ), + new RouteAction( + "/client/ragfair/itemMarketPrice", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.ragfairCallbacks.getMarketPrice(url, info, sessionID); + }, + ), + new RouteAction( + "/client/ragfair/offerfees", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.ragfairCallbacks.storePlayerOfferTaxAmount(url, info, sessionID); + }, + ), + new RouteAction( + "/client/reports/ragfair/send", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.ragfairCallbacks.sendReport(url, info, sessionID); + }, + ), + new RouteAction( + "/client/items/prices", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.ragfairCallbacks.getFleaPrices(url, info, sessionID); + }, + ), + ]); } - -} \ No newline at end of file +} diff --git a/project/src/routers/static/TraderStaticRouter.ts b/project/src/routers/static/TraderStaticRouter.ts index 40c7b3fc..3b2a4917 100644 --- a/project/src/routers/static/TraderStaticRouter.ts +++ b/project/src/routers/static/TraderStaticRouter.ts @@ -4,23 +4,19 @@ import { TraderCallbacks } from "@spt-aki/callbacks/TraderCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class TraderStaticRouter extends StaticRouter +export class TraderStaticRouter extends StaticRouter { - constructor( - @inject("TraderCallbacks") protected traderCallbacks: TraderCallbacks - ) + constructor(@inject("TraderCallbacks") protected traderCallbacks: TraderCallbacks) { - super( - [ - new RouteAction( - "/client/trading/api/traderSettings", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.traderCallbacks.getTraderSettings(url, info, sessionID); - } - ) - ] - ); + super([ + new RouteAction( + "/client/trading/api/traderSettings", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.traderCallbacks.getTraderSettings(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/routers/static/WeatherStaticRouter.ts b/project/src/routers/static/WeatherStaticRouter.ts index 2ec39e40..6720a563 100644 --- a/project/src/routers/static/WeatherStaticRouter.ts +++ b/project/src/routers/static/WeatherStaticRouter.ts @@ -4,22 +4,19 @@ import { WeatherCallbacks } from "@spt-aki/callbacks/WeatherCallbacks"; import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; @injectable() -export class WeatherStaticRouter extends StaticRouter +export class WeatherStaticRouter extends StaticRouter { - constructor( - @inject("WeatherCallbacks") protected weatherCallbacks: WeatherCallbacks - ) + constructor(@inject("WeatherCallbacks") protected weatherCallbacks: WeatherCallbacks) { - super( - [ - new RouteAction( - "/client/weather", - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (url: string, info: any, sessionID: string, output: string): any => - { - return this.weatherCallbacks.getWeather(url, info, sessionID); - }) - ] - ); + super([ + new RouteAction( + "/client/weather", + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (url: string, info: any, sessionID: string, output: string): any => + { + return this.weatherCallbacks.getWeather(url, info, sessionID); + }, + ), + ]); } -} \ No newline at end of file +} diff --git a/project/src/servers/ConfigServer.ts b/project/src/servers/ConfigServer.ts index 2fb9ead1..85c4cb6f 100644 --- a/project/src/servers/ConfigServer.ts +++ b/project/src/servers/ConfigServer.ts @@ -7,7 +7,7 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; import { VFS } from "@spt-aki/utils/VFS"; @injectable() -export class ConfigServer +export class ConfigServer { protected configs: Record = {}; protected readonly acceptableFileExtensions: string[] = ["json", "jsonc"]; @@ -15,7 +15,7 @@ export class ConfigServer constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("VFS") protected vfs: VFS, - @inject("JsonUtil") protected jsonUtil: JsonUtil + @inject("JsonUtil") protected jsonUtil: JsonUtil, ) { this.initialize(); @@ -36,9 +36,7 @@ export class ConfigServer this.logger.debug("Importing configs..."); // Get all filepaths - const filepath = (globalThis.G_RELEASE_CONFIGURATION) - ? "Aki_Data/Server/configs/" - : "./assets/configs/"; + const filepath = (globalThis.G_RELEASE_CONFIGURATION) ? "Aki_Data/Server/configs/" : "./assets/configs/"; const files = this.vfs.getFiles(filepath); // Add file content to result @@ -48,10 +46,13 @@ export class ConfigServer { const fileName = this.vfs.stripExtension(file); const filePathAndName = `${filepath}${file}`; - this.configs[`aki-${fileName}`] = this.jsonUtil.deserializeJsonC(this.vfs.readFile(filePathAndName), filePathAndName); + this.configs[`aki-${fileName}`] = this.jsonUtil.deserializeJsonC( + this.vfs.readFile(filePathAndName), + filePathAndName, + ); } } - + this.logger.info(`Commit hash: ${(this.configs[ConfigTypes.CORE] as ICoreConfig).commit || "DEBUG"}`); this.logger.info(`Build date: ${(this.configs[ConfigTypes.CORE] as ICoreConfig).buildTime || "DEBUG"}`); } diff --git a/project/src/servers/DatabaseServer.ts b/project/src/servers/DatabaseServer.ts index 49c34fa4..e6c48dfa 100644 --- a/project/src/servers/DatabaseServer.ts +++ b/project/src/servers/DatabaseServer.ts @@ -16,7 +16,7 @@ export class DatabaseServer traders: undefined, globals: undefined, server: undefined, - settings: undefined + settings: undefined, }; public getTables(): IDatabaseTables diff --git a/project/src/servers/HttpServer.ts b/project/src/servers/HttpServer.ts index 556322c7..9aabff8c 100644 --- a/project/src/servers/HttpServer.ts +++ b/project/src/servers/HttpServer.ts @@ -26,7 +26,7 @@ export class HttpServer @injectAll("HttpListener") protected httpListeners: IHttpListener[], @inject("ConfigServer") protected configServer: ConfigServer, @inject("ApplicationContext") protected applicationContext: ApplicationContext, - @inject("WebSocketServer") protected webSocketServer: WebSocketServer + @inject("WebSocketServer") protected webSocketServer: WebSocketServer, ) { this.httpConfig = this.configServer.getConfig(ConfigTypes.HTTP); @@ -49,7 +49,9 @@ export class HttpServer /* Config server to listen on a port */ httpServer.listen(this.httpConfig.port, this.httpConfig.ip, () => { - this.logger.success(this.localisationService.getText("started_webserver_success", this.httpServerHelper.getBackendUrl())); + this.logger.success( + this.localisationService.getText("started_webserver_success", this.httpServerHelper.getBackendUrl()), + ); }); httpServer.on("error", (e: any) => @@ -72,15 +74,15 @@ export class HttpServer protected handleRequest(req: IncomingMessage, resp: ServerResponse): void { // Pull sessionId out of cookies and store inside app context - const sessionId = this.getCookies(req)["PHPSESSID"]; + const sessionId = this.getCookies(req).PHPSESSID; this.applicationContext.addValue(ContextVariableType.SESSION_ID, sessionId); // http.json logRequests boolean option to allow the user/server to choose to not log requests - if (this.httpConfig.logRequests) + if (this.httpConfig.logRequests) { this.logger.info(this.localisationService.getText("client_request", req.url)); } - + for (const listener of this.httpListeners) { if (listener.canHandle(sessionId, req)) @@ -108,4 +110,4 @@ export class HttpServer return found; } -} \ No newline at end of file +} diff --git a/project/src/servers/RagfairServer.ts b/project/src/servers/RagfairServer.ts index 22fb4b84..87ad6de3 100644 --- a/project/src/servers/RagfairServer.ts +++ b/project/src/servers/RagfairServer.ts @@ -28,7 +28,7 @@ export class RagfairServer @inject("LocalisationService") protected localisationService: LocalisationService, @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("TraderAssortHelper") protected traderAssortHelper: TraderAssortHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -79,7 +79,7 @@ export class RagfairServer */ protected getUpdateableTraders(): string[] { - return Object.keys(this.ragfairConfig.traders).filter(x => this.ragfairConfig.traders[x]); + return Object.keys(this.ragfairConfig.traders).filter((x) => this.ragfairConfig.traders[x]); } public getAllCategories(): Record @@ -99,7 +99,7 @@ export class RagfairServer public hideOffer(offerId: string): void { const offers = this.ragfairOfferService.getOffers(); - const offer = offers.find(x => x._id === offerId); + const offer = offers.find((x) => x._id === offerId); if (!offer) { @@ -135,4 +135,4 @@ export class RagfairServer { this.ragfairOfferService.addPlayerOffers(); } -} \ No newline at end of file +} diff --git a/project/src/servers/SaveServer.ts b/project/src/servers/SaveServer.ts index 998eb85f..95152dee 100644 --- a/project/src/servers/SaveServer.ts +++ b/project/src/servers/SaveServer.ts @@ -1,4 +1,4 @@ -import { inject, injectable, injectAll } from "tsyringe"; +import { inject, injectAll, injectable } from "tsyringe"; import { SaveLoadRouter } from "@spt-aki/di/Router"; import { IAkiProfile, Info } from "@spt-aki/models/eft/profile/IAkiProfile"; @@ -23,9 +23,9 @@ export class SaveServer @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("HashUtil") protected hashUtil: HashUtil, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("WinstonLogger") protected logger: ILogger + @inject("WinstonLogger") protected logger: ILogger, ) - { } + {} /** * Add callback to occur prior to saving profile changes @@ -142,10 +142,7 @@ export class SaveServer throw new Error(`profile already exists for sessionId: ${profileInfo.id}`); } - this.profiles[profileInfo.id] = { - info: profileInfo, - characters: { pmc: {}, scav: {}} - }; + this.profiles[profileInfo.id] = { info: profileInfo, characters: { pmc: {}, scav: {} } }; } /** @@ -180,14 +177,14 @@ export class SaveServer } /** - * Save changes from in-memory profile to user/profiles json + * Save changes from in-memory profile to user/profiles json * Execute onBeforeSaveCallbacks callbacks prior to being saved to json * @param sessionID profile id (user/profiles/id.json) */ public saveProfile(sessionID: string): void { const filePath = `${this.profileFilepath}${sessionID}.json`; - + // run callbacks for (const callback in this.onBeforeSaveCallbacks) { @@ -205,7 +202,7 @@ export class SaveServer const jsonProfile = this.jsonUtil.serialize(this.profiles[sessionID], true); const fmd5 = this.hashUtil.generateMd5ForData(jsonProfile); - if (typeof(this.saveMd5[sessionID]) !== "string" || this.saveMd5[sessionID] !== fmd5) + if (typeof (this.saveMd5[sessionID]) !== "string" || this.saveMd5[sessionID] !== fmd5) { this.saveMd5[sessionID] = String(fmd5); // save profile to disk diff --git a/project/src/servers/WebSocketServer.ts b/project/src/servers/WebSocketServer.ts index 002b10c8..19fa82eb 100644 --- a/project/src/servers/WebSocketServer.ts +++ b/project/src/servers/WebSocketServer.ts @@ -13,40 +13,38 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; import { RandomUtil } from "@spt-aki/utils/RandomUtil"; @injectable() -export class WebSocketServer +export class WebSocketServer { - constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("ConfigServer") protected configServer: ConfigServer, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper - ) + @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper, + ) { this.httpConfig = this.configServer.getConfig(ConfigTypes.HTTP); } protected httpConfig: IHttpConfig; - protected defaultNotification: INotification = { - type: NotificationType.PING, - eventId: "ping" - }; + protected defaultNotification: INotification = { type: NotificationType.PING, eventId: "ping" }; protected webSockets: Record = {}; protected websocketPingHandler = null; - public setupWebSocket(httpServer: http.Server): void + public setupWebSocket(httpServer: http.Server): void { - const webSocketServer = new WebSocket.Server({ - "server": httpServer - }); + const webSocketServer = new WebSocket.Server({ server: httpServer }); - webSocketServer.addListener("listening", () => + webSocketServer.addListener("listening", () => { - this.logger.success(this.localisationService.getText("websocket-started", this.httpServerHelper.getWebsocketUrl())); - this.logger.success(`${this.localisationService.getText("server_running")}, ${this.getRandomisedMessage()}!`); + this.logger.success( + this.localisationService.getText("websocket-started", this.httpServerHelper.getWebsocketUrl()), + ); + this.logger.success( + `${this.localisationService.getText("server_running")}, ${this.getRandomisedMessage()}!`, + ); }); webSocketServer.addListener("connection", this.wsOnConnection.bind(this)); @@ -72,9 +70,9 @@ export class WebSocketServer } } - protected getRandomisedMessage(): string + protected getRandomisedMessage(): string { - if (this.randomUtil.getInt(1, 1000) > 999) + if (this.randomUtil.getInt(1, 1000) > 999) { return this.localisationService.getRandomTextThatMatchesPartialKey("server_start_meme_"); } @@ -84,12 +82,12 @@ export class WebSocketServer : this.localisationService.getText("server_start_success"); } - public isConnectionWebSocket(sessionID: string): boolean + public isConnectionWebSocket(sessionID: string): boolean { return this.webSockets[sessionID] !== undefined && this.webSockets[sessionID].readyState === WebSocket.OPEN; } - protected wsOnConnection(ws: WebSocket.WebSocket, req: IncomingMessage): void + protected wsOnConnection(ws: WebSocket.WebSocket, req: IncomingMessage): void { // Strip request and break it into sections const splitUrl = req.url.substring(0, req.url.indexOf("?")).split("/"); @@ -99,27 +97,27 @@ export class WebSocketServer const logger = this.logger; const msgToLog = this.localisationService.getText("websocket-received_message", sessionID); - ws.on("message", function message(msg) + ws.on("message", function message(msg) { logger.info(`${msgToLog} ${msg}`); }); this.webSockets[sessionID] = ws; - if (this.websocketPingHandler) + if (this.websocketPingHandler) { clearInterval(this.websocketPingHandler); } - this.websocketPingHandler = setInterval(() => + this.websocketPingHandler = setInterval(() => { this.logger.debug(this.localisationService.getText("websocket-pinging_player", sessionID)); - if (ws.readyState === WebSocket.OPEN) + if (ws.readyState === WebSocket.OPEN) { ws.send(this.jsonUtil.serialize(this.defaultNotification)); } - else + else { this.logger.debug(this.localisationService.getText("websocket-socket_lost_deleting_handle")); clearInterval(this.websocketPingHandler); @@ -127,4 +125,4 @@ export class WebSocketServer } }, this.httpConfig.webSocketPingDelayMs); } -} \ No newline at end of file +} diff --git a/project/src/servers/http/AkiHttpListener.ts b/project/src/servers/http/AkiHttpListener.ts index 08e29f1b..cc48eb62 100644 --- a/project/src/servers/http/AkiHttpListener.ts +++ b/project/src/servers/http/AkiHttpListener.ts @@ -13,7 +13,6 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; @injectable() export class AkiHttpListener implements IHttpListener { - constructor( @inject("HttpRouter") protected httpRouter: HttpRouter, // TODO: delay required @injectAll("Serializer") protected serializers: Serializer[], @@ -21,7 +20,7 @@ export class AkiHttpListener implements IHttpListener @inject("RequestsLogger") protected requestsLogger: ILogger, @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, - @inject("LocalisationService") protected localisationService: LocalisationService + @inject("LocalisationService") protected localisationService: LocalisationService, ) { } @@ -53,7 +52,7 @@ export class AkiHttpListener implements IHttpListener const buffer = Buffer.alloc(requestLength); let written = 0; - req.on("data", (data: any) => + req.on("data", (data: any) => { data.copy(buffer, written, 0); written += data.length; @@ -65,10 +64,10 @@ export class AkiHttpListener implements IHttpListener // determine if the payload is compressed. All PUT requests are, and POST requests without // debug = 1 are as well. This should be fixed. // let compressed = req.headers["content-encoding"] === "deflate"; - const compressed = req.method === "PUT" || req.headers["debug"] !== "1"; + const compressed = req.method === "PUT" || req.headers.debug !== "1"; const value = compressed ? zlib.inflateSync(buffer) : buffer; - if (req.headers["debug"] === "1") + if (req.headers.debug === "1") { this.logger.debug(value.toString(), true); } @@ -96,13 +95,19 @@ export class AkiHttpListener implements IHttpListener * @param body Buffer * @param output Server generated response data */ - public sendResponse(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: Buffer, output: string): void + public sendResponse( + sessionID: string, + req: IncomingMessage, + resp: ServerResponse, + body: Buffer, + output: string, + ): void { const info = this.getBodyInfo(body); let handled = false; // Check if this is a debug request, if so just send the raw response without transformation - if (req.headers["debug"] === "1") + if (req.headers.debug === "1") { this.sendJson(resp, output, sessionID); } @@ -136,9 +141,7 @@ export class AkiHttpListener implements IHttpListener if (globalThis.G_LOG_REQUESTS) { // Parse quest info into object - const data = (typeof info === "object") - ? info - : this.jsonUtil.deserialize(info); + const data = (typeof info === "object") ? info : this.jsonUtil.deserialize(info); const log = new Request(req.method, new RequestData(req.url, req.headers, data)); this.requestsLogger.info(`REQUEST=${this.jsonUtil.serialize(log)}`); @@ -150,15 +153,15 @@ export class AkiHttpListener implements IHttpListener { this.logger.error(this.localisationService.getText("unhandled_response", req.url)); this.logger.info(info); - output = this.httpResponse.getBody(null, 404, `UNHANDLED RESPONSE: ${req.url}`); + output = this.httpResponse.getBody(null, 404, `UNHANDLED RESPONSE: ${req.url}`); } return output; } - protected getBodyInfo(body: Buffer, requestUrl = null): any + protected getBodyInfo(body: Buffer, requestUrl = null): any { - const text = (body) ? body.toString() : "{}"; - const info = (text) ? this.jsonUtil.deserialize(text, requestUrl) : {}; + const text = body ? body.toString() : "{}"; + const info = text ? this.jsonUtil.deserialize(text, requestUrl) : {}; return info; } @@ -175,33 +178,22 @@ export class AkiHttpListener implements IHttpListener resp.writeHead(200, "OK", { "Content-Type": "application/json", "Set-Cookie": `PHPSESSID=${sessionID}` }); zlib.deflate(output, (_, buf) => resp.end(buf)); } - } class RequestData { - constructor( - public url: string, - public headers: IncomingHttpHeaders, - public data?: any - ) + constructor(public url: string, public headers: IncomingHttpHeaders, public data?: any) {} } class Request { - constructor( - public type: string, - public req: RequestData - ) + constructor(public type: string, public req: RequestData) {} } class Response { - constructor( - public type: string, - public response: any - ) + constructor(public type: string, public response: any) {} -} \ No newline at end of file +} diff --git a/project/src/servers/http/HttpMethods.ts b/project/src/servers/http/HttpMethods.ts index a5be4da3..031ca7c1 100644 --- a/project/src/servers/http/HttpMethods.ts +++ b/project/src/servers/http/HttpMethods.ts @@ -1,9 +1,9 @@ -export enum HttpMethods - { +export enum HttpMethods +{ OPTIONS = "OPTIONS", GET = "GET", POST = "POST", PUT = "PUT", PATCH = "PATCH", - DELETE = "DELETE" -} \ No newline at end of file + DELETE = "DELETE", +} diff --git a/project/src/servers/http/IHttpListener.ts b/project/src/servers/http/IHttpListener.ts index 22b8bbd8..9d746768 100644 --- a/project/src/servers/http/IHttpListener.ts +++ b/project/src/servers/http/IHttpListener.ts @@ -2,6 +2,6 @@ import { IncomingMessage, ServerResponse } from "node:http"; export interface IHttpListener { - canHandle(sessionId: string, req: IncomingMessage): boolean - handle(sessionId: string, req: IncomingMessage, resp: ServerResponse): void -} \ No newline at end of file + canHandle(sessionId: string, req: IncomingMessage): boolean; + handle(sessionId: string, req: IncomingMessage, resp: ServerResponse): void; +} diff --git a/project/src/services/BotEquipmentFilterService.ts b/project/src/services/BotEquipmentFilterService.ts index 597a1dd2..5c67c0d8 100644 --- a/project/src/services/BotEquipmentFilterService.ts +++ b/project/src/services/BotEquipmentFilterService.ts @@ -3,16 +3,20 @@ import { inject, injectable } from "tsyringe"; import { BotHelper } from "@spt-aki/helpers/BotHelper"; import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper"; import { - EquipmentChances, Generation, + EquipmentChances, + Generation, GenerationData, IBotType, - ModsChances + ModsChances, } from "@spt-aki/models/eft/common/tables/IBotType"; import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; import { BotGenerationDetails } from "@spt-aki/models/spt/bots/BotGenerationDetails"; import { - AdjustmentDetails, EquipmentFilterDetails, EquipmentFilters, IBotConfig, - WeightingAdjustmentDetails + AdjustmentDetails, + EquipmentFilterDetails, + EquipmentFilters, + IBotConfig, + WeightingAdjustmentDetails, } from "@spt-aki/models/spt/config/IBotConfig"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { ConfigServer } from "@spt-aki/servers/ConfigServer"; @@ -27,7 +31,7 @@ export class BotEquipmentFilterService @inject("WinstonLogger") protected logger: ILogger, @inject("BotHelper") protected botHelper: BotHelper, @inject("ProfileHelper") protected profileHelper: ProfileHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -41,27 +45,33 @@ export class BotEquipmentFilterService * @param botLevel Level of the bot * @param botGenerationDetails details on how to generate a bot */ - public filterBotEquipment(sessionId: string, baseBotNode: IBotType, botLevel: number, botGenerationDetails: BotGenerationDetails): void + public filterBotEquipment( + sessionId: string, + baseBotNode: IBotType, + botLevel: number, + botGenerationDetails: BotGenerationDetails, + ): void { const pmcProfile = this.profileHelper.getPmcProfile(sessionId); - const botRole = (botGenerationDetails.isPmc) - ? "pmc" - : botGenerationDetails.role; + const botRole = (botGenerationDetails.isPmc) ? "pmc" : botGenerationDetails.role; const botEquipmentBlacklist = this.getBotEquipmentBlacklist(botRole, botLevel); const botEquipmentWhitelist = this.getBotEquipmentWhitelist(botRole, botLevel); const botWeightingAdjustments = this.getBotWeightingAdjustments(botRole, botLevel); - const botWeightingAdjustmentsByPlayerLevel = this.getBotWeightingAdjustmentsByPlayerLevel(botRole, pmcProfile.Info.Level); + const botWeightingAdjustmentsByPlayerLevel = this.getBotWeightingAdjustmentsByPlayerLevel( + botRole, + pmcProfile.Info.Level, + ); const botEquipConfig = this.botConfig.equipment[botRole]; const randomisationDetails = this.botHelper.getBotRandomizationDetails(botLevel, botEquipConfig); - + if (botEquipmentBlacklist || botEquipmentWhitelist) { this.filterEquipment(baseBotNode, botEquipmentBlacklist, botEquipmentWhitelist); this.filterCartridges(baseBotNode, botEquipmentBlacklist, botEquipmentWhitelist); } - + if (botWeightingAdjustments) { this.adjustWeighting(botWeightingAdjustments?.equipment, baseBotNode.inventory.equipment); @@ -107,7 +117,10 @@ export class BotEquipmentFilterService * @param generationChanges Changes to apply * @param baseBotGeneration dictionary to update */ - protected adjustGenerationChances(generationChanges: Record, baseBotGeneration: Generation): void + protected adjustGenerationChances( + generationChanges: Record, + baseBotGeneration: Generation, + ): void { if (!generationChanges) { @@ -159,12 +172,17 @@ export class BotEquipmentFilterService const blacklistDetailsForBot = this.botEquipmentConfig[botRole]; // No equipment blacklist found, skip - if (!blacklistDetailsForBot || Object.keys(blacklistDetailsForBot).length === 0 || !blacklistDetailsForBot.blacklist) + if ( + !blacklistDetailsForBot || Object.keys(blacklistDetailsForBot).length === 0 + || !blacklistDetailsForBot.blacklist + ) { return null; } - return blacklistDetailsForBot.blacklist.find(x => playerLevel >= x.levelRange.min && playerLevel <= x.levelRange.max); + return blacklistDetailsForBot.blacklist.find((x) => + playerLevel >= x.levelRange.min && playerLevel <= x.levelRange.max + ); } /** @@ -183,7 +201,9 @@ export class BotEquipmentFilterService return null; } - return botEquipmentConfig.whitelist.find(x => playerLevel >= x.levelRange.min && playerLevel <= x.levelRange.max); + return botEquipmentConfig.whitelist.find((x) => + playerLevel >= x.levelRange.min && playerLevel <= x.levelRange.max + ); } /** @@ -197,12 +217,17 @@ export class BotEquipmentFilterService const botEquipmentConfig = this.botEquipmentConfig[botRole]; // No config found, skip - if (!botEquipmentConfig || Object.keys(botEquipmentConfig).length === 0 || !botEquipmentConfig.weightingAdjustmentsByBotLevel) + if ( + !botEquipmentConfig || Object.keys(botEquipmentConfig).length === 0 + || !botEquipmentConfig.weightingAdjustmentsByBotLevel + ) { return null; } - return botEquipmentConfig.weightingAdjustmentsByBotLevel.find(x => botLevel >= x.levelRange.min && botLevel <= x.levelRange.max); + return botEquipmentConfig.weightingAdjustmentsByBotLevel.find((x) => + botLevel >= x.levelRange.min && botLevel <= x.levelRange.max + ); } /** @@ -216,12 +241,17 @@ export class BotEquipmentFilterService const botEquipmentConfig = this.botEquipmentConfig[botRole]; // No config found, skip - if (!botEquipmentConfig || Object.keys(botEquipmentConfig).length === 0 || !botEquipmentConfig.weightingAdjustmentsByPlayerLevel) + if ( + !botEquipmentConfig || Object.keys(botEquipmentConfig).length === 0 + || !botEquipmentConfig.weightingAdjustmentsByPlayerLevel + ) { return null; } - return botEquipmentConfig.weightingAdjustmentsByPlayerLevel.find(x => playerlevel >= x.levelRange.min && playerlevel <= x.levelRange.max); + return botEquipmentConfig.weightingAdjustmentsByPlayerLevel.find((x) => + playerlevel >= x.levelRange.min && playerlevel <= x.levelRange.max + ); } /** @@ -231,7 +261,11 @@ export class BotEquipmentFilterService * @param blacklist equipment blacklist * @returns Filtered bot file */ - protected filterEquipment(baseBotNode: IBotType, blacklist: EquipmentFilterDetails, whitelist: EquipmentFilterDetails): void + protected filterEquipment( + baseBotNode: IBotType, + blacklist: EquipmentFilterDetails, + whitelist: EquipmentFilterDetails, + ): void { if (whitelist) { @@ -247,7 +281,9 @@ export class BotEquipmentFilterService } // Filter equipment slot items to just items in whitelist - baseBotNode.inventory.equipment[equipmentSlotKey] = Object.keys(botEquipment).filter((tpl) => whitelistEquipmentForSlot.includes(tpl)).reduce( (res, key) => (res[key] = botEquipment[key], res), {} ); + baseBotNode.inventory.equipment[equipmentSlotKey] = Object.keys(botEquipment).filter((tpl) => + whitelistEquipmentForSlot.includes(tpl) + ).reduce((res, key) => (res[key] = botEquipment[key], res), {}); } return; @@ -267,7 +303,9 @@ export class BotEquipmentFilterService } // Filter equipment slot items to just items not in blacklist - baseBotNode.inventory.equipment[equipmentSlotKey] = Object.keys(botEquipment).filter((tpl) => !equipmentSlotBlacklist.includes(tpl)).reduce( (res, key) => (res[key] = botEquipment[key], res), {} ); + baseBotNode.inventory.equipment[equipmentSlotKey] = Object.keys(botEquipment).filter((tpl) => + !equipmentSlotBlacklist.includes(tpl) + ).reduce((res, key) => (res[key] = botEquipment[key], res), {}); } } } @@ -280,7 +318,11 @@ export class BotEquipmentFilterService * @param whitelist equipment on this list should be used exclusively * @returns Filtered bot file */ - protected filterCartridges(baseBotNode: IBotType, blacklist: EquipmentFilterDetails, whitelist: EquipmentFilterDetails): void + protected filterCartridges( + baseBotNode: IBotType, + blacklist: EquipmentFilterDetails, + whitelist: EquipmentFilterDetails, + ): void { if (whitelist) { @@ -296,7 +338,9 @@ export class BotEquipmentFilterService } // Filter caliber slot items to just items in whitelist - baseBotNode.inventory.Ammo[ammoCaliberKey] = Object.keys(botAmmo).filter((tpl) => whitelist.cartridge[ammoCaliberKey].includes(tpl)).reduce( (res, key) => (res[key] = botAmmo[key], res), {} ); + baseBotNode.inventory.Ammo[ammoCaliberKey] = Object.keys(botAmmo).filter((tpl) => + whitelist.cartridge[ammoCaliberKey].includes(tpl) + ).reduce((res, key) => (res[key] = botAmmo[key], res), {}); } return; @@ -316,7 +360,9 @@ export class BotEquipmentFilterService } // Filter cartridge slot items to just items not in blacklist - baseBotNode.inventory.Ammo[ammoCaliberKey] = Object.keys(botAmmo).filter((tpl) => !cartridgeCaliberBlacklist.includes(tpl)).reduce( (res, key) => (res[key] = botAmmo[key], res), {} ); + baseBotNode.inventory.Ammo[ammoCaliberKey] = Object.keys(botAmmo).filter((tpl) => + !cartridgeCaliberBlacklist.includes(tpl) + ).reduce((res, key) => (res[key] = botAmmo[key], res), {}); } } } @@ -326,7 +372,11 @@ export class BotEquipmentFilterService * @param weightingAdjustments Weighting change to apply to bot * @param botItemPool Bot item dictionary to adjust */ - protected adjustWeighting(weightingAdjustments: AdjustmentDetails, botItemPool: Record, showEditWarnings = true): void + protected adjustWeighting( + weightingAdjustments: AdjustmentDetails, + botItemPool: Record, + showEditWarnings = true, + ): void { if (!weightingAdjustments) { @@ -361,12 +411,13 @@ export class BotEquipmentFilterService { if (showEditWarnings) { - this.logger.warning(`Tried to edit a non-existent item for slot: ${poolAdjustmentKey} ${itemToEditKey}`); + this.logger.warning( + `Tried to edit a non-existent item for slot: ${poolAdjustmentKey} ${itemToEditKey}`, + ); } } } } } } - -} \ No newline at end of file +} diff --git a/project/src/services/BotEquipmentModPoolService.ts b/project/src/services/BotEquipmentModPoolService.ts index df906d1e..a6b944a6 100644 --- a/project/src/services/BotEquipmentModPoolService.ts +++ b/project/src/services/BotEquipmentModPoolService.ts @@ -28,7 +28,7 @@ export class BotEquipmentModPoolService @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -48,12 +48,17 @@ export class BotEquipmentModPoolService } // Get weapon or gear pool - const pool = (poolType === "weapon" ? this.weaponModPool : this.gearModPool); + const pool = poolType === "weapon" ? this.weaponModPool : this.gearModPool; for (const item of items) { if (!item._props) { - this.logger.error(this.localisationService.getText("bot-item_missing_props_property", {itemTpl: item._id, name: item._name})); + this.logger.error( + this.localisationService.getText("bot-item_missing_props_property", { + itemTpl: item._id, + name: item._name, + }), + ); continue; } @@ -85,9 +90,9 @@ export class BotEquipmentModPoolService { pool[item._id][slot._name] = []; } - + // only add item to pool if it doesnt already exist - if (!pool[item._id][slot._name].some(x => x === itemToAdd)) + if (!pool[item._id][slot._name].some((x) => x === itemToAdd)) { pool[item._id][slot._name].push(itemToAdd); @@ -99,7 +104,7 @@ export class BotEquipmentModPoolService // Recursive call this.generatePool([subItemDetails], poolType); } - } + } } } } @@ -181,7 +186,9 @@ export class BotEquipmentModPoolService */ protected generateWeaponPool(): void { - const weapons = Object.values(this.databaseServer.getTables().templates.items).filter(x => x._type === "Item" && this.itemHelper.isOfBaseclass(x._id, BaseClasses.WEAPON)); + const weapons = Object.values(this.databaseServer.getTables().templates.items).filter((x) => + x._type === "Item" && this.itemHelper.isOfBaseclass(x._id, BaseClasses.WEAPON) + ); this.generatePool(weapons, "weapon"); // Flag pool as being complete @@ -193,10 +200,12 @@ export class BotEquipmentModPoolService */ protected generateGearPool(): void { - const gear = Object.values(this.databaseServer.getTables().templates.items).filter(x => x._type === "Item" && this.itemHelper.isOfBaseclass(x._id, BaseClasses.ARMOREDEQUIPMENT)); + const gear = Object.values(this.databaseServer.getTables().templates.items).filter((x) => + x._type === "Item" && this.itemHelper.isOfBaseclass(x._id, BaseClasses.ARMOREDEQUIPMENT) + ); this.generatePool(gear, "gear"); // Flag pool as being complete this.armorPoolGenerated = true; } -} \ No newline at end of file +} diff --git a/project/src/services/BotGenerationCacheService.ts b/project/src/services/BotGenerationCacheService.ts index 2742a9bc..d108db22 100644 --- a/project/src/services/BotGenerationCacheService.ts +++ b/project/src/services/BotGenerationCacheService.ts @@ -11,23 +11,23 @@ import { RandomUtil } from "@spt-aki/utils/RandomUtil"; export class BotGenerationCacheService { protected storedBots: Map = new Map(); - + constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("BotHelper") protected botHelper: BotHelper + @inject("BotHelper") protected botHelper: BotHelper, ) - { } - + {} + /** * Store array of bots in cache, shuffle results before storage * @param botsToStore Bots we want to store in the cache */ public storeBots(key: string, botsToStore: IBotBase[]): void - { - botsToStore.forEach(e => + { + botsToStore.forEach((e) => { if (this.storedBots.has(key)) { @@ -63,7 +63,7 @@ export class BotGenerationCacheService return undefined; } - + /** * Remove all cached bot profiles from memory */ @@ -71,7 +71,7 @@ export class BotGenerationCacheService { this.storedBots = new Map(); } - + /** * Does cache have a bot with requested key * @returns false if empty @@ -80,4 +80,4 @@ export class BotGenerationCacheService { return this.storedBots.has(key) && this.storedBots.get(key).length > 0; } -} \ No newline at end of file +} diff --git a/project/src/services/BotLootCacheService.ts b/project/src/services/BotLootCacheService.ts index 002b1a04..f24ba9ff 100644 --- a/project/src/services/BotLootCacheService.ts +++ b/project/src/services/BotLootCacheService.ts @@ -24,7 +24,7 @@ export class BotLootCacheService @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("PMCLootGenerator") protected pmcLootGenerator: PMCLootGenerator, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("RagfairPriceService") protected ragfairPriceService: RagfairPriceService + @inject("RagfairPriceService") protected ragfairPriceService: RagfairPriceService, ) { this.clearCache(); @@ -46,7 +46,12 @@ export class BotLootCacheService * @param botJsonTemplate Base json db file for the bot having its loot generated * @returns ITemplateItem array */ - public getLootFromCache(botRole: string, isPmc: boolean, lootType: LootCacheType, botJsonTemplate: IBotType): ITemplateItem[] + public getLootFromCache( + botRole: string, + isPmc: boolean, + lootType: LootCacheType, + botJsonTemplate: IBotType, + ): ITemplateItem[] { if (!this.botRoleExistsInCache(botRole)) { @@ -75,7 +80,13 @@ export class BotLootCacheService case LootCacheType.STIM_ITEMS: return this.lootCache[botRole].stimItems; default: - this.logger.error(this.localisationService.getText("bot-loot_type_not_found", {lootType: lootType, botRole: botRole, isPmc: isPmc})); + this.logger.error( + this.localisationService.getText("bot-loot_type_not_found", { + lootType: lootType, + botRole: botRole, + isPmc: isPmc, + }), + ); break; } } @@ -138,7 +149,7 @@ export class BotLootCacheService itemsToAdd = pool.map((lootTpl: string) => items[lootTpl]); this.addUniqueItemsToPool(backpackLootTemplates, itemsToAdd); } - + // Add items to combined pool if any exist if (Object.keys(itemsToAdd).length > 0) { @@ -155,60 +166,61 @@ export class BotLootCacheService // use whitelist if array has values, otherwise process above sorted pools const specialLootItems = (botJsonTemplate.generation.items.specialItems.whitelist?.length > 0) - ? botJsonTemplate.generation.items.specialItems.whitelist.map(x => this.itemHelper.getItem(x)[1]) - : specialLootTemplates.filter(template => - !(this.isBulletOrGrenade(template._props) - || this.isMagazine(template._props))); + ? botJsonTemplate.generation.items.specialItems.whitelist.map((x) => this.itemHelper.getItem(x)[1]) + : specialLootTemplates.filter((template) => + !(this.isBulletOrGrenade(template._props) || this.isMagazine(template._props)) + ); const healingItems = (botJsonTemplate.generation.items.healing.whitelist?.length > 0) - ? botJsonTemplate.generation.items.healing.whitelist.map(x => this.itemHelper.getItem(x)[1]) - : combinedPoolTemplates.filter(template => + ? botJsonTemplate.generation.items.healing.whitelist.map((x) => this.itemHelper.getItem(x)[1]) + : combinedPoolTemplates.filter((template) => this.isMedicalItem(template._props) && template._parent !== BaseClasses.STIMULATOR - && template._parent !== BaseClasses.DRUGS); + && template._parent !== BaseClasses.DRUGS + ); const drugItems = (botJsonTemplate.generation.items.drugs.whitelist?.length > 0) - ? botJsonTemplate.generation.items.drugs.whitelist.map(x => this.itemHelper.getItem(x)[1]) - : combinedPoolTemplates.filter(template => - this.isMedicalItem(template._props) - && template._parent === BaseClasses.DRUGS); + ? botJsonTemplate.generation.items.drugs.whitelist.map((x) => this.itemHelper.getItem(x)[1]) + : combinedPoolTemplates.filter((template) => + this.isMedicalItem(template._props) && template._parent === BaseClasses.DRUGS + ); const stimItems = (botJsonTemplate.generation.items.stims.whitelist?.length > 0) - ? botJsonTemplate.generation.items.stims.whitelist.map(x => this.itemHelper.getItem(x)[1]) - : combinedPoolTemplates.filter(template => - this.isMedicalItem(template._props) - && template._parent === BaseClasses.STIMULATOR); + ? botJsonTemplate.generation.items.stims.whitelist.map((x) => this.itemHelper.getItem(x)[1]) + : combinedPoolTemplates.filter((template) => + this.isMedicalItem(template._props) && template._parent === BaseClasses.STIMULATOR + ); const grenadeItems = (botJsonTemplate.generation.items.grenades.whitelist?.length > 0) - ? botJsonTemplate.generation.items.grenades.whitelist.map(x => this.itemHelper.getItem(x)[1]) - : combinedPoolTemplates.filter(template => - this.isGrenade(template._props)); + ? botJsonTemplate.generation.items.grenades.whitelist.map((x) => this.itemHelper.getItem(x)[1]) + : combinedPoolTemplates.filter((template) => this.isGrenade(template._props)); // Get loot items (excluding magazines, bullets, grenades and healing items) - const backpackLootItems = backpackLootTemplates.filter(template => - // rome-ignore lint/complexity/useSimplifiedLogicExpression: - !this.isBulletOrGrenade(template._props) - && !this.isMagazine(template._props) - //&& !this.isMedicalItem(template._props) // Disabled for now as followSanitar has a lot of med items as loot - && !this.isGrenade(template._props)); + const backpackLootItems = backpackLootTemplates.filter((template) => + // biome-ignore lint/complexity/useSimplifiedLogicExpression: + !this.isBulletOrGrenade(template._props) && !this.isMagazine(template._props) // && !this.isMedicalItem(template._props) // Disabled for now as followSanitar has a lot of med items as loot + && !this.isGrenade(template._props) + ); // Get pocket loot - const pocketLootItems = pocketLootTemplates.filter(template => - // rome-ignore lint/complexity/useSimplifiedLogicExpression: + const pocketLootItems = pocketLootTemplates.filter((template) => + // biome-ignore lint/complexity/useSimplifiedLogicExpression: !this.isBulletOrGrenade(template._props) && !this.isMagazine(template._props) && !this.isMedicalItem(template._props) && !this.isGrenade(template._props) && ("Height" in template._props) - && ("Width" in template._props)); + && ("Width" in template._props) + ); // Get vest loot items - const vestLootItems = vestLootTemplates.filter(template => - // rome-ignore lint/complexity/useSimplifiedLogicExpression: + const vestLootItems = vestLootTemplates.filter((template) => + // biome-ignore lint/complexity/useSimplifiedLogicExpression: !this.isBulletOrGrenade(template._props) && !this.isMagazine(template._props) && !this.isMedicalItem(template._props) - && !this.isGrenade(template._props)); + && !this.isGrenade(template._props) + ); this.lootCache[botRole].healingItems = healingItems; this.lootCache[botRole].drugItems = drugItems; @@ -227,7 +239,12 @@ export class BotLootCacheService */ protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void { - poolToSort.sort((a, b) => this.compareByValue(this.ragfairPriceService.getFleaPriceForItem(a._id), this.ragfairPriceService.getFleaPriceForItem(b._id))); + poolToSort.sort((a, b) => + this.compareByValue( + this.ragfairPriceService.getFleaPriceForItem(a._id), + this.ragfairPriceService.getFleaPriceForItem(b._id), + ) + ); } /** @@ -246,15 +263,15 @@ export class BotLootCacheService const mergedItemPools = [...combinedItemPool, ...itemsToAdd]; // Save only unique array values - const uniqueResults = [... new Set([].concat(...mergedItemPools))]; + const uniqueResults = [...new Set([].concat(...mergedItemPools))]; combinedItemPool.splice(0, combinedItemPool.length); combinedItemPool.push(...uniqueResults); } /** * Ammo/grenades have this property - * @param props - * @returns + * @param props + * @returns */ protected isBulletOrGrenade(props: Props): boolean { @@ -263,8 +280,8 @@ export class BotLootCacheService /** * Internal and external magazine have this property - * @param props - * @returns + * @param props + * @returns */ protected isMagazine(props: Props): boolean { @@ -273,8 +290,8 @@ export class BotLootCacheService /** * Medical use items (e.g. morphine/lip balm/grizzly) - * @param props - * @returns + * @param props + * @returns */ protected isMedicalItem(props: Props): boolean { @@ -283,8 +300,8 @@ export class BotLootCacheService /** * Grenades have this property (e.g. smoke/frag/flash grenades) - * @param props - * @returns + * @param props + * @returns */ protected isGrenade(props: Props): boolean { @@ -317,7 +334,7 @@ export class BotLootCacheService grenadeItems: [], drugItems: [], healingItems: [], - stimItems: [] + stimItems: [], }; } @@ -326,9 +343,9 @@ export class BotLootCacheService * -1 when a < b * 0 when a === b * 1 when a > b - * @param itemAPrice - * @param itemBPrice - * @returns + * @param itemAPrice + * @param itemBPrice + * @returns */ protected compareByValue(itemAPrice: number, itemBPrice: number): number { @@ -355,5 +372,4 @@ export class BotLootCacheService return 0; } - -} \ No newline at end of file +} diff --git a/project/src/services/BotWeaponModLimitService.ts b/project/src/services/BotWeaponModLimitService.ts index 89bee596..3429d1a5 100644 --- a/project/src/services/BotWeaponModLimitService.ts +++ b/project/src/services/BotWeaponModLimitService.ts @@ -32,7 +32,7 @@ export class BotWeaponModLimitService constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("ConfigServer") protected configServer: ConfigServer, - @inject("ItemHelper") protected itemHelper: ItemHelper + @inject("ItemHelper") protected itemHelper: ItemHelper, ) { this.botConfig = this.configServer.getConfig(ConfigTypes.BOT); @@ -46,12 +46,22 @@ export class BotWeaponModLimitService public getWeaponModLimits(botRole: string): BotModLimits { return { - scope: {count: 0}, + scope: { count: 0 }, scopeMax: this.botConfig.equipment[botRole]?.weaponModLimits?.scopeLimit, - scopeBaseTypes: [BaseClasses.OPTIC_SCOPE, BaseClasses.ASSAULT_SCOPE, BaseClasses.COLLIMATOR, BaseClasses.COMPACT_COLLIMATOR, BaseClasses.SPECIAL_SCOPE], - flashlightLaser: {count: 0}, + scopeBaseTypes: [ + BaseClasses.OPTIC_SCOPE, + BaseClasses.ASSAULT_SCOPE, + BaseClasses.COLLIMATOR, + BaseClasses.COMPACT_COLLIMATOR, + BaseClasses.SPECIAL_SCOPE, + ], + flashlightLaser: { count: 0 }, flashlightLaserMax: this.botConfig.equipment[botRole]?.weaponModLimits?.lightLaserLimit, - flashlgihtLaserBaseTypes: [BaseClasses.TACTICAL_COMBO, BaseClasses.FLASHLIGHT, BaseClasses.PORTABLE_RANGE_FINDER] + flashlgihtLaserBaseTypes: [ + BaseClasses.TACTICAL_COMBO, + BaseClasses.FLASHLIGHT, + BaseClasses.PORTABLE_RANGE_FINDER, + ], }; } @@ -67,14 +77,28 @@ export class BotWeaponModLimitService * @param modsParent The parent of the mod to be checked * @returns true if over item limit */ - public weaponModHasReachedLimit(botRole: string, modTemplate: ITemplateItem, modLimits: BotModLimits, modsParent: ITemplateItem, weapon: Item[]): boolean + public weaponModHasReachedLimit( + botRole: string, + modTemplate: ITemplateItem, + modLimits: BotModLimits, + modsParent: ITemplateItem, + weapon: Item[], + ): boolean { // If mod or mods parent is the NcSTAR MPR45 Backup mount, allow it as it looks cool const ncSTARTpl = "5649a2464bdc2d91118b45a8"; if (modsParent._id === ncSTARTpl || modTemplate._id === ncSTARTpl) { // If weapon already has a longer ranged scope on it, allow ncstar to be spawned - if (weapon.some(x => this.itemHelper.isOfBaseclasses(x._tpl, [BaseClasses.ASSAULT_SCOPE, BaseClasses.OPTIC_SCOPE, BaseClasses.SPECIAL_SCOPE]))) + if ( + weapon.some((x) => + this.itemHelper.isOfBaseclasses(x._tpl, [ + BaseClasses.ASSAULT_SCOPE, + BaseClasses.OPTIC_SCOPE, + BaseClasses.SPECIAL_SCOPE, + ]) + ) + ) { return false; } @@ -96,10 +120,12 @@ export class BotWeaponModLimitService } // Mod is a mount that can hold only scopes and limit is reached (dont want to add empty mounts if limit is reached) - if (this.itemHelper.isOfBaseclass(modTemplate._id, BaseClasses.MOUNT) - && modTemplate._props.Slots.some(x => x._name === "mod_scope") + if ( + this.itemHelper.isOfBaseclass(modTemplate._id, BaseClasses.MOUNT) + && modTemplate._props.Slots.some((x) => x._name === "mod_scope") && modTemplate._props.Slots.length === 1 - && modLimits.scope.count >= modLimits.scopeMax) + && modLimits.scope.count >= modLimits.scopeMax + ) { return true; } @@ -108,14 +134,21 @@ export class BotWeaponModLimitService const modIsLightOrLaser = this.itemHelper.isOfBaseclasses(modTemplate._id, modLimits.flashlgihtLaserBaseTypes); if (modIsLightOrLaser) { - return this.weaponModLimitReached(modTemplate._id, modLimits.flashlightLaser, modLimits.flashlightLaserMax, botRole); + return this.weaponModLimitReached( + modTemplate._id, + modLimits.flashlightLaser, + modLimits.flashlightLaserMax, + botRole, + ); } // Mod is a mount that can hold only flashlights ad limit is reached (dont want to add empty mounts if limit is reached) - if (this.itemHelper.isOfBaseclass(modTemplate._id, BaseClasses.MOUNT) - && modTemplate._props.Slots.some(x => x._name === "mod_flashlight") + if ( + this.itemHelper.isOfBaseclass(modTemplate._id, BaseClasses.MOUNT) + && modTemplate._props.Slots.some((x) => x._name === "mod_flashlight") && modTemplate._props.Slots.length === 1 - && modLimits.scope.count >= modLimits.scopeMax) + && modLimits.scope.count >= modLimits.scopeMax + ) { return true; } @@ -132,7 +165,12 @@ export class BotWeaponModLimitService * @returns true if limit reached */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - protected weaponModLimitReached(modTpl: string, currentCount: { count: number; }, maxLimit: number, botRole: string): boolean + protected weaponModLimitReached( + modTpl: string, + currentCount: { count: number; }, + maxLimit: number, + botRole: string, + ): boolean { // No value or 0 if (!maxLimit) @@ -143,7 +181,7 @@ export class BotWeaponModLimitService // Has mod limit for bot type been reached if (currentCount.count >= maxLimit) { - //this.logger.debug(`[${botRole}] scope limit reached! tried to add ${modTpl} but scope count is ${currentCount.count}`); + // this.logger.debug(`[${botRole}] scope limit reached! tried to add ${modTpl} but scope count is ${currentCount.count}`); return true; } @@ -152,4 +190,4 @@ export class BotWeaponModLimitService return false; } -} \ No newline at end of file +} diff --git a/project/src/services/CustomLocationWaveService.ts b/project/src/services/CustomLocationWaveService.ts index 732827be..28d77df8 100644 --- a/project/src/services/CustomLocationWaveService.ts +++ b/project/src/services/CustomLocationWaveService.ts @@ -19,7 +19,7 @@ export class CustomLocationWaveService @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.locationConfig = this.configServer.getConfig(ConfigTypes.LOCATION); @@ -76,13 +76,15 @@ export class CustomLocationWaveService const location: ILocationBase = this.databaseServer.getTables().locations[mapKey].base; for (const bossWave of bossWavesToApply[mapKey]) { - if (location.BossLocationSpawn.find(x => x.sptId === bossWave.sptId)) + if (location.BossLocationSpawn.find((x) => x.sptId === bossWave.sptId)) { // Already exists, skip continue; } location.BossLocationSpawn.push(bossWave); - this.logger.debug(`Added custom boss wave to ${mapKey} of type ${bossWave.BossName}, time: ${bossWave.Time}, chance: ${bossWave.BossChance}, zone: ${bossWave.BossZone}`); + this.logger.debug( + `Added custom boss wave to ${mapKey} of type ${bossWave.BossName}, time: ${bossWave.Time}, chance: ${bossWave.BossChance}, zone: ${bossWave.BossZone}`, + ); } } @@ -91,7 +93,7 @@ export class CustomLocationWaveService const location: ILocationBase = this.databaseServer.getTables().locations[mapKey].base; for (const normalWave of normalWavesToApply[mapKey]) { - if (location.waves.find(x => x.sptId === normalWave.sptId)) + if (location.waves.find((x) => x.sptId === normalWave.sptId)) { // Already exists, skip continue; @@ -102,4 +104,4 @@ export class CustomLocationWaveService } } } -} \ No newline at end of file +} diff --git a/project/src/services/FenceService.ts b/project/src/services/FenceService.ts index 33ee7f7c..eacc3908 100644 --- a/project/src/services/FenceService.ts +++ b/project/src/services/FenceService.ts @@ -49,7 +49,7 @@ export class FenceService @inject("PresetHelper") protected presetHelper: PresetHelper, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.traderConfig = this.configServer.getConfig(ConfigTypes.TRADER); @@ -88,13 +88,21 @@ export class FenceService // Clone assorts so we can adjust prices before sending to client const assort = this.jsonUtil.clone(this.fenceAssort); - this.adjustAssortItemPrices(assort, this.getFenceInfo(pmcProfile).PriceModifier, this.traderConfig.fence.presetPriceMult); + this.adjustAssortItemPrices( + assort, + this.getFenceInfo(pmcProfile).PriceModifier, + this.traderConfig.fence.presetPriceMult, + ); // merge normal fence assorts + discount assorts if player standing is large enough if (pmcProfile.TradersInfo[Traders.FENCE].standing >= 6) { const discountAssort = this.jsonUtil.clone(this.fenceDiscountAssort); - this.adjustAssortItemPrices(discountAssort, this.traderConfig.fence.discountOptions.itemPriceMult, this.traderConfig.fence.discountOptions.presetPriceMult); + this.adjustAssortItemPrices( + discountAssort, + this.traderConfig.fence.discountOptions.itemPriceMult, + this.traderConfig.fence.discountOptions.presetPriceMult, + ); const mergedAssorts = this.mergeAssorts(assort, discountAssort); return mergedAssorts; @@ -129,7 +137,7 @@ export class FenceService * @param secondAssort assort #2 * @returns merged assort */ - protected mergeAssorts(firstAssort: ITraderAssort,secondAssort: ITraderAssort): ITraderAssort + protected mergeAssorts(firstAssort: ITraderAssort, secondAssort: ITraderAssort): ITraderAssort { for (const itemId in secondAssort.barter_scheme) { @@ -156,14 +164,19 @@ export class FenceService * @param modifier value to multiply item price by * @param presetModifier value to multiply preset price by */ - protected adjustItemPriceByModifier(item: Item, assort: ITraderAssort, modifier: number, presetModifier: number): void + protected adjustItemPriceByModifier( + item: Item, + assort: ITraderAssort, + modifier: number, + presetModifier: number, + ): void { // Is preset if (item.upd.sptPresetId) { if (assort.barter_scheme[item._id]) { - assort.barter_scheme[item._id][0][0].count *= (modifier + presetModifier); + assort.barter_scheme[item._id][0][0].count *= modifier + presetModifier; } } else if (assort.barter_scheme[item._id]) @@ -200,7 +213,9 @@ export class FenceService public performPartialRefresh(): void { let itemCountToReplace = this.getCountOfItemsToReplace(this.traderConfig.fence.assortSize); - const discountItemCountToReplace = this.getCountOfItemsToReplace(this.traderConfig.fence.discountOptions.assortSize); + const discountItemCountToReplace = this.getCountOfItemsToReplace( + this.traderConfig.fence.discountOptions.assortSize, + ); // Iterate x times to remove items (only remove if assort has items) if (this.fenceAssort?.items?.length > 0) @@ -220,7 +235,6 @@ export class FenceService } } - itemCountToReplace = this.getCountOfItemsToGenerate(itemCountToReplace); const newItems = this.createBaseTraderAssortItem(); @@ -253,7 +267,8 @@ export class FenceService // Add loyalty items to fence discount assorts loyalty object for (const loyaltyItemKey in newDiscountItems.loyal_level_items) { - this.fenceDiscountAssort.loyal_level_items[loyaltyItemKey] = newDiscountItems.loyal_level_items[loyaltyItemKey]; + this.fenceDiscountAssort.loyal_level_items[loyaltyItemKey] = + newDiscountItems.loyal_level_items[loyaltyItemKey]; } this.incrementPartialRefreshTime(); @@ -264,7 +279,8 @@ export class FenceService */ protected incrementPartialRefreshTime(): void { - this.nextMiniRefreshTimestamp = this.timeUtil.getTimestamp() + this.traderConfig.fence.partialRefreshTimeSeconds; + this.nextMiniRefreshTimestamp = this.timeUtil.getTimestamp() + + this.traderConfig.fence.partialRefreshTimeSeconds; } /** @@ -278,9 +294,7 @@ export class FenceService const desiredTotalCount = this.traderConfig.fence.assortSize; const actualTotalCount = this.fenceAssort.items.reduce((count, item) => { - return item.slotId === "hideout" - ? count + 1 - : count; + return item.slotId === "hideout" ? count + 1 : count; }, 0); return actualTotalCount < desiredTotalCount @@ -295,9 +309,11 @@ export class FenceService protected removeRandomItemFromAssorts(assort: ITraderAssort): void { // Only remove if assort has items - if (!assort.items.some(x => x.slotId === "hideout")) + if (!assort.items.some((x) => x.slotId === "hideout")) { - this.logger.warning("Unable to remove random assort from trader as they have no assorts with a slotid of `hideout`"); + this.logger.warning( + "Unable to remove random assort from trader as they have no assorts with a slotid of `hideout`", + ); return; } @@ -308,12 +324,12 @@ export class FenceService itemToRemove = this.randomUtil.getArrayValue(assort.items); } - const indexOfItemToRemove = assort.items.findIndex(x => x._id === itemToRemove._id); + const indexOfItemToRemove = assort.items.findIndex((x) => x._id === itemToRemove._id); assort.items.splice(indexOfItemToRemove, 1); // Clean up any mods if item removed was a weapon // TODO: also check for mods attached down the item chain - assort.items = assort.items.filter(x => x.parentId !== itemToRemove._id); + assort.items = assort.items.filter((x) => x.parentId !== itemToRemove._id); delete assort.barter_scheme[itemToRemove._id]; delete assort.loyal_level_items[itemToRemove._id]; @@ -376,7 +392,7 @@ export class FenceService barter_scheme: {}, // eslint-disable-next-line @typescript-eslint/naming-convention loyal_level_items: {}, - nextResupply: this.getNextFenceUpdateTimestamp() + nextResupply: this.getNextFenceUpdateTimestamp(), }; } @@ -400,7 +416,14 @@ export class FenceService this.addPresets(randomisedPresetCount, defaultWeaponPresets, assorts, loyaltyLevel); } - protected addItemAssorts(assortCount: number, fenceAssortIds: string[], assorts: ITraderAssort, fenceAssort: ITraderAssort, itemTypeCounts: Record, loyaltyLevel: number): void + protected addItemAssorts( + assortCount: number, + fenceAssortIds: string[], + assorts: ITraderAssort, + fenceAssort: ITraderAssort, + itemTypeCounts: Record, + loyaltyLevel: number, + ): void { const priceLimits = this.traderConfig.fence.itemCategoryRoublePriceLimit; for (let i = 0; i < assortCount; i++) @@ -420,7 +443,7 @@ export class FenceService // It's a normal non-preset item if (!itemIsPreset) { - const desiredAssort = fenceAssort.items[fenceAssort.items.findIndex(i => i._id === itemTpl)]; + const desiredAssort = fenceAssort.items[fenceAssort.items.findIndex((i) => i._id === itemTpl)]; if (!desiredAssort) { this.logger.error(this.localisationService.getText("fence-unable_to_find_assort_by_id", itemTpl)); @@ -485,7 +508,7 @@ export class FenceService ? 1 : this.randomUtil.getInt(itemDbDetails._props.StackMinRandom, itemDbDetails._props.StackMaxRandom); } - + return 1; } @@ -496,7 +519,12 @@ export class FenceService * @param assorts object to add presets to * @param loyaltyLevel loyalty level to requre item at */ - protected addPresets(desiredPresetCount: number, defaultWeaponPresets: Record, assorts: ITraderAssort, loyaltyLevel: number): void + protected addPresets( + desiredPresetCount: number, + defaultWeaponPresets: Record, + assorts: ITraderAssort, + loyaltyLevel: number, + ): void { let presetCount = 0; const presetKeys = Object.keys(defaultWeaponPresets); @@ -512,19 +540,22 @@ export class FenceService } // Skip presets we've already added - if (assorts.items.some(i => i.upd && i.upd.sptPresetId === preset._id)) + if (assorts.items.some((i) => i.upd && i.upd.sptPresetId === preset._id)) { continue; } - + // Construct weapon + mods - const weaponAndMods: Item[] = this.itemHelper.replaceIDs(null, this.jsonUtil.clone(defaultWeaponPresets[preset._id]._items)); + const weaponAndMods: Item[] = this.itemHelper.replaceIDs( + null, + this.jsonUtil.clone(defaultWeaponPresets[preset._id]._items), + ); this.removeRandomPartsOfWeapon(weaponAndMods); for (let i = 0; i < weaponAndMods.length; i++) { const mod = weaponAndMods[i]; - //build root Item info + // build root Item info if (!("parentId" in mod)) { mod._id = weaponAndMods[0]._id; @@ -534,7 +565,7 @@ export class FenceService UnlimitedCount: false, StackObjectsCount: 1, BuyRestrictionCurrent: 0, - sptPresetId: preset._id // Store preset id here so we can check it later to prevent preset dupes + sptPresetId: preset._id, // Store preset id here so we can check it later to prevent preset dupes }; } } @@ -554,10 +585,7 @@ export class FenceService // Multiply weapon+mods rouble price by multipler in config assorts.barter_scheme[weaponAndMods[0]._id] = [[]]; - assorts.barter_scheme[weaponAndMods[0]._id][0][0] = { - _tpl: Money.ROUBLES, - count: Math.round(rub) - }; + assorts.barter_scheme[weaponAndMods[0]._id][0][0] = { _tpl: Money.ROUBLES, count: Math.round(rub) }; assorts.loyal_level_items[weaponAndMods[0]._id] = loyaltyLevel; @@ -624,9 +652,8 @@ export class FenceService // Roll from 0 to 9999, then divide it by 100: 9999 = 99.99% const randomChance = this.randomUtil.getInt(0, 9999) / 100; - - return randomChance > removalChance - && !itemsBeingDeleted.includes(weaponMod._id); + + return randomChance > removalChance && !itemsBeingDeleted.includes(weaponMod._id); } /** @@ -638,7 +665,9 @@ export class FenceService { if (!itemDetails._props) { - this.logger.error(`Item ${itemDetails._name} lacks a _props field, unable to randomise item: ${itemToAdjust._id}`); + this.logger.error( + `Item ${itemDetails._name} lacks a _props field, unable to randomise item: ${itemToAdjust._id}`, + ); return; } @@ -646,30 +675,26 @@ export class FenceService // Randomise hp resource of med items if ("MaxHpResource" in itemDetails._props && itemDetails._props.MaxHpResource > 0) { - itemToAdjust.upd.MedKit = { - HpResource: this.randomUtil.getInt(1, itemDetails._props.MaxHpResource) - }; + itemToAdjust.upd.MedKit = { HpResource: this.randomUtil.getInt(1, itemDetails._props.MaxHpResource) }; } // Randomise armor durability - if ((itemDetails._parent === BaseClasses.ARMOR - || itemDetails._parent === BaseClasses.HEADWEAR - || itemDetails._parent === BaseClasses.VEST - || itemDetails._parent === BaseClasses.ARMOREDEQUIPMENT - || itemDetails._parent === BaseClasses.FACECOVER) - && itemDetails._props.MaxDurability > 0) + if ( + (itemDetails._parent === BaseClasses.ARMOR + || itemDetails._parent === BaseClasses.HEADWEAR + || itemDetails._parent === BaseClasses.VEST + || itemDetails._parent === BaseClasses.ARMOREDEQUIPMENT + || itemDetails._parent === BaseClasses.FACECOVER) && itemDetails._props.MaxDurability > 0 + ) { const armorMaxDurabilityLimits = this.traderConfig.fence.armorMaxDurabilityPercentMinMax; - const duraMin = (armorMaxDurabilityLimits.min / 100 * itemDetails._props.MaxDurability); - const duraMax = (armorMaxDurabilityLimits.max / 100 * itemDetails._props.MaxDurability); + const duraMin = armorMaxDurabilityLimits.min / 100 * itemDetails._props.MaxDurability; + const duraMax = armorMaxDurabilityLimits.max / 100 * itemDetails._props.MaxDurability; const maxDurability = this.randomUtil.getInt(duraMin, duraMax); const durability = this.randomUtil.getInt(1, maxDurability); - itemToAdjust.upd.Repairable = { - Durability: durability, - MaxDurability: maxDurability - }; + itemToAdjust.upd.Repairable = { Durability: durability, MaxDurability: maxDurability }; return; } @@ -678,34 +703,32 @@ export class FenceService if (this.itemHelper.isOfBaseclass(itemDetails._id, BaseClasses.WEAPON)) { const presetMaxDurabilityLimits = this.traderConfig.fence.presetMaxDurabilityPercentMinMax; - const duraMin = (presetMaxDurabilityLimits.min / 100 * itemDetails._props.MaxDurability); - const duraMax = (presetMaxDurabilityLimits.max / 100 * itemDetails._props.MaxDurability); + const duraMin = presetMaxDurabilityLimits.min / 100 * itemDetails._props.MaxDurability; + const duraMax = presetMaxDurabilityLimits.max / 100 * itemDetails._props.MaxDurability; const maxDurability = this.randomUtil.getInt(duraMin, duraMax); const durability = this.randomUtil.getInt(1, maxDurability); - itemToAdjust.upd.Repairable = { - Durability: durability, - MaxDurability: maxDurability - }; + itemToAdjust.upd.Repairable = { Durability: durability, MaxDurability: maxDurability }; return; } if (this.itemHelper.isOfBaseclass(itemDetails._id, BaseClasses.REPAIR_KITS)) { - itemToAdjust.upd.RepairKit = { - Resource: this.randomUtil.getInt(1, itemDetails._props.MaxRepairResource) - }; + itemToAdjust.upd.RepairKit = { Resource: this.randomUtil.getInt(1, itemDetails._props.MaxRepairResource) }; return; } // Mechanical key + has limited uses - if (this.itemHelper.isOfBaseclass(itemDetails._id, BaseClasses.KEY_MECHANICAL) && itemDetails._props.MaximumNumberOfUsage > 1) + if ( + this.itemHelper.isOfBaseclass(itemDetails._id, BaseClasses.KEY_MECHANICAL) + && itemDetails._props.MaximumNumberOfUsage > 1 + ) { itemToAdjust.upd.Key = { - NumberOfUsages: this.randomUtil.getInt(0, itemDetails._props.MaximumNumberOfUsage - 1) + NumberOfUsages: this.randomUtil.getInt(0, itemDetails._props.MaximumNumberOfUsage - 1), }; return; @@ -717,10 +740,7 @@ export class FenceService const resourceMax = itemDetails._props.MaxResource; const resourceCurrent = this.randomUtil.getInt(1, itemDetails._props.MaxResource); - itemToAdjust.upd.Resource = { - Value : resourceMax - resourceCurrent, - UnitsConsumed: resourceCurrent - }; + itemToAdjust.upd.Resource = { Value: resourceMax - resourceCurrent, UnitsConsumed: resourceCurrent }; } } @@ -729,16 +749,13 @@ export class FenceService * @param limits limits as defined in config * @returns record, key: item tplId, value: current/max item count allowed */ - protected initItemLimitCounter(limits: Record): Record + protected initItemLimitCounter(limits: Record): Record { - const itemTypeCounts: Record = {}; + const itemTypeCounts: Record = {}; for (const x in limits) { - itemTypeCounts[x] = { - current: 0, - max: limits[x] - }; + itemTypeCounts[x] = { current: 0, max: limits[x] }; } return itemTypeCounts; @@ -760,7 +777,7 @@ export class FenceService */ protected getFenceRefreshTime(): number { - return this.traderConfig.updateTime.find(x => x.traderId === Traders.FENCE).seconds; + return this.traderConfig.updateTime.find((x) => x.traderId === Traders.FENCE).seconds; } /** @@ -802,12 +819,12 @@ export class FenceService */ public removeFenceOffer(assortIdToRemove: string): void { - let relatedAssortIndex = this.fenceAssort.items.findIndex(i => i._id === assortIdToRemove); + let relatedAssortIndex = this.fenceAssort.items.findIndex((i) => i._id === assortIdToRemove); // No offer found in main assort, check discount items if (relatedAssortIndex === -1) { - relatedAssortIndex = this.fenceDiscountAssort.items.findIndex(i => i._id === assortIdToRemove); + relatedAssortIndex = this.fenceDiscountAssort.items.findIndex((i) => i._id === assortIdToRemove); this.fenceDiscountAssort.items.splice(relatedAssortIndex, 1); return; @@ -816,4 +833,4 @@ export class FenceService // Remove offer from assort this.fenceAssort.items.splice(relatedAssortIndex, 1); } -} \ No newline at end of file +} diff --git a/project/src/services/GiftService.ts b/project/src/services/GiftService.ts index 2d7e6a6f..4193f2a5 100644 --- a/project/src/services/GiftService.ts +++ b/project/src/services/GiftService.ts @@ -25,7 +25,7 @@ export class GiftService @inject("HashUtil") protected hashUtil: HashUtil, @inject("TimeUtil") protected timeUtil: TimeUtil, @inject("ProfileHelper") protected profileHelper: ProfileHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.giftConfig = this.configServer.getConfig(ConfigTypes.GIFTS); @@ -77,7 +77,8 @@ export class GiftService playerId, giftData.localeTextId, giftData.items, - this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours)); + this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours), + ); } else { @@ -85,10 +86,9 @@ export class GiftService playerId, giftData.messageText, giftData.items, - this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours)); + this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours), + ); } - - } // Handle user messages else if (giftData.sender === GiftSenderType.USER) @@ -98,7 +98,8 @@ export class GiftService giftData.senderDetails, giftData.messageText, giftData.items, - this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours)); + this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours), + ); } else if (giftData.sender === GiftSenderType.TRADER) { @@ -110,7 +111,8 @@ export class GiftService MessageType.MESSAGE_WITH_ITEMS, giftData.localeTextId, giftData.items, - this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours)); + this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours), + ); } else { @@ -120,8 +122,9 @@ export class GiftService MessageType.MESSAGE_WITH_ITEMS, giftData.messageText, giftData.items, - this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours)); - } + this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours), + ); + } } else { @@ -130,10 +133,10 @@ export class GiftService const details: ISendMessageDetails = { recipientId: playerId, sender: this.getMessageType(giftData), - senderDetails: { _id: this.getSenderId(giftData), info: null}, + senderDetails: { _id: this.getSenderId(giftData), info: null }, messageText: giftData.messageText, items: giftData.items, - itemsMaxStorageLifetimeSeconds: this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours) + itemsMaxStorageLifetimeSeconds: this.timeUtil.getHoursAsSeconds(giftData.collectionTimeHours), }; if (giftData.trader) @@ -142,7 +145,7 @@ export class GiftService } this.mailSendService.sendMessageToPlayer(details); - } + } this.profileHelper.addGiftReceivedFlagToProfile(playerId, giftId); @@ -195,7 +198,7 @@ export class GiftService */ public sendPraporStartingGift(sessionId: string, day: number): void { - switch (day) + switch (day) { case 1: if (this.profileHelper.playerHasRecievedGift(sessionId, "PraporGiftDay1")) @@ -210,6 +213,5 @@ export class GiftService } break; } - } -} \ No newline at end of file +} diff --git a/project/src/services/HashCacheService.ts b/project/src/services/HashCacheService.ts index 101088da..a2c629d0 100644 --- a/project/src/services/HashCacheService.ts +++ b/project/src/services/HashCacheService.ts @@ -16,17 +16,17 @@ export class HashCacheService @inject("VFS") protected vfs: VFS, @inject("HashUtil") protected hashUtil: HashUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("WinstonLogger") protected logger: ILogger + @inject("WinstonLogger") protected logger: ILogger, ) - { + { if (!this.vfs.exists(this.modCachePath)) { this.vfs.writeFile(this.modCachePath, "{}"); } // get mod hash file - if (!this.modHashes) // empty - { + if (!this.modHashes) + { // empty this.modHashes = this.jsonUtil.deserialize(this.vfs.readFile(`${this.modCachePath}`)); } } @@ -44,7 +44,7 @@ export class HashCacheService /** * Does the generated hash match the stored hash * @param modName name of mod - * @param modContent + * @param modContent * @returns True if they match */ public modContentMatchesStoredHash(modName: string, modContent: string): boolean @@ -77,4 +77,4 @@ export class HashCacheService this.logger.debug(`Mod ${modName} hash stored in ${this.modCachePath}`); } -} \ No newline at end of file +} diff --git a/project/src/services/InsuranceService.ts b/project/src/services/InsuranceService.ts index a52e3de7..c7ac6a21 100644 --- a/project/src/services/InsuranceService.ts +++ b/project/src/services/InsuranceService.ts @@ -46,7 +46,7 @@ export class InsuranceService @inject("LocalisationService") protected localisationService: LocalisationService, @inject("LocaleService") protected localeService: LocaleService, @inject("MailSendService") protected mailSendService: MailSendService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.insuranceConfig = this.configServer.getConfig(ConfigTypes.INSURANCE); @@ -103,13 +103,17 @@ export class InsuranceService const dialogueTemplates = this.databaseServer.getTables().traders[traderId].dialogue; // Construct "i will go look for your stuff" message - const messageContent = this.dialogueHelper.createMessageContext(this.randomUtil.getArrayValue(dialogueTemplates.insuranceStart), MessageType.NPC_TRADER, traderBase.insurance.max_storage_time); + const messageContent = this.dialogueHelper.createMessageContext( + this.randomUtil.getArrayValue(dialogueTemplates.insuranceStart), + MessageType.NPC_TRADER, + traderBase.insurance.max_storage_time, + ); messageContent.text = ""; // Live insurance returns have an empty string for the text property messageContent.profileChangeEvents = []; messageContent.systemData = { date: this.timeUtil.getDateMailFormat(), time: this.timeUtil.getTimeMailFormat(), - location: mapId + location: mapId, }; // MUST occur after systemData is hydrated @@ -128,7 +132,7 @@ export class InsuranceService scheduledTime: insuranceReturnTimestamp, traderId: traderId, messageContent: messageContent, - items: this.getInsurance(sessionID)[traderId] + items: this.getInsurance(sessionID)[traderId], }); } @@ -144,8 +148,8 @@ export class InsuranceService { const dialogueTemplates = this.databaseServer.getTables().traders[Traders.PRAPOR].dialogue; // todo: get trader id instead of hard coded prapor const randomResponseId = locationName?.toLowerCase() === "laboratory" - ? this.randomUtil.getArrayValue(dialogueTemplates["insuranceFailedLabs"]) - : this.randomUtil.getArrayValue(dialogueTemplates["insuranceFailed"]); + ? this.randomUtil.getArrayValue(dialogueTemplates.insuranceFailedLabs) + : this.randomUtil.getArrayValue(dialogueTemplates.insuranceFailed); this.mailSendService.sendLocalisedNpcMessageToPlayer( sessionId, @@ -154,7 +158,8 @@ export class InsuranceService randomResponseId, [], null, - {location: locationName}); + { location: locationName }, + ); } /** @@ -168,7 +173,7 @@ export class InsuranceService for (const insuredItem of this.getInsurance(sessionId)[traderId]) { // Find insured items parent - const insuredItemsParent = insuredItems.find(x => x._id === insuredItem.parentId); + const insuredItemsParent = insuredItems.find((x) => x._id === insuredItem.parentId); if (!insuredItemsParent) { // Remove location + set slotId of insured items parent @@ -190,14 +195,15 @@ export class InsuranceService // If override inconfig is non-zero, use that instead of trader values if (this.insuranceConfig.returnTimeOverrideSeconds > 0) { - this.logger.debug(`Insurance override used: returning in ${this.insuranceConfig.returnTimeOverrideSeconds} seconds`); + this.logger.debug( + `Insurance override used: returning in ${this.insuranceConfig.returnTimeOverrideSeconds} seconds`, + ); return this.timeUtil.getTimestamp() + this.insuranceConfig.returnTimeOverrideSeconds; } - const insuranceReturnTimeBonus = pmcData.Bonuses.find(b => b.type === "InsuranceReturnTime"); - const insuranceReturnTimeBonusPercent = 1.0 - (insuranceReturnTimeBonus - ? Math.abs(insuranceReturnTimeBonus.value) - : 0) / 100; + const insuranceReturnTimeBonus = pmcData.Bonuses.find((b) => b.type === "InsuranceReturnTime"); + const insuranceReturnTimeBonusPercent = 1.0 + - (insuranceReturnTimeBonus ? Math.abs(insuranceReturnTimeBonus.value) : 0) / 100; const traderMinReturnAsSeconds = trader.insurance.min_return_hour * TimeUtil.oneHourAsSeconds; const traderMaxReturnAsSeconds = trader.insurance.max_return_hour * TimeUtil.oneHourAsSeconds; @@ -215,7 +221,13 @@ export class InsuranceService * @param sessionID Session id * @param playerDied did the player die in raid */ - public storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string, playerDied: boolean): void + public storeLostGear( + pmcData: IPmcData, + offraidData: ISaveProgressRequestData, + preRaidGear: Item[], + sessionID: string, + playerDied: boolean, + ): void { const preRaidGearHash = this.createItemHashTable(preRaidGear); const offRaidGearHash = this.createItemHashTable(offraidData.profile.Inventory.items); @@ -242,9 +254,13 @@ export class InsuranceService { equipmentToSendToPlayer.push({ pmcData: pmcData, - itemToReturnToPlayer: this.getInsuredItemDetails(pmcData, preRaidItem, offraidData.insurance?.find(x => x.id === insuredItem.itemId)), + itemToReturnToPlayer: this.getInsuredItemDetails( + pmcData, + preRaidItem, + offraidData.insurance?.find((x) => x.id === insuredItem.itemId), + ), traderId: insuredItem.tid, - sessionID: sessionID + sessionID: sessionID, }); } } @@ -264,7 +280,11 @@ export class InsuranceService * @param insuredItemFromClient Item data when player left raid (durability values) * @returns Item object */ - protected getInsuredItemDetails(pmcData: IPmcData, preRaidItem: Item, insuredItemFromClient: IInsuredItemsData): Item + protected getInsuredItemDetails( + pmcData: IPmcData, + preRaidItem: Item, + insuredItemFromClient: IInsuredItemsData, + ): Item { // Get baseline item to return, clone pre raid item const itemToReturn: Item = this.jsonUtil.clone(preRaidItem); @@ -298,7 +318,7 @@ export class InsuranceService { itemToReturn.upd.Repairable = { Durability: insuredItemFromClient.durability, - MaxDurability: insuredItemFromClient.maxDurability + MaxDurability: insuredItemFromClient.maxDurability, }; } else @@ -306,7 +326,6 @@ export class InsuranceService itemToReturn.upd.Repairable.Durability = insuredItemFromClient.durability; itemToReturn.upd.Repairable.MaxDurability = insuredItemFromClient.maxDurability; } - } // Client item has FaceShield values, Ensure values persist into server data @@ -315,15 +334,12 @@ export class InsuranceService // Item didnt have faceshield object pre-raid, add it if (!itemToReturn.upd.FaceShield) { - itemToReturn.upd.FaceShield = { - Hits: insuredItemFromClient.hits - }; + itemToReturn.upd.FaceShield = { Hits: insuredItemFromClient.hits }; } else { itemToReturn.upd.FaceShield.Hits = insuredItemFromClient.hits; } - } return itemToReturn; @@ -336,21 +352,16 @@ export class InsuranceService */ protected updateSlotIdValue(playerBaseInventoryEquipmentId: string, itemToReturn: Item): void { - const pocketSlots = [ - "pocket1", - "pocket2", - "pocket3", - "pocket4" - ]; + const pocketSlots = ["pocket1", "pocket2", "pocket3", "pocket4"]; // Some pockets can lose items with player death, some don't - if (!("slotId" in itemToReturn) || pocketSlots.includes(itemToReturn.slotId)) + if (!("slotId" in itemToReturn) || pocketSlots.includes(itemToReturn.slotId)) { itemToReturn.slotId = "hideout"; } // Mark root-level items for later processing - if (itemToReturn.parentId === playerBaseInventoryEquipmentId) + if (itemToReturn.parentId === playerBaseInventoryEquipmentId) { itemToReturn.slotId = "hideout"; } @@ -379,7 +390,9 @@ export class InsuranceService * @param itemToReturnToPlayer item to store * @param traderId Id of trader item was insured with */ - protected addGearToSend(gear: { sessionID: string; pmcData: IPmcData; itemToReturnToPlayer: Item; traderId: string}): void + protected addGearToSend( + gear: { sessionID: string; pmcData: IPmcData; itemToReturnToPlayer: Item; traderId: string; }, + ): void { const sessionId = gear.sessionID; const pmcData = gear.pmcData; @@ -436,7 +449,6 @@ export class InsuranceService */ public addInsuranceItemToArray(sessionId: string, traderId: string, itemToAdd: Item): void { - this.insured[sessionId][traderId].push(itemToAdd); } @@ -453,7 +465,9 @@ export class InsuranceService if (!insuranceMultiplier) { insuranceMultiplier = 0.3; - this.logger.warning(this.localisationService.getText("insurance-missing_insurance_price_multiplier", traderId)); + this.logger.warning( + this.localisationService.getText("insurance-missing_insurance_price_multiplier", traderId), + ); } // Multiply item handbook price by multiplier in config to get the new insurance price @@ -462,9 +476,9 @@ export class InsuranceService if (coef > 0) { - pricePremium *= (1 - this.traderHelper.getLoyaltyLevel(traderId, pmcData).insurance_price_coef / 100); + pricePremium *= 1 - this.traderHelper.getLoyaltyLevel(traderId, pmcData).insurance_price_coef / 100; } return Math.round(pricePremium); } -} \ No newline at end of file +} diff --git a/project/src/services/ItemBaseClassService.ts b/project/src/services/ItemBaseClassService.ts index 114bf39e..7f0b2a0a 100644 --- a/project/src/services/ItemBaseClassService.ts +++ b/project/src/services/ItemBaseClassService.ts @@ -18,7 +18,7 @@ export class ItemBaseClassService constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("DatabaseServer") protected databaseServer: DatabaseServer + @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) {} @@ -39,7 +39,7 @@ export class ItemBaseClassService return; } - const filteredDbItems = Object.values(allDbItems).filter(x => x._type === "Item"); + const filteredDbItems = Object.values(allDbItems).filter((x) => x._type === "Item"); for (const item of filteredDbItems) { const itemIdToUpdate = item._id; @@ -111,7 +111,7 @@ export class ItemBaseClassService } } - return this.itemBaseClassesCache[itemTpl].some(x => baseClasses.includes(x)); + return this.itemBaseClassesCache[itemTpl].some((x) => baseClasses.includes(x)); } /** @@ -133,4 +133,4 @@ export class ItemBaseClassService return this.itemBaseClassesCache[itemTpl]; } -} \ No newline at end of file +} diff --git a/project/src/services/ItemFilterService.ts b/project/src/services/ItemFilterService.ts index 91d8fcd9..52bd472f 100644 --- a/project/src/services/ItemFilterService.ts +++ b/project/src/services/ItemFilterService.ts @@ -6,16 +6,16 @@ import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { ConfigServer } from "@spt-aki/servers/ConfigServer"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; -/** Centralise the handling of blacklisting items, uses blacklist found in config/item.json, stores items that should not be used by players / broken items */ +/** Centralise the handling of blacklisting items, uses blacklist found in config/item.json, stores items that should not be used by players / broken items */ @injectable() export class ItemFilterService { - protected itemConfig: IItemConfig ; + protected itemConfig: IItemConfig; constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.itemConfig = this.configServer.getConfig(ConfigTypes.ITEM); @@ -58,4 +58,4 @@ export class ItemFilterService { return this.itemConfig.bossItems; } -} \ No newline at end of file +} diff --git a/project/src/services/LocaleService.ts b/project/src/services/LocaleService.ts index 5747df1e..c9bc8263 100644 --- a/project/src/services/LocaleService.ts +++ b/project/src/services/LocaleService.ts @@ -17,7 +17,7 @@ export class LocaleService constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.localeConfig = this.configServer.getConfig(ConfigTypes.LOCALE); @@ -35,9 +35,11 @@ export class LocaleService return desiredLocale; } - this.logger.warning(`Unable to find desired locale file using locale ${this.getDesiredGameLocale()} from config/locale.json, falling back to 'en'`); + this.logger.warning( + `Unable to find desired locale file using locale ${this.getDesiredGameLocale()} from config/locale.json, falling back to 'en'`, + ); - return this.databaseServer.getTables().locales.global["en"]; + return this.databaseServer.getTables().locales.global.en; } /** @@ -95,10 +97,12 @@ export class LocaleService if (!this.localeConfig.serverSupportedLocales.includes(platformLocale.language)) { - this.logger.warning(`Unsupported system langauge found ${platformLocale.baseName}, falling back to english`); + this.logger.warning( + `Unsupported system langauge found ${platformLocale.baseName}, falling back to english`, + ); return "en"; } return platformLocale.language; } -} \ No newline at end of file +} diff --git a/project/src/services/LocalisationService.ts b/project/src/services/LocalisationService.ts index 0477aa86..73859227 100644 --- a/project/src/services/LocalisationService.ts +++ b/project/src/services/LocalisationService.ts @@ -1,5 +1,5 @@ -import { I18n } from "i18n"; import path from "node:path"; +import { I18n } from "i18n"; import { inject, injectable } from "tsyringe"; import { ILocaleConfig } from "@spt-aki/models/spt/config/ILocaleConfig"; @@ -21,18 +21,21 @@ export class LocalisationService @inject("WinstonLogger") protected logger: ILogger, @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("LocaleService") protected localeService: LocaleService + @inject("LocaleService") protected localeService: LocaleService, ) { - const localeFileDirectory = path.join(process.cwd(), globalThis.G_RELEASE_CONFIGURATION ? "Aki_Data/Server/database/locales/server" : "./assets/database/locales/server"); - this.i18n = new I18n( - { - locales: this.localeService.getServerSupportedLocales(), - defaultLocale: "en", - directory: localeFileDirectory, - retryInDefaultLocale: true - } + const localeFileDirectory = path.join( + process.cwd(), + globalThis.G_RELEASE_CONFIGURATION + ? "Aki_Data/Server/database/locales/server" + : "./assets/database/locales/server", ); + this.i18n = new I18n({ + locales: this.localeService.getServerSupportedLocales(), + defaultLocale: "en", + directory: localeFileDirectory, + retryInDefaultLocale: true, + }); this.i18n.setLocale(this.localeService.getDesiredServerLocale()); } @@ -54,7 +57,7 @@ export class LocalisationService */ public getKeys(): string[] { - return Object.keys(this.databaseServer.getTables().locales.server["en"]); + return Object.keys(this.databaseServer.getTables().locales.server.en); } /** @@ -64,9 +67,11 @@ export class LocalisationService */ public getRandomTextThatMatchesPartialKey(partialKey: string): string { - const filteredKeys = Object.keys(this.databaseServer.getTables().locales.server["en"]).filter(x => x.startsWith(partialKey)); + const filteredKeys = Object.keys(this.databaseServer.getTables().locales.server.en).filter((x) => + x.startsWith(partialKey) + ); const chosenKey = this.randomUtil.getArrayValue(filteredKeys); return this.getText(chosenKey); } -} \ No newline at end of file +} diff --git a/project/src/services/MailSendService.ts b/project/src/services/MailSendService.ts index 88c853a0..242dd658 100644 --- a/project/src/services/MailSendService.ts +++ b/project/src/services/MailSendService.ts @@ -33,9 +33,9 @@ export class MailSendService @inject("NotificationSendHelper") protected notificationSendHelper: NotificationSendHelper, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("ItemHelper") protected itemHelper: ItemHelper, - @inject("TraderHelper") protected traderHelper: TraderHelper + @inject("TraderHelper") protected traderHelper: TraderHelper, ) - { } + {} /** * Send a message from an NPC (e.g. prapor) to the player with or without items using direct message text, do not look up any locale @@ -46,11 +46,25 @@ export class MailSendService * @param items Optional items to send to player * @param maxStorageTimeSeconds Optional time to collect items before they expire */ - public sendDirectNpcMessageToPlayer(sessionId: string, trader: Traders, messageType: MessageType, message: string, items: Item[] = [], maxStorageTimeSeconds = null, systemData = null, ragfair = null): void + public sendDirectNpcMessageToPlayer( + sessionId: string, + trader: Traders, + messageType: MessageType, + message: string, + items: Item[] = [], + maxStorageTimeSeconds = null, + systemData = null, + ragfair = null, + ): void { if (!trader) { - this.logger.error(this.localisationService.getText("mailsend-missing_trader", {messageType: messageType, sessionId: sessionId})); + this.logger.error( + this.localisationService.getText("mailsend-missing_trader", { + messageType: messageType, + sessionId: sessionId, + }), + ); return; } @@ -60,7 +74,7 @@ export class MailSendService sender: messageType, dialogType: MessageType.NPC_TRADER, trader: trader, - messageText: message + messageText: message, }; // Add items to message @@ -92,11 +106,25 @@ export class MailSendService * @param items Optional items to send to player * @param maxStorageTimeSeconds Optional time to collect items before they expire */ - public sendLocalisedNpcMessageToPlayer(sessionId: string, trader: Traders, messageType: MessageType, messageLocaleId: string, items: Item[] = [], maxStorageTimeSeconds = null, systemData = null, ragfair = null): void + public sendLocalisedNpcMessageToPlayer( + sessionId: string, + trader: Traders, + messageType: MessageType, + messageLocaleId: string, + items: Item[] = [], + maxStorageTimeSeconds = null, + systemData = null, + ragfair = null, + ): void { if (!trader) { - this.logger.error(this.localisationService.getText("mailsend-missing_trader", {messageType: messageType, sessionId: sessionId})); + this.logger.error( + this.localisationService.getText("mailsend-missing_trader", { + messageType: messageType, + sessionId: sessionId, + }), + ); return; } @@ -106,7 +134,7 @@ export class MailSendService sender: messageType, dialogType: MessageType.NPC_TRADER, trader: trader, - templateId: messageLocaleId + templateId: messageLocaleId, }; // Add items to message @@ -136,12 +164,17 @@ export class MailSendService * @param items Optional items to send to player * @param maxStorageTimeSeconds Optional time to collect items before they expire */ - public sendSystemMessageToPlayer(sessionId: string, message: string, items: Item[] = [], maxStorageTimeSeconds = null): void + public sendSystemMessageToPlayer( + sessionId: string, + message: string, + items: Item[] = [], + maxStorageTimeSeconds = null, + ): void { const details: ISendMessageDetails = { recipientId: sessionId, sender: MessageType.SYSTEM_MESSAGE, - messageText: message + messageText: message, }; // Add items to message @@ -161,12 +194,17 @@ export class MailSendService * @param items Optional items to send to player * @param maxStorageTimeSeconds Optional time to collect items before they expire */ - public sendLocalisedSystemMessageToPlayer(sessionId: string, messageLocaleId: string, items: Item[] = [], maxStorageTimeSeconds = null): void + public sendLocalisedSystemMessageToPlayer( + sessionId: string, + messageLocaleId: string, + items: Item[] = [], + maxStorageTimeSeconds = null, + ): void { const details: ISendMessageDetails = { recipientId: sessionId, sender: MessageType.SYSTEM_MESSAGE, - templateId: messageLocaleId + templateId: messageLocaleId, }; // Add items to message @@ -187,13 +225,19 @@ export class MailSendService * @param items Optional items to send to player * @param maxStorageTimeSeconds Optional time to collect items before they expire */ - public sendUserMessageToPlayer(sessionId: string, senderDetails: IUserDialogInfo, message: string, items: Item[] = [], maxStorageTimeSeconds = null): void + public sendUserMessageToPlayer( + sessionId: string, + senderDetails: IUserDialogInfo, + message: string, + items: Item[] = [], + maxStorageTimeSeconds = null, + ): void { const details: ISendMessageDetails = { recipientId: sessionId, sender: MessageType.USER_MESSAGE, senderDetails: senderDetails, - messageText: message + messageText: message, }; // Add items to message @@ -222,7 +266,7 @@ export class MailSendService // Craft message const message = this.createDialogMessage(senderDialog._id, messageDetails); - // Create items array + // Create items array // Generate item stash if we have rewards. const itemsToSendToPlayer = this.processItemsBeforeAddingToMail(senderDialog.type, messageDetails); @@ -240,9 +284,15 @@ export class MailSendService // TODO: clean up old code here // Offer Sold notifications are now separate from the main notification - if ([MessageType.NPC_TRADER, MessageType.FLEAMARKET_MESSAGE].includes(senderDialog.type) && messageDetails.ragfairDetails) + if ( + [MessageType.NPC_TRADER, MessageType.FLEAMARKET_MESSAGE].includes(senderDialog.type) + && messageDetails.ragfairDetails + ) { - const offerSoldMessage = this.notifierHelper.createRagfairOfferSoldNotification(message, messageDetails.ragfairDetails); + const offerSoldMessage = this.notifierHelper.createRagfairOfferSoldNotification( + message, + messageDetails.ragfairDetails, + ); this.notificationSendHelper.sendMessage(messageDetails.recipientId, offerSoldMessage); message.type = MessageType.MESSAGE_WITH_ITEMS; // Should prevent getting the same notification popup twice } @@ -276,7 +326,7 @@ export class MailSendService uid: playerProfile.characters.pmc._id, type: MessageType.USER_MESSAGE, rewardCollected: false, - text: message + text: message, }); } @@ -298,7 +348,9 @@ export class MailSendService hasRewards: false, // The default dialog message has no rewards, can be added later via addRewardItemsToMessage() rewardCollected: false, // The default dialog message has no rewards, can be added later via addRewardItemsToMessage() systemData: messageDetails.systemData ? messageDetails.systemData : undefined, // Used by ragfair / localised messages that need "location" or "time" - profileChangeEvents: (messageDetails.profileChangeEvents?.length === 0) ? messageDetails.profileChangeEvents : undefined // no one knows, its never been used in any dumps + profileChangeEvents: (messageDetails.profileChangeEvents?.length === 0) + ? messageDetails.profileChangeEvents + : undefined, // no one knows, its never been used in any dumps }; // Clean up empty system data @@ -322,7 +374,11 @@ export class MailSendService * @param itemsToSendToPlayer Items to add to message * @param maxStorageTimeSeconds total time items are stored in mail before being deleted */ - protected addRewardItemsToMessage(message: Message, itemsToSendToPlayer: MessageItems, maxStorageTimeSeconds: number): void + protected addRewardItemsToMessage( + message: Message, + itemsToSendToPlayer: MessageItems, + maxStorageTimeSeconds: number, + ): void { if (itemsToSendToPlayer?.data?.length > 0) { @@ -335,8 +391,8 @@ export class MailSendService /** * perform various sanitising actions on the items before they're considered ready for insertion into message - * @param dialogType The type of the dialog that will hold the reward items being processed - * @param messageDetails + * @param dialogType The type of the dialog that will hold the reward items being processed + * @param messageDetails * @returns Sanitised items */ protected processItemsBeforeAddingToMail(dialogType: MessageType, messageDetails: ISendMessageDetails): MessageItems @@ -350,7 +406,10 @@ export class MailSendService const parentItem = this.getBaseItemFromRewards(messageDetails.items); if (!parentItem) { - this.localisationService.getText("mailsend-missing_parent", {traderId: messageDetails.trader, sender: messageDetails.sender}); + this.localisationService.getText("mailsend-missing_parent", { + traderId: messageDetails.trader, + sender: messageDetails.sender, + }); return itemsToSendToPlayer; } @@ -361,11 +420,8 @@ export class MailSendService parentItem.parentId = this.hashUtil.generate(); } - itemsToSendToPlayer = { - stash: parentItem.parentId, - data: [] - }; - + itemsToSendToPlayer = { stash: parentItem.parentId, data: [] }; + // Ensure Ids are unique and cont collide with items in player inventory later messageDetails.items = this.itemHelper.replaceIDs(null, messageDetails.items); @@ -376,7 +432,12 @@ export class MailSendService if (!itemTemplate) { // Can happen when modded items are insured + mod is removed - this.logger.error(this.localisationService.getText("dialog-missing_item_template", {tpl: reward._tpl, type: dialogType})); + this.logger.error( + this.localisationService.getText("dialog-missing_item_template", { + tpl: reward._tpl, + type: dialogType, + }), + ); continue; } @@ -427,7 +488,7 @@ export class MailSendService } // Find first item with slotId that indicates its a 'base' item - let item = items.find(x => ["hideout", "main"].includes(x.slotId)); + let item = items.find((x) => ["hideout", "main"].includes(x.slotId)); if (item) { return item; @@ -435,7 +496,7 @@ export class MailSendService // Not a singlular item + no items have a hideout/main slotid // Look for first item without parent id - item = items.find(x => !x.parentId); + item = items.find((x) => !x.parentId); if (item) { return item; @@ -467,7 +528,7 @@ export class MailSendService messages: [], pinned: false, new: 0, - attachmentsNew: 0 + attachmentsNew: 0, }; senderDialog = dialogsInProfile[senderId]; @@ -478,7 +539,7 @@ export class MailSendService /** * Get the appropriate sender id by the sender enum type - * @param messageDetails + * @param messageDetails * @returns gets an id of the individual sending it */ protected getMessageSenderIdByType(messageDetails: ISendMessageDetails): string @@ -510,5 +571,4 @@ export class MailSendService this.logger.warning(`Unable to handle message of type: ${messageDetails.sender}`); } - -} \ No newline at end of file +} diff --git a/project/src/services/MatchBotDetailsCacheService.ts b/project/src/services/MatchBotDetailsCacheService.ts index 2e1dc2e5..826f731b 100644 --- a/project/src/services/MatchBotDetailsCacheService.ts +++ b/project/src/services/MatchBotDetailsCacheService.ts @@ -12,7 +12,7 @@ export class MatchBotDetailsCacheService constructor( @inject("WinstonLogger") protected logger: ILogger, - @inject("LocalisationService") protected localisationService: LocalisationService + @inject("LocalisationService") protected localisationService: LocalisationService, ) {} @@ -48,5 +48,4 @@ export class MatchBotDetailsCacheService return botInCache; } - -} \ No newline at end of file +} diff --git a/project/src/services/MatchLocationService.ts b/project/src/services/MatchLocationService.ts index ad29293c..d81b1817 100644 --- a/project/src/services/MatchLocationService.ts +++ b/project/src/services/MatchLocationService.ts @@ -8,35 +8,31 @@ export class MatchLocationService { protected locations = {}; - constructor( - @inject("TimeUtil") protected timeUtil: TimeUtil - ) - { } + constructor(@inject("TimeUtil") protected timeUtil: TimeUtil) + {} public createGroup(sessionID: string, info: ICreateGroupRequestData): any { const groupID = "test"; this.locations[info.location].groups[groupID] = { - "_id": groupID, - "owner": `pmc${sessionID}`, - "location": info.location, - "gameVersion": "live", - "region": "EUR", - "status": "wait", - "isSavage": false, - "timeShift": "CURR", - "dt": this.timeUtil.getTimestamp(), - "players": [ - { - "_id": `pmc${sessionID}`, - "region": "EUR", - "ip": "127.0.0.1", - "savageId": `scav${sessionID}`, - "accessKeyId": "" - } - ], - "customDataCenter": [] + _id: groupID, + owner: `pmc${sessionID}`, + location: info.location, + gameVersion: "live", + region: "EUR", + status: "wait", + isSavage: false, + timeShift: "CURR", + dt: this.timeUtil.getTimestamp(), + players: [{ + _id: `pmc${sessionID}`, + region: "EUR", + ip: "127.0.0.1", + savageId: `scav${sessionID}`, + accessKeyId: "", + }], + customDataCenter: [], }; return this.locations[info.location].groups[groupID]; @@ -56,4 +52,4 @@ export class MatchLocationService } } } -} \ No newline at end of file +} diff --git a/project/src/services/ModCompilerService.ts b/project/src/services/ModCompilerService.ts index c69f50b4..833c22d7 100644 --- a/project/src/services/ModCompilerService.ts +++ b/project/src/services/ModCompilerService.ts @@ -16,7 +16,7 @@ export class ModCompilerService constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("HashCacheService") protected hashCacheService: HashCacheService, - @inject("VFS") protected vfs: VFS + @inject("VFS") protected vfs: VFS, ) { const packageJsonPath: string = path.join(__dirname, "../../package.json"); @@ -27,8 +27,8 @@ export class ModCompilerService * Convert a mods TS into JS * @param modName Name of mod * @param modPath Dir path to mod - * @param modTypeScriptFiles - * @returns + * @param modTypeScriptFiles + * @returns */ public async compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise { @@ -38,7 +38,7 @@ export class ModCompilerService for (const file of modTypeScriptFiles) { const fileContent = this.vfs.readFile(file); - tsFileContents+= fileContent; + tsFileContents += fileContent; // Does equivalent .js file exist if (!this.vfs.exists(file.replace(".ts", ".js"))) @@ -61,22 +61,21 @@ export class ModCompilerService this.hashCacheService.storeModContent(modName, tsFileContents); } - return this.compile(modTypeScriptFiles, - { - noEmitOnError: true, - noImplicitAny: false, - target: ts.ScriptTarget.ES2022, - module: ts.ModuleKind.CommonJS, - moduleResolution: ts.ModuleResolutionKind.Node10, - sourceMap: true, - resolveJsonModule: true, - allowJs: true, - esModuleInterop: true, - downlevelIteration: true, - experimentalDecorators: true, - emitDecoratorMetadata: true, - rootDir: modPath - }); + return this.compile(modTypeScriptFiles, { + noEmitOnError: true, + noImplicitAny: false, + target: ts.ScriptTarget.ES2022, + module: ts.ModuleKind.CommonJS, + moduleResolution: ts.ModuleResolutionKind.Node10, + sourceMap: true, + resolveJsonModule: true, + allowJs: true, + esModuleInterop: true, + downlevelIteration: true, + experimentalDecorators: true, + emitDecoratorMetadata: true, + rootDir: modPath, + }); } /** @@ -87,7 +86,7 @@ export class ModCompilerService protected async compile(fileNames: string[], options: ts.CompilerOptions): Promise { // C:/snapshot/project || /snapshot/project - const baseDir: string = __dirname.replace(/\\/g,"/").split("/").slice(0, 3).join("/"); + const baseDir: string = __dirname.replace(/\\/g, "/").split("/").slice(0, 3).join("/"); for (const filePath of fileNames) { @@ -100,25 +99,28 @@ export class ModCompilerService if (globalThis.G_RELEASE_CONFIGURATION) { replacedText = text.replace(/(@spt-aki)/g, `${baseDir}/obj`); - for (const dependency of this.serverDependencies) + for (const dependency of this.serverDependencies) { replacedText = replacedText.replace(`"${dependency}"`, `"${baseDir}/node_modules/${dependency}"`); } } else { - replacedText = text.replace(/(@spt-aki)/g, path.join(__dirname, "..").replace(/\\/g,"/")); + replacedText = text.replace(/(@spt-aki)/g, path.join(__dirname, "..").replace(/\\/g, "/")); } const output = ts.transpileModule(replacedText, { compilerOptions: options }); if (output.sourceMapText) { - output.outputText = output.outputText.replace("//# sourceMappingURL=module.js.map", `//# sourceMappingURL=${parsedDestPath.base}.map`); + output.outputText = output.outputText.replace( + "//# sourceMappingURL=module.js.map", + `//# sourceMappingURL=${parsedDestPath.base}.map`, + ); const sourceMap = JSON.parse(output.sourceMapText); sourceMap.file = parsedDestPath.base; - sourceMap.sources = [ parsedPath.base ]; + sourceMap.sources = [parsedPath.base]; fs.writeFileSync(`${destPath}.map`, JSON.stringify(sourceMap)); } @@ -133,21 +135,21 @@ export class ModCompilerService /** * Do the files at the provided paths exist - * @param fileNames - * @returns + * @param fileNames + * @returns */ protected areFilesReady(fileNames: string[]): boolean { - return fileNames.filter(x => !this.vfs.exists(x.replace(".ts", ".js"))).length === 0; + return fileNames.filter((x) => !this.vfs.exists(x.replace(".ts", ".js"))).length === 0; } /** * Wait the provided number of milliseconds * @param ms Milliseconds - * @returns + * @returns */ protected delay(ms: number): Promise { - return new Promise( resolve => setTimeout(resolve, ms) ); + return new Promise((resolve) => setTimeout(resolve, ms)); } -} \ No newline at end of file +} diff --git a/project/src/services/NotificationService.ts b/project/src/services/NotificationService.ts index e0356e7f..2439eba8 100644 --- a/project/src/services/NotificationService.ts +++ b/project/src/services/NotificationService.ts @@ -61,4 +61,4 @@ export class NotificationService return this.messageQueue[sessionID]; } -} \ No newline at end of file +} diff --git a/project/src/services/OpenZoneService.ts b/project/src/services/OpenZoneService.ts index c5bb5410..303d4f92 100644 --- a/project/src/services/OpenZoneService.ts +++ b/project/src/services/OpenZoneService.ts @@ -22,7 +22,7 @@ export class OpenZoneService @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.locationConfig = this.configServer.getConfig(ConfigTypes.LOCATION); @@ -54,7 +54,7 @@ export class OpenZoneService { const dbLocations = this.databaseServer.getTables().locations; for (const mapKey in this.locationConfig.openZones) - { + { if (!dbLocations[mapKey]) { this.logger.error(this.localisationService.getText("openzone-unable_to_find_map", mapKey)); @@ -76,4 +76,4 @@ export class OpenZoneService } } } -} \ No newline at end of file +} diff --git a/project/src/services/PaymentService.ts b/project/src/services/PaymentService.ts index 18ff2afa..d17ee724 100644 --- a/project/src/services/PaymentService.ts +++ b/project/src/services/PaymentService.ts @@ -28,9 +28,9 @@ export class PaymentService @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("InventoryHelper") protected inventoryHelper: InventoryHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("PaymentHelper") protected paymentHelper: PaymentHelper + @inject("PaymentHelper") protected paymentHelper: PaymentHelper, ) - { } + {} /** * Take money and insert items into return to server request @@ -39,18 +39,23 @@ export class PaymentService * @param {string} sessionID * @returns IItemEventRouterResponse */ - public payMoney(pmcData: IPmcData, request: IProcessBuyTradeRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse + public payMoney( + pmcData: IPmcData, + request: IProcessBuyTradeRequestData, + sessionID: string, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { const trader = this.traderHelper.getTrader(request.tid, sessionID); // Track the amounts of each type of currency involved in the trade. - const currencyAmounts: { [key: string]: number } = {}; + const currencyAmounts: { [key: string]: number; } = {}; // Delete barter items and track currencies for (const index in request.scheme_items) { // Find the corresponding item in the player's inventory. - const item = pmcData.Inventory.items.find(i => i._id === request.scheme_items[index].id); + const item = pmcData.Inventory.items.find((i) => i._id === request.scheme_items[index].id); if (item !== undefined) { if (!this.paymentHelper.isMoneyTpl(item._tpl)) @@ -95,7 +100,10 @@ export class PaymentService } // Convert the amount to the trader's currency and update the sales sum. - const costOfPurchaseInCurrency = this.handbookHelper.fromRUB(this.handbookHelper.inRUB(currencyAmount, currencyTpl), this.paymentHelper.getCurrency(trader.currency)); + const costOfPurchaseInCurrency = this.handbookHelper.fromRUB( + this.handbookHelper.inRUB(currencyAmount, currencyTpl), + this.paymentHelper.getCurrency(trader.currency), + ); pmcData.TradersInfo[request.tid].salesSum += costOfPurchaseInCurrency; } } @@ -106,7 +114,10 @@ export class PaymentService this.logger.debug(this.localisationService.getText("payment-zero_price_no_payment")); // Convert the handbook price to the trader's currency and update the sales sum. - const costOfPurchaseInCurrency = this.handbookHelper.fromRUB(this.getTraderItemHandbookPriceRouble(request.item_id, request.tid), this.paymentHelper.getCurrency(trader.currency)); + const costOfPurchaseInCurrency = this.handbookHelper.fromRUB( + this.getTraderItemHandbookPriceRouble(request.item_id, request.tid), + this.paymentHelper.getCurrency(trader.currency), + ); pmcData.TradersInfo[request.tid].salesSum += costOfPurchaseInCurrency; } @@ -133,8 +144,10 @@ export class PaymentService const assortItemPriceRouble = this.handbookHelper.getTemplatePrice(purchasedAssortItem._tpl); if (!assortItemPriceRouble) { - this.logger.debug(`No item price found for ${purchasedAssortItem._tpl} on trader: ${traderId} in assort: ${traderAssortId}`); - + this.logger.debug( + `No item price found for ${purchasedAssortItem._tpl} on trader: ${traderId} in assort: ${traderAssortId}`, + ); + return 1; } @@ -150,7 +163,13 @@ export class PaymentService * @param {string} sessionID * @returns IItemEventRouterResponse */ - public getMoney(pmcData: IPmcData, amount: number, body: IProcessSellTradeRequestData, output: IItemEventRouterResponse, sessionID: string): IItemEventRouterResponse + public getMoney( + pmcData: IPmcData, + amount: number, + body: IProcessSellTradeRequestData, + output: IItemEventRouterResponse, + sessionID: string, + ): IItemEventRouterResponse { const trader = this.traderHelper.getTrader(body.tid, sessionID); const currency = this.paymentHelper.getCurrency(trader.currency); @@ -174,7 +193,6 @@ export class PaymentService if (item.upd.StackObjectsCount < maxStackSize) { - if (item.upd.StackObjectsCount + calcAmount > maxStackSize) { // calculate difference @@ -202,9 +220,9 @@ export class PaymentService items: [{ // eslint-disable-next-line @typescript-eslint/naming-convention item_id: currency, - count: calcAmount + count: calcAmount, }], - tid: body.tid + tid: body.tid, }; output = this.inventoryHelper.addItem(pmcData, request, output, sessionID, null, false, null, true); @@ -220,22 +238,22 @@ export class PaymentService } /** - * Recursively checks if the given item is - * inside the stash, that is it has the stash as - * ancestor with slotId=hideout - */ + * Recursively checks if the given item is + * inside the stash, that is it has the stash as + * ancestor with slotId=hideout + */ protected isItemInStash(pmcData: IPmcData, item: Item): boolean { let container = item; - + while ("parentId" in container) { if (container.parentId === pmcData.Inventory.stash && container.slotId === "hideout") { return true; } - - container = pmcData.Inventory.items.find(i => i._id === container.parentId); + + container = pmcData.Inventory.items.find((i) => i._id === container.parentId); if (!container) { break; @@ -253,16 +271,38 @@ export class PaymentService * @param output output object to send to client * @returns IItemEventRouterResponse */ - public addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse + public addPaymentToOutput( + pmcData: IPmcData, + currencyTpl: string, + amountToPay: number, + sessionID: string, + output: IItemEventRouterResponse, + ): IItemEventRouterResponse { - const moneyItemsInInventory = this.getSortedMoneyItemsInInventory(pmcData, currencyTpl, pmcData.Inventory.stash); - const amountAvailable = moneyItemsInInventory.reduce((accumulator, item) => accumulator + item.upd.StackObjectsCount, 0); + const moneyItemsInInventory = this.getSortedMoneyItemsInInventory( + pmcData, + currencyTpl, + pmcData.Inventory.stash, + ); + const amountAvailable = moneyItemsInInventory.reduce( + (accumulator, item) => accumulator + item.upd.StackObjectsCount, + 0, + ); // If no money in inventory or amount is not enough we return false if (moneyItemsInInventory.length <= 0 || amountAvailable < amountToPay) { - this.logger.error(this.localisationService.getText("payment-not_enough_money_to_complete_transation", {amountToPay: amountToPay, amountAvailable: amountAvailable})); - output = this.httpResponse.appendErrorToOutput(output, this.localisationService.getText("payment-not_enough_money_to_complete_transation_short"), BackendErrorCodes.UNKNOWN_TRADING_ERROR); + this.logger.error( + this.localisationService.getText("payment-not_enough_money_to_complete_transation", { + amountToPay: amountToPay, + amountAvailable: amountAvailable, + }), + ); + output = this.httpResponse.appendErrorToOutput( + output, + this.localisationService.getText("payment-not_enough_money_to_complete_transation_short"), + BackendErrorCodes.UNKNOWN_TRADING_ERROR, + ); return output; } @@ -294,8 +334,8 @@ export class PaymentService /** * Get all money stacks in inventory and prioritse items in stash - * @param pmcData - * @param currencyTpl + * @param pmcData + * @param currencyTpl * @param playerStashId Players stash id * @returns Sorting money items */ @@ -365,7 +405,7 @@ export class PaymentService */ protected isInStash(itemId: string, inventoryItems: Item[], playerStashId: string): boolean { - const itemParent = inventoryItems.find(x => x._id === itemId); + const itemParent = inventoryItems.find((x) => x._id === itemId); if (itemParent) { diff --git a/project/src/services/PlayerService.ts b/project/src/services/PlayerService.ts index 8ef07062..c416f7a8 100644 --- a/project/src/services/PlayerService.ts +++ b/project/src/services/PlayerService.ts @@ -9,14 +9,13 @@ import { TimeUtil } from "@spt-aki/utils/TimeUtil"; @injectable() export class PlayerService { - constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("TimeUtil") protected timeUtil: TimeUtil, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("DatabaseServer") protected databaseServer: DatabaseServer + @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) - { } + {} /** * Get level of player diff --git a/project/src/services/PmcChatResponseService.ts b/project/src/services/PmcChatResponseService.ts index 933861eb..c7688a8c 100644 --- a/project/src/services/PmcChatResponseService.ts +++ b/project/src/services/PmcChatResponseService.ts @@ -27,7 +27,7 @@ export class PmcChatResponseService @inject("MatchBotDetailsCacheService") protected matchBotDetailsCacheService: MatchBotDetailsCacheService, @inject("LocalisationService") protected localisationService: LocalisationService, @inject("WeightedRandomHelper") protected weightedRandomHelper: WeightedRandomHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.pmcResponsesConfig = this.configServer.getConfig(ConfigTypes.PMC_CHAT_RESPONSE); @@ -50,11 +50,15 @@ export class PmcChatResponseService const victimDetails = this.getVictimDetails(victim); const message = this.chooseMessage(true, pmcData); - this.notificationSendHelper.sendMessageToPlayer(sessionId, victimDetails, message, MessageType.USER_MESSAGE); - } + this.notificationSendHelper.sendMessageToPlayer( + sessionId, + victimDetails, + message, + MessageType.USER_MESSAGE, + ); + } } - /** * Not fully implemented yet, needs method of acquiring killers details after raid * @param sessionId Session id @@ -75,7 +79,10 @@ export class PmcChatResponseService } // find bot by name in cache - const killerDetailsInCache = this.matchBotDetailsCacheService.getBotByNameAndSide(killer.Name.trim(), killer.Side); + const killerDetailsInCache = this.matchBotDetailsCacheService.getBotByNameAndSide( + killer.Name.trim(), + killer.Side, + ); if (!killerDetailsInCache) { return; @@ -93,8 +100,8 @@ export class PmcChatResponseService Nickname: killerDetailsInCache.Info.Nickname, Side: killerDetailsInCache.Info.Side, Level: killerDetailsInCache.Info.Level, - MemberCategory: killerDetailsInCache.Info.MemberCategory - } + MemberCategory: killerDetailsInCache.Info.MemberCategory, + }, }; const message = this.chooseMessage(false, pmcData); @@ -127,14 +134,20 @@ export class PmcChatResponseService } // Choose random response from above list and request it from localisation service - let responseText = this.localisationService.getText(this.randomUtil.getArrayValue(possibleResponseLocaleKeys), {playerName: pmcData.Info.Nickname, playerLevel: pmcData.Info.Level, playerSide: pmcData.Info.Side}); + let responseText = this.localisationService.getText(this.randomUtil.getArrayValue(possibleResponseLocaleKeys), { + playerName: pmcData.Info.Nickname, + playerLevel: pmcData.Info.Level, + playerSide: pmcData.Info.Side, + }); if (this.appendSuffixToMessageEnd(isVictim)) { - const suffixText = this.localisationService.getText(this.randomUtil.getArrayValue(this.getResponseSuffixLocaleKeys())); + const suffixText = this.localisationService.getText( + this.randomUtil.getArrayValue(this.getResponseSuffixLocaleKeys()), + ); responseText += ` ${suffixText}`; } - + if (this.stripCapitalistion(isVictim)) { responseText = responseText.toLowerCase(); @@ -189,7 +202,7 @@ export class PmcChatResponseService return this.randomUtil.getChance100(chance); } - + /** * Choose a type of response based on the weightings in pmc response config * @param isVictim Was responder killed by player @@ -208,14 +221,14 @@ export class PmcChatResponseService * Get locale keys related to the type of response to send (victim/killer) * @param keyType Positive/negative * @param isVictim Was responder killed by player - * @returns + * @returns */ protected getResponseLocaleKeys(keyType: string, isVictim = true): string[] { const keyBase = isVictim ? "pmcresponse-victim_" : "pmcresponse-killer_"; const keys = this.localisationService.getKeys(); - return keys.filter(x => x.startsWith(`${keyBase}${keyType}`)); + return keys.filter((x) => x.startsWith(`${keyBase}${keyType}`)); } /** @@ -226,7 +239,7 @@ export class PmcChatResponseService { const keys = this.localisationService.getKeys(); - return keys.filter(x => x.startsWith("pmcresponse-suffix")); + return keys.filter((x) => x.startsWith("pmcresponse-suffix")); } /** @@ -248,7 +261,25 @@ export class PmcChatResponseService */ protected getVictimDetails(pmcVictim: Victim): IUserDialogInfo { - const categories = [MemberCategory.UNIQUE_ID, MemberCategory.DEFAULT, MemberCategory.DEFAULT, MemberCategory.DEFAULT, MemberCategory.DEFAULT, MemberCategory.DEFAULT, MemberCategory.DEFAULT, MemberCategory.SHERPA, MemberCategory.DEVELOPER]; - return {_id: pmcVictim.Name, info:{Nickname: pmcVictim.Name, Level: pmcVictim.Level, Side: pmcVictim.Side, MemberCategory: this.randomUtil.getArrayValue(categories)}}; + const categories = [ + MemberCategory.UNIQUE_ID, + MemberCategory.DEFAULT, + MemberCategory.DEFAULT, + MemberCategory.DEFAULT, + MemberCategory.DEFAULT, + MemberCategory.DEFAULT, + MemberCategory.DEFAULT, + MemberCategory.SHERPA, + MemberCategory.DEVELOPER, + ]; + return { + _id: pmcVictim.Name, + info: { + Nickname: pmcVictim.Name, + Level: pmcVictim.Level, + Side: pmcVictim.Side, + MemberCategory: this.randomUtil.getArrayValue(categories), + }, + }; } -} \ No newline at end of file +} diff --git a/project/src/services/ProfileFixerService.ts b/project/src/services/ProfileFixerService.ts index ae390807..ad11a60a 100644 --- a/project/src/services/ProfileFixerService.ts +++ b/project/src/services/ProfileFixerService.ts @@ -7,6 +7,7 @@ import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper"; import { TraderHelper } from "@spt-aki/helpers/TraderHelper"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { Bonus, HideoutSlot, IQuestStatus } from "@spt-aki/models/eft/common/tables/IBotBase"; +import { IHideoutImprovement } from "@spt-aki/models/eft/common/tables/IBotBase"; import { IPmcDataRepeatableQuest, IRepeatableQuest } from "@spt-aki/models/eft/common/tables/IRepeatableQuests"; import { StageBonus } from "@spt-aki/models/eft/hideout/IHideoutArea"; import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile"; @@ -44,7 +45,7 @@ export class ProfileFixerService @inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("HashUtil") protected hashUtil: HashUtil, @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.coreConfig = this.configServer.getConfig(ConfigTypes.CORE); @@ -81,30 +82,73 @@ export class ProfileFixerService this.reorderHideoutAreasWithResouceInputs(pmcProfile); - if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.GENERATOR).slots.length < - (6 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.Generator.Slots)) + if ( + pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.GENERATOR).slots.length + < (6 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .Generator.Slots) + ) { this.logger.debug("Updating generator area slots to a size of 6 + hideout management skill"); - this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.GENERATOR, (6 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.Generator.Slots), pmcProfile); + this.addEmptyObjectsToHideoutAreaSlots( + HideoutAreas.GENERATOR, + 6 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .Generator.Slots, + pmcProfile, + ); } - if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WATER_COLLECTOR).slots.length < (1 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.WaterCollector.Slots)) + if ( + pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.WATER_COLLECTOR).slots.length + < (1 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .WaterCollector.Slots) + ) { this.logger.debug("Updating water collector area slots to a size of 1 + hideout management skill"); - this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.WATER_COLLECTOR, (1 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.WaterCollector.Slots), pmcProfile); + this.addEmptyObjectsToHideoutAreaSlots( + HideoutAreas.WATER_COLLECTOR, + 1 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .WaterCollector.Slots, + pmcProfile, + ); } - if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.AIR_FILTERING).slots.length < (3 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.AirFilteringUnit.Slots)) + if ( + pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.AIR_FILTERING).slots.length + < (3 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .AirFilteringUnit.Slots) + ) { this.logger.debug("Updating air filter area slots to a size of 3 + hideout management skill"); - this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.AIR_FILTERING, (3 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.AirFilteringUnit.Slots), pmcProfile); + this.addEmptyObjectsToHideoutAreaSlots( + HideoutAreas.AIR_FILTERING, + 3 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .AirFilteringUnit.Slots, + pmcProfile, + ); } // BTC Farm doesnt have extra slots for hideout management, but we still check for modded stuff!! - if (pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.BITCOIN_FARM).slots.length < (50 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.BitcoinFarm.Slots)) + if ( + pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.BITCOIN_FARM).slots.length + < (50 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .BitcoinFarm.Slots) + ) { this.logger.debug("Updating bitcoin farm area slots to a size of 50 + hideout management skill"); - this.addEmptyObjectsToHideoutAreaSlots(HideoutAreas.BITCOIN_FARM, (50 + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots.BitcoinFarm.Slots), pmcProfile); + this.addEmptyObjectsToHideoutAreaSlots( + HideoutAreas.BITCOIN_FARM, + 50 + + this.databaseServer.getTables().globals.config.SkillsSettings.HideoutManagement.EliteSlots + .BitcoinFarm.Slots, + pmcProfile, + ); } } @@ -120,7 +164,7 @@ export class ProfileFixerService protected addMissingGunStandContainerImprovements(pmcProfile: IPmcData): void { - const weaponStandArea = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WEAPON_STAND); + const weaponStandArea = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.WEAPON_STAND); if (!weaponStandArea || weaponStandArea.level === 0) { // No stand in profile or its level 0, skip @@ -128,8 +172,8 @@ export class ProfileFixerService } const db = this.databaseServer.getTables(); - const hideoutStandAreaDb = db.hideout.areas.find(x => x.type === HideoutAreas.WEAPON_STAND); - const hideoutStandSecondaryAreaDb = db.hideout.areas.find(x => x.parentArea === hideoutStandAreaDb._id); + const hideoutStandAreaDb = db.hideout.areas.find((x) => x.type === HideoutAreas.WEAPON_STAND); + const hideoutStandSecondaryAreaDb = db.hideout.areas.find((x) => x.parentArea === hideoutStandAreaDb._id); const stageCurrentAt = hideoutStandAreaDb.stages[weaponStandArea.level]; const hideoutStandStashId = pmcProfile.Inventory.hideoutAreaStashes[HideoutAreas.WEAPON_STAND]; const hideoutSecondaryStashId = pmcProfile.Inventory.hideoutAreaStashes[HideoutAreas.WEAPON_STAND_SECONDARY]; @@ -139,51 +183,69 @@ export class ProfileFixerService { // Value is missing, add it pmcProfile.Inventory.hideoutAreaStashes[HideoutAreas.WEAPON_STAND] = hideoutStandAreaDb._id; - pmcProfile.Inventory.hideoutAreaStashes[HideoutAreas.WEAPON_STAND_SECONDARY] = hideoutStandSecondaryAreaDb._id; + pmcProfile.Inventory.hideoutAreaStashes[HideoutAreas.WEAPON_STAND_SECONDARY] = + hideoutStandSecondaryAreaDb._id; // Add stash item to profile - const gunStandStashItem = pmcProfile.Inventory.items.find(x => x._id === hideoutStandAreaDb._id); + const gunStandStashItem = pmcProfile.Inventory.items.find((x) => x._id === hideoutStandAreaDb._id); if (gunStandStashItem) { gunStandStashItem._tpl = stageCurrentAt.container; - this.logger.debug(`Updated existing gun stand inventory stash: ${gunStandStashItem._id} tpl to ${stageCurrentAt.container}`); + this.logger.debug( + `Updated existing gun stand inventory stash: ${gunStandStashItem._id} tpl to ${stageCurrentAt.container}`, + ); } else { pmcProfile.Inventory.items.push({ _id: hideoutStandAreaDb._id, _tpl: stageCurrentAt.container }); - this.logger.debug(`Added missing gun stand inventory stash: ${hideoutStandAreaDb._id} tpl to ${stageCurrentAt.container}`); + this.logger.debug( + `Added missing gun stand inventory stash: ${hideoutStandAreaDb._id} tpl to ${stageCurrentAt.container}`, + ); } // Add secondary stash item to profile - const gunStandStashSecondaryItem = pmcProfile.Inventory.items.find(x => x._id === hideoutStandSecondaryAreaDb._id); + const gunStandStashSecondaryItem = pmcProfile.Inventory.items.find((x) => + x._id === hideoutStandSecondaryAreaDb._id + ); if (gunStandStashItem) { gunStandStashSecondaryItem._tpl = stageCurrentAt.container; - this.logger.debug(`Updated gun stand existing inventory secondary stash: ${gunStandStashSecondaryItem._id} tpl to ${stageCurrentAt.container}`); + this.logger.debug( + `Updated gun stand existing inventory secondary stash: ${gunStandStashSecondaryItem._id} tpl to ${stageCurrentAt.container}`, + ); } else { - pmcProfile.Inventory.items.push({ _id: hideoutStandSecondaryAreaDb._id, _tpl: stageCurrentAt.container }); - this.logger.debug(`Added missing gun stand inventory secondary stash: ${hideoutStandSecondaryAreaDb._id} tpl to ${stageCurrentAt.container}`); + pmcProfile.Inventory.items.push({ + _id: hideoutStandSecondaryAreaDb._id, + _tpl: stageCurrentAt.container, + }); + this.logger.debug( + `Added missing gun stand inventory secondary stash: ${hideoutStandSecondaryAreaDb._id} tpl to ${stageCurrentAt.container}`, + ); } return; } - const stashItem = pmcProfile.Inventory.items?.find(x => x._id === hideoutStandAreaDb._id); + const stashItem = pmcProfile.Inventory.items?.find((x) => x._id === hideoutStandAreaDb._id); // `hideoutAreaStashes` has value related stash inventory items tpl doesnt match what's expected if (hideoutStandStashId && stashItem?._tpl !== stageCurrentAt.container) { - this.logger.debug(`primary Stash tpl was: ${stashItem._tpl}, but should be ${stageCurrentAt.container}, updating`); + this.logger.debug( + `primary Stash tpl was: ${stashItem._tpl}, but should be ${stageCurrentAt.container}, updating`, + ); // The id inside the profile does not match what the hideout db value is, out of sync, adjust stashItem._tpl = stageCurrentAt.container; } - const stashSecondaryItem = pmcProfile.Inventory.items?.find(x => x._id === hideoutStandSecondaryAreaDb._id); + const stashSecondaryItem = pmcProfile.Inventory.items?.find((x) => x._id === hideoutStandSecondaryAreaDb._id); // `hideoutAreaStashes` has value related stash inventory items tpl doesnt match what's expected if (hideoutSecondaryStashId && stashSecondaryItem?._tpl !== stageCurrentAt.container) { - this.logger.debug(`Secondary stash tpl was: ${stashSecondaryItem._tpl}, but should be ${stageCurrentAt.container}, updating`); + this.logger.debug( + `Secondary stash tpl was: ${stashSecondaryItem._tpl}, but should be ${stageCurrentAt.container}, updating`, + ); // The id inside the profile does not match what the hideout db value is, out of sync, adjust stashSecondaryItem._tpl = stageCurrentAt.container; } @@ -192,10 +254,10 @@ export class ProfileFixerService protected ensureGunStandLevelsMatch(pmcProfile: IPmcData): void { // only proceed if stand is level 1 or above - const gunStandParent = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WEAPON_STAND); + const gunStandParent = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.WEAPON_STAND); if (gunStandParent && gunStandParent.level > 0) { - const gunStandChild = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WEAPON_STAND_SECONDARY); + const gunStandChild = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.WEAPON_STAND_SECONDARY); if (gunStandChild && gunStandParent.level !== gunStandChild.level) { this.logger.success("Upgraded gun stand levels to match"); @@ -203,7 +265,7 @@ export class ProfileFixerService } } } - + protected addHideoutAreaStashes(pmcProfile: IPmcData): void { if (!pmcProfile?.Inventory?.hideoutAreaStashes) @@ -215,36 +277,32 @@ export class ProfileFixerService protected addMissingHideoutWallAreas(pmcProfile: IPmcData): void { - if (!pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WEAPON_STAND)) + if (!pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.WEAPON_STAND)) { - pmcProfile.Hideout.Areas.push( - { - type: 24, - level: 0, - active: true, - passiveBonusesEnabled: true, - completeTime: 0, - constructing: false, - slots: [], - lastRecipe: "" - } - ); + pmcProfile.Hideout.Areas.push({ + type: 24, + level: 0, + active: true, + passiveBonusesEnabled: true, + completeTime: 0, + constructing: false, + slots: [], + lastRecipe: "", + }); } - if (!pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.WEAPON_STAND_SECONDARY)) + if (!pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.WEAPON_STAND_SECONDARY)) { - pmcProfile.Hideout.Areas.push( - { - type: 25, - level: 0, - active: true, - passiveBonusesEnabled: true, - completeTime: 0, - constructing: false, - slots: [], - lastRecipe: "" - } - ); + pmcProfile.Hideout.Areas.push({ + type: 25, + level: 0, + active: true, + passiveBonusesEnabled: true, + completeTime: 0, + constructing: false, + slots: [], + lastRecipe: "", + }); } } @@ -269,7 +327,7 @@ export class ProfileFixerService continue; } - const itemHandbookPrice = handbookPrices.find(x => x.Id === itemTpl); + const itemHandbookPrice = handbookPrices.find((x) => x.Id === itemTpl); if (!itemHandbookPrice) { continue; @@ -279,7 +337,7 @@ export class ProfileFixerService { if (fleaPrices[itemTpl] <= 1) { - continue; + continue; } // Price is over limit, adjust @@ -291,17 +349,14 @@ export class ProfileFixerService /** * Add tag to profile to indicate when it was made - * @param fullProfile + * @param fullProfile */ public addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void { if (!fullProfile.aki) { this.logger.debug("Adding aki object to profile"); - fullProfile.aki = { - version: this.watermark.getVersionTag(), - receivedGifts: [] - }; + fullProfile.aki = { version: this.watermark.getVersionTag(), receivedGifts: [] }; } } @@ -314,7 +369,7 @@ export class ProfileFixerService { if (pmcProfile.ConditionCounters) { - pmcProfile.ConditionCounters.Counters = pmcProfile.ConditionCounters.Counters.filter(c => c.qid !== null); + pmcProfile.ConditionCounters.Counters = pmcProfile.ConditionCounters.Counters.filter((c) => c.qid !== null); } } @@ -325,7 +380,7 @@ export class ProfileFixerService return; } - // only add if other traders exist, means this is pre-patch 13 profile + // only add if other traders exist, means this is pre-patch 13 profile if (!pmcProfile.TradersInfo[Traders.LIGHTHOUSEKEEPER] && Object.keys(pmcProfile.TradersInfo).length > 0) { this.logger.warning("Added missing Lighthouse keeper trader to pmc profile"); @@ -335,7 +390,7 @@ export class ProfileFixerService salesSum: 0, standing: 0.2, loyaltyLevel: 1, - nextResupply: this.timeUtil.getTimestamp() + 3600 // now + 1 hour + nextResupply: this.timeUtil.getTimestamp() + 3600, // now + 1 hour }; } } @@ -345,9 +400,7 @@ export class ProfileFixerService if (!pmcProfile.UnlockedInfo) { this.logger.debug("Adding UnlockedInfo object to profile"); - pmcProfile.UnlockedInfo = { - unlockedProductionRecipe: [] - }; + pmcProfile.UnlockedInfo = { unlockedProductionRecipe: [] }; } } @@ -361,11 +414,11 @@ export class ProfileFixerService { if (pmcProfile.RepeatableQuests && activeQuests.length > 0) { - const existsInActiveRepeatableQuests = activeQuests.some(x => x._id === backendCounter.qid); - const existsInQuests = pmcProfile.Quests.some(q => q.qid === backendCounter.qid); - + const existsInActiveRepeatableQuests = activeQuests.some((x) => x._id === backendCounter.qid); + const existsInQuests = pmcProfile.Quests.some((q) => q.qid === backendCounter.qid); + // if BackendCounter's quest is neither in activeQuests nor Quests it's stale - if (!existsInActiveRepeatableQuests && !existsInQuests) + if (!(existsInActiveRepeatableQuests || existsInQuests)) { counterKeysToRemove.push(key); } @@ -375,7 +428,7 @@ export class ProfileFixerService for (const counterKeyToRemove of counterKeysToRemove) { this.logger.debug(`Removed ${counterKeyToRemove} backend count object`); - delete pmcProfile.BackendCounters[counterKeyToRemove]; + delete pmcProfile.BackendCounters[counterKeyToRemove]; } } } @@ -383,7 +436,7 @@ export class ProfileFixerService protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[] { let activeQuests = []; - repeatableQuests?.forEach(x => + repeatableQuests?.forEach((x) => { if (x.activeQuests.length > 0) { @@ -400,7 +453,7 @@ export class ProfileFixerService for (const traderId in pmcProfile.TradersInfo) { const trader = pmcProfile.TradersInfo[traderId]; - if (trader && trader.salesSum === null) + if (trader && trader.salesSum === null) { this.logger.warning(`trader ${traderId} has a null salesSum value, resetting to 0`); trader.salesSum = 0; @@ -410,9 +463,9 @@ export class ProfileFixerService protected addMissingBonusesProperty(pmcProfile: IPmcData): void { - if (typeof pmcProfile["Bonuses"] === "undefined") + if (typeof pmcProfile.Bonuses === "undefined") { - pmcProfile["Bonuses"] = []; + pmcProfile.Bonuses = []; this.logger.debug("Missing Bonuses property added to profile"); } } @@ -430,7 +483,7 @@ export class ProfileFixerService return; } - const fixes = new Map(); + const fixes = new Map(); const questsToDelete: IQuestStatus[] = []; const fullProfile = this.profileHelper.getFullProfile(pmcProfile.sessionId); const isDevProfile = fullProfile?.info.edition.toLowerCase() === "spt developer"; @@ -448,9 +501,13 @@ export class ProfileFixerService if (quest.status && !Number(quest.status)) { if (fixes.has(quest.status)) + { fixes.set(quest.status, fixes.get(quest.status) + 1); + } else + { fixes.set(quest.status, 1); + } const newQuestStatus = QuestStatus[quest.status]; quest.status = newQuestStatus; @@ -461,7 +518,7 @@ export class ProfileFixerService { const newKey = QuestStatus[statusTimer]; quest.statusTimers[newKey] = quest.statusTimers[statusTimer]; - delete quest.statusTimers[statusTimer]; + delete quest.statusTimers[statusTimer]; } } } @@ -473,7 +530,13 @@ export class ProfileFixerService } if (fixes.size > 0) - this.logger.debug(`Updated quests values: ${Array.from(fixes.entries()).map(([k, v]) => `(${k}: ${v} times)`).join(", ")}`); + { + this.logger.debug( + `Updated quests values: ${ + Array.from(fixes.entries()).map(([k, v]) => `(${k}: ${v} times)`).join(", ") + }`, + ); + } } protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void @@ -484,8 +547,10 @@ export class ProfileFixerService for (const currentRepeatable of pmcProfile.RepeatableQuests) { if ( - !(currentRepeatable.changeRequirement && - currentRepeatable.activeQuests.every(x => (typeof x.changeCost !== "undefined" && typeof x.changeStandingCost !== "undefined"))) + !(currentRepeatable.changeRequirement + && currentRepeatable.activeQuests.every(( + x, + ) => (typeof x.changeCost !== "undefined" && typeof x.changeStandingCost !== "undefined"))) ) { repeatablesCompatible = false; @@ -506,8 +571,10 @@ export class ProfileFixerService */ protected addMissingWallImprovements(pmcProfile: IPmcData): void { - const profileWallArea = pmcProfile.Hideout.Areas.find(x => x.type === HideoutAreas.EMERGENCY_WALL); - const wallDb = this.databaseServer.getTables().hideout.areas.find(x => x.type === HideoutAreas.EMERGENCY_WALL); + const profileWallArea = pmcProfile.Hideout.Areas.find((x) => x.type === HideoutAreas.EMERGENCY_WALL); + const wallDb = this.databaseServer.getTables().hideout.areas.find((x) => + x.type === HideoutAreas.EMERGENCY_WALL + ); if (profileWallArea.level > 0) { @@ -531,7 +598,7 @@ export class ProfileFixerService pmcProfile.Hideout.Improvement[improvement.id] = { completed: true, - improveCompleteTimestamp: this.timeUtil.getTimestamp() + i // add some variability + improveCompleteTimestamp: this.timeUtil.getTimestamp() + i, // add some variability }; this.logger.debug(`Added wall improvement ${improvement.id} to profile`); @@ -555,13 +622,13 @@ export class ProfileFixerService } // Only slots with location index - area.slots = area.slots.filter(x => "locationIndex" in x); + area.slots = area.slots.filter((x) => "locationIndex" in x); // Only slots that: // Have an item property and it has at least one item in it // Or // Have no item property - area.slots = area.slots.filter(x => "item" in x && x.item?.length > 0 || !("item" in x)); + area.slots = area.slots.filter((x) => "item" in x && x.item?.length > 0 || !("item" in x)); } } @@ -571,24 +638,29 @@ export class ProfileFixerService */ protected reorderHideoutAreasWithResouceInputs(pmcProfile: IPmcData): void { - const areasToCheck = [HideoutAreas.AIR_FILTERING, HideoutAreas.GENERATOR, HideoutAreas.BITCOIN_FARM, HideoutAreas.WATER_COLLECTOR]; + const areasToCheck = [ + HideoutAreas.AIR_FILTERING, + HideoutAreas.GENERATOR, + HideoutAreas.BITCOIN_FARM, + HideoutAreas.WATER_COLLECTOR, + ]; for (const areaId of areasToCheck) { - const area = pmcProfile.Hideout.Areas.find(x => x.type === areaId); + const area = pmcProfile.Hideout.Areas.find((x) => x.type === areaId); if (!area) { this.logger.debug(`unable to sort ${areaId} slots, no area found`); continue; } - if (!area.slots || area.slots.length === 0) + if (!area.slots || area.slots.length === 0) { this.logger.debug(`unable to sort ${areaId} slots, no slots found`); continue; } - area.slots = area.slots.sort( (a, b) => + area.slots = area.slots.sort((a, b) => { return a.locationIndex > b.locationIndex ? 1 : -1; }); @@ -600,10 +672,13 @@ export class ProfileFixerService * @param areaType area to check * @param pmcProfile profile to update */ - protected addEmptyObjectsToHideoutAreaSlots(areaType: HideoutAreas, emptyItemCount: number, pmcProfile: IPmcData): void + protected addEmptyObjectsToHideoutAreaSlots( + areaType: HideoutAreas, + emptyItemCount: number, + pmcProfile: IPmcData, + ): void { - - const area = pmcProfile.Hideout.Areas.find(x => x.type === areaType); + const area = pmcProfile.Hideout.Areas.find((x) => x.type === areaType); area.slots = this.addObjectsToArray(emptyItemCount, area.slots); } @@ -611,23 +686,22 @@ export class ProfileFixerService { for (let i = 0; i < count; i++) { - if (!slots.find(x => x.locationIndex === i)) + if (!slots.find((x) => x.locationIndex === i)) { - slots.push({locationIndex: i}); + slots.push({ locationIndex: i }); } } return slots; - } /** * In 18876 bsg changed the pockets tplid to be one that has 3 additional special slots - * @param pmcProfile + * @param pmcProfile */ protected updateProfilePocketsToNewId(pmcProfile: IPmcData): void { - const pocketItem = pmcProfile.Inventory?.items?.find(x => x.slotId === "Pockets"); + const pocketItem = pmcProfile.Inventory?.items?.find((x) => x.slotId === "Pockets"); if (pocketItem) { if (pocketItem._tpl === "557ffd194bdc2d28148b457f") @@ -667,7 +741,7 @@ export class ProfileFixerService } // Iterate over area levels, check for bonuses, add if needed - const dbArea = dbHideoutAreas.find(x => x.type === areaType); + const dbArea = dbHideoutAreas.find((x) => x.type === areaType); if (!dbArea) { continue; @@ -690,16 +764,19 @@ export class ProfileFixerService if (!profileBonus) { // no bonus, add to profile - this.logger.debug(`Profile has level ${level} area ${HideoutAreas[area.type]} but no bonus found, adding ${bonus.type}`); + this.logger.debug( + `Profile has level ${level} area ${ + HideoutAreas[area.type] + } but no bonus found, adding ${bonus.type}`, + ); this.hideoutHelper.applyPlayerUpgradesBonuses(pmcProfile, bonus); } - } + } } } } /** - * * @param profileBonuses bonuses from profile * @param bonus bonus to find * @returns matching bonus @@ -709,27 +786,22 @@ export class ProfileFixerService // match by id first, used by "TextBonus" bonuses if (bonus.id) { - return profileBonuses.find(x => x.id === bonus.id); + return profileBonuses.find((x) => x.id === bonus.id); } if (bonus.type.toLowerCase() === "stashsize") { - return profileBonuses.find( - x => x.type === bonus.type - && x.templateId === bonus.templateId); + return profileBonuses.find((x) => x.type === bonus.type && x.templateId === bonus.templateId); } if (bonus.type.toLowerCase() === "additionalslots") { - return profileBonuses.find( - x => x.type === bonus.type - && x.value === bonus.value - && x.visible === bonus.visible); + return profileBonuses.find((x) => + x.type === bonus.type && x.value === bonus.value && x.visible === bonus.visible + ); } - return profileBonuses.find( - x => x.type === bonus.type - && x.value === bonus.value); + return profileBonuses.find((x) => x.type === bonus.type && x.value === bonus.value); } /** @@ -744,7 +816,7 @@ export class ProfileFixerService // Get items placed in root of stash // TODO: extend to other areas / sub items - const inventoryItemsToCheck = pmcProfile.Inventory.items.filter(x => ["hideout", "main"].includes(x.slotId)); + const inventoryItemsToCheck = pmcProfile.Inventory.items.filter((x) => ["hideout", "main"].includes(x.slotId)); if (!inventoryItemsToCheck) { return; @@ -759,7 +831,9 @@ export class ProfileFixerService if (this.coreConfig.fixes.removeModItemsFromProfile) { - this.logger.success(`Deleting item from inventory and insurance with id: ${item._id} tpl: ${item._tpl}`); + this.logger.success( + `Deleting item from inventory and insurance with id: ${item._id} tpl: ${item._tpl}`, + ); // Also deletes from insured array this.inventoryHelper.removeItem(pmcProfile, item._id, sessionId); @@ -780,7 +854,9 @@ export class ProfileFixerService if (this.coreConfig.fixes.removeModItemsFromProfile) { delete fullProfile.userbuilds.weaponBuilds[buildId]; - this.logger.warning(`Item: ${item._tpl} has resulted in the deletion of weapon build: ${buildId}`); + this.logger.warning( + `Item: ${item._tpl} has resulted in the deletion of weapon build: ${buildId}`, + ); } break; @@ -823,8 +899,10 @@ export class ProfileFixerService if (this.coreConfig.fixes.removeModItemsFromProfile) { - dialog.messages.splice(dialog.messages.findIndex(x => x._id === message._id), 1); - this.logger.warning(`Item: ${item._tpl} has resulted in the deletion of message: ${message._id} from dialog ${dialogId}`); + dialog.messages.splice(dialog.messages.findIndex((x) => x._id === message._id), 1); + this.logger.warning( + `Item: ${item._tpl} has resulted in the deletion of message: ${message._id} from dialog ${dialogId}`, + ); } break; @@ -856,8 +934,13 @@ export class ProfileFixerService this.logger.error(this.localisationService.getText("fixer-mod_item_found", activeQuest.traderId)); if (this.coreConfig.fixes.removeModItemsFromProfile) { - this.logger.warning(`Non-default quest: ${activeQuest._id} from trader: ${activeQuest.traderId} removed from RepeatableQuests list in profile`); - repeatable.activeQuests.splice(repeatable.activeQuests.findIndex(x => x._id === activeQuest._id), 1); + this.logger.warning( + `Non-default quest: ${activeQuest._id} from trader: ${activeQuest.traderId} removed from RepeatableQuests list in profile`, + ); + repeatable.activeQuests.splice( + repeatable.activeQuests.findIndex((x) => x._id === activeQuest._id), + 1, + ); } continue; @@ -871,11 +954,18 @@ export class ProfileFixerService { if (!itemsDb[rewardItem._tpl]) { - this.logger.error(this.localisationService.getText("fixer-mod_item_found", rewardItem._tpl)); + this.logger.error( + this.localisationService.getText("fixer-mod_item_found", rewardItem._tpl), + ); if (this.coreConfig.fixes.removeModItemsFromProfile) { - this.logger.warning(`Non-default quest: ${activeQuest._id} from trader: ${activeQuest.traderId} removed from RepeatableQuests list in profile`); - repeatable.activeQuests.splice(repeatable.activeQuests.findIndex(x => x._id === activeQuest._id), 1); + this.logger.warning( + `Non-default quest: ${activeQuest._id} from trader: ${activeQuest.traderId} removed from RepeatableQuests list in profile`, + ); + repeatable.activeQuests.splice( + repeatable.activeQuests.findIndex((x) => x._id === activeQuest._id), + 1, + ); } } } @@ -897,7 +987,7 @@ export class ProfileFixerService } } } - + /** * Add `Improvements` object to hideout if missing - added in eft 13.0.21469 * @param pmcProfile profile to update @@ -916,7 +1006,7 @@ export class ProfileFixerService */ public addMissingHideoutAreasToProfile(fullProfile: IAkiProfile): void { - const pmcProfile = fullProfile.characters["pmc"]; + const pmcProfile = fullProfile.characters.pmc; // No profile, probably new account being created if (!pmcProfile?.Hideout) { @@ -938,7 +1028,7 @@ export class ProfileFixerService // Get all areas from templates/profiles.json for (const area of profileTemplate.character.Hideout.Areas) { - if (!pmcProfile.Hideout.Areas.find(x => x.type === area.type)) + if (!pmcProfile.Hideout.Areas.find((x) => x.type === area.type)) { pmcProfile.Hideout.Areas.push(area); this.logger.debug(`Added missing hideout area ${area.type} to profile`); @@ -956,7 +1046,7 @@ export class ProfileFixerService { if (prodKey.startsWith("ScavCase")) { - delete pmcProfile.Hideout.Production[prodKey]; + delete pmcProfile.Hideout.Production[prodKey]; } } } @@ -969,7 +1059,7 @@ export class ProfileFixerService public fixIncorrectAidValue(fullProfile: IAkiProfile): void { // Not a number, regenerate - if (isNaN(fullProfile.characters.pmc.aid)) + if (Number.isNaN(fullProfile.characters.pmc.aid)) { fullProfile.characters.pmc.sessionId = fullProfile.characters.pmc.aid; fullProfile.characters.pmc.aid = this.hashUtil.generateAccountId(); @@ -979,7 +1069,9 @@ export class ProfileFixerService fullProfile.info.aid = fullProfile.characters.pmc.aid; - this.logger.debug(`Migrated AccountId from: ${fullProfile.characters.pmc.sessionId} to: ${fullProfile.characters.pmc.aid}`); + this.logger.debug( + `Migrated AccountId from: ${fullProfile.characters.pmc.sessionId} to: ${fullProfile.characters.pmc.aid}`, + ); } } @@ -996,7 +1088,7 @@ export class ProfileFixerService const statsCopy = this.jsonUtil.clone(fullProfile.characters.pmc.Stats); // Clear stats object - fullProfile.characters.pmc.Stats = {Eft: null}; + fullProfile.characters.pmc.Stats = { Eft: null }; fullProfile.characters.pmc.Stats.Eft = statsCopy; } @@ -1019,12 +1111,14 @@ export class ProfileFixerService // Bonus lacks id, find matching hideout area / stage / bonus for (const area of this.databaseServer.getTables().hideout.areas) - { + { // TODO: skip if no stages for (const stageIndex in area.stages) { const stageInfo = area.stages[stageIndex]; - const matchingBonus = stageInfo.bonuses.find(x => x.templateId === bonus.templateId && x.type === bonus.type); + const matchingBonus = stageInfo.bonuses.find((x) => + x.templateId === bonus.templateId && x.type === bonus.type + ); if (matchingBonus) { // Add id to bonus, flag bonus as found and exit stage loop @@ -1051,12 +1145,12 @@ export class ProfileFixerService */ protected migrateImprovements(pmcProfile: IPmcData): void { - if (pmcProfile.Hideout["Improvements"]) + if ("Improvements" in pmcProfile.Hideout) { - // Correct name is `Improvement` - pmcProfile.Hideout.Improvement = this.jsonUtil.clone(pmcProfile.Hideout["Improvements"]); - delete pmcProfile.Hideout["Improvements"]; + const improvements = pmcProfile.Hideout.Improvements as Record; + pmcProfile.Hideout.Improvement = this.jsonUtil.clone(improvements); + delete pmcProfile.Hideout.Improvements; this.logger.success("Successfully migrated hideout Improvements data to new location, deleted old data"); } } -} \ No newline at end of file +} diff --git a/project/src/services/ProfileSnapshotService.ts b/project/src/services/ProfileSnapshotService.ts index b8dfc36d..f1ffe7c5 100644 --- a/project/src/services/ProfileSnapshotService.ts +++ b/project/src/services/ProfileSnapshotService.ts @@ -8,11 +8,9 @@ export class ProfileSnapshotService { protected storedProfileSnapshots: Record = {}; - constructor( - @inject("JsonUtil") protected jsonUtil: JsonUtil - ) + constructor(@inject("JsonUtil") protected jsonUtil: JsonUtil) {} - + /** * Store a profile into an in-memory object * @param sessionID session id - acts as the key @@ -61,4 +59,4 @@ export class ProfileSnapshotService { delete this.storedProfileSnapshots[sessionID]; } -} \ No newline at end of file +} diff --git a/project/src/services/RagfairCategoriesService.ts b/project/src/services/RagfairCategoriesService.ts index 1ee6cb64..5a1196bd 100644 --- a/project/src/services/RagfairCategoriesService.ts +++ b/project/src/services/RagfairCategoriesService.ts @@ -8,16 +8,14 @@ export class RagfairCategoriesService { protected categories: Record = {}; - constructor( - @inject("WinstonLogger") protected logger: ILogger - ) - { } + constructor(@inject("WinstonLogger") protected logger: ILogger) + {} /** * Get all flea categories and their count of offers * @returns item categories and count */ - public getAllCategories(): Record + public getAllCategories(): Record { return this.categories; } @@ -26,7 +24,7 @@ export class RagfairCategoriesService * With the supplied items, get custom categories * @returns a custom list of categories */ - public getBespokeCategories(offers: IRagfairOffer[]): Record + public getBespokeCategories(offers: IRagfairOffer[]): Record { return this.processOffersIntoCategories(offers); } @@ -36,7 +34,7 @@ export class RagfairCategoriesService * @param offers ragfair offers * @returns categories and count */ - protected processOffersIntoCategories(offers: IRagfairOffer[]): Record + protected processOffersIntoCategories(offers: IRagfairOffer[]): Record { const result = {}; for (const offer of offers) @@ -53,14 +51,12 @@ export class RagfairCategoriesService * @param categories Categories to update * @param increment (Optional) Should item be incremented or decremented */ - protected addOrIncrementCategory(offer: IRagfairOffer, categories: Record, increment = true ): void + protected addOrIncrementCategory(offer: IRagfairOffer, categories: Record, increment = true): void { const itemId = offer.items[0]._tpl; if (increment) { - categories[itemId] = categories[itemId] - ? categories[itemId] + 1 - : 1; + categories[itemId] = categories[itemId] ? categories[itemId] + 1 : 1; } else { @@ -80,7 +76,7 @@ export class RagfairCategoriesService /** * Increase category count by 1 - * @param offer + * @param offer */ public incrementCategory(offer: IRagfairOffer): void { @@ -90,11 +86,11 @@ export class RagfairCategoriesService /** * Reduce category count by 1 - * @param offer + * @param offer */ public decrementCategory(offer: IRagfairOffer): void { this.addOrIncrementCategory(offer, this.categories, false); this.categories[offer.items[0]._tpl]--; } -} \ No newline at end of file +} diff --git a/project/src/services/RagfairLinkedItemService.ts b/project/src/services/RagfairLinkedItemService.ts index de08ac68..b881cdc0 100644 --- a/project/src/services/RagfairLinkedItemService.ts +++ b/project/src/services/RagfairLinkedItemService.ts @@ -12,9 +12,9 @@ export class RagfairLinkedItemService constructor( @inject("DatabaseServer") protected databaseServer: DatabaseServer, - @inject("ItemHelper") protected itemHelper: ItemHelper + @inject("ItemHelper") protected itemHelper: ItemHelper, ) - { } + {} public getLinkedItems(linkedSearchId: string): Set { @@ -34,7 +34,7 @@ export class RagfairLinkedItemService public getLinkedDbItems(itemTpl: string): ITemplateItem[] { const linkedItemsToWeaponTpls = this.getLinkedItems(itemTpl); - return [...linkedItemsToWeaponTpls].map(x => + return [...linkedItemsToWeaponTpls].map((x) => { const itemDetails = this.itemHelper.getItem(x); return itemDetails[1]; @@ -88,11 +88,14 @@ export class RagfairLinkedItemService /** * Add ammo to revolvers linked item dictionary * @param cylinder Revolvers cylinder - * @param applyLinkedItems + * @param applyLinkedItems */ - protected addRevolverCylinderAmmoToLinkedItems(cylinder: ITemplateItem, applyLinkedItems: (items: string[]) => void): void + protected addRevolverCylinderAmmoToLinkedItems( + cylinder: ITemplateItem, + applyLinkedItems: (items: string[]) => void, + ): void { - const cylinderMod = cylinder._props.Slots.find(x => x._name === "mod_magazine"); + const cylinderMod = cylinder._props.Slots.find((x) => x._name === "mod_magazine"); if (cylinderMod) { // Get the first cylinder filter tpl @@ -108,8 +111,8 @@ export class RagfairLinkedItemService /** * Scans a given slot type for filters and returns them as a Set - * @param item - * @param slot + * @param item + * @param slot * @returns array of ids */ protected getFilters(item: ITemplateItem, slot: string): string[] @@ -140,4 +143,4 @@ export class RagfairLinkedItemService return filters; } -} \ No newline at end of file +} diff --git a/project/src/services/RagfairOfferService.ts b/project/src/services/RagfairOfferService.ts index 4392bab0..c011cde0 100644 --- a/project/src/services/RagfairOfferService.ts +++ b/project/src/services/RagfairOfferService.ts @@ -38,7 +38,7 @@ export class RagfairOfferService @inject("EventOutputHolder") protected eventOutputHolder: EventOutputHolder, @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -113,12 +113,14 @@ export class RagfairOfferService * Remove an offer from ragfair by offer id * @param offerId Offer id to remove */ - public removeOfferById(offerId: string): void + public removeOfferById(offerId: string): void { const offer = this.ragfairOfferHandler.getOfferById(offerId); if (!offer) { - this.logger.warning(this.localisationService.getText("ragfair-unable_to_remove_offer_doesnt_exist", offerId)); + this.logger.warning( + this.localisationService.getText("ragfair-unable_to_remove_offer_doesnt_exist", offerId), + ); return; } @@ -171,13 +173,13 @@ export class RagfairOfferService for (const sessionID in this.saveServer.getProfiles()) { const pmcData = this.saveServer.getProfile(sessionID).characters.pmc; - + if (pmcData.RagfairInfo === undefined || pmcData.RagfairInfo.offers === undefined) { // Profile is wiped continue; } - + this.ragfairOfferHandler.addOffers(pmcData.RagfairInfo.offers); } this.playerOffersLoaded = true; @@ -187,9 +189,7 @@ export class RagfairOfferService public expireStaleOffers(): void { const time = this.timeUtil.getTimestamp(); - this.ragfairOfferHandler - .getStaleOffers(time) - .forEach(o => this.processStaleOffer(o)); + this.ragfairOfferHandler.getStaleOffers(time).forEach((o) => this.processStaleOffer(o)); } /** @@ -234,12 +234,15 @@ export class RagfairOfferService const pmcID = String(offer.user.id); const profile = this.profileHelper.getProfileByPmcId(pmcID); const sessionID = profile.sessionId; - const offerIndex = profile.RagfairInfo.offers.findIndex(o => o._id === offer._id); + const offerIndex = profile.RagfairInfo.offers.findIndex((o) => o._id === offer._id); if (offerIndex === -1) { this.logger.warning(this.localisationService.getText("ragfair-unable_to_find_offer_to_remove", offer._id)); - return this.httpResponse.appendErrorToOutput(this.eventOutputHolder.getOutput(sessionID), this.localisationService.getText("ragfair-offer_not_found_in_profile_short")); + return this.httpResponse.appendErrorToOutput( + this.eventOutputHolder.getOutput(sessionID), + this.localisationService.getText("ragfair-offer_not_found_in_profile_short"), + ); } profile.RagfairInfo.rating -= this.ragfairConfig.sell.reputation.loss; diff --git a/project/src/services/RagfairPriceService.ts b/project/src/services/RagfairPriceService.ts index 77699e5a..dafd135d 100644 --- a/project/src/services/RagfairPriceService.ts +++ b/project/src/services/RagfairPriceService.ts @@ -29,10 +29,7 @@ export class RagfairPriceService implements OnLoad protected generatedDynamicPrices: boolean; protected generatedStaticPrices: boolean; - protected prices: IRagfairServerPrices = { - static: {}, - dynamic: {} - }; + protected prices: IRagfairServerPrices = { static: {}, dynamic: {} }; constructor( @inject("HandbookHelper") protected handbookHelper: HandbookHelper, @@ -43,7 +40,7 @@ export class RagfairPriceService implements OnLoad @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("RandomUtil") protected randomUtil: RandomUtil, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); @@ -52,7 +49,7 @@ export class RagfairPriceService implements OnLoad /** * Generate static (handbook) and dynamic (prices.json) flea prices, store inside class as dictionaries */ - public async onLoad(): Promise + public async onLoad(): Promise { if (!this.generatedStaticPrices) { @@ -67,7 +64,7 @@ export class RagfairPriceService implements OnLoad } } - public getRoute(): string + public getRoute(): string { return "RagfairPriceService"; } @@ -77,7 +74,11 @@ export class RagfairPriceService implements OnLoad */ public generateStaticPrices(): void { - for (const item of Object.values(this.databaseServer.getTables().templates.items).filter(x => x._type === "Item")) + for ( + const item of Object.values(this.databaseServer.getTables().templates.items).filter((x) => + x._type === "Item" + ) + ) { this.prices.static[item._id] = Math.round(this.handbookHelper.getTemplatePrice(item._id)); } @@ -103,7 +104,9 @@ export class RagfairPriceService implements OnLoad let itemPrice = this.getDynamicPriceForItem(tplId) || this.getStaticPriceForItem(tplId); if (itemPrice === undefined) { - this.logger.warning(this.localisationService.getText("ragfair-unable_to_find_item_price_for_item_in_flea_handbook", tplId)); + this.logger.warning( + this.localisationService.getText("ragfair-unable_to_find_item_price_for_item_in_flea_handbook", tplId), + ); } // If no price in dynamic/static, set to 1 @@ -155,7 +158,7 @@ export class RagfairPriceService implements OnLoad public getAllStaticPrices(): Record { - return {...this.prices.static}; + return { ...this.prices.static }; } /** @@ -171,7 +174,7 @@ export class RagfairPriceService implements OnLoad /** * Get the rouble price for an assorts barter scheme - * @param barterScheme + * @param barterScheme * @returns Rouble price */ public getBarterPrice(barterScheme: IBarterScheme[]): number @@ -180,7 +183,7 @@ export class RagfairPriceService implements OnLoad for (const item of barterScheme) { - price += (this.prices.static[item._tpl] * item.count); + price += this.prices.static[item._tpl] * item.count; } return Math.round(price); @@ -219,7 +222,7 @@ export class RagfairPriceService implements OnLoad itemPrice = traderPrice; } } - + // Check if item type is weapon preset, handle differently const itemDetails = this.itemHelper.getItem(item._tpl); if (this.presetHelper.isPreset(item._id) && itemDetails[1]._props.weapFireType) @@ -248,7 +251,7 @@ export class RagfairPriceService implements OnLoad const rangeValues = this.getOfferTypeRangeValues(isPreset, isPackOffer); price = this.randomiseOfferPrice(price, rangeValues); - + if (price < 1) { price = 1; @@ -291,12 +294,16 @@ export class RagfairPriceService implements OnLoad const priceDifferencePercent = this.getPriceDifference(itemHandbookPrice, itemPrice); // Only adjust price if difference is > a percent AND item price passes threshhold set in config - if (priceDifferencePercent > this.ragfairConfig.dynamic.offerAdjustment.maxPriceDifferenceBelowHandbookPercent - && itemPrice >= this.ragfairConfig.dynamic.offerAdjustment.priceThreshholdRub) + if ( + priceDifferencePercent > this.ragfairConfig.dynamic.offerAdjustment.maxPriceDifferenceBelowHandbookPercent + && itemPrice >= this.ragfairConfig.dynamic.offerAdjustment.priceThreshholdRub + ) { - //const itemDetails = this.itemHelper.getItem(itemTpl); - //this.logger.debug(`item below handbook price ${itemDetails[1]._name} handbook: ${itemHandbookPrice} flea: ${itemPrice} ${priceDifferencePercent}%`); - itemPrice = Math.round(itemHandbookPrice * this.ragfairConfig.dynamic.offerAdjustment.handbookPriceMultipier); + // const itemDetails = this.itemHelper.getItem(itemTpl); + // this.logger.debug(`item below handbook price ${itemDetails[1]._name} handbook: ${itemHandbookPrice} flea: ${itemPrice} ${priceDifferencePercent}%`); + itemPrice = Math.round( + itemHandbookPrice * this.ragfairConfig.dynamic.offerAdjustment.handbookPriceMultipier, + ); } return itemPrice; @@ -344,7 +351,9 @@ export class RagfairPriceService implements OnLoad } // Get mods on current gun not in default preset - const newOrReplacedModsInPresetVsDefault = items.filter(x => !presetResult.preset._items.some(y => y._tpl === x._tpl)); + const newOrReplacedModsInPresetVsDefault = items.filter((x) => + !presetResult.preset._items.some((y) => y._tpl === x._tpl) + ); // Add up extra mods price let extraModsPrice = 0; @@ -358,7 +367,9 @@ export class RagfairPriceService implements OnLoad if (newOrReplacedModsInPresetVsDefault.length >= 1) { // Add up cost of mods replaced - const modsReplacedByNewMods = newOrReplacedModsInPresetVsDefault.filter(x => presetResult.preset._items.some(y => y.slotId === x.slotId)); + const modsReplacedByNewMods = newOrReplacedModsInPresetVsDefault.filter((x) => + presetResult.preset._items.some((y) => y.slotId === x.slotId) + ); // Add up replaced mods price let replacedModsPrice = 0; @@ -398,29 +409,31 @@ export class RagfairPriceService implements OnLoad * @param presets weapon presets to choose from * @returns Default preset object */ - protected getWeaponPreset(presets: IPreset[], weapon: Item): {isDefault: boolean, preset: IPreset} + protected getWeaponPreset(presets: IPreset[], weapon: Item): { isDefault: boolean; preset: IPreset; } { - const defaultPreset = presets.find(x => x._encyclopedia); + const defaultPreset = presets.find((x) => x._encyclopedia); if (defaultPreset) { - return { - isDefault: true, - preset: defaultPreset - }; + return { isDefault: true, preset: defaultPreset }; } if (presets.length === 1) { - this.logger.debug(`Item Id: ${weapon._tpl} has no default encyclopedia entry but only one preset (${presets[0]._name}), choosing preset (${presets[0]._name})`); + this.logger.debug( + `Item Id: ${weapon._tpl} has no default encyclopedia entry but only one preset (${ + presets[0]._name + }), choosing preset (${presets[0]._name})`, + ); } else { - this.logger.debug(`Item Id: ${weapon._tpl} has no default encyclopedia entry, choosing first preset (${presets[0]._name}) of ${presets.length}`); + this.logger.debug( + `Item Id: ${weapon._tpl} has no default encyclopedia entry, choosing first preset (${ + presets[0]._name + }) of ${presets.length}`, + ); } - return { - isDefault: false, - preset: presets[0] - }; + return { isDefault: false, preset: presets[0] }; } -} \ No newline at end of file +} diff --git a/project/src/services/RagfairRequiredItemsService.ts b/project/src/services/RagfairRequiredItemsService.ts index 8adc0efd..23e90891 100644 --- a/project/src/services/RagfairRequiredItemsService.ts +++ b/project/src/services/RagfairRequiredItemsService.ts @@ -12,9 +12,9 @@ export class RagfairRequiredItemsService constructor( @inject("WinstonLogger") protected logger: ILogger, @inject("PaymentHelper") protected paymentHelper: PaymentHelper, - @inject("RagfairOfferService") protected ragfairOfferService: RagfairOfferService + @inject("RagfairOfferService") protected ragfairOfferService: RagfairOfferService, ) - { } + {} public getRequiredItemsById(searchId: string): any { @@ -50,5 +50,4 @@ export class RagfairRequiredItemsService this.requiredItemsCache = requiredItems; } - -} \ No newline at end of file +} diff --git a/project/src/services/RagfairTaxService.ts b/project/src/services/RagfairTaxService.ts index e4e6fb48..566366d4 100644 --- a/project/src/services/RagfairTaxService.ts +++ b/project/src/services/RagfairTaxService.ts @@ -18,9 +18,9 @@ export class RagfairTaxService @inject("WinstonLogger") protected logger: ILogger, @inject("DatabaseServer") protected databaseServer: DatabaseServer, @inject("RagfairPriceService") protected ragfairPriceService: RagfairPriceService, - @inject("ItemHelper") protected itemHelper: ItemHelper + @inject("ItemHelper") protected itemHelper: ItemHelper, ) - { } + {} public storeClientOfferTaxValue(sessionId: string, offer: IStorePlayerOfferTaxAmountRequestData): void { @@ -39,7 +39,13 @@ export class RagfairTaxService // This method, along with calculateItemWorth, is trying to mirror the client-side code found in the method "CalculateTaxPrice". // It's structured to resemble the client-side code as closely as possible - avoid making any big structure changes if it's not necessary. - public calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number + public calculateTax( + item: Item, + pmcData: IPmcData, + requirementsValue: number, + offerItemCount: number, + sellInOnePiece: boolean, + ): number { if (!requirementsValue) { @@ -56,29 +62,33 @@ export class RagfairTaxService const requirementsPrice = requirementsValue * (sellInOnePiece ? 1 : offerItemCount); const itemTaxMult = this.databaseServer.getTables().globals.config.RagFair.communityItemTax / 100.0; - const requirementTaxMult = this.databaseServer.getTables().globals.config.RagFair.communityRequirementTax / 100.0; + const requirementTaxMult = this.databaseServer.getTables().globals.config.RagFair.communityRequirementTax + / 100.0; let itemPriceMult = Math.log10(itemWorth / requirementsPrice); let requirementPriceMult = Math.log10(requirementsPrice / itemWorth); if (requirementsPrice >= itemWorth) { - requirementPriceMult = Math.pow(requirementPriceMult, 1.08); + requirementPriceMult = requirementPriceMult ** 1.08; } else { - itemPriceMult = Math.pow(itemPriceMult, 1.08); + itemPriceMult = itemPriceMult ** 1.08; } - itemPriceMult = Math.pow(4, itemPriceMult); - requirementPriceMult = Math.pow(4, requirementPriceMult); + itemPriceMult = 4 ** itemPriceMult; + requirementPriceMult = 4 ** requirementPriceMult; - const hideoutFleaTaxDiscountBonus = pmcData.Bonuses.find(b => b.type === "RagfairCommission"); + const hideoutFleaTaxDiscountBonus = pmcData.Bonuses.find((b) => b.type === "RagfairCommission"); const taxDiscountPercent = hideoutFleaTaxDiscountBonus ? Math.abs(hideoutFleaTaxDiscountBonus.value) : 0; - const tax = itemWorth * itemTaxMult * itemPriceMult + requirementsPrice * requirementTaxMult * requirementPriceMult; + const tax = itemWorth * itemTaxMult * itemPriceMult + + requirementsPrice * requirementTaxMult * requirementPriceMult; const discountedTax = tax * (1.0 - taxDiscountPercent / 100.0); - const itemComissionMult = itemTemplate._props.RagFairCommissionModifier ? itemTemplate._props.RagFairCommissionModifier : 1; + const itemComissionMult = itemTemplate._props.RagFairCommissionModifier + ? itemTemplate._props.RagFairCommissionModifier + : 1; if (item.upd.Buff) { @@ -93,13 +103,19 @@ export class RagfairTaxService // This method is trying to replicate the item worth calculation method found in the client code. // Any inefficiencies or style issues are intentional and should not be fixed, to preserve the client-side code mirroring. - protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem = true): number + protected calculateItemWorth( + item: Item, + itemTemplate: ITemplateItem, + itemCount: number, + pmcData: IPmcData, + isRootItem = true, + ): number { let worth = this.ragfairPriceService.getFleaPriceForItem(item._tpl); // In client, all item slots are traversed and any items contained within have their values added - if (isRootItem) // Since we get a flat list of all child items, we only want to recurse from parent item - { + if (isRootItem) + { // Since we get a flat list of all child items, we only want to recurse from parent item const itemChildren = this.itemHelper.findAndReturnChildrenAsItems(pmcData.Inventory.items, item._id); if (itemChildren.length > 1) { @@ -110,7 +126,13 @@ export class RagfairTaxService continue; } - worth += this.calculateItemWorth(child, this.itemHelper.getItem(child._tpl)[1], child.upd.StackObjectsCount, pmcData, false); + worth += this.calculateItemWorth( + child, + this.itemHelper.getItem(child._tpl)[1], + child.upd.StackObjectsCount, + pmcData, + false, + ); } } } @@ -122,7 +144,8 @@ export class RagfairTaxService if ("Key" in item.upd && itemTemplate._props.MaximumNumberOfUsage > 0) { - worth = worth / itemTemplate._props.MaximumNumberOfUsage * (itemTemplate._props.MaximumNumberOfUsage - item.upd.Key.NumberOfUsages); + worth = worth / itemTemplate._props.MaximumNumberOfUsage + * (itemTemplate._props.MaximumNumberOfUsage - item.upd.Key.NumberOfUsages); } if ("Resource" in item.upd && itemTemplate._props.MaxResource > 0) @@ -147,10 +170,14 @@ export class RagfairTaxService if ("Repairable" in item.upd && itemTemplate._props.armorClass > 0) { - const num2 = 0.01 * Math.pow(0.0, item.upd.Repairable.MaxDurability); - worth = worth * ((item.upd.Repairable.MaxDurability / itemTemplate._props.Durability) - num2) - Math.floor(itemTemplate._props.RepairCost * (item.upd.Repairable.MaxDurability - item.upd.Repairable.Durability)); + const num2 = 0.01 * 0.0 ** item.upd.Repairable.MaxDurability; + worth = worth * ((item.upd.Repairable.MaxDurability / itemTemplate._props.Durability) - num2) + - Math.floor( + itemTemplate._props.RepairCost + * (item.upd.Repairable.MaxDurability - item.upd.Repairable.Durability), + ); } return worth * itemCount; } -} \ No newline at end of file +} diff --git a/project/src/services/RepairService.ts b/project/src/services/RepairService.ts index bfb5619d..6333e92a 100644 --- a/project/src/services/RepairService.ts +++ b/project/src/services/RepairService.ts @@ -39,7 +39,7 @@ export class RepairService @inject("PaymentService") protected paymentService: PaymentService, @inject("RepairHelper") protected repairHelper: RepairHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.repairConfig = this.configServer.getConfig(ConfigTypes.REPAIR); @@ -53,9 +53,14 @@ export class RepairService * @param traderId Trader being used to repair item * @returns RepairDetails object */ - public repairItemByTrader(sessionID: string, pmcData: IPmcData, repairItemDetails: RepairItem, traderId: string): RepairDetails + public repairItemByTrader( + sessionID: string, + pmcData: IPmcData, + repairItemDetails: RepairItem, + traderId: string, + ): RepairDetails { - const itemToRepair = pmcData.Inventory.items.find(x => x._id === repairItemDetails._id); + const itemToRepair = pmcData.Inventory.items.find((x) => x._id === repairItemDetails._id); if (itemToRepair === undefined) { throw new Error(`Item ${repairItemDetails._id} not found in profile inventory, unable to repair`); @@ -64,12 +69,10 @@ export class RepairService const priceCoef = this.traderHelper.getLoyaltyLevel(traderId, pmcData).repair_price_coef; const traderRepairDetails = this.traderHelper.getTrader(traderId, sessionID).repair; const repairQualityMultiplier = traderRepairDetails.quality; - const repairRate = (priceCoef <= 0) - ? 1 - : (priceCoef / 100 + 1); + const repairRate = (priceCoef <= 0) ? 1 : (priceCoef / 100 + 1); const itemToRepairDetails = this.databaseServer.getTables().templates.items[itemToRepair._tpl]; - const repairItemIsArmor = (!!itemToRepairDetails._props.ArmorMaterial); + const repairItemIsArmor = !!itemToRepairDetails._props.ArmorMaterial; this.repairHelper.updateItemDurability( itemToRepair, @@ -78,12 +81,14 @@ export class RepairService repairItemDetails.count, false, repairQualityMultiplier, - repairQualityMultiplier !== 0 && this.repairConfig.applyRandomizeDurabilityLoss + repairQualityMultiplier !== 0 && this.repairConfig.applyRandomizeDurabilityLoss, ); // get repair price const itemRepairCost = this.databaseServer.getTables().templates.items[itemToRepair._tpl]._props.RepairCost; - const repairCost = Math.round((itemRepairCost * repairItemDetails.count * repairRate) * this.repairConfig.priceMultiplier); + const repairCost = Math.round( + (itemRepairCost * repairItemDetails.count * repairRate) * this.repairConfig.priceMultiplier, + ); this.logger.debug(`item base repair cost: ${itemRepairCost}`, true); this.logger.debug(`price multipler: ${this.repairConfig.priceMultiplier}`, true); @@ -94,18 +99,17 @@ export class RepairService repairedItem: itemToRepair, repairedItemIsArmor: repairItemIsArmor, repairAmount: repairItemDetails.count, - repairedByKit: false + repairedByKit: false, }; } /** - * * @param sessionID Session id * @param pmcData profile to take money from * @param repairedItemId Repaired item id * @param repairCost Cost to repair item in roubles * @param traderId Id of the trader who repaired the item / who is paid - * @param output + * @param output */ public payForRepair( sessionID: string, @@ -113,16 +117,15 @@ export class RepairService repairedItemId: string, repairCost: number, traderId: string, - output: IItemEventRouterResponse): void + output: IItemEventRouterResponse, + ): void { const options: IProcessBuyTradeRequestData = { // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_items: [ - { - id: "5449016a4bdc2d6f028b456f", // Rouble tpl - count: Math.round(repairCost) - } - ], + scheme_items: [{ + id: "5449016a4bdc2d6f028b456f", // Rouble tpl + count: Math.round(repairCost), + }], tid: traderId, Action: "SptRepair", type: "", @@ -130,7 +133,7 @@ export class RepairService item_id: "", count: 0, // eslint-disable-next-line @typescript-eslint/naming-convention - scheme_id: 0 + scheme_id: 0, }; this.paymentService.payMoney(pmcData, options, sessionID, output); @@ -142,12 +145,12 @@ export class RepairService * @param repairDetails details of item repaired, cost/item * @param pmcData Profile to add points to */ - public addRepairSkillPoints( - sessionId: string, - repairDetails: RepairDetails, - pmcData: IPmcData): void + public addRepairSkillPoints(sessionId: string, repairDetails: RepairDetails, pmcData: IPmcData): void { - if (repairDetails.repairedByKit && this.itemHelper.isOfBaseclass(repairDetails.repairedItem._tpl, BaseClasses.WEAPON)) + if ( + repairDetails.repairedByKit + && this.itemHelper.isOfBaseclass(repairDetails.repairedItem._tpl, BaseClasses.WEAPON) + ) { const skillPoints = this.getWeaponRepairSkillPoints(repairDetails); @@ -155,22 +158,29 @@ export class RepairService } // Handle kit repairs of armor - if (repairDetails.repairedByKit && this.itemHelper.isOfBaseclasses(repairDetails.repairedItem._tpl, [BaseClasses.ARMOR, BaseClasses.VEST])) + if ( + repairDetails.repairedByKit + && this.itemHelper.isOfBaseclasses(repairDetails.repairedItem._tpl, [BaseClasses.ARMOR, BaseClasses.VEST]) + ) { const itemDetails = this.itemHelper.getItem(repairDetails.repairedItem._tpl); if (!itemDetails[0]) { // No item found - this.logger.error(this.localisationService.getText("repair-unable_to_find_item_in_db", repairDetails.repairedItem._tpl)); + this.logger.error( + this.localisationService.getText( + "repair-unable_to_find_item_in_db", + repairDetails.repairedItem._tpl, + ), + ); return; } const isHeavyArmor = itemDetails[1]._props.ArmorType === "Heavy"; - const vestSkillToLevel = (isHeavyArmor) - ? SkillTypes.HEAVY_VESTS - : SkillTypes.LIGHT_VESTS; - const pointsToAddToVestSkill = repairDetails.repairPoints * this.repairConfig.armorKitSkillPointGainPerRepairPointMultiplier; + const vestSkillToLevel = isHeavyArmor ? SkillTypes.HEAVY_VESTS : SkillTypes.LIGHT_VESTS; + const pointsToAddToVestSkill = repairDetails.repairPoints + * this.repairConfig.armorKitSkillPointGainPerRepairPointMultiplier; this.profileHelper.addSkillPointsToPlayer(pmcData, vestSkillToLevel, pointsToAddToVestSkill); } @@ -179,17 +189,24 @@ export class RepairService let intellectGainedFromRepair: number; if (repairDetails.repairedByKit) { - const intRepairMultiplier = (this.itemHelper.isOfBaseclass(repairDetails.repairedItem._tpl, BaseClasses.WEAPON)) - ? this.repairConfig.repairKitIntellectGainMultiplier.weapon - : this.repairConfig.repairKitIntellectGainMultiplier.armor; + const intRepairMultiplier = + (this.itemHelper.isOfBaseclass(repairDetails.repairedItem._tpl, BaseClasses.WEAPON)) + ? this.repairConfig.repairKitIntellectGainMultiplier.weapon + : this.repairConfig.repairKitIntellectGainMultiplier.armor; // limit gain to a max value defined in config.maxIntellectGainPerRepair - intellectGainedFromRepair = Math.min(repairDetails.repairPoints * intRepairMultiplier, this.repairConfig.maxIntellectGainPerRepair.kit); + intellectGainedFromRepair = Math.min( + repairDetails.repairPoints * intRepairMultiplier, + this.repairConfig.maxIntellectGainPerRepair.kit, + ); } else { // Trader repair - Not as accurate as kit, needs data from live - intellectGainedFromRepair = Math.min(repairDetails.repairAmount / 10, this.repairConfig.maxIntellectGainPerRepair.trader); + intellectGainedFromRepair = Math.min( + repairDetails.repairAmount / 10, + this.repairConfig.maxIntellectGainPerRepair.trader, + ); } this.profileHelper.addSkillPointsToPlayer(pmcData, SkillTypes.INTELLECT, intellectGainedFromRepair); @@ -200,8 +217,7 @@ export class RepairService * @param repairDetails the repair details to calculate skill points for * @returns the number of skill points to reward the user */ - protected getWeaponRepairSkillPoints( - repairDetails: RepairDetails): number + protected getWeaponRepairSkillPoints(repairDetails: RepairDetails): number { // This formula and associated configs is calculated based on 30 repairs done on live // The points always came out 2-aligned, which is why there's a divide/multiply by 2 with ceil calls @@ -228,12 +244,11 @@ export class RepairService { skillPoints += this.repairConfig.weaponTreatment.critSuccessAmount; } - + return skillPoints; } - + /** - * * @param sessionId Session id * @param pmcData Profile to update repaired item in * @param repairKits Array of Repair kits to use @@ -246,7 +261,8 @@ export class RepairService pmcData: IPmcData, repairKits: RepairKitsInfo[], itemToRepairId: string, - output: IItemEventRouterResponse): RepairDetails + output: IItemEventRouterResponse, + ): RepairDetails { // Find item to repair in inventory const itemToRepair = pmcData.Inventory.items.find((x: { _id: string; }) => x._id === itemToRepairId); @@ -257,9 +273,12 @@ export class RepairService const itemsDb = this.databaseServer.getTables().templates.items; const itemToRepairDetails = itemsDb[itemToRepair._tpl]; - const repairItemIsArmor = (!!itemToRepairDetails._props.ArmorMaterial); + const repairItemIsArmor = !!itemToRepairDetails._props.ArmorMaterial; const repairAmount = repairKits[0].count / this.getKitDivisor(itemToRepairDetails, repairItemIsArmor, pmcData); - const shouldApplyDurabilityLoss = this.shouldRepairKitApplyDurabilityLoss(pmcData, this.repairConfig.applyRandomizeDurabilityLoss); + const shouldApplyDurabilityLoss = this.shouldRepairKitApplyDurabilityLoss( + pmcData, + this.repairConfig.applyRandomizeDurabilityLoss, + ); this.repairHelper.updateItemDurability( itemToRepair, @@ -268,12 +287,13 @@ export class RepairService repairAmount, true, 1, - shouldApplyDurabilityLoss); + shouldApplyDurabilityLoss, + ); // Find and use repair kit defined in body for (const repairKit of repairKits) { - const repairKitInInventory = pmcData.Inventory.items.find(x => x._id === repairKit._id); + const repairKitInInventory = pmcData.Inventory.items.find((x) => x._id === repairKit._id); const repairKitDetails = itemsDb[repairKitInInventory._tpl]; const repairKitReductionAmount = repairKit.count; @@ -290,7 +310,7 @@ export class RepairService repairedItem: itemToRepair, repairedItemIsArmor: repairItemIsArmor, repairAmount: repairAmount, - repairedByKit: true + repairedByKit: true, }; } @@ -301,33 +321,34 @@ export class RepairService * @param pmcData Player profile * @returns Number to divide kit points by */ - protected getKitDivisor(itemToRepairDetails: ITemplateItem, isArmor: boolean, pmcData: IPmcData): number + protected getKitDivisor(itemToRepairDetails: ITemplateItem, isArmor: boolean, pmcData: IPmcData): number { const globals = this.databaseServer.getTables().globals; const globalRepairSettings = globals.config.RepairSettings; const intellectRepairPointsPerLevel = globals.config.SkillsSettings.Intellect.RepairPointsCostReduction; - const profileIntellectLevel = this.profileHelper.getSkillFromProfile(pmcData, SkillTypes.INTELLECT)?.Progress ?? 0; + const profileIntellectLevel = this.profileHelper.getSkillFromProfile(pmcData, SkillTypes.INTELLECT)?.Progress + ?? 0; const intellectPointReduction = intellectRepairPointsPerLevel * Math.trunc(profileIntellectLevel / 100); if (isArmor) { const durabilityPointCostArmor = globalRepairSettings.durabilityPointCostArmor; const repairArmorBonus = this.getBonusMultiplierValue("RepairArmorBonus", pmcData); - const armorBonus = (1.0 - (repairArmorBonus - 1.0) - intellectPointReduction); + const armorBonus = 1.0 - (repairArmorBonus - 1.0) - intellectPointReduction; const materialType = itemToRepairDetails._props.ArmorMaterial ?? ""; const armorMaterial = globals.config.ArmorMaterials[materialType] as IArmorType; - const destructability = (1 + armorMaterial.Destructibility); + const destructability = 1 + armorMaterial.Destructibility; const armorClass = parseInt(`${itemToRepairDetails._props.armorClass}`); const armorClassDivisor = globals.config.RepairSettings.armorClassDivisor; - const armorClassMultiplier = (1.0 + armorClass / armorClassDivisor); + const armorClassMultiplier = 1.0 + armorClass / armorClassDivisor; return durabilityPointCostArmor * armorBonus * destructability * armorClassMultiplier; } - else + else { const repairWeaponBonus = this.getBonusMultiplierValue("RepairWeaponBonus", pmcData) - 1; - const repairPointMultiplier = (1.0 - repairWeaponBonus - intellectPointReduction); + const repairPointMultiplier = 1.0 - repairWeaponBonus - intellectPointReduction; const durabilityPointCostGuns = globals.config.RepairSettings.durabilityPointCostGuns; return durabilityPointCostGuns * repairPointMultiplier; @@ -342,11 +363,11 @@ export class RepairService */ protected getBonusMultiplierValue(skillBonusName: string, pmcData: IPmcData): number { - const bonusesMatched = pmcData?.Bonuses?.filter(b => b.type === skillBonusName); + const bonusesMatched = pmcData?.Bonuses?.filter((b) => b.type === skillBonusName); let value = 1; if (bonusesMatched != null) { - const sumedPercentage = bonusesMatched.map(b => b.value).reduce((v1,v2) => v1 + v2, 0); + const sumedPercentage = bonusesMatched.map((b) => b.value).reduce((v1, v2) => v1 + v2, 0); value = 1 + sumedPercentage / 100; } @@ -387,17 +408,11 @@ export class RepairService if (!repairKitInInventory.upd) { this.logger.debug(`Repair kit: ${repairKitInInventory._id} in inventory lacks upd object, adding`); - repairKitInInventory.upd = { - RepairKit: { - Resource: maxRepairAmount - } - }; + repairKitInInventory.upd = { RepairKit: { Resource: maxRepairAmount } }; } if (!repairKitInInventory.upd.RepairKit?.Resource) { - repairKitInInventory.upd.RepairKit = { - Resource: maxRepairAmount - }; + repairKitInInventory.upd.RepairKit = { Resource: maxRepairAmount }; } } @@ -432,7 +447,7 @@ export class RepairService /** * Add random buff to item - * @param itemConfig weapon/armor config + * @param itemConfig weapon/armor config * @param repairDetails Details for item to repair */ public addBuff(itemConfig: BonusSettings, item: Item): void @@ -450,7 +465,10 @@ export class RepairService rarity: bonusRarity, buffType: bonusType, value: bonusValue, - thresholdDurability: this.randomUtil.getPercentOfValue(bonusThresholdPercent, item.upd.Repairable.Durability) + thresholdDurability: this.randomUtil.getPercentOfValue( + bonusThresholdPercent, + item.upd.Repairable.Durability, + ), }; } @@ -467,7 +485,9 @@ export class RepairService const hasTemplate = this.itemHelper.getItem(repairDetails.repairedItem._tpl); if (!hasTemplate[0]) + { return false; + } const template = hasTemplate[1]; const itemSkillType = this.getItemSkillType(template); @@ -476,14 +496,22 @@ export class RepairService return false; } - const commonBuffMinChanceValue = globals.config.SkillsSettings[itemSkillType as string].BuffSettings.CommonBuffMinChanceValue; - const commonBuffChanceLevelBonus = globals.config.SkillsSettings[itemSkillType as string].BuffSettings.CommonBuffChanceLevelBonus; - const receivedDurabilityMaxPercent = globals.config.SkillsSettings[itemSkillType as string].BuffSettings.ReceivedDurabilityMaxPercent; + const commonBuffMinChanceValue = + globals.config.SkillsSettings[itemSkillType as string].BuffSettings.CommonBuffMinChanceValue; + const commonBuffChanceLevelBonus = + globals.config.SkillsSettings[itemSkillType as string].BuffSettings.CommonBuffChanceLevelBonus; + const receivedDurabilityMaxPercent = + globals.config.SkillsSettings[itemSkillType as string].BuffSettings.ReceivedDurabilityMaxPercent; - const skillLevel = Math.trunc((this.profileHelper.getSkillFromProfile(pmcData, itemSkillType)?.Progress ?? 0) / 100); + const skillLevel = Math.trunc( + (this.profileHelper.getSkillFromProfile(pmcData, itemSkillType)?.Progress ?? 0) / 100, + ); const durabilityToRestorePercent = repairDetails.repairPoints / template._props.MaxDurability; - const durabilityMultiplier = this.getDurabilityMultiplier(receivedDurabilityMaxPercent, durabilityToRestorePercent); + const durabilityMultiplier = this.getDurabilityMultiplier( + receivedDurabilityMaxPercent, + durabilityToRestorePercent, + ); const doBuff = commonBuffMinChanceValue + commonBuffChanceLevelBonus * skillLevel * durabilityMultiplier; @@ -494,13 +522,13 @@ export class RepairService return false; } - + /** * Based on item, what underlying skill does this item use for buff settings * @param itemTemplate Item to check for skill * @returns Skill name */ - protected getItemSkillType(itemTemplate: ITemplateItem): SkillTypes + protected getItemSkillType(itemTemplate: ITemplateItem): SkillTypes { if (this.itemHelper.isOfBaseclass(itemTemplate._id, BaseClasses.ARMOR)) { @@ -533,7 +561,7 @@ export class RepairService */ protected getDurabilityMultiplier(receiveDurabilityMaxPercent: number, receiveDurabilityPercent: number): number { - receiveDurabilityMaxPercent = ((receiveDurabilityMaxPercent > 0) ? receiveDurabilityMaxPercent : 0.01); + receiveDurabilityMaxPercent = (receiveDurabilityMaxPercent > 0) ? receiveDurabilityMaxPercent : 0.01; const num = receiveDurabilityPercent / receiveDurabilityMaxPercent; if (num > 1) { @@ -556,4 +584,4 @@ export class RepairDetails repairedItemIsArmor: boolean; repairAmount: number; repairedByKit: boolean; -} \ No newline at end of file +} diff --git a/project/src/services/SeasonalEventService.ts b/project/src/services/SeasonalEventService.ts index 81ba9289..e676d615 100644 --- a/project/src/services/SeasonalEventService.ts +++ b/project/src/services/SeasonalEventService.ts @@ -35,7 +35,7 @@ export class SeasonalEventService @inject("LocalisationService") protected localisationService: LocalisationService, @inject("BotHelper") protected botHelper: BotHelper, @inject("ProfileHelper") protected profileHelper: ProfileHelper, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.seasonalEventConfig = this.configServer.getConfig(ConfigTypes.SEASONAL_EVENT); @@ -53,7 +53,7 @@ export class SeasonalEventService "5df8a77486f77412672a1e3f", // Violet bauble "5df8a72c86f77412640e2e83", // Silver bauble "5a43943586f77416ad2f06e2", // Ded moroz hat - "5a43957686f7742a2c2f11b0" // Santa hat + "5a43957686f7742a2c2f11b0", // Santa hat ]; } @@ -70,7 +70,7 @@ export class SeasonalEventService "6176a40f0b8c0312ac75a3d3", // Ghoul mask "62a5c2c98ec41a51b34739c0", // Hockey player mask "Captain" "62a5c333ec21e50cad3b5dc6", // Hockey player mask "Brawler" - "62a5c41e8ec41a51b34739c3" // Hockey player mask "Quiet" + "62a5c41e8ec41a51b34739c3", // Hockey player mask "Quiet" ]; } @@ -105,7 +105,7 @@ export class SeasonalEventService /** * Check if item id exists in christmas or halloween event arrays * @param itemTpl item tpl to check for - * @returns + * @returns */ public itemIsSeasonalRelated(itemTpl: string): boolean { @@ -234,11 +234,10 @@ export class SeasonalEventService const eventEndDate = new Date(currentDate.getFullYear(), event.endMonth - 1, event.endDay); // Current date is between start/end dates - if (currentDate >= eventStartDate - && currentDate <= eventEndDate) + if (currentDate >= eventStartDate && currentDate <= eventEndDate) { - this.christmasEventActive = (SeasonalEventType[event.type] === SeasonalEventType.CHRISTMAS); - this.halloweenEventActive = (SeasonalEventType[event.type] === SeasonalEventType.HALLOWEEN); + this.christmasEventActive = SeasonalEventType[event.type] === SeasonalEventType.CHRISTMAS; + this.halloweenEventActive = SeasonalEventType[event.type] === SeasonalEventType.HALLOWEEN; } } } @@ -259,12 +258,19 @@ export class SeasonalEventService { if (!nodeInventory.equipment[equipmentSlotKey]) { - this.logger.warning(this.localisationService.getText("seasonal-missing_equipment_slot_on_bot", {equipmentSlot: equipmentSlotKey, botRole: botRole})); + this.logger.warning( + this.localisationService.getText("seasonal-missing_equipment_slot_on_bot", { + equipmentSlot: equipmentSlotKey, + botRole: botRole, + }), + ); } const equipment: Record = nodeInventory.equipment[equipmentSlotKey]; // eslint-disable-next-line @typescript-eslint/no-unused-vars - nodeInventory.equipment[equipmentSlotKey] = Object.fromEntries(Object.entries(equipment).filter(([index]) => !christmasItems.includes(index))); + nodeInventory.equipment[equipmentSlotKey] = Object.fromEntries( + Object.entries(equipment).filter(([index]) => !christmasItems.includes(index)), + ); } // Remove christmas related loot from loot containers @@ -272,10 +278,17 @@ export class SeasonalEventService { if (!nodeInventory.items[lootContainerKey]) { - this.logger.warning(this.localisationService.getText("seasonal-missing_loot_container_slot_on_bot", {lootContainer: lootContainerKey, botRole: botRole})); + this.logger.warning( + this.localisationService.getText("seasonal-missing_loot_container_slot_on_bot", { + lootContainer: lootContainerKey, + botRole: botRole, + }), + ); } - nodeInventory.items[lootContainerKey] = nodeInventory.items[lootContainerKey].filter((x: string) => !christmasItems.includes(x)); + nodeInventory.items[lootContainerKey] = nodeInventory.items[lootContainerKey].filter((x: string) => + !christmasItems.includes(x) + ); } } @@ -290,7 +303,7 @@ export class SeasonalEventService switch (eventType.toLowerCase()) { case SeasonalEventType.HALLOWEEN.toLowerCase(): - globalConfig.EventType = globalConfig.EventType.filter(x => x !== "None"); + globalConfig.EventType = globalConfig.EventType.filter((x) => x !== "None"); globalConfig.EventType.push("Halloween"); globalConfig.EventType.push("HalloweenIllumination"); globalConfig.Health.ProfileHealthSettings.DefaultStimulatorBuff = "Buffs_Halloween"; @@ -299,7 +312,7 @@ export class SeasonalEventService this.adjustTraderIcons(eventType); break; case SeasonalEventType.CHRISTMAS.toLowerCase(): - globalConfig.EventType = globalConfig.EventType.filter(x => x !== "None"); + globalConfig.EventType = globalConfig.EventType.filter((x) => x !== "None"); globalConfig.EventType.push("Christmas"); this.addEventGearToBots(eventType); this.addGifterBotToMaps(); @@ -326,21 +339,31 @@ export class SeasonalEventService switch (eventType.toLowerCase()) { case SeasonalEventType.HALLOWEEN.toLowerCase(): - this.httpConfig.serverImagePathOverride["./assets/images/traders/5a7c2ebb86f7746e324a06ab.png"] = "./assets/images/traders/halloween/5a7c2ebb86f7746e324a06ab.png"; - this.httpConfig.serverImagePathOverride["./assets/images/traders/5ac3b86a86f77461491d1ad8.png"] = "./assets/images/traders/halloween/5ac3b86a86f77461491d1ad8.png"; - this.httpConfig.serverImagePathOverride["./assets/images/traders/5c06531a86f7746319710e1b.png"] = "./assets/images/traders/halloween/5c06531a86f7746319710e1b.png"; - this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91ca086f77469a81232e4.png"] = "./assets/images/traders/halloween/59b91ca086f77469a81232e4.png"; - this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91cab86f77469aa5343ca.png"] = "./assets/images/traders/halloween/59b91cab86f77469aa5343ca.png"; - this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91cb486f77469a81232e5.png"] = "./assets/images/traders/halloween/59b91cb486f77469a81232e5.png"; - this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91cbd86f77469aa5343cb.png"] = "./assets/images/traders/halloween/59b91cbd86f77469aa5343cb.png"; - this.httpConfig.serverImagePathOverride["./assets/images/traders/579dc571d53a0658a154fbec.png"] = "./assets/images/traders/halloween/579dc571d53a0658a154fbec.png"; - break; + this.httpConfig.serverImagePathOverride["./assets/images/traders/5a7c2ebb86f7746e324a06ab.png"] = + "./assets/images/traders/halloween/5a7c2ebb86f7746e324a06ab.png"; + this.httpConfig.serverImagePathOverride["./assets/images/traders/5ac3b86a86f77461491d1ad8.png"] = + "./assets/images/traders/halloween/5ac3b86a86f77461491d1ad8.png"; + this.httpConfig.serverImagePathOverride["./assets/images/traders/5c06531a86f7746319710e1b.png"] = + "./assets/images/traders/halloween/5c06531a86f7746319710e1b.png"; + this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91ca086f77469a81232e4.png"] = + "./assets/images/traders/halloween/59b91ca086f77469a81232e4.png"; + this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91cab86f77469aa5343ca.png"] = + "./assets/images/traders/halloween/59b91cab86f77469aa5343ca.png"; + this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91cb486f77469a81232e5.png"] = + "./assets/images/traders/halloween/59b91cb486f77469a81232e5.png"; + this.httpConfig.serverImagePathOverride["./assets/images/traders/59b91cbd86f77469aa5343cb.png"] = + "./assets/images/traders/halloween/59b91cbd86f77469aa5343cb.png"; + this.httpConfig.serverImagePathOverride["./assets/images/traders/579dc571d53a0658a154fbec.png"] = + "./assets/images/traders/halloween/579dc571d53a0658a154fbec.png"; + break; case SeasonalEventType.CHRISTMAS.toLowerCase(): // TODO: find christmas trader icons break; } - this.databaseImporter.loadImages(`${this.databaseImporter.getSptDataPath()}images/`, ["traders"], ["/files/trader/avatar/"]); + this.databaseImporter.loadImages(`${this.databaseImporter.getSptDataPath()}images/`, ["traders"], [ + "/files/trader/avatar/", + ]); } /** @@ -348,10 +371,10 @@ export class SeasonalEventService */ protected addLootItemsToGifterDropItemsList(): void { - const gifterBot = this.databaseServer.getTables().bots.types["gifter"]; + const gifterBot = this.databaseServer.getTables().bots.types.gifter; for (const difficulty in gifterBot.difficulty) { - gifterBot.difficulty[difficulty].Patrol["ITEMS_TO_DROP"] = gifterBot.inventory.items.Backpack.join(", "); + gifterBot.difficulty[difficulty].Patrol.ITEMS_TO_DROP = gifterBot.inventory.items.Backpack.join(", "); } } @@ -368,7 +391,7 @@ export class SeasonalEventService return; } - + // Iterate over bots with changes to apply for (const bot in botGearChanges) { @@ -384,7 +407,10 @@ export class SeasonalEventService for (const equipmentSlot in gearAmendments) { // Adjust slots spawn chance to be at least 75% - botToUpdate.chances.equipment[equipmentSlot] = Math.max(botToUpdate.chances.equipment[equipmentSlot], 75); + botToUpdate.chances.equipment[equipmentSlot] = Math.max( + botToUpdate.chances.equipment[equipmentSlot], + 75, + ); // Grab gear to add and loop over it const itemsToAdd = gearAmendments[equipmentSlot]; @@ -398,7 +424,7 @@ export class SeasonalEventService protected addPumpkinsToScavBackpacks(): void { - const assaultBackpack = this.databaseServer.getTables().bots.types["assault"].inventory.items.Backpack; + const assaultBackpack = this.databaseServer.getTables().bots.types.assault.inventory.items.Backpack; assaultBackpack.push("634959225289190e5e773b3b"); assaultBackpack.push("634959225289190e5e773b3b"); assaultBackpack.push("634959225289190e5e773b3b"); @@ -451,7 +477,7 @@ export class SeasonalEventService TriggerId: "", TriggerName: "", Delay: 0, - RandomTimeSpawn: false + RandomTimeSpawn: false, }); } } @@ -467,6 +493,5 @@ export class SeasonalEventService { this.giftService.sendGiftToPlayer(playerId, giftkey); } - } -} \ No newline at end of file +} diff --git a/project/src/services/TraderAssortService.ts b/project/src/services/TraderAssortService.ts index 5a826c12..77e6cd0b 100644 --- a/project/src/services/TraderAssortService.ts +++ b/project/src/services/TraderAssortService.ts @@ -1,6 +1,6 @@ import { ITraderAssort } from "@spt-aki/models/eft/common/tables/ITrader"; -export class TraderAssortService +export class TraderAssortService { protected pristineTraderAssorts: Record = {}; @@ -18,4 +18,4 @@ export class TraderAssortService { this.pristineTraderAssorts[traderId] = assort; } -} \ No newline at end of file +} diff --git a/project/src/services/TraderPurchasePersisterService.ts b/project/src/services/TraderPurchasePersisterService.ts index b050ce51..ff0deee9 100644 --- a/project/src/services/TraderPurchasePersisterService.ts +++ b/project/src/services/TraderPurchasePersisterService.ts @@ -22,7 +22,7 @@ export class TraderPurchasePersisterService @inject("TimeUtil") protected timeUtil: TimeUtil, @inject("ProfileHelper") protected profileHelper: ProfileHelper, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.traderConfig = this.configServer.getConfig(ConfigTypes.TRADER); @@ -95,23 +95,30 @@ export class TraderPurchasePersisterService for (const purchaseKey in profile.traderPurchases[traderId]) { - const traderUpdateDetails = this.traderConfig.updateTime.find(x => x.traderId === traderId); + const traderUpdateDetails = this.traderConfig.updateTime.find((x) => x.traderId === traderId); if (!traderUpdateDetails) { - this.logger.error(this.localisationService.getText("trader-unable_to_delete_stale_purchases", {profileId: profile.info.id, traderId: traderId})); + this.logger.error( + this.localisationService.getText("trader-unable_to_delete_stale_purchases", { + profileId: profile.info.id, + traderId: traderId, + }), + ); continue; } const purchaseDetails = profile.traderPurchases[traderId][purchaseKey]; const resetTimeForItem = purchaseDetails.purchaseTimestamp + traderUpdateDetails.seconds; - if ((resetTimeForItem) < this.timeUtil.getTimestamp()) + if (resetTimeForItem < this.timeUtil.getTimestamp()) { // Item was purchased far enough in past a trader refresh would have occured, remove purchase record from profile - this.logger.debug(`Removed trader: ${traderId} purchase: ${purchaseKey} from profile: ${profile.info.id}`); + this.logger.debug( + `Removed trader: ${traderId} purchase: ${purchaseKey} from profile: ${profile.info.id}`, + ); delete profile.traderPurchases[traderId][purchaseKey]; } } } } -} \ No newline at end of file +} diff --git a/project/src/services/mod/CustomItemService.ts b/project/src/services/mod/CustomItemService.ts index ae25d6a1..507fb962 100644 --- a/project/src/services/mod/CustomItemService.ts +++ b/project/src/services/mod/CustomItemService.ts @@ -1,7 +1,12 @@ import { inject, injectable } from "tsyringe"; import { ITemplateItem, Props } from "@spt-aki/models/eft/common/tables/ITemplateItem"; -import { CreateItemResult, LocaleDetails, NewItemDetails, NewItemFromCloneDetails } from "@spt-aki/models/spt/mod/NewItemDetails"; +import { + CreateItemResult, + LocaleDetails, + NewItemDetails, + NewItemFromCloneDetails, +} from "@spt-aki/models/spt/mod/NewItemDetails"; import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; @@ -17,7 +22,7 @@ export class CustomItemService @inject("WinstonLogger") protected logger: ILogger, @inject("HashUtil") protected hashUtil: HashUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("DatabaseServer") protected databaseServer: DatabaseServer + @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) { this.tables = this.databaseServer.getTables(); @@ -115,9 +120,7 @@ export class CustomItemService */ protected getOrGenerateIdForItem(newId: string): string { - return (newId === "") - ? this.hashUtil.generate() - : newId; + return (newId === "") ? this.hashUtil.generate() : newId; } /** @@ -152,13 +155,7 @@ export class CustomItemService */ protected addToHandbookDb(newItemId: string, parentId: string, priceRoubles: number): void { - this.tables.templates.handbook.Items.push( - { - Id: newItemId, - ParentId: parentId, - Price: priceRoubles - } - ); + this.tables.templates.handbook.Items.push({ Id: newItemId, ParentId: parentId, Price: priceRoubles }); } /** @@ -167,7 +164,7 @@ export class CustomItemService * e.g. * en[0] * fr[1] - * + * * No jp provided, so english will be used as a substitute * @param localeDetails key is language, value are the new locale details * @param newItemId id of the item being created @@ -200,4 +197,4 @@ export class CustomItemService { this.tables.templates.prices[newItemId] = fleaPriceRoubles; } -} \ No newline at end of file +} diff --git a/project/src/services/mod/dynamicRouter/DynamicRouterMod.ts b/project/src/services/mod/dynamicRouter/DynamicRouterMod.ts index 075a19db..fc93971a 100644 --- a/project/src/services/mod/dynamicRouter/DynamicRouterMod.ts +++ b/project/src/services/mod/dynamicRouter/DynamicRouterMod.ts @@ -2,16 +2,13 @@ import { DynamicRouter, RouteAction } from "@spt-aki/di/Router"; export class DynamicRouterMod extends DynamicRouter { - public constructor( - routes: RouteAction[], - private topLevelRoute: string - ) + public constructor(routes: RouteAction[], private topLevelRoute: string) { super(routes); } - public override getTopLevelRoute(): string + public override getTopLevelRoute(): string { return this.topLevelRoute; } -} \ No newline at end of file +} diff --git a/project/src/services/mod/dynamicRouter/DynamicRouterModService.ts b/project/src/services/mod/dynamicRouter/DynamicRouterModService.ts index 92dc69ec..58675ee4 100644 --- a/project/src/services/mod/dynamicRouter/DynamicRouterModService.ts +++ b/project/src/services/mod/dynamicRouter/DynamicRouterModService.ts @@ -4,17 +4,13 @@ import { RouteAction } from "@spt-aki/di/Router"; import { DynamicRouterMod } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterMod"; @injectable() -export class DynamicRouterModService +export class DynamicRouterModService { - constructor(private container: DependencyContainer) + constructor(private container: DependencyContainer) {} - public registerDynamicRouter( - name: string, - routes: RouteAction[], - topLevelRoute: string - ): void + public registerDynamicRouter(name: string, routes: RouteAction[], topLevelRoute: string): void { - this.container.register(name, {useValue: new DynamicRouterMod(routes, topLevelRoute)}); + this.container.register(name, { useValue: new DynamicRouterMod(routes, topLevelRoute) }); this.container.registerType("DynamicRoutes", name); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/httpListener/HttpListenerMod.ts b/project/src/services/mod/httpListener/HttpListenerMod.ts index d0fcf049..760cc14a 100644 --- a/project/src/services/mod/httpListener/HttpListenerMod.ts +++ b/project/src/services/mod/httpListener/HttpListenerMod.ts @@ -6,18 +6,18 @@ export class HttpListenerMod implements IHttpListener { public constructor( private canHandleOverride: (sessionId: string, req: IncomingMessage) => boolean, - private handleOverride: (sessionId: string, req: IncomingMessage, resp: ServerResponse) => void - ) + private handleOverride: (sessionId: string, req: IncomingMessage, resp: ServerResponse) => void, + ) { } - public canHandle(sessionId: string, req: IncomingMessage): boolean + public canHandle(sessionId: string, req: IncomingMessage): boolean { return this.canHandleOverride(sessionId, req); } - public handle(sessionId: string, req: IncomingMessage, resp: ServerResponse): void + public handle(sessionId: string, req: IncomingMessage, resp: ServerResponse): void { this.handleOverride(sessionId, req, resp); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/httpListener/HttpListenerModService.ts b/project/src/services/mod/httpListener/HttpListenerModService.ts index e862ff5b..40fbcd49 100644 --- a/project/src/services/mod/httpListener/HttpListenerModService.ts +++ b/project/src/services/mod/httpListener/HttpListenerModService.ts @@ -5,18 +5,20 @@ import { IHttpListener } from "@spt-aki/servers/http/IHttpListener"; import { HttpListenerMod } from "@spt-aki/services/mod/httpListener/HttpListenerMod"; @injectable() -export class HttpListenerModService +export class HttpListenerModService { - constructor(protected container: DependencyContainer) + constructor(protected container: DependencyContainer) {} - + public registerHttpListener( name: string, canHandleOverride: (sessionId: string, req: IncomingMessage) => boolean, - handleOverride: (sessionId: string, req: IncomingMessage, resp: ServerResponse) => void - ): void + handleOverride: (sessionId: string, req: IncomingMessage, resp: ServerResponse) => void, + ): void { - this.container.register(name, {useValue: new HttpListenerMod(canHandleOverride, handleOverride)}); + this.container.register(name, { + useValue: new HttpListenerMod(canHandleOverride, handleOverride), + }); this.container.registerType("HttpListener", name); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/image/ImageRouteService.ts b/project/src/services/mod/image/ImageRouteService.ts index d676f5c7..de1ea20b 100644 --- a/project/src/services/mod/image/ImageRouteService.ts +++ b/project/src/services/mod/image/ImageRouteService.ts @@ -16,4 +16,4 @@ export class ImageRouteService { return (this.routes[urlKey] !== undefined); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/onLoad/OnLoadMod.ts b/project/src/services/mod/onLoad/OnLoadMod.ts index 24f253cc..2f1b4458 100644 --- a/project/src/services/mod/onLoad/OnLoadMod.ts +++ b/project/src/services/mod/onLoad/OnLoadMod.ts @@ -2,12 +2,9 @@ import { OnLoad } from "@spt-aki/di/OnLoad"; export class OnLoadMod implements OnLoad { - public constructor( - private onLoadOverride: () => void, - private getRouteOverride: () => string - ) + public constructor(private onLoadOverride: () => void, private getRouteOverride: () => string) { - //super(); + // super(); } public async onLoad(): Promise @@ -15,8 +12,8 @@ export class OnLoadMod implements OnLoad return this.onLoadOverride(); } - public getRoute(): string + public getRoute(): string { return this.getRouteOverride(); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/onLoad/OnLoadModService.ts b/project/src/services/mod/onLoad/OnLoadModService.ts index 4ffb03bf..f86887db 100644 --- a/project/src/services/mod/onLoad/OnLoadModService.ts +++ b/project/src/services/mod/onLoad/OnLoadModService.ts @@ -3,18 +3,14 @@ import { DependencyContainer, injectable } from "tsyringe"; import { OnLoadMod } from "@spt-aki/services/mod/onLoad/OnLoadMod"; @injectable() -export class OnLoadModService +export class OnLoadModService { - constructor(protected container: DependencyContainer) + constructor(protected container: DependencyContainer) {} - - public registerOnLoad( - name: string, - onLoad: () => void, - getRoute: () => string - ): void + + public registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void { - this.container.register(name, {useValue: new OnLoadMod(onLoad, getRoute)}); + this.container.register(name, { useValue: new OnLoadMod(onLoad, getRoute) }); this.container.registerType("OnLoad", name); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/onUpdate/OnUpdateMod.ts b/project/src/services/mod/onUpdate/OnUpdateMod.ts index 88def5a4..8474f5dc 100644 --- a/project/src/services/mod/onUpdate/OnUpdateMod.ts +++ b/project/src/services/mod/onUpdate/OnUpdateMod.ts @@ -3,9 +3,9 @@ import { OnUpdate } from "@spt-aki/di/OnUpdate"; export class OnUpdateMod implements OnUpdate { public constructor( - private onUpdateOverride: ( timeSinceLastRun: number ) => boolean, - private getRouteOverride: () => string - ) + private onUpdateOverride: (timeSinceLastRun: number) => boolean, + private getRouteOverride: () => string, + ) { } @@ -14,8 +14,8 @@ export class OnUpdateMod implements OnUpdate return this.onUpdateOverride(timeSinceLastRun); } - public getRoute(): string + public getRoute(): string { return this.getRouteOverride(); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/onUpdate/OnUpdateModService.ts b/project/src/services/mod/onUpdate/OnUpdateModService.ts index 711a5c12..fdb384c5 100644 --- a/project/src/services/mod/onUpdate/OnUpdateModService.ts +++ b/project/src/services/mod/onUpdate/OnUpdateModService.ts @@ -3,18 +3,14 @@ import { DependencyContainer, injectable } from "tsyringe"; import { OnUpdateMod } from "@spt-aki/services/mod/onUpdate/OnUpdateMod"; @injectable() -export class OnUpdateModService +export class OnUpdateModService { - constructor(protected container: DependencyContainer) + constructor(protected container: DependencyContainer) {} - - public registerOnUpdate( - name: string, - onUpdate: (timeSinceLastRun: number) => boolean, - getRoute: () => string - ): void + + public registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void { - this.container.register(name, {useValue: new OnUpdateMod(onUpdate, getRoute)}); + this.container.register(name, { useValue: new OnUpdateMod(onUpdate, getRoute) }); this.container.registerType("OnUpdate", name); } -} \ No newline at end of file +} diff --git a/project/src/services/mod/staticRouter/StaticRouterMod.ts b/project/src/services/mod/staticRouter/StaticRouterMod.ts index b6065286..04e07227 100644 --- a/project/src/services/mod/staticRouter/StaticRouterMod.ts +++ b/project/src/services/mod/staticRouter/StaticRouterMod.ts @@ -2,16 +2,13 @@ import { RouteAction, StaticRouter } from "@spt-aki/di/Router"; export class StaticRouterMod extends StaticRouter { - public constructor( - routes: RouteAction[], - private topLevelRoute: string - ) + public constructor(routes: RouteAction[], private topLevelRoute: string) { super(routes); } - public override getTopLevelRoute(): string + public override getTopLevelRoute(): string { return this.topLevelRoute; } -} \ No newline at end of file +} diff --git a/project/src/services/mod/staticRouter/StaticRouterModService.ts b/project/src/services/mod/staticRouter/StaticRouterModService.ts index 957efcbc..7b3d1e65 100644 --- a/project/src/services/mod/staticRouter/StaticRouterModService.ts +++ b/project/src/services/mod/staticRouter/StaticRouterModService.ts @@ -4,17 +4,13 @@ import { RouteAction } from "@spt-aki/di/Router"; import { StaticRouterMod } from "@spt-aki/services/mod/staticRouter/StaticRouterMod"; @injectable() -export class StaticRouterModService +export class StaticRouterModService { - constructor(protected container: DependencyContainer) + constructor(protected container: DependencyContainer) {} - public registerStaticRouter( - name: string, - routes: RouteAction[], - topLevelRoute: string - ): void + public registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void { - this.container.register(name, {useValue: new StaticRouterMod(routes, topLevelRoute)}); + this.container.register(name, { useValue: new StaticRouterMod(routes, topLevelRoute) }); this.container.registerType("StaticRoutes", name); } -} \ No newline at end of file +} diff --git a/project/src/utils/App.ts b/project/src/utils/App.ts index 401211ed..9b51b1aa 100644 --- a/project/src/utils/App.ts +++ b/project/src/utils/App.ts @@ -24,7 +24,7 @@ export class App @inject("ConfigServer") protected configServer: ConfigServer, @inject("EncodingUtil") protected encodingUtil: EncodingUtil, @injectAll("OnLoad") protected onLoadComponents: OnLoad[], - @injectAll("OnUpdate") protected onUpdateComponents: OnUpdate[] + @injectAll("OnUpdate") protected onUpdateComponents: OnUpdate[], ) { this.coreConfig = this.configServer.getConfig(ConfigTypes.CORE); @@ -90,7 +90,9 @@ export class App if (success === void 0 && !(secondsSinceLastRun % warnTime)) { - this.logger.debug(this.localisationService.getText("route_onupdate_no_response", updateable.getRoute())); + this.logger.debug( + this.localisationService.getText("route_onupdate_no_response", updateable.getRoute()), + ); } } } @@ -99,13 +101,13 @@ export class App protected logUpdateException(err: any, updateable: OnUpdate): void { this.logger.error(this.localisationService.getText("scheduled_event_failed_to_run", updateable.getRoute())); - if (err.message) + if (err.message) { this.logger.error(err.message); } - if (err.stack) + if (err.stack) { this.logger.error(err.stack); } } -} \ No newline at end of file +} diff --git a/project/src/utils/AsyncQueue.ts b/project/src/utils/AsyncQueue.ts index 2e2398c3..86ef0701 100644 --- a/project/src/utils/AsyncQueue.ts +++ b/project/src/utils/AsyncQueue.ts @@ -12,21 +12,21 @@ export class AsyncQueue implements IAsyncQueue // Wait for the right command to execute // This ensures that the commands execute in the right order, thus no data corruption - public async waitFor(command: ICommand): Promise + public async waitFor(command: ICommand): Promise { // Add to the queue this.commandsQueue.push(command); // eslint-disable-next-line no-constant-condition - while (this.commandsQueue[0].uuid !== command.uuid) + while (this.commandsQueue[0].uuid !== command.uuid) { - await new Promise(resolve => + await new Promise((resolve) => { - setTimeout(resolve, 100); + setTimeout(resolve, 100); }); } // When the command is ready, execute it return this.commandsQueue.shift().cmd(); } -} \ No newline at end of file +} diff --git a/project/src/utils/DatabaseImporter.ts b/project/src/utils/DatabaseImporter.ts index 5eba10b5..c348e6d5 100644 --- a/project/src/utils/DatabaseImporter.ts +++ b/project/src/utils/DatabaseImporter.ts @@ -33,7 +33,7 @@ export class DatabaseImporter implements OnLoad @inject("EncodingUtil") protected encodingUtil: EncodingUtil, @inject("HashUtil") protected hashUtil: HashUtil, @inject("ImporterUtil") protected importerUtil: ImporterUtil, - @inject("ConfigServer") protected configServer: ConfigServer + @inject("ConfigServer") protected configServer: ConfigServer, ) { this.httpConfig = this.configServer.getConfig(ConfigTypes.HTTP); @@ -45,25 +45,26 @@ export class DatabaseImporter implements OnLoad */ public getSptDataPath(): string { - return (globalThis.G_RELEASE_CONFIGURATION) - ? "Aki_Data/Server/" - : "./assets/"; + return (globalThis.G_RELEASE_CONFIGURATION) ? "Aki_Data/Server/" : "./assets/"; } - + public async onLoad(): Promise { this.filepath = this.getSptDataPath(); - + if (globalThis.G_RELEASE_CONFIGURATION) { - try + try { // Reading the dynamic SHA1 file const file = "checks.dat"; const fileWithPath = `${this.filepath}${file}`; if (this.vfs.exists(fileWithPath)) { - this.hashedFile = this.jsonUtil.deserialize(this.encodingUtil.fromBase64(this.vfs.readFile(fileWithPath)), file); + this.hashedFile = this.jsonUtil.deserialize( + this.encodingUtil.fromBase64(this.vfs.readFile(fileWithPath)), + file, + ); } else { @@ -88,7 +89,7 @@ export class DatabaseImporter implements OnLoad "/files/Hideout/", "/files/launcher/", "/files/quest/icon/", - "/files/trader/avatar/" + "/files/trader/avatar/", ]); } @@ -99,42 +100,50 @@ export class DatabaseImporter implements OnLoad protected async hydrateDatabase(filepath: string): Promise { this.logger.info(this.localisationService.getText("importing_database")); - + const dataToImport = await this.importerUtil.loadAsync( `${filepath}database/`, this.filepath, - (fileWithPath: string, data: string) => this.onReadValidate(fileWithPath, data) + (fileWithPath: string, data: string) => this.onReadValidate(fileWithPath, data), ); - const validation = (this.valid === VaildationResult.FAILED || this.valid === VaildationResult.NOT_FOUND) ? "." : ""; + const validation = (this.valid === VaildationResult.FAILED || this.valid === VaildationResult.NOT_FOUND) + ? "." + : ""; this.logger.info(`${this.localisationService.getText("importing_database_finish")}${validation}`); this.databaseServer.setTables(dataToImport); } - + protected onReadValidate(fileWithPath: string, data: string): void { // Validate files if (globalThis.G_RELEASE_CONFIGURATION && this.hashedFile && !this.validateFile(fileWithPath, data)) + { this.valid = VaildationResult.FAILED; + } } public getRoute(): string { return "aki-database"; } - + protected validateFile(filePathAndName: string, fileData: any): boolean { - try + try { const finalPath = filePathAndName.replace(this.filepath, "").replace(".json", ""); let tempObject; for (const prop of finalPath.split("/")) { if (!tempObject) + { tempObject = this.hashedFile[prop]; + } else + { tempObject = tempObject[prop]; + } } if (tempObject !== this.hashUtil.generateSha1ForData(fileData)) @@ -196,9 +205,9 @@ export class DatabaseImporter implements OnLoad } enum VaildationResult - { - SUCCESS, - FAILED, - NOT_FOUND, - UNDEFINED -} \ No newline at end of file +{ + SUCCESS = 0, + FAILED = 1, + NOT_FOUND = 2, + UNDEFINED = 3, +} diff --git a/project/src/utils/EncodingUtil.ts b/project/src/utils/EncodingUtil.ts index 3468b12e..6ab124ef 100644 --- a/project/src/utils/EncodingUtil.ts +++ b/project/src/utils/EncodingUtil.ts @@ -3,7 +3,6 @@ import { injectable } from "tsyringe"; @injectable() export class EncodingUtil { - public encode(value: string, encode: EncodeType): string { return Buffer.from(value).toString(encode); @@ -33,14 +32,13 @@ export class EncodingUtil { return this.encode(value, EncodeType.HEX); } - } export enum EncodeType - { +{ BASE64 = "base64", HEX = "hex", ASCII = "ascii", BINARY = "binary", - UTF8 = "utf8" -} \ No newline at end of file + UTF8 = "utf8", +} diff --git a/project/src/utils/HashUtil.ts b/project/src/utils/HashUtil.ts index 7832f427..6b9d0d2e 100644 --- a/project/src/utils/HashUtil.ts +++ b/project/src/utils/HashUtil.ts @@ -6,10 +6,8 @@ import { TimeUtil } from "@spt-aki/utils/TimeUtil"; @injectable() export class HashUtil { - constructor( - @inject("TimeUtil") protected timeUtil: TimeUtil - ) - { } + constructor(@inject("TimeUtil") protected timeUtil: TimeUtil) + {} /** * Create a 24 character id using the sha256 algorithm + current timestamp diff --git a/project/src/utils/HttpFileUtil.ts b/project/src/utils/HttpFileUtil.ts index 7dc79adc..baca8734 100644 --- a/project/src/utils/HttpFileUtil.ts +++ b/project/src/utils/HttpFileUtil.ts @@ -7,22 +7,21 @@ import { HttpServerHelper } from "@spt-aki/helpers/HttpServerHelper"; @injectable() export class HttpFileUtil { - constructor( - @inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper - ) + constructor(@inject("HttpServerHelper") protected httpServerHelper: HttpServerHelper) { } public sendFile(resp: ServerResponse, file: any): void { const pathSlic = file.split("/"); - const type = this.httpServerHelper.getMimeText(pathSlic[pathSlic.length - 1].split(".").at(-1)) || this.httpServerHelper.getMimeText("txt"); + const type = this.httpServerHelper.getMimeText(pathSlic[pathSlic.length - 1].split(".").at(-1)) + || this.httpServerHelper.getMimeText("txt"); const fileStream = fs.createReadStream(file); - fileStream.on("open", function () + fileStream.on("open", function() { resp.setHeader("Content-Type", type); fileStream.pipe(resp); }); } -} \ No newline at end of file +} diff --git a/project/src/utils/HttpResponseUtil.ts b/project/src/utils/HttpResponseUtil.ts index dbd93496..c2ed1011 100644 --- a/project/src/utils/HttpResponseUtil.ts +++ b/project/src/utils/HttpResponseUtil.ts @@ -10,27 +10,24 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; @injectable() export class HttpResponseUtil { - constructor( @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("LocalisationService") protected localisationService: LocalisationService + @inject("LocalisationService") protected localisationService: LocalisationService, ) - { } + {} protected clearString(s: string): any { - return s.replace(/[\b]/g, "") - .replace(/[\f]/g, "") - .replace(/[\n]/g, "") - .replace(/[\r]/g, "") - .replace(/[\t]/g, "") - .replace(/[\\]/g, ""); + return s.replace(/[\b]/g, "").replace(/[\f]/g, "").replace(/[\n]/g, "").replace(/[\r]/g, "").replace( + /[\t]/g, + "", + ).replace(/[\\]/g, ""); } /** * Return passed in data as JSON string - * @param data - * @returns + * @param data + * @returns */ public noBody(data: any): any { @@ -44,11 +41,7 @@ export class HttpResponseUtil public getUnclearedBody(data: any, err = 0, errmsg = null): string { - return this.jsonUtil.serialize({ - err: err, - errmsg: errmsg, - data: data - }); + return this.jsonUtil.serialize({ err: err, errmsg: errmsg, data: data }); } public emptyResponse(): IGetBodyResponseData @@ -66,13 +59,13 @@ export class HttpResponseUtil return this.getBody([]); } - public appendErrorToOutput(output: IItemEventRouterResponse, message = this.localisationService.getText("http-unknown_error"), errorCode = BackendErrorCodes.NONE): IItemEventRouterResponse + public appendErrorToOutput( + output: IItemEventRouterResponse, + message = this.localisationService.getText("http-unknown_error"), + errorCode = BackendErrorCodes.NONE, + ): IItemEventRouterResponse { - output.warnings = [{ - index: 0, - errmsg: message, - code: errorCode.toString() - }]; + output.warnings = [{ index: 0, errmsg: message, code: errorCode.toString() }]; return output; } diff --git a/project/src/utils/ImporterUtil.ts b/project/src/utils/ImporterUtil.ts index 9c5e25a2..51173cec 100644 --- a/project/src/utils/ImporterUtil.ts +++ b/project/src/utils/ImporterUtil.ts @@ -1,18 +1,15 @@ import { inject, injectable } from "tsyringe"; -import { Queue } from "@spt-aki/utils/collections/queue/Queue"; import { JsonUtil } from "@spt-aki/utils/JsonUtil"; import { VFS } from "@spt-aki/utils/VFS"; +import { Queue } from "@spt-aki/utils/collections/queue/Queue"; /* eslint-disable @typescript-eslint/no-empty-function */ /* eslint-disable @typescript-eslint/brace-style */ @injectable() export class ImporterUtil { - constructor( - @inject("VFS") protected vfs: VFS, - @inject("JsonUtil") protected jsonUtil: JsonUtil - ) + constructor(@inject("VFS") protected vfs: VFS, @inject("JsonUtil") protected jsonUtil: JsonUtil) {} /** @@ -22,8 +19,10 @@ export class ImporterUtil */ public async loadRecursiveAsync( filepath: string, - onReadCallback: (fileWithPath: string, data: string) => void = () => {}, - onObjectDeserialized: (fileWithPath: string, object: any) => void = () => {} + onReadCallback: (fileWithPath: string, data: string) => void = () => + {}, + onObjectDeserialized: (fileWithPath: string, object: any) => void = () => + {}, ): Promise { const result = {} as T; @@ -39,7 +38,7 @@ export class ImporterUtil { const filename = this.vfs.stripExtension(file); const filePathAndName = `${filepath}${file}`; - await this.vfs.readFileAsync(filePathAndName).then(fileData => + await this.vfs.readFileAsync(filePathAndName).then((fileData) => { onReadCallback(filePathAndName, fileData); const fileDeserialized = this.jsonUtil.deserializeWithCacheCheck(fileData, filePathAndName); @@ -57,7 +56,7 @@ export class ImporterUtil // set all loadRecursive to be executed asynchronously const resEntries = Object.entries(result); - const resResolved = await Promise.all(resEntries.map(ent => ent[1])); + const resResolved = await Promise.all(resEntries.map((ent) => ent[1])); for (let resIdx = 0; resIdx < resResolved.length; resIdx++) { resEntries[resIdx][1] = resResolved[resIdx]; @@ -67,17 +66,14 @@ export class ImporterUtil return Object.fromEntries(resEntries) as T; } - /** * Load files into js objects recursively (synchronous) * @param filepath Path to folder with files - * @returns + * @returns */ - public loadRecursive( - filepath: string, - onReadCallback: (fileWithPath: string, data: string) => void = () => {}, - onObjectDeserialized: (fileWithPath: string, object: any) => void = () => {} - ): T + public loadRecursive(filepath: string, onReadCallback: (fileWithPath: string, data: string) => void = () => + {}, onObjectDeserialized: (fileWithPath: string, object: any) => void = () => + {}): T { const result = {} as T; @@ -112,8 +108,10 @@ export class ImporterUtil public async loadAsync( filepath: string, strippablePath = "", - onReadCallback: (fileWithPath: string, data: string) => void = () => {}, - onObjectDeserialized: (fileWithPath: string, object: any) => void = () => {} + onReadCallback: (fileWithPath: string, data: string) => void = () => + {}, + onObjectDeserialized: (fileWithPath: string, object: any) => void = () => + {}, ): Promise { const directoriesToRead = new Queue(); @@ -125,15 +123,15 @@ export class ImporterUtil const files = this.vfs.getFiles(filepath); const directories = this.vfs.getDirs(filepath); - - directoriesToRead.enqueueAll(directories.map(d => `${filepath}${d}`)); - filesToProcess.enqueueAll(files.map(f => new VisitNode(filepath, f))); + + directoriesToRead.enqueueAll(directories.map((d) => `${filepath}${d}`)); + filesToProcess.enqueueAll(files.map((f) => new VisitNode(filepath, f))); while (!directoriesToRead.isEmpty()) { const directory = directoriesToRead.dequeue(); - filesToProcess.enqueueAll(this.vfs.getFiles(directory).map(f => new VisitNode(`${directory}/`, f))); - directoriesToRead.enqueueAll(this.vfs.getDirs(directory).map(d => `${directory}/${d}`)); + filesToProcess.enqueueAll(this.vfs.getFiles(directory).map((f) => new VisitNode(`${directory}/`, f))); + directoriesToRead.enqueueAll(this.vfs.getDirs(directory).map((d) => `${directory}/${d}`)); } while (!filesToProcess.isEmpty()) @@ -143,26 +141,27 @@ export class ImporterUtil { const filePathAndName = `${fileNode.filePath}${fileNode.fileName}`; promises.push( - this.vfs.readFileAsync(filePathAndName) - .then(async fileData => { - onReadCallback(filePathAndName, fileData); - return this.jsonUtil.deserializeWithCacheCheckAsync(fileData, filePathAndName); - }) - .then(async fileDeserialized => { - onObjectDeserialized(filePathAndName, fileDeserialized); - const strippedFilePath = this.vfs.stripExtension(filePathAndName).replace(filepath, ""); - this.placeObject(fileDeserialized, strippedFilePath, result, strippablePath); - }) + this.vfs.readFileAsync(filePathAndName).then(async (fileData) => + { + onReadCallback(filePathAndName, fileData); + return this.jsonUtil.deserializeWithCacheCheckAsync(fileData, filePathAndName); + }).then(async (fileDeserialized) => + { + onObjectDeserialized(filePathAndName, fileDeserialized); + const strippedFilePath = this.vfs.stripExtension(filePathAndName).replace(filepath, ""); + this.placeObject(fileDeserialized, strippedFilePath, result, strippablePath); + }), ); } } - - await Promise.all(promises).catch(e => console.error(e)); - + + await Promise.all(promises).catch((e) => console.error(e)); + return result; } - - protected placeObject(fileDeserialized: any, strippedFilePath: string, result: T, strippablePath: string):void { + + protected placeObject(fileDeserialized: any, strippedFilePath: string, result: T, strippablePath: string): void + { const strippedFinalPath = strippedFilePath.replace(strippablePath, ""); let temp = result; const propertiesToVisit = strippedFinalPath.split("/"); @@ -177,7 +176,9 @@ export class ImporterUtil else { if (!temp[property]) + { temp[property] = {}; + } temp = temp[property]; } } @@ -186,9 +187,6 @@ export class ImporterUtil class VisitNode { - constructor( - public filePath: string, - public fileName: string - ){} - -} \ No newline at end of file + constructor(public filePath: string, public fileName: string) + {} +} diff --git a/project/src/utils/JsonUtil.ts b/project/src/utils/JsonUtil.ts index a5b5877f..534ac2bf 100644 --- a/project/src/utils/JsonUtil.ts +++ b/project/src/utils/JsonUtil.ts @@ -18,9 +18,9 @@ export class JsonUtil constructor( @inject("VFS") protected vfs: VFS, @inject("HashUtil") protected hashUtil: HashUtil, - @inject("WinstonLogger") protected logger: ILogger + @inject("WinstonLogger") protected logger: ILogger, ) - { } + {} /** * From object to string @@ -47,23 +47,23 @@ export class JsonUtil * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. * @returns string */ - public serializeAdvanced(data: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string + public serializeAdvanced( + data: any, + replacer?: (this: any, key: string, value: any) => any, + space?: string | number, + ): string { - return JSON.stringify(data, replacer, space); } /** * From object to string * @param data object to turn into JSON - * @param filename Name of file being serialized - * @param options Stringify options or a replacer. - * @returns The string converted from the JavaScript value + * @param filename Name of file being serialized + * @param options Stringify options or a replacer. + * @returns The string converted from the JavaScript value */ - public serializeJsonC( - data: any, - filename?: string | null, - options?: IStringifyOptions | Reviver): string + public serializeJsonC(data: any, filename?: string | null, options?: IStringifyOptions | Reviver): string { try { @@ -71,14 +71,13 @@ export class JsonUtil } catch (error) { - this.logger.error(`unable to stringify jsonC file: ${filename} message: ${error.message}, stack: ${error.stack}`); + this.logger.error( + `unable to stringify jsonC file: ${filename} message: ${error.message}, stack: ${error.stack}`, + ); } } - public serializeJson5( - data: any, - filename?: string | null, - prettify = false): string + public serializeJson5(data: any, filename?: string | null, prettify = false): string { try { @@ -93,7 +92,9 @@ export class JsonUtil } catch (error) { - this.logger.error(`unable to stringify json5 file: ${filename} message: ${error.message}, stack: ${error.stack}`); + this.logger.error( + `unable to stringify json5 file: ${filename} message: ${error.message}, stack: ${error.stack}`, + ); } } @@ -111,7 +112,9 @@ export class JsonUtil } catch (error) { - this.logger.error(`unable to parse json file: ${filename} message: ${error.message}, stack: ${error.stack}`); + this.logger.error( + `unable to parse json file: ${filename} message: ${error.message}, stack: ${error.stack}`, + ); } } @@ -130,7 +133,9 @@ export class JsonUtil } catch (error) { - this.logger.error(`unable to parse jsonC file: ${filename} message: ${error.message}, stack: ${error.stack}`); + this.logger.error( + `unable to parse jsonC file: ${filename} message: ${error.message}, stack: ${error.stack}`, + ); } } @@ -142,13 +147,15 @@ export class JsonUtil } catch (error) { - this.logger.error(`unable to parse json file: ${filename} message: ${error.message}, stack: ${error.stack}`); + this.logger.error( + `unable to parse json file: ${filename} message: ${error.message}, stack: ${error.stack}`, + ); } } public async deserializeWithCacheCheckAsync(jsonString: string, filePath: string): Promise { - return new Promise((resolve) => + return new Promise((resolve) => { resolve(this.deserializeWithCacheCheck(jsonString, filePath)); }); @@ -175,8 +182,8 @@ export class JsonUtil try { const { data, changed } = fixJson(jsonString); - if (changed) // data invalid, return it - { + if (changed) + { // data invalid, return it this.logger.error(`${filePath} - Detected faulty json, please fix your json file using VSCodium`); } else @@ -206,7 +213,6 @@ export class JsonUtil return this.deserialize(jsonString); } - /** * Create file if nothing found * @param jsonCachePath path to cache @@ -228,7 +234,7 @@ export class JsonUtil * Read contents of json cache and add to class field * @param jsonCachePath Path to cache */ - protected hydrateJsonCache(jsonCachePath: string) : void + protected hydrateJsonCache(jsonCachePath: string): void { // Get all file hashes if (!this.fileHashes) diff --git a/project/src/utils/MathUtil.ts b/project/src/utils/MathUtil.ts index ab72896f..ec23703d 100644 --- a/project/src/utils/MathUtil.ts +++ b/project/src/utils/MathUtil.ts @@ -5,9 +5,9 @@ export class MathUtil { /** * Helper to create the sum of all array elements - * @param {array} values The array with numbers of which to calculate the sum - * @return {number} sum(values) - */ + * @param {array} values The array with numbers of which to calculate the sum + * @return {number} sum(values) + */ public arraySum(values: number[]): number { // sum with initial value being 0 @@ -24,7 +24,7 @@ export class MathUtil { // curried function for cumulative sum: (cum, x) => cum += x // and 0 being the initial value for the map - return values.map((cum => x => cum += x)(0)); + return values.map(((cum) => (x) => cum += x)(0)); } /** @@ -34,7 +34,7 @@ export class MathUtil */ public arrayProd(values: number[], factor: number): number[] { - return values.map(x => x * factor); + return values.map((x) => x * factor); } /** @@ -44,7 +44,7 @@ export class MathUtil */ public arrayAdd(values: number[], summand: number): number[] { - return values.map(x => x + summand); + return values.map((x) => x + summand); } /** @@ -72,14 +72,14 @@ export class MathUtil } /** - * Linear interpolation - * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel - * - * @param {string} xp the point of x at which to interpolate - * @param {array} x support points in x (of same length as y) - * @param {array} y support points in y (of same length as x) - * @return {number} y(xp) - */ + * Linear interpolation + * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel + * + * @param {string} xp the point of x at which to interpolate + * @param {array} x support points in x (of same length as y) + * @param {array} y support points in y (of same length as x) + * @return {number} y(xp) + */ public interp1(xp: number, x: number[], y: number[]): number { if (xp > x[x.length - 1]) @@ -101,4 +101,4 @@ export class MathUtil } } } -} \ No newline at end of file +} diff --git a/project/src/utils/ObjectId.ts b/project/src/utils/ObjectId.ts index 40183e9b..4438e5e2 100644 --- a/project/src/utils/ObjectId.ts +++ b/project/src/utils/ObjectId.ts @@ -6,10 +6,8 @@ import { TimeUtil } from "@spt-aki/utils/TimeUtil"; @injectable() export class ObjectId { - constructor( - @inject("TimeUtil") protected timeUtil: TimeUtil - ) - { } + constructor(@inject("TimeUtil") protected timeUtil: TimeUtil) + {} protected randomBytes = crypto.randomBytes(5); protected constglobalCounter = 0; @@ -58,4 +56,4 @@ export class ObjectId return this.toHexString(objectIdBinary); } -} \ No newline at end of file +} diff --git a/project/src/utils/RagfairOfferHolder.ts b/project/src/utils/RagfairOfferHolder.ts index 86861ded..3dcb9926 100644 --- a/project/src/utils/RagfairOfferHolder.ts +++ b/project/src/utils/RagfairOfferHolder.ts @@ -51,7 +51,7 @@ export class RagfairOfferHolder public addOffers(offers: Array): void { - offers.forEach(o => this.addOffer(o)); + offers.forEach((o) => this.addOffer(o)); } public addOffer(offer: IRagfairOffer): void @@ -76,9 +76,9 @@ export class RagfairOfferHolder public removeOffers(offers: Array): void { - offers.forEach(o => this.removeOffer(o)); + offers.forEach((o) => this.removeOffer(o)); } - + public removeOfferByTrader(traderId: string): void { if (this.offersByTrader.has(traderId)) @@ -93,7 +93,7 @@ export class RagfairOfferHolder */ public getStaleOffers(time: number): Array { - return this.getOffers().filter(o => this.isStale(o, time)); + return this.getOffers().filter((o) => this.isStale(o, time)); } protected addOfferByTemplates(template: string, offer: IRagfairOffer): void @@ -128,4 +128,4 @@ export class RagfairOfferHolder { return offer.endTime < time || offer.items[0].upd.StackObjectsCount < 1; } -} \ No newline at end of file +} diff --git a/project/src/utils/RandomUtil.ts b/project/src/utils/RandomUtil.ts index 1ef6f403..8323fa53 100644 --- a/project/src/utils/RandomUtil.ts +++ b/project/src/utils/RandomUtil.ts @@ -5,32 +5,31 @@ import { JsonUtil } from "@spt-aki/utils/JsonUtil"; import { MathUtil } from "@spt-aki/utils/MathUtil"; /** - * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects - * based on the relative probability of each of its elements. - * The probabilities of the contained element is not required to be normalized. - * - * Example: - * po = new ProbabilityObjectArray( - * new ProbabilityObject("a", 5), - * new ProbabilityObject("b", 1), - * new ProbabilityObject("c", 1) - * ); - * res = po.draw(10000); - * // count the elements which should be distributed according to the relative probabilities - * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) - */ -export class ProbabilityObjectArray extends Array> + * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects + * based on the relative probability of each of its elements. + * The probabilities of the contained element is not required to be normalized. + * + * Example: + * po = new ProbabilityObjectArray( + * new ProbabilityObject("a", 5), + * new ProbabilityObject("b", 1), + * new ProbabilityObject("c", 1) + * ); + * res = po.draw(10000); + * // count the elements which should be distributed according to the relative probabilities + * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) + */ +export class ProbabilityObjectArray extends Array> { - constructor( - private mathUtil: MathUtil, - private jsonUtil: JsonUtil, - ...items: ProbabilityObject[]) + constructor(private mathUtil: MathUtil, private jsonUtil: JsonUtil, ...items: ProbabilityObject[]) { super(); this.push(...items); } - filter(callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any): ProbabilityObjectArray + filter( + callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any, + ): ProbabilityObjectArray { return new ProbabilityObjectArray(this.mathUtil, this.jsonUtil, ...super.filter(callbackfn)); } @@ -56,7 +55,7 @@ export class ProbabilityObjectArray extends Array(this.mathUtil, this.jsonUtil); - for (const ci of clone) + for (const ci of clone) { probabliltyObjects.push(new ProbabilityObject(ci.key, ci.relativeProbability, ci.data)); } @@ -71,7 +70,7 @@ export class ProbabilityObjectArray extends Array { - return this.filter(r => r.key !== key); + return this.filter((r) => r.key !== key); } /** @@ -81,7 +80,7 @@ export class ProbabilityObjectArray extends Array r.key === key)[0]?.data; + return this.filter((r) => r.key === key)[0]?.data; } /** @@ -96,7 +95,7 @@ export class ProbabilityObjectArray extends Array r.key === key)[0].relativeProbability; + return this.filter((r) => r.key === key)[0].relativeProbability; } /** @@ -110,7 +109,7 @@ export class ProbabilityObjectArray extends Array x.relativeProbability)); + return Math.max(...this.map((x) => x.relativeProbability)); } /** @@ -124,7 +123,7 @@ export class ProbabilityObjectArray extends Array x.relativeProbability)); + return Math.min(...this.map((x) => x.relativeProbability)); } /** @@ -137,26 +136,26 @@ export class ProbabilityObjectArray extends Array = []): K[] { - const {probArray, keyArray} = this.reduce((acc, x) => + const { probArray, keyArray } = this.reduce((acc, x) => { acc.probArray.push(x.relativeProbability); acc.keyArray.push(x.key); return acc; - }, {probArray: [], keyArray: []}); + }, { probArray: [], keyArray: [] }); let probCumsum = this.cumulativeProbability(probArray); const drawnKeys = []; - for (let i = 0; i < count; i++) + for (let i = 0; i < count; i++) { const rand = Math.random(); - const randomIndex = probCumsum.findIndex(x => x > rand); + const randomIndex = probCumsum.findIndex((x) => x > rand); // We cannot put Math.random() directly in the findIndex because then it draws anew for each of its iteration - if (replacement || locklist.includes(keyArray[randomIndex])) + if (replacement || locklist.includes(keyArray[randomIndex])) { // Add random item from possible value into return array drawnKeys.push(keyArray[randomIndex]); } - else + else { // We draw without replacement -> remove the key and its probability from array const key = keyArray.splice(randomIndex, 1)[0]; @@ -164,7 +163,7 @@ export class ProbabilityObjectArray extends Array extends Array + * A ProbabilityObject which is use as an element to the ProbabilityObjectArray array + * It contains a key, the relative probability as well as optional data. + */ +export class ProbabilityObject { key: K; relativeProbability: number; data: V; /** - * Constructor for the ProbabilityObject - * @param {string} key The key of the element - * @param {number} relativeProbability The relative probability of this element - * @param {any} data Optional data attached to the element - */ + * Constructor for the ProbabilityObject + * @param {string} key The key of the element + * @param {number} relativeProbability The relative probability of this element + * @param {any} data Optional data attached to the element + */ constructor(key: K, relativeProbability: number, data: V = null) { this.key = key; @@ -201,10 +200,7 @@ export class ProbabilityObject @injectable() export class RandomUtil { - constructor ( - @inject("JsonUtil") protected jsonUtil: JsonUtil, - @inject("WinstonLogger") protected logger: ILogger - ) + constructor(@inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("WinstonLogger") protected logger: ILogger) { } @@ -276,8 +272,14 @@ export class RandomUtil { let u = 0; let v = 0; - while (u === 0) u = Math.random(); //Converting [0,1) to (0,1) - while (v === 0) v = Math.random(); + while (u === 0) + { + u = Math.random(); // Converting [0,1) to (0,1) + } + while (v === 0) + { + v = Math.random(); + } const w = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); return mu + w * sigma; } @@ -291,11 +293,11 @@ export class RandomUtil */ public randInt(low: number, high?: number): number { - if (high) + if (high) { return low + Math.floor(Math.random() * (high - low)); } - else + else { return Math.floor(Math.random() * low); } @@ -311,20 +313,20 @@ export class RandomUtil */ public drawRandomFromList(list: Array, count = 1, replacement = true): Array { - if (!replacement) + if (!replacement) { list = this.jsonUtil.clone(list); } const results = []; - for (let i = 0; i < count; i++) + for (let i = 0; i < count; i++) { const randomIndex = this.randInt(list.length); - if (replacement) + if (replacement) { results.push(list[randomIndex]); } - else + else { results.push(list.splice(randomIndex, 1)[0]); } @@ -365,17 +367,14 @@ export class RandomUtil if (max < min) { throw { - "name": "Invalid arguments", - "message": `Bounded random number generation max is smaller than min (${max} < ${min})` + name: "Invalid arguments", + message: `Bounded random number generation max is smaller than min (${max} < ${min})`, }; } if (n < 1) { - throw { - "name": "Invalid argument", - "message": `'n' must be 1 or greater (received ${n})` - }; + throw { name: "Invalid argument", message: `'n' must be 1 or greater (received ${n})` }; } if (min === max) @@ -390,7 +389,9 @@ export class RandomUtil * A shift that is equal to the available range only has a 50% chance of rolling correctly, theoretically halving performance. * Shifting even further drops the success chance very rapidly - so we want to warn against that */ - this.logger.warning("Bias shift for random number generation is greater than the range of available numbers.\nThis can have a very severe performance impact!"); + this.logger.warning( + "Bias shift for random number generation is greater than the range of available numbers.\nThis can have a very severe performance impact!", + ); this.logger.info(`min -> ${min}; max -> ${max}; shift -> ${shift}`); } @@ -433,19 +434,18 @@ export class RandomUtil { let currentIndex = array.length; let randomIndex: number; - + // While there remain elements to shuffle. - while (currentIndex !== 0) + while (currentIndex !== 0) { // Pick a remaining element. randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; - + // And swap it with the current element. - [array[currentIndex], array[randomIndex]] = [ - array[randomIndex], array[currentIndex]]; + [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; } - + return array; } -} \ No newline at end of file +} diff --git a/project/src/utils/TimeUtil.ts b/project/src/utils/TimeUtil.ts index 9d2a5dbc..c37413ea 100644 --- a/project/src/utils/TimeUtil.ts +++ b/project/src/utils/TimeUtil.ts @@ -35,7 +35,7 @@ export class TimeUtil /** * Get timestamp in seconds - * @returns + * @returns */ public getTimestamp(): number { @@ -43,7 +43,7 @@ export class TimeUtil } /** - * mail in eft requires time be in a specific format + * mail in eft requires time be in a specific format * @returns current time in format: 00:00 (hh:mm) */ public getTimeMailFormat(): string @@ -55,7 +55,7 @@ export class TimeUtil } /** - * Mail in eft requires date be in a specific format + * Mail in eft requires date be in a specific format * @returns current date in format: 00.00.0000 (dd.mm.yyyy) */ public getDateMailFormat(): string diff --git a/project/src/utils/UUidGenerator.ts b/project/src/utils/UUidGenerator.ts index 12099ee9..e79b7776 100644 --- a/project/src/utils/UUidGenerator.ts +++ b/project/src/utils/UUidGenerator.ts @@ -3,23 +3,23 @@ import { injectable } from "tsyringe"; import { IUUidGenerator } from "@spt-aki/models/spt/utils/IUuidGenerator"; @injectable() -export class UUidGenerator implements IUUidGenerator +export class UUidGenerator implements IUUidGenerator { // https://stackoverflow.com/a/8809472 - public generate(): string + public generate(): string { // Public Domain/MIT - let date = new Date().getTime();//Timestamp - let time = ((typeof performance !== "undefined") && performance.now && (performance.now() * 1000)) || 0;//Time in microseconds since page-load or 0 if unsupported - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) + let date = new Date().getTime(); // Timestamp + let time = ((typeof performance !== "undefined") && performance.now && (performance.now() * 1000)) || 0; // Time in microseconds since page-load or 0 if unsupported + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { - let rand = Math.random() * 16;//random number between 0 and 16 - if (date > 0) - {//Use timestamp until depleted + let rand = Math.random() * 16; // random number between 0 and 16 + if (date > 0) + { // Use timestamp until depleted rand = (date + rand) % 16 | 0; date = Math.floor(date / 16); } - else - {//Use microseconds since page-load if supported + else + { // Use microseconds since page-load if supported rand = (time + rand) % 16 | 0; time = Math.floor(time / 16); } diff --git a/project/src/utils/VFS.ts b/project/src/utils/VFS.ts index 896fe5ca..2d856f02 100644 --- a/project/src/utils/VFS.ts +++ b/project/src/utils/VFS.ts @@ -1,7 +1,7 @@ -import { writeFileSync } from "atomically"; import fs from "node:fs"; import path, { resolve } from "node:path"; import { promisify } from "node:util"; +import { writeFileSync } from "atomically"; import lockfile from "proper-lockfile"; import "reflect-metadata"; import { inject, injectable } from "tsyringe"; @@ -10,14 +10,17 @@ import { IAsyncQueue } from "@spt-aki/models/spt/utils/IAsyncQueue"; import { IUUidGenerator } from "@spt-aki/models/spt/utils/IUuidGenerator"; @injectable() -export class VFS +export class VFS { accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { recursive: true; }) => Promise; readFilePromisify: (path: fs.PathLike) => Promise; writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; - readdirPromisify: (path: fs.PathLike, options?: BufferEncoding | { encoding: BufferEncoding; withFileTypes?: false; }) => Promise; + readdirPromisify: ( + path: fs.PathLike, + options?: BufferEncoding | { encoding: BufferEncoding; withFileTypes?: false; }, + ) => Promise; statPromisify: (path: fs.PathLike, options?: fs.StatOptions & { bigint?: false; }) => Promise; unlinkPromisify: (path: fs.PathLike) => Promise; rmdirPromisify: (path: fs.PathLike) => Promise; @@ -25,8 +28,8 @@ export class VFS constructor( @inject("AsyncQueue") protected asyncQueue: IAsyncQueue, - @inject("UUidGenerator") protected uuidGenerator: IUUidGenerator - ) + @inject("UUidGenerator") protected uuidGenerator: IUUidGenerator, + ) { this.accessFilePromisify = promisify(fs.access); this.copyFilePromisify = promisify(fs.copyFile); @@ -40,19 +43,19 @@ export class VFS this.renamePromisify = promisify(fs.renameSync); } - public exists(filepath: fs.PathLike): boolean + public exists(filepath: fs.PathLike): boolean { return fs.existsSync(filepath); } - public async existsAsync(filepath: fs.PathLike): Promise + public async existsAsync(filepath: fs.PathLike): Promise { - try + try { // Create the command to add to the queue const command = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.accessFilePromisify(filepath) + cmd: async () => await this.accessFilePromisify(filepath), }; // Wait for the command completion await this.asyncQueue.waitFor(command); @@ -60,104 +63,109 @@ export class VFS // If no Exception, the file exists return true; } - catch + catch { // If Exception, the file does not exis return false; } } - public copyFile(filepath: fs.PathLike, target: fs.PathLike): void + public copyFile(filepath: fs.PathLike, target: fs.PathLike): void { fs.copyFileSync(filepath, target); } - public async copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise + public async copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise { const command = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.copyFilePromisify(filepath, target) + cmd: async () => await this.copyFilePromisify(filepath, target), }; await this.asyncQueue.waitFor(command); } - public createDir(filepath: string): void + public createDir(filepath: string): void { - fs.mkdirSync(filepath.substr(0, filepath.lastIndexOf("/")), { "recursive": true }); + fs.mkdirSync(filepath.substr(0, filepath.lastIndexOf("/")), { recursive: true }); } - public async createDirAsync(filepath: string): Promise + public async createDirAsync(filepath: string): Promise { const command = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.mkdirPromisify(filepath.substr(0, filepath.lastIndexOf("/")), { "recursive": true }) + cmd: async () => + await this.mkdirPromisify(filepath.substr(0, filepath.lastIndexOf("/")), { recursive: true }), }; await this.asyncQueue.waitFor(command); } - public copyDir(filepath: string, target: string, fileExtensions: string | string[] = undefined): void + public copyDir(filepath: string, target: string, fileExtensions: string | string[] = undefined): void { const files = this.getFiles(filepath); const dirs = this.getDirs(filepath); - if (!this.exists(target)) + if (!this.exists(target)) { this.createDir(`${target}/`); } - for (const dir of dirs) + for (const dir of dirs) { this.copyDir(path.join(filepath, dir), path.join(target, dir), fileExtensions); } - for (const file of files) + for (const file of files) { // copy all if fileExtension is not set, copy only those with fileExtension if set - if (!fileExtensions || fileExtensions.includes(file.split(".").pop())) + if (!fileExtensions || fileExtensions.includes(file.split(".").pop())) { this.copyFile(path.join(filepath, file), path.join(target, file)); } } } - public async copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise + public async copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise { const files = this.getFiles(filepath); const dirs = this.getDirs(filepath); - if (!await this.existsAsync(target)) + if (!await this.existsAsync(target)) { await this.createDirAsync(`${target}/`); } - for (const dir of dirs) + for (const dir of dirs) { await this.copyDirAsync(path.join(filepath, dir), path.join(target, dir), fileExtensions); } - for (const file of files) + for (const file of files) { // copy all if fileExtension is not set, copy only those with fileExtension if set - if (!fileExtensions || fileExtensions.includes(file.split(".").pop())) + if (!fileExtensions || fileExtensions.includes(file.split(".").pop())) { await this.copyAsync(path.join(filepath, file), path.join(target, file)); } } } - public readFile(...args: Parameters): string + public readFile(...args: Parameters): string { const read = fs.readFileSync(...args); if (this.isBuffer(read)) + { return read.toString(); + } return read; } - - public async readFileAsync(path: fs.PathLike): Promise + + public async readFileAsync(path: fs.PathLike): Promise { const read = await this.readFilePromisify(path); if (this.isBuffer(read)) + { return read.toString(); + } return read; } @@ -166,11 +174,11 @@ export class VFS return value?.write && value.toString && value.toJSON && value.equals; } - public writeFile(filepath: any, data = "", append = false, atomic = true): void + public writeFile(filepath: any, data = "", append = false, atomic = true): void { - const options = (append) ? { "flag": "a" } : { "flag": "w" }; + const options = append ? { flag: "a" } : { flag: "w" }; - if (!this.exists(filepath)) + if (!this.exists(filepath)) { this.createDir(filepath); fs.writeFileSync(filepath, ""); @@ -178,99 +186,98 @@ export class VFS this.lockFileSync(filepath); - if (!append && atomic) + if (!append && atomic) { writeFileSync(filepath, data); } - else + else { fs.writeFileSync(filepath, data, options); } - if (this.checkFileSync(filepath)) + if (this.checkFileSync(filepath)) { this.unlockFileSync(filepath); } } - public async writeFileAsync(filepath: any, data = "", append = false, atomic = true): Promise + public async writeFileAsync(filepath: any, data = "", append = false, atomic = true): Promise { - const options = (append) ? { "flag": "a" } : { "flag": "w" }; + const options = append ? { flag: "a" } : { flag: "w" }; - if (!await this.exists(filepath)) + if (!await this.exists(filepath)) { await this.createDir(filepath); await this.writeFilePromisify(filepath, ""); } - if (!append && atomic) + if (!append && atomic) { await this.writeFilePromisify(filepath, data); } - else + else { await this.writeFilePromisify(filepath, data, options); } } - public getFiles(filepath: string): string[] + public getFiles(filepath: string): string[] { - return fs.readdirSync(filepath).filter((item) => + return fs.readdirSync(filepath).filter((item) => { return fs.statSync(path.join(filepath, item)).isFile(); }); } - public async getFilesAsync(filepath: string): Promise + public async getFilesAsync(filepath: string): Promise { const addr = await this.readdirPromisify(filepath); - return addr.filter(async (item) => + return addr.filter(async (item) => { const stat = await this.statPromisify(path.join(filepath, item)); return stat.isFile(); }); } - - public getDirs(filepath: string): string[] + public getDirs(filepath: string): string[] { - return fs.readdirSync(filepath).filter((item) => + return fs.readdirSync(filepath).filter((item) => { return fs.statSync(path.join(filepath, item)).isDirectory(); }); } - public async getDirsAsync(filepath: string): Promise + public async getDirsAsync(filepath: string): Promise { const addr = await this.readdirPromisify(filepath); - return addr.filter(async (item) => + return addr.filter(async (item) => { const stat = await this.statPromisify(path.join(filepath, item)); return stat.isDirectory(); }); } - public removeFile(filepath: string): void + public removeFile(filepath: string): void { fs.unlinkSync(filepath); } - public async removeFileAsync(filepath: string): Promise + public async removeFileAsync(filepath: string): Promise { await this.unlinkPromisify(filepath); } - public removeDir(filepath: string): void + public removeDir(filepath: string): void { const files = this.getFiles(filepath); const dirs = this.getDirs(filepath); - for (const dir of dirs) + for (const dir of dirs) { this.removeDir(path.join(filepath, dir)); } - for (const file of files) + for (const file of files) { this.removeFile(path.join(filepath, file)); } @@ -278,19 +285,19 @@ export class VFS fs.rmdirSync(filepath); } - public async removeDirAsync(filepath: string): Promise + public async removeDirAsync(filepath: string): Promise { const files = this.getFiles(filepath); const dirs = this.getDirs(filepath); const promises = []; - for (const dir of dirs) + for (const dir of dirs) { promises.push(this.removeDirAsync(path.join(filepath, dir))); } - for (const file of files) + for (const file of files) { promises.push(this.removeFile(path.join(filepath, file))); } @@ -299,45 +306,45 @@ export class VFS await this.rmdirPromisify(filepath); } - public rename(oldPath: string, newPath: string): void + public rename(oldPath: string, newPath: string): void { fs.renameSync(oldPath, newPath); } - public async renameAsync(oldPath: string, newPath: string): Promise + public async renameAsync(oldPath: string, newPath: string): Promise { await this.renamePromisify(oldPath, newPath); } - protected lockFileSync(filepath: any): void + protected lockFileSync(filepath: any): void { lockfile.lockSync(filepath); } - protected checkFileSync(filepath: any): any + protected checkFileSync(filepath: any): any { return lockfile.checkSync(filepath); } - protected unlockFileSync(filepath: any): void + protected unlockFileSync(filepath: any): void { lockfile.unlockSync(filepath); } - public getFileExtension(filepath: string): string + public getFileExtension(filepath: string): string { return filepath.split(".").pop(); } - public stripExtension(filepath: string): string + public stripExtension(filepath: string): string { return filepath.split(".").slice(0, -1).join("."); } - public async minifyAllJsonInDirRecursive(filepath: string): Promise + public async minifyAllJsonInDirRecursive(filepath: string): Promise { const files = this.getFiles(filepath).filter((item) => this.getFileExtension(item) === "json"); - for (const file of files) + for (const file of files) { const filePathAndName = path.join(filepath, file); const minified = JSON.stringify(JSON.parse(this.readFile(filePathAndName))); @@ -345,16 +352,16 @@ export class VFS } const dirs = this.getDirs(filepath); - for (const dir of dirs) + for (const dir of dirs) { this.minifyAllJsonInDirRecursive(path.join(filepath, dir)); } } - public async minifyAllJsonInDirRecursiveAsync(filepath: string): Promise + public async minifyAllJsonInDirRecursiveAsync(filepath: string): Promise { const files = this.getFiles(filepath).filter((item) => this.getFileExtension(item) === "json"); - for (const file of files) + for (const file of files) { const filePathAndName = path.join(filepath, file); const minified = JSON.stringify(JSON.parse(await this.readFile(filePathAndName))); @@ -363,7 +370,7 @@ export class VFS const dirs = this.getDirs(filepath); const promises: Promise[] = []; - for (const dir of dirs) + for (const dir of dirs) { promises.push(this.minifyAllJsonInDirRecursive(path.join(filepath, dir))); } diff --git a/project/src/utils/Watermark.ts b/project/src/utils/Watermark.ts index 22724e1f..3f6a4b9b 100644 --- a/project/src/utils/Watermark.ts +++ b/project/src/utils/Watermark.ts @@ -14,16 +14,14 @@ export class WatermarkLocale protected warning: string[]; protected modding: string[]; - constructor( - @inject("LocalisationService") protected localisationService: LocalisationService - ) + constructor(@inject("LocalisationService") protected localisationService: LocalisationService) { this.description = [ this.localisationService.getText("watermark-discord_url"), "", this.localisationService.getText("watermark-free_of_charge"), this.localisationService.getText("watermark-paid_scammed"), - this.localisationService.getText("watermark-commercial_use_prohibited") + this.localisationService.getText("watermark-commercial_use_prohibited"), ]; this.warning = [ "", @@ -33,14 +31,14 @@ export class WatermarkLocale `${this.localisationService.getText("watermark-report_issues_to")}:`, this.localisationService.getText("watermark-issue_tracker_url"), "", - this.localisationService.getText("watermark-use_at_own_risk") + this.localisationService.getText("watermark-use_at_own_risk"), ]; this.modding = [ "", this.localisationService.getText("watermark-modding_disabled"), "", this.localisationService.getText("watermark-not_an_issue"), - this.localisationService.getText("watermark-do_not_report") + this.localisationService.getText("watermark-do_not_report"), ]; } @@ -69,7 +67,7 @@ export class Watermark @inject("WinstonLogger") protected logger: ILogger, @inject("ConfigServer") protected configServer: ConfigServer, @inject("LocalisationService") protected localisationService: LocalisationService, - @inject("WatermarkLocale") protected watermarkLocale?: WatermarkLocale + @inject("WatermarkLocale") protected watermarkLocale?: WatermarkLocale, ) { this.akiConfig = this.configServer.getConfig(ConfigTypes.CORE); diff --git a/project/src/utils/collections/lists/LinkedList.ts b/project/src/utils/collections/lists/LinkedList.ts index 2aa51fa3..3a60d5ca 100644 --- a/project/src/utils/collections/lists/LinkedList.ts +++ b/project/src/utils/collections/lists/LinkedList.ts @@ -3,19 +3,19 @@ export class LinkedList private head: LinkedListNode; private tail: LinkedListNode; - public add(t: T): void + public add(t: T): void { - if (!this.head) + if (!this.head) { const node = new LinkedListNode(t); this.head = node; this.tail = node; } - else + else { let ref = this.head; let next = this.head.getNextNode(); - while (next) + while (next) { ref = next; next = ref.getNextNode(); @@ -26,34 +26,34 @@ export class LinkedList } } - public addRange(list: T[]): void + public addRange(list: T[]): void { - for (const item of list) + for (const item of list) { this.add(item); } } - public getHead(): LinkedListNode + public getHead(): LinkedListNode { return this.head; } - public getTail(): LinkedListNode + public getTail(): LinkedListNode { return this.tail; } - public isEmpty(): boolean + public isEmpty(): boolean { return this.head === undefined || this.head === null; } - public getSize(): number + public getSize(): number { let size = 0; let next = this.head; - while (next) + while (next) { size++; next = next.getNextNode(); @@ -61,41 +61,47 @@ export class LinkedList return size; } - public removeFirst(): LinkedListNode + public removeFirst(): LinkedListNode { - if (!this.head) return undefined; + if (!this.head) + { + return undefined; + } const node = this.head; - if (this.head.getNextNode()) + if (this.head.getNextNode()) { this.head = this.head.getNextNode(); this.head.setPreviousNode(undefined); } - else + else { this.head = undefined; } return node; } - public removeLast(): LinkedListNode + public removeLast(): LinkedListNode { - if (!this.tail) return undefined; - + if (!this.tail) + { + return undefined; + } + const node = this.tail; - if (this.tail.getPreviousNode()) + if (this.tail.getPreviousNode()) { this.tail = this.tail.getPreviousNode(); this.tail.setNextNode(undefined); } - else + else { this.tail = undefined; } return node; } - public indexOf(func: (t:T) => boolean): number + public indexOf(func: (t: T) => boolean): number { const node = this.head; let index = 0; @@ -110,7 +116,7 @@ export class LinkedList return undefined; } - public contains(func: (t:T) => boolean): boolean + public contains(func: (t: T) => boolean): boolean { let node = this.head; while (node) @@ -124,7 +130,7 @@ export class LinkedList return false; } - public forEachNode(func: (t:LinkedListNode) => void): void + public forEachNode(func: (t: LinkedListNode) => void): void { let node = this.head; while (node) @@ -134,7 +140,7 @@ export class LinkedList } } - public forEachValue(func: (t:T) => void): void + public forEachValue(func: (t: T) => void): void { let node = this.head; while (node) @@ -144,7 +150,7 @@ export class LinkedList } } - public findFirstNode(func: (t:LinkedListNode) => boolean): LinkedListNode + public findFirstNode(func: (t: LinkedListNode) => boolean): LinkedListNode { let node = this.head; while (node) @@ -158,7 +164,7 @@ export class LinkedList return undefined; } - public findFirstValue(func: (t:T) => boolean): T + public findFirstValue(func: (t: T) => boolean): T { let node = this.head; while (node) @@ -191,35 +197,35 @@ export class LinkedListNode private value: T; private next: LinkedListNode; - constructor(value: T, previous: LinkedListNode = undefined, next: LinkedListNode = undefined) + constructor(value: T, previous: LinkedListNode = undefined, next: LinkedListNode = undefined) { this.value = value; this.previous = previous; this.next = next; } - public getValue(): T + public getValue(): T { return this.value; } - public getNextNode(): LinkedListNode + public getNextNode(): LinkedListNode { return this.next; } - public setNextNode(node: LinkedListNode): void + public setNextNode(node: LinkedListNode): void { this.next = node; } - public getPreviousNode(): LinkedListNode + public getPreviousNode(): LinkedListNode { return this.previous; } - public setPreviousNode(node: LinkedListNode): void + public setPreviousNode(node: LinkedListNode): void { this.previous = node; } -} \ No newline at end of file +} diff --git a/project/src/utils/collections/queue/Queue.ts b/project/src/utils/collections/queue/Queue.ts index 607c08c5..d6224e6a 100644 --- a/project/src/utils/collections/queue/Queue.ts +++ b/project/src/utils/collections/queue/Queue.ts @@ -3,26 +3,25 @@ export class Queue private elements: Record; private head: number; private tail: number; - constructor() - + constructor() { this.elements = {}; this.head = 0; this.tail = 0; } - - public enqueue(element: T): void + + public enqueue(element: T): void { this.elements[this.tail] = element; this.tail++; } - public enqueueAll(elements: T[]): void + public enqueueAll(elements: T[]): void { - elements.forEach(e => this.enqueue(e)); + elements.forEach((e) => this.enqueue(e)); } - public dequeue(): T + public dequeue(): T { const item = this.elements[this.head]; delete this.elements[this.head]; @@ -30,11 +29,11 @@ export class Queue return item; } - public peek():T + public peek(): T { return this.elements[this.head]; } - public getLength(): number + public getLength(): number { return this.tail - this.head; } @@ -43,4 +42,4 @@ export class Queue { return this.getLength() === 0; } -} \ No newline at end of file +} diff --git a/project/src/utils/logging/AbstractWinstonLogger.ts b/project/src/utils/logging/AbstractWinstonLogger.ts index 9d8dd79b..24dabbdf 100644 --- a/project/src/utils/logging/AbstractWinstonLogger.ts +++ b/project/src/utils/logging/AbstractWinstonLogger.ts @@ -12,27 +12,13 @@ import { ICommand } from "@spt-aki/models/spt/utils/ICommand"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { IUUidGenerator } from "@spt-aki/models/spt/utils/IUuidGenerator"; -export abstract class AbstractWinstonLogger implements ILogger +export abstract class AbstractWinstonLogger implements ILogger { protected showDebugInConsole = false; protected filePath: string; protected logLevels = { - levels: { - error: 0, - warn: 1, - succ: 2, - info: 3, - custom: 4, - debug: 5 - }, - colors: { - error: "red", - warn: "yellow", - succ: "green", - info: "white", - custom: "black", - debug: "gray" - }, + levels: { error: 0, warn: 1, succ: 2, info: 3, custom: 4, debug: 5 }, + colors: { error: "red", warn: "yellow", succ: "green", info: "white", custom: "black", debug: "gray" }, bgColors: { default: "", blackBG: "blackBG", @@ -42,21 +28,18 @@ export abstract class AbstractWinstonLogger implements ILogger blueBG: "blueBG", magentaBG: "magentaBG", cyanBG: "cyanBG", - whiteBG: "whiteBG" - } + whiteBG: "whiteBG", + }, }; protected logger: winston.Logger & SptLogger; protected writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; - constructor( - protected asyncQueue: IAsyncQueue, - protected uuidGenerator: IUUidGenerator - ) + constructor(protected asyncQueue: IAsyncQueue, protected uuidGenerator: IUUidGenerator) { this.filePath = `${this.getFilePath()}${this.getFileName()}`; this.writeFilePromisify = promisify(fs.writeFile); this.showDebugInConsole = globalThis.G_DEBUG_CONFIGURATION; - if (!fs.existsSync(this.getFilePath())) + if (!fs.existsSync(this.getFilePath())) { fs.mkdirSync(this.getFilePath(), { recursive: true }); } @@ -70,12 +53,12 @@ export abstract class AbstractWinstonLogger implements ILogger level: this.showDebugInConsole ? "debug" : "custom", format: format.combine( format.colorize({ all: true, colors: this.logLevels.colors }), - format.printf(({ message }) => + format.printf(({ message }) => { return `${message}`; - }) - ) - }) + }), + ), + }), ); } if (this.isLogToFile()) @@ -92,24 +75,21 @@ export abstract class AbstractWinstonLogger implements ILogger format.timestamp(), format.align(), format.json(), - format.printf(({ timestamp, level, message }) => + format.printf(({ timestamp, level, message }) => { return `[${timestamp}] ${level}: ${message}`; - }) - ) - }) + }), + ), + }), ); } winston.addColors(this.logLevels.colors); - this.logger = createLogger({ - levels: this.logLevels.levels, - transports: [...transportsList] - }); + this.logger = createLogger({ levels: this.logLevels.levels, transports: [...transportsList] }); if (this.isLogExceptions()) { - process.on("uncaughtException", (error) => + process.on("uncaughtException", (error) => { this.error(`${error.name}: ${error.message}`); this.error(error.stack); @@ -124,9 +104,9 @@ export abstract class AbstractWinstonLogger implements ILogger protected abstract isLogExceptions(): boolean; protected abstract getFilePath(): string; - + protected abstract getFileName(): string; - + protected getLogMaxSize(): string { return "5m"; @@ -137,81 +117,80 @@ export abstract class AbstractWinstonLogger implements ILogger return "14d"; } - public async writeToLogFile(data: string | Daum): Promise + public async writeToLogFile(data: string | Daum): Promise { const command: ICommand = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.writeFilePromisify(this.filePath, `${data}\n`, true) + cmd: async () => await this.writeFilePromisify(this.filePath, `${data}\n`, true), }; await this.asyncQueue.waitFor(command); } - public async log(data: string | Error | Record, color: string, backgroundColor = "" ): Promise + public async log(data: string | Error | Record, color: string, backgroundColor = ""): Promise { const textColor = `${color} ${backgroundColor}`.trimEnd(); const tmpLogger = createLogger({ levels: { custom: 0 }, level: "custom", - transports: [new transports.Console({ - format: format.combine( - format.colorize({ all: true, colors: { custom: textColor } }), - format.printf(({ message }) => message) - ) - })] + transports: [ + new transports.Console({ + format: format.combine( + format.colorize({ all: true, colors: { custom: textColor } }), + format.printf(({ message }) => message), + ), + }), + ], }); let command: ICommand; - if (typeof (data) === "string") + if (typeof data === "string") { - command = { - uuid: this.uuidGenerator.generate(), - cmd: async () => await tmpLogger.log("custom", data) - }; + command = { uuid: this.uuidGenerator.generate(), cmd: async () => await tmpLogger.log("custom", data) }; } - else + else { command = { uuid: this.uuidGenerator.generate(), - cmd: async () => await tmpLogger.log("custom", JSON.stringify(data, null, 4)) + cmd: async () => await tmpLogger.log("custom", JSON.stringify(data, null, 4)), }; } await this.asyncQueue.waitFor(command); } - public async error(data: string | Record): Promise + public async error(data: string | Record): Promise { const command: ICommand = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.logger.error(data) + cmd: async () => await this.logger.error(data), }; await this.asyncQueue.waitFor(command); } - public async warning(data: string | Record): Promise + public async warning(data: string | Record): Promise { const command: ICommand = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.logger.warn(data) + cmd: async () => await this.logger.warn(data), }; await this.asyncQueue.waitFor(command); } - public async success(data: string | Record): Promise + public async success(data: string | Record): Promise { const command: ICommand = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.logger.succ(data) + cmd: async () => await this.logger.succ(data), }; await this.asyncQueue.waitFor(command); } - public async info(data: string | Record): Promise + public async info(data: string | Record): Promise { const command: ICommand = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.logger.info(data) + cmd: async () => await this.logger.info(data), }; await this.asyncQueue.waitFor(command); } @@ -222,33 +201,34 @@ export abstract class AbstractWinstonLogger implements ILogger * @param textColor color of text * @param backgroundColor color of background */ - public async logWithColor(data: string | Record, textColor: LogTextColor, backgroundColor = LogBackgroundColor.DEFAULT): Promise + public async logWithColor( + data: string | Record, + textColor: LogTextColor, + backgroundColor = LogBackgroundColor.DEFAULT, + ): Promise { const command: ICommand = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.log(data, textColor.toString(), backgroundColor.toString()) + cmd: async () => await this.log(data, textColor.toString(), backgroundColor.toString()), }; await this.asyncQueue.waitFor(command); } - public async debug(data: string | Record, onlyShowInConsole = false): Promise + public async debug(data: string | Record, onlyShowInConsole = false): Promise { let command: ICommand; - if (onlyShowInConsole) + if (onlyShowInConsole) { command = { uuid: this.uuidGenerator.generate(), - cmd: async () => await this.log(data, this.logLevels.colors.debug) + cmd: async () => await this.log(data, this.logLevels.colors.debug), }; } - else + else { - command = { - uuid: this.uuidGenerator.generate(), - cmd: async () => await this.logger.debug(data) - }; + command = { uuid: this.uuidGenerator.generate(), cmd: async () => await this.logger.debug(data) }; } await this.asyncQueue.waitFor(command); diff --git a/project/src/utils/logging/WinstonMainLogger.ts b/project/src/utils/logging/WinstonMainLogger.ts index dee95420..0e76ff96 100644 --- a/project/src/utils/logging/WinstonMainLogger.ts +++ b/project/src/utils/logging/WinstonMainLogger.ts @@ -5,38 +5,37 @@ import { IUUidGenerator } from "@spt-aki/models/spt/utils/IUuidGenerator"; import { AbstractWinstonLogger } from "@spt-aki/utils/logging/AbstractWinstonLogger"; @injectable() -export class WinstonMainLogger extends AbstractWinstonLogger +export class WinstonMainLogger extends AbstractWinstonLogger { - constructor( @inject("AsyncQueue") protected asyncQueue: IAsyncQueue, - @inject("UUidGenerator") protected uuidGenerator: IUUidGenerator + @inject("UUidGenerator") protected uuidGenerator: IUUidGenerator, ) { super(asyncQueue, uuidGenerator); } - protected isLogExceptions(): boolean + protected isLogExceptions(): boolean { return true; } - protected isLogToFile(): boolean - { - return true; - } - - protected isLogToConsole(): boolean + protected isLogToFile(): boolean { return true; } - protected getFilePath(): string + protected isLogToConsole(): boolean + { + return true; + } + + protected getFilePath(): string { return "./user/logs/"; } - protected getFileName(): string + protected getFileName(): string { return "server-%DATE%.log"; } diff --git a/project/src/utils/logging/WinstonRequestLogger.ts b/project/src/utils/logging/WinstonRequestLogger.ts index 23857ecc..aff85d99 100644 --- a/project/src/utils/logging/WinstonRequestLogger.ts +++ b/project/src/utils/logging/WinstonRequestLogger.ts @@ -5,37 +5,37 @@ import { IUUidGenerator } from "@spt-aki/models/spt/utils/IUuidGenerator"; import { AbstractWinstonLogger } from "@spt-aki/utils/logging/AbstractWinstonLogger"; @injectable() -export class WinstonRequestLogger extends AbstractWinstonLogger +export class WinstonRequestLogger extends AbstractWinstonLogger { constructor( @inject("AsyncQueue") protected asyncQueue: IAsyncQueue, - @inject("UUidGenerator") protected uuidGenerator: IUUidGenerator + @inject("UUidGenerator") protected uuidGenerator: IUUidGenerator, ) { super(asyncQueue, uuidGenerator); } - protected isLogExceptions(): boolean + protected isLogExceptions(): boolean { return false; } - protected isLogToFile(): boolean + protected isLogToFile(): boolean { return true; } - protected isLogToConsole(): boolean + protected isLogToConsole(): boolean { return false; } - protected getFilePath(): string + protected getFilePath(): string { return "./user/logs/requests/"; } - protected getFileName(): string + protected getFileName(): string { return "requests-%DATE%.log"; } diff --git a/project/tests/BotDifficultyHelper.test.ts b/project/tests/BotDifficultyHelper.test.ts index 2ad0462e..b0321c4b 100644 --- a/project/tests/BotDifficultyHelper.test.ts +++ b/project/tests/BotDifficultyHelper.test.ts @@ -23,8 +23,10 @@ let localisationService: LocalisationService; let databaseServer: DatabaseServer; let botHelper: BotHelper; -describe("BotHelper", () => { - beforeAll(async () => { +describe("BotHelper", () => +{ + beforeAll(async () => + { testHelper = await TestHelper.fetchTestHelper(); logger = testHelper.getTestLogger(); jsonUtil = testHelper.getTestJsonUtil(); @@ -33,12 +35,20 @@ describe("BotHelper", () => { localisationService = testHelper.getTestLocalisationService(); databaseServer = testHelper.getTestDatabaseServer(); botHelper = testHelper.getTestBotHelper(); - }) + }); let botDifficultyHelper: BotDifficultyHelper; beforeEach(() => { - botDifficultyHelper = new BotDifficultyHelper(logger, jsonUtil, databaseServer, randomUtil, localisationService, botHelper, configServer); + botDifficultyHelper = new BotDifficultyHelper( + logger, + jsonUtil, + databaseServer, + randomUtil, + localisationService, + botHelper, + configServer, + ); }); it("BotDifficultyHelper type check", () => @@ -63,20 +73,20 @@ describe("BotHelper", () => { it("getPmcDifficultySettings() difficulty set to 'medium' in config", () => { - const configServerMock = mockHelper.getMockConfigServer(); - const mockBotConfig = { - kind: "aki-bot", - pmc: { - difficulty: "medium", - enemyTypes: ["assault"] - } - }; - configServerMock.setup(x => x.getConfig(ConfigTypes.BOT)).returns(() => mockBotConfig); + const mockBotConfig = { kind: "aki-bot", pmc: { difficulty: "medium", enemyTypes: ["assault"] } }; + configServerMock.setup((x) => x.getConfig(ConfigTypes.BOT)).returns(() => mockBotConfig); - const testOnlyHelper = new BotDifficultyHelper(logger, jsonUtil, databaseServer, randomUtil, localisationService, botHelper, configServerMock.object); + const testOnlyHelper = new BotDifficultyHelper( + logger, + jsonUtil, + databaseServer, + randomUtil, + localisationService, + botHelper, + configServerMock.object, + ); expect(testOnlyHelper.getPmcDifficultySettings("usec", "medium", "sptUsec", "sptBear")).not.toBeFalsy(); }); - -}); \ No newline at end of file +}); diff --git a/project/tests/BotHelper.test.ts b/project/tests/BotHelper.test.ts index 19960074..2a3412ad 100644 --- a/project/tests/BotHelper.test.ts +++ b/project/tests/BotHelper.test.ts @@ -18,9 +18,10 @@ let configServer: ConfigServer; let localisationService: LocalisationService; let databaseServer: DatabaseServer; - -describe("BotHelper", () => { - beforeAll(async () => { +describe("BotHelper", () => +{ + beforeAll(async () => + { testHelper = await TestHelper.fetchTestHelper(); logger = testHelper.getTestLogger(); jsonUtil = testHelper.getTestJsonUtil(); @@ -28,10 +29,11 @@ describe("BotHelper", () => { configServer = testHelper.getTestConfigServer(); localisationService = testHelper.getTestLocalisationService(); databaseServer = testHelper.getTestDatabaseServer(); - }) + }); let helper: BotHelper; - beforeEach(() => { + beforeEach(() => + { helper = new BotHelper(logger, jsonUtil, databaseServer, randomUtil, localisationService, configServer); }); @@ -61,4 +63,4 @@ describe("BotHelper", () => { expect(helper.getBotTemplate("fakebottype")).toBeFalsy(); expect(helper.getBotTemplate("")).toBeFalsy(); }); -}); \ No newline at end of file +}); diff --git a/project/tests/PaymentHelper.test.ts b/project/tests/PaymentHelper.test.ts index 0dd9d5e0..1db31578 100644 --- a/project/tests/PaymentHelper.test.ts +++ b/project/tests/PaymentHelper.test.ts @@ -51,4 +51,4 @@ describe("test text", () => expect(helper.getCurrency("1234353434534")).toBe(""); expect(helper.getCurrency("")).toBe(""); }); -}); \ No newline at end of file +}); diff --git a/project/tests/RepairHelper.test.ts b/project/tests/RepairHelper.test.ts index a6c0636c..fc4fd331 100644 --- a/project/tests/RepairHelper.test.ts +++ b/project/tests/RepairHelper.test.ts @@ -18,24 +18,21 @@ let configServer: ConfigServer; let databaseServer: DatabaseServer; let helper: RepairHelper; -describe("BotHelper", () => { - - beforeAll(async () => { +describe("BotHelper", () => +{ + beforeAll(async () => + { testHelper = await TestHelper.fetchTestHelper(); logger = testHelper.getTestLogger(); jsonUtil = testHelper.getTestJsonUtil(); randomUtil = testHelper.getTestRandomUtil(); configServer = testHelper.getTestConfigServer(); databaseServer = testHelper.getTestDatabaseServer(); - }) + }); - beforeEach(() => { - helper = new RepairHelper( - logger, - jsonUtil, - randomUtil, - databaseServer, - configServer); + beforeEach(() => + { + helper = new RepairHelper(logger, jsonUtil, randomUtil, databaseServer, configServer); }); it("RepairHelper type check", () => @@ -49,12 +46,7 @@ describe("BotHelper", () => { const itemToRepair: Item = { _id: "12345", _tpl: slickTpl, - upd: { - Repairable: { - Durability: 60, - MaxDurability: 80 - } - } + upd: { Repairable: { Durability: 60, MaxDurability: 80 } }, }; const itemToRepairDetails = databaseServer.getTables().templates?.items[slickTpl]; const isArmor = true; @@ -72,12 +64,7 @@ describe("BotHelper", () => { const itemToRepair: Item = { _id: "12345", _tpl: slickTpl, - upd: { - Repairable: { - Durability: 60, - MaxDurability: 80 - } - } + upd: { Repairable: { Durability: 60, MaxDurability: 80 } }, }; const itemToRepairDetails = databaseServer.getTables().templates?.items[slickTpl]; const isArmor = true; @@ -87,7 +74,9 @@ describe("BotHelper", () => { helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, 5, useRepairKit, 1.2, useDegridation); expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(80); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual(itemToRepair.upd?.Repairable?.MaxDurability); + expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( + itemToRepair.upd?.Repairable?.MaxDurability, + ); }); it("updateItemDurability() trader with slick armor, no dura degradation", () => @@ -96,12 +85,7 @@ describe("BotHelper", () => { const itemToRepair: Item = { _id: "12345", _tpl: slickTpl, - upd: { - Repairable: { - Durability: 60, - MaxDurability: 80 - } - } + upd: { Repairable: { Durability: 60, MaxDurability: 80 } }, }; const itemToRepairDetails = databaseServer.getTables().templates?.items[slickTpl]; const isArmor = true; @@ -111,7 +95,9 @@ describe("BotHelper", () => { helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, 20, useRepairKit, 1.2, useDegradation); expect(itemToRepair.upd?.Repairable?.Durability).toBe(80); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual(itemToRepair.upd?.Repairable?.MaxDurability); + expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( + itemToRepair.upd?.Repairable?.MaxDurability, + ); }); it("updateItemDurability() repairkit with g36 with max dura degradation - Full repair", () => @@ -123,22 +109,27 @@ describe("BotHelper", () => { const itemToRepair: Item = { _id: "12345", _tpl: g36Tpl, - upd: { - Repairable: { - Durability: itemCurrentDura, - MaxDurability: itemCurrentMaxDura - } - } + upd: { Repairable: { Durability: itemCurrentDura, MaxDurability: itemCurrentMaxDura } }, }; const itemToRepairDetails = databaseServer.getTables().templates?.items[g36Tpl]; const isArmor = false; const useRepairKit = true; const useDegradation = true; - helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, duraDifference, useRepairKit, 1, useDegradation); + helper.updateItemDurability( + itemToRepair, + itemToRepairDetails, + isArmor, + duraDifference, + useRepairKit, + 1, + useDegradation, + ); expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(100); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual(itemToRepair.upd?.Repairable?.MaxDurability); + expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( + itemToRepair.upd?.Repairable?.MaxDurability, + ); }); it("updateItemDurability() trader with g36 with max dura degradation - Full repair", () => @@ -150,22 +141,27 @@ describe("BotHelper", () => { const itemToRepair: Item = { _id: "12345", _tpl: g36Tpl, - upd: { - Repairable: { - Durability: itemCurrentDura, - MaxDurability: itemCurrentMaxDura - } - } + upd: { Repairable: { Durability: itemCurrentDura, MaxDurability: itemCurrentMaxDura } }, }; const itemToRepairDetails = databaseServer.getTables().templates?.items[g36Tpl]; const isArmor = false; const useRepairKit = false; const useDegradation = true; - helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, duraDifference, useRepairKit, 1.2, useDegradation); + helper.updateItemDurability( + itemToRepair, + itemToRepairDetails, + isArmor, + duraDifference, + useRepairKit, + 1.2, + useDegradation, + ); expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(100); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual(itemToRepair.upd?.Repairable?.MaxDurability); + expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( + itemToRepair.upd?.Repairable?.MaxDurability, + ); }); it("updateItemDurability() faceshield broken use repairkit with max dura degradation", () => @@ -174,18 +170,11 @@ describe("BotHelper", () => { const itemToRepair: Item = { _id: "12345", _tpl: twExfilBallisticFaceShieldTpl, - upd: { - Repairable: { - Durability: 30, - MaxDurability: 45 - }, - FaceShield: { - Hits: 2 - } - } + upd: { Repairable: { Durability: 30, MaxDurability: 45 }, FaceShield: { Hits: 2 } }, }; - const itemToRepairDetails = databaseServer.getTables().templates?.items[twExfilBallisticFaceShieldTpl]; + const itemToRepairDetails = databaseServer.getTables().templates + ?.items[twExfilBallisticFaceShieldTpl]; const isArmor = true; const useRepairKit = true; const useDegradation = true; @@ -194,7 +183,9 @@ describe("BotHelper", () => { expect(itemToRepair.upd?.FaceShield?.Hits).toBe(0); expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(45); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual(itemToRepair.upd?.Repairable?.MaxDurability); + expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( + itemToRepair.upd?.Repairable?.MaxDurability, + ); }); it("isWeaponTemplate() g36 weapon", () => @@ -210,4 +201,4 @@ describe("BotHelper", () => { expect(result).toBe(false); }); -}); \ No newline at end of file +}); diff --git a/project/tests/common/MockHelper.ts b/project/tests/common/MockHelper.ts index 1a59d4ba..092226a0 100644 --- a/project/tests/common/MockHelper.ts +++ b/project/tests/common/MockHelper.ts @@ -1,6 +1,6 @@ -import * as TypeMoq from "typemoq"; import { QuestHelper } from "@spt-aki/helpers/QuestHelper"; import { TraderHelper } from "@spt-aki/helpers/TraderHelper"; +import * as TypeMoq from "typemoq"; import { ImageRouter } from "@spt-aki/routers/ImageRouter"; import { ItemEventRouter } from "@spt-aki/routers/ItemEventRouter"; @@ -17,7 +17,7 @@ export class MockHelper public getMockVFS(): TypeMoq.IMock { - //vfsMock.setup(x => x.getFiles(TypeMoq.It.isAnyString())).returns(() => []); + // vfsMock.setup(x => x.getFiles(TypeMoq.It.isAnyString())).returns(() => []); return TypeMoq.Mock.ofType(VFS); } @@ -45,7 +45,6 @@ export class MockHelper { return TypeMoq.Mock.ofType(PaymentService); } - } export class TestConfigServer extends ConfigServer @@ -54,4 +53,4 @@ export class TestConfigServer extends ConfigServer { return; } -} \ No newline at end of file +} diff --git a/project/tests/common/TestHelper.ts b/project/tests/common/TestHelper.ts index 7dd7eaa9..abc28a14 100644 --- a/project/tests/common/TestHelper.ts +++ b/project/tests/common/TestHelper.ts @@ -22,7 +22,7 @@ import { VFS } from "@spt-aki/utils/VFS"; import { MockHelper } from "./MockHelper"; import WinstonLogger from "./__mocks__/WinstonLogger"; -export class TestHelper +export class TestHelper { logger: ILogger; asyncQueue: AsyncQueue; @@ -45,7 +45,7 @@ export class TestHelper itemBaseClassService: ItemBaseClassService; botHelper: BotHelper; - public static async fetchTestHelper() + public static async fetchTestHelper() { const initTestHelper = new TestHelper(); const mockHelper = new MockHelper(); @@ -59,15 +59,14 @@ export class TestHelper mockHelper.getMockImageRouter().object, initTestHelper.encodingUtil, initTestHelper.hashUtil, - initTestHelper.importerUtil + initTestHelper.importerUtil, ); await dbImporter.onLoad(); return initTestHelper; } - constructor() + constructor() { - this.logger = new WinstonLogger(); this.asyncQueue = new AsyncQueue(); this.uuidGenerator = new UUidGenerator(); @@ -88,9 +87,32 @@ export class TestHelper this.importerUtil = new ImporterUtil(this.vfs, this.jsonUtil); this.handbookHelper = new HandbookHelper(this.databaseServer); - this.itemBaseClassService = new ItemBaseClassService(this.logger, this.localisationService, this.databaseServer); - this.itemHelper = new ItemHelper(this.logger, this.hashUtil, this.jsonUtil, this.randomUtil, this.objectId, this.mathUtil, this.databaseServer, this.handbookHelper, this.itemBaseClassService, this.localisationService, this.localeService); - this.botHelper = new BotHelper(this.logger, this.jsonUtil, this.databaseServer, this.randomUtil, this.localisationService, this.configServer); + this.itemBaseClassService = new ItemBaseClassService( + this.logger, + this.localisationService, + this.databaseServer, + ); + this.itemHelper = new ItemHelper( + this.logger, + this.hashUtil, + this.jsonUtil, + this.randomUtil, + this.objectId, + this.mathUtil, + this.databaseServer, + this.handbookHelper, + this.itemBaseClassService, + this.localisationService, + this.localeService, + ); + this.botHelper = new BotHelper( + this.logger, + this.jsonUtil, + this.databaseServer, + this.randomUtil, + this.localisationService, + this.configServer, + ); } public getTestLogger(): ILogger @@ -103,7 +125,6 @@ export class TestHelper return this.uuidGenerator; } - public getTestVFS(): VFS { return this.vfs; @@ -153,4 +174,4 @@ export class TestHelper { return this.mathUtil; } -} \ No newline at end of file +} diff --git a/project/tests/common/__mocks__/WinstonLogger.ts b/project/tests/common/__mocks__/WinstonLogger.ts index 07b879a5..b47d1b13 100644 --- a/project/tests/common/__mocks__/WinstonLogger.ts +++ b/project/tests/common/__mocks__/WinstonLogger.ts @@ -5,28 +5,31 @@ import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; export default class WinstonLogger implements ILogger { - writeToLogFile(data: string | Daum): void { console.log(`writeToLogFile ${data}`); } - logWithColor(data: string | Record, textColor: LogTextColor, backgroundColor?: LogBackgroundColor | undefined): void + logWithColor( + data: string | Record, + textColor: LogTextColor, + backgroundColor?: LogBackgroundColor | undefined, + ): void { console.log(`logWithColor ${data}`); } - error(data: string): void + error(data: string): void { console.log(`error ${data}`); } - warning(data: string): void + warning(data: string): void { console.log(`warning ${data}`); } - success(data: string): void + success(data: string): void { console.log(`success ${data}`); } - info(data: string): void + info(data: string): void { console.log(`info ${data}`); } @@ -39,4 +42,4 @@ export default class WinstonLogger implements ILogger { console.log(msg); } -} \ No newline at end of file +} diff --git a/project/tests/utils/HashUtil.test.ts b/project/tests/utils/HashUtil.test.ts index a78715de..c2756070 100644 --- a/project/tests/utils/HashUtil.test.ts +++ b/project/tests/utils/HashUtil.test.ts @@ -29,4 +29,4 @@ describe("test text", () => expect(hashUtil.generateMd5ForData("test")).toBe("098f6bcd4621d373cade4e832627b4f6"); expect(hashUtil.generateMd5ForData("longerString12345678910")).toBe("c3e76c3c118c14e357e61ae1dbad4cf7"); }); -}); \ No newline at end of file +}); diff --git a/project/tests/utils/ItemHelper.test.ts b/project/tests/utils/ItemHelper.test.ts index 66bba0a5..bc365173 100644 --- a/project/tests/utils/ItemHelper.test.ts +++ b/project/tests/utils/ItemHelper.test.ts @@ -10,11 +10,11 @@ let testHelper: TestHelper; describe("test text", () => { - beforeAll(async () => + beforeAll(async () => { testHelper = await TestHelper.fetchTestHelper(); }); - + let itemHelper: ItemHelper; beforeEach(() => { @@ -68,104 +68,63 @@ describe("test text", () => it("fixItemStackCount() item with no upd object", () => { - const itemWithNoUpd: Item = { - _id: "test", - _tpl: "123456789" - }; + const itemWithNoUpd: Item = { _id: "test", _tpl: "123456789" }; const result = itemHelper.fixItemStackCount(itemWithNoUpd); expect(result.upd?.StackObjectsCount).toBe(1); }); it("fixItemStackCount() item with upd object no StackObjectsCount property", () => { - const itemWithUpdNoStack: Item = { - _id: "test", - _tpl: "123456789", - upd: {} - }; + const itemWithUpdNoStack: Item = { _id: "test", _tpl: "123456789", upd: {} }; const result = itemHelper.fixItemStackCount(itemWithUpdNoStack); expect(result.upd?.StackObjectsCount).toBe(1); }); it("fixItemStackCount() item with upd object and custom stack count", () => { - const itemWithUpdAndStack: Item = { - _id: "test", - _tpl: "123456789", - upd: { StackObjectsCount: 2 } - }; + const itemWithUpdAndStack: Item = { _id: "test", _tpl: "123456789", upd: { StackObjectsCount: 2 } }; const result = itemHelper.fixItemStackCount(itemWithUpdAndStack); expect(result.upd?.StackObjectsCount).toBe(2); }); it("getItemStackSize() stack size of 4", () => { - const itemWithStackSizeOf4: Item = { - _id: "", - _tpl: "", - upd: { StackObjectsCount: 4} - }; + const itemWithStackSizeOf4: Item = { _id: "", _tpl: "", upd: { StackObjectsCount: 4 } }; const result = itemHelper.getItemStackSize(itemWithStackSizeOf4); expect(result).toBe(4); }); it("getItemStackSize() upd object no stack property", () => { - const itemWithUpdNoStack: Item = { - _id: "", - _tpl: "", - upd: {} - }; + const itemWithUpdNoStack: Item = { _id: "", _tpl: "", upd: {} }; const result = itemHelper.getItemStackSize(itemWithUpdNoStack); expect(result).toBe(1); }); it("getItemStackSize() no upd object", () => { - const itemWithNoUpdObject: Item = { - _id: "", - _tpl: "" - }; + const itemWithNoUpdObject: Item = { _id: "", _tpl: "" }; const result = itemHelper.getItemStackSize(itemWithNoUpdObject); expect(result).toBe(1); }); it("getItemQualityModifier() no upd object", () => { - const itemWithNoUpdObject: Item = { - _id: "", - _tpl: "" - }; + const itemWithNoUpdObject: Item = { _id: "", _tpl: "" }; const result = itemHelper.getItemQualityModifier(itemWithNoUpdObject); expect(result).toBe(1); }); it("getItemQualityModifier() grizzly medkit with full hp", () => { - const medkitItem: Item = { - _id: "", - _tpl: "590c657e86f77412b013051d", - upd: { - MedKit: { - HpResource: 1800 - } - } - }; + const medkitItem: Item = { _id: "", _tpl: "590c657e86f77412b013051d", upd: { MedKit: { HpResource: 1800 } } }; const result = itemHelper.getItemQualityModifier(medkitItem); expect(result).toBe(1); }); it("getItemQualityModifier() grizzly medkit with 0 hp", () => { - const medkitItem: Item = { - _id: "", - _tpl: "590c657e86f77412b013051d", - upd: { - MedKit: { - HpResource: 0 - } - } - }; + const medkitItem: Item = { _id: "", _tpl: "590c657e86f77412b013051d", upd: { MedKit: { HpResource: 0 } } }; const result = itemHelper.getItemQualityModifier(medkitItem); expect(result).toBe(0.01); }); @@ -175,12 +134,7 @@ describe("test text", () => const medkitItem: Item = { _id: "", _tpl: "5e4abb5086f77406975c9342", - upd: { - Repairable: { - Durability: 80, - MaxDurability: 80 - } - } + upd: { Repairable: { Durability: 80, MaxDurability: 80 } }, }; const result = itemHelper.getItemQualityModifier(medkitItem); expect(result).toBe(1); @@ -191,12 +145,7 @@ describe("test text", () => const medkitItem: Item = { _id: "", _tpl: "5e4abb5086f77406975c9342", - upd: { - Repairable: { - Durability: 0, - MaxDurability: 80 - } - } + upd: { Repairable: { Durability: 0, MaxDurability: 80 } }, }; const result = itemHelper.getItemQualityModifier(medkitItem); expect(result).toBe(0.01); @@ -207,12 +156,7 @@ describe("test text", () => const mdrItem: Item = { _id: "", _tpl: "5c488a752e221602b412af63", - upd: { - Repairable: { - Durability: 100, - MaxDurability: 100 - } - } + upd: { Repairable: { Durability: 100, MaxDurability: 100 } }, }; const result = itemHelper.getItemQualityModifier(mdrItem); @@ -221,14 +165,7 @@ describe("test text", () => it("hasBuyRestrictions() item with restrictions, not reached", () => { - const item: Item = { - _id: "", - _tpl: "", - upd: { - BuyRestrictionCurrent: 0, - BuyRestrictionMax: 5 - } - }; + const item: Item = { _id: "", _tpl: "", upd: { BuyRestrictionCurrent: 0, BuyRestrictionMax: 5 } }; const result = itemHelper.hasBuyRestrictions(item); expect(result).toBe(true); @@ -236,11 +173,7 @@ describe("test text", () => it("hasBuyRestrictions() item no restrictions defined", () => { - const item: Item = { - _id: "", - _tpl: "", - upd: { } - }; + const item: Item = { _id: "", _tpl: "", upd: {} }; const result = itemHelper.hasBuyRestrictions(item); expect(result).toBe(false); @@ -269,4 +202,4 @@ describe("test text", () => const result = itemHelper.isQuestItem("faketpl"); expect(result).toBe(false); }); -}); \ No newline at end of file +}); diff --git a/project/tests/utils/RandomUtil.test.ts b/project/tests/utils/RandomUtil.test.ts index 4e69cfc1..8dd999d9 100644 --- a/project/tests/utils/RandomUtil.test.ts +++ b/project/tests/utils/RandomUtil.test.ts @@ -25,16 +25,16 @@ describe("test text", () => it("getInt()", () => { - expect(randomUtil.getInt(1,1)).toBe(1); - expect(randomUtil.getInt(100,100)).toBe(100); - expect([256,257,258,259,260,261]).toContain(randomUtil.getInt(256,261)); + expect(randomUtil.getInt(1, 1)).toBe(1); + expect(randomUtil.getInt(100, 100)).toBe(100); + expect([256, 257, 258, 259, 260, 261]).toContain(randomUtil.getInt(256, 261)); }); it("getIntEx()", () => { expect(randomUtil.getIntEx(1)).toBe(1); - expect([1,2,3]).toContain(randomUtil.getIntEx(5)); - expect([1,2,3,4,5,6,7,8]).toContain(randomUtil.getIntEx(10)); + expect([1, 2, 3]).toContain(randomUtil.getIntEx(5)); + expect([1, 2, 3, 4, 5, 6, 7, 8]).toContain(randomUtil.getIntEx(10)); }); it("getFloat()", () => @@ -48,4 +48,4 @@ describe("test text", () => { expect([true, false]).toContain(randomUtil.getBool()); }); -}); \ No newline at end of file +}); diff --git a/project/tests/utils/TimeUtil.test.ts b/project/tests/utils/TimeUtil.test.ts index be3a50aa..e0c1523a 100644 --- a/project/tests/utils/TimeUtil.test.ts +++ b/project/tests/utils/TimeUtil.test.ts @@ -58,17 +58,17 @@ describe("test text", () => it("getTimeMailFormat()", () => { const currentTime = new Date(); - const currentTimeMinutes = (currentTime.getMinutes()).toString().padStart(2,"0"); - const currentTimeHours = (currentTime.getHours()).toString().padStart(2,"0"); + const currentTimeMinutes = (currentTime.getMinutes()).toString().padStart(2, "0"); + const currentTimeHours = (currentTime.getHours()).toString().padStart(2, "0"); expect(timeUtil.getTimeMailFormat()).toBe(`${currentTimeHours}:${currentTimeMinutes}`); }); it("getDateMailFormat()", () => { const currentTime = new Date(); - const currentDay = (currentTime.getDate()).toString().padStart(2,"0"); - const currentMonth = (currentTime.getMonth() + 1).toString().padStart(2,"0"); + const currentDay = (currentTime.getDate()).toString().padStart(2, "0"); + const currentMonth = (currentTime.getMonth() + 1).toString().padStart(2, "0"); const currentYear = currentTime.getFullYear(); expect(timeUtil.getDateMailFormat()).toBe(`${currentDay}.${currentMonth}.${currentYear}`); }); -}); \ No newline at end of file +}); diff --git a/project/tests/utils/UUidGenerator.test.ts b/project/tests/utils/UUidGenerator.test.ts index 1a9a61e6..e4a4e9a4 100644 --- a/project/tests/utils/UUidGenerator.test.ts +++ b/project/tests/utils/UUidGenerator.test.ts @@ -25,4 +25,4 @@ describe("test text", () => expect(uuidGenerator.generate()).toContain("-"); expect(uuidGenerator.generate()).toContain("4"); }); -}); \ No newline at end of file +}); diff --git a/project/typedoc.json b/project/typedoc.json index 976e9c6d..840852b4 100644 --- a/project/typedoc.json +++ b/project/typedoc.json @@ -3,4 +3,4 @@ "sort": ["source-order"], "media": "media", "basePath": "server-docs" -} \ No newline at end of file +} From 083a2a798ea8152e4f4da3308b2ebf2771cb30c3 Mon Sep 17 00:00:00 2001 From: Refringe Date: Thu, 16 Nov 2023 22:12:51 +0000 Subject: [PATCH 23/23] Removes Old Jest Tests (!169) These should not be used. Branch `3.8.0` has newer Vitest tests configured. Co-authored-by: Refringe Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/169 --- project/.vscode/launch.json | 16 -- project/jest.config.ts | 13 -- project/package.json | 11 +- project/tests/BotDifficultyHelper.test.ts | 92 -------- project/tests/BotHelper.test.ts | 66 ------ project/tests/PaymentHelper.test.ts | 54 ----- project/tests/RepairHelper.test.ts | 204 ----------------- project/tests/common/MockHelper.ts | 56 ----- project/tests/common/TestHelper.ts | 177 --------------- .../tests/common/__mocks__/WinstonLogger.ts | 45 ---- project/tests/utils/HashUtil.test.ts | 32 --- project/tests/utils/ItemHelper.test.ts | 205 ------------------ project/tests/utils/RandomUtil.test.ts | 51 ----- project/tests/utils/TimeUtil.test.ts | 74 ------- project/tests/utils/UUidGenerator.test.ts | 28 --- 15 files changed, 1 insertion(+), 1123 deletions(-) delete mode 100644 project/jest.config.ts delete mode 100644 project/tests/BotDifficultyHelper.test.ts delete mode 100644 project/tests/BotHelper.test.ts delete mode 100644 project/tests/PaymentHelper.test.ts delete mode 100644 project/tests/RepairHelper.test.ts delete mode 100644 project/tests/common/MockHelper.ts delete mode 100644 project/tests/common/TestHelper.ts delete mode 100644 project/tests/common/__mocks__/WinstonLogger.ts delete mode 100644 project/tests/utils/HashUtil.test.ts delete mode 100644 project/tests/utils/ItemHelper.test.ts delete mode 100644 project/tests/utils/RandomUtil.test.ts delete mode 100644 project/tests/utils/TimeUtil.test.ts delete mode 100644 project/tests/utils/UUidGenerator.test.ts diff --git a/project/.vscode/launch.json b/project/.vscode/launch.json index eefad0da..7137c412 100644 --- a/project/.vscode/launch.json +++ b/project/.vscode/launch.json @@ -20,22 +20,6 @@ ], "cwd": "${workspaceFolder}", "outputCapture": "std" - }, - { - "name": "Run Jest UnitTests", - "type": "node", - "runtimeVersion": "18.15.0", - "request": "launch", - "program": "${workspaceFolder}/node_modules/.bin/jest", - "args": [ - "--runInBand" - ], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - } } ] } diff --git a/project/jest.config.ts b/project/jest.config.ts deleted file mode 100644 index fc79268b..00000000 --- a/project/jest.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { pathsToModuleNameMapper } from "ts-jest"; -import type { JestConfigWithTsJest } from "ts-jest"; -import { compilerOptions } from "./tsconfig.json"; - -const config: JestConfigWithTsJest = { - preset: "ts-jest", - testEnvironment: "node", - roots: ["./tests/"], - modulePaths: [compilerOptions.baseUrl], - moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths), -}; - -export default config; diff --git a/project/package.json b/project/package.json index 04c5c838..787b2cc4 100644 --- a/project/package.json +++ b/project/package.json @@ -1,6 +1,6 @@ { "name": "aki-server", - "version": "3.7.1", + "version": "3.7.3", "author": "SPT-AKI Server", "license": "NCSA", "main": "obj/bundle.js", @@ -16,10 +16,6 @@ "lint:fix": "biome check --apply-unsafe --max-diagnostics=200 . && dprint fmt --incremental=false", "style": "dprint check --incremental=false", "style:fix": "dprint fmt --incremental=false", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "test:ui": "vitest --ui --coverage", "build:release": "cross-env PKG_CACHE_PATH=\"./.pkg-cache\" gulp build:release", "build:debug": "cross-env PKG_CACHE_PATH=\"./.pkg-cache\" gulp build:debug", "build:bleeding": "cross-env PKG_CACHE_PATH=\"./.pkg-cache\" gulp build:bleeding", @@ -47,13 +43,10 @@ }, "devDependencies": { "@biomejs/biome": "1.3.3", - "@jest/globals": "29.7.0", "@pnpm/exe": "8.9.0", "@swc/cli": "0.1.62", "@swc/core": "1.3.92", - "@swc/jest": "0.2.29", "@types/i18n": "0.13.7", - "@types/jest": "29.5.5", "@types/node": "18.18.4", "@types/proper-lockfile": "4.1.2", "@types/semver": "7.5.3", @@ -66,12 +59,10 @@ "gulp": "4.0.2", "gulp-execa": "5.0.1", "gulp-rename": "2.0.0", - "jest": "29.7.0", "madge": "6.1.0", "pkg": "5.8.1", "pkg-fetch": "3.5.2", "resedit": "2.0.0", - "ts-jest": "29.1.1", "ts-node-dev": "2.0.0", "tsconfig-paths": "4.2.0", "typedoc": "0.25.2", diff --git a/project/tests/BotDifficultyHelper.test.ts b/project/tests/BotDifficultyHelper.test.ts deleted file mode 100644 index b0321c4b..00000000 --- a/project/tests/BotDifficultyHelper.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; -import { BotDifficultyHelper } from "@spt-aki/helpers/BotDifficultyHelper"; -import { BotHelper } from "@spt-aki/helpers/BotHelper"; -import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; -import { ConfigServer } from "@spt-aki/servers/ConfigServer"; -import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; -import { LocalisationService } from "@spt-aki/services/LocalisationService"; -import { JsonUtil } from "@spt-aki/utils/JsonUtil"; -import { RandomUtil } from "@spt-aki/utils/RandomUtil"; -import { MockHelper } from "./common/MockHelper"; -import { TestHelper } from "./common/TestHelper"; - -const mockHelper = new MockHelper(); -let testHelper: TestHelper; -let logger: ILogger; -let jsonUtil: JsonUtil; -let randomUtil: RandomUtil; -let configServer: ConfigServer; -let localisationService: LocalisationService; -let databaseServer: DatabaseServer; -let botHelper: BotHelper; - -describe("BotHelper", () => -{ - beforeAll(async () => - { - testHelper = await TestHelper.fetchTestHelper(); - logger = testHelper.getTestLogger(); - jsonUtil = testHelper.getTestJsonUtil(); - randomUtil = testHelper.getTestRandomUtil(); - configServer = testHelper.getTestConfigServer(); - localisationService = testHelper.getTestLocalisationService(); - databaseServer = testHelper.getTestDatabaseServer(); - botHelper = testHelper.getTestBotHelper(); - }); - - let botDifficultyHelper: BotDifficultyHelper; - beforeEach(() => - { - botDifficultyHelper = new BotDifficultyHelper( - logger, - jsonUtil, - databaseServer, - randomUtil, - localisationService, - botHelper, - configServer, - ); - }); - - it("BotDifficultyHelper type check", () => - { - expect(botDifficultyHelper).toBeInstanceOf(BotDifficultyHelper); - }); - - it("chooseRandomDifficulty()", () => - { - expect(["easy", "normal", "hard", "impossible"]).toContain(botDifficultyHelper.chooseRandomDifficulty()); - }); - - it("getPmcDifficultySettings() easy", () => - { - expect(botDifficultyHelper.getPmcDifficultySettings("bear", "easy", "sptUsec", "sptBear")).not.toBeFalsy(); - }); - - it("getPmcDifficultySettings() random", () => - { - expect(botDifficultyHelper.getPmcDifficultySettings("usec", "random", "sptUsec", "sptBear")).not.toBeFalsy(); - }); - - it("getPmcDifficultySettings() difficulty set to 'medium' in config", () => - { - const configServerMock = mockHelper.getMockConfigServer(); - const mockBotConfig = { kind: "aki-bot", pmc: { difficulty: "medium", enemyTypes: ["assault"] } }; - configServerMock.setup((x) => x.getConfig(ConfigTypes.BOT)).returns(() => mockBotConfig); - - const testOnlyHelper = new BotDifficultyHelper( - logger, - jsonUtil, - databaseServer, - randomUtil, - localisationService, - botHelper, - configServerMock.object, - ); - - expect(testOnlyHelper.getPmcDifficultySettings("usec", "medium", "sptUsec", "sptBear")).not.toBeFalsy(); - }); -}); diff --git a/project/tests/BotHelper.test.ts b/project/tests/BotHelper.test.ts deleted file mode 100644 index 2a3412ad..00000000 --- a/project/tests/BotHelper.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; -import { BotHelper } from "@spt-aki/helpers/BotHelper"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; -import { ConfigServer } from "@spt-aki/servers/ConfigServer"; -import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; -import { LocalisationService } from "@spt-aki/services/LocalisationService"; -import { JsonUtil } from "@spt-aki/utils/JsonUtil"; -import { RandomUtil } from "@spt-aki/utils/RandomUtil"; -import { TestHelper } from "./common/TestHelper"; - -let testHelper: TestHelper; -let logger: ILogger; -let jsonUtil: JsonUtil; -let randomUtil: RandomUtil; -let configServer: ConfigServer; -let localisationService: LocalisationService; -let databaseServer: DatabaseServer; - -describe("BotHelper", () => -{ - beforeAll(async () => - { - testHelper = await TestHelper.fetchTestHelper(); - logger = testHelper.getTestLogger(); - jsonUtil = testHelper.getTestJsonUtil(); - randomUtil = testHelper.getTestRandomUtil(); - configServer = testHelper.getTestConfigServer(); - localisationService = testHelper.getTestLocalisationService(); - databaseServer = testHelper.getTestDatabaseServer(); - }); - - let helper: BotHelper; - beforeEach(() => - { - helper = new BotHelper(logger, jsonUtil, databaseServer, randomUtil, localisationService, configServer); - }); - - it("BotHelper type check", () => - { - expect(helper).toBeInstanceOf(BotHelper); - }); - - it("isBotPmc()", () => - { - expect(helper.isBotPmc("usec")).toBe(true); - expect(helper.isBotPmc("bear")).toBe(true); - expect(helper.isBotPmc("faketype")).toBe(false); - }); - - it("isBotFollower()", () => - { - expect(helper.isBotFollower("followerBully")).toBe(true); - expect(helper.isBotFollower("FoLlOwErBULlY")).toBe(true); - expect(helper.isBotFollower("followerSanitar")).toBe(true); - expect(helper.isBotFollower("botFollower")).toBe(false); - }); - - it("getBotTemplate()", () => - { - expect(helper.getBotTemplate("assault")).not.toBeFalsy(); - expect(helper.getBotTemplate("fakebottype")).toBeFalsy(); - expect(helper.getBotTemplate("")).toBeFalsy(); - }); -}); diff --git a/project/tests/PaymentHelper.test.ts b/project/tests/PaymentHelper.test.ts deleted file mode 100644 index 1db31578..00000000 --- a/project/tests/PaymentHelper.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; -import { PaymentHelper } from "@spt-aki/helpers/PaymentHelper"; - -describe("test text", () => -{ - let helper: PaymentHelper; - beforeEach(() => - { - helper = new PaymentHelper(); - }); - - it("PaymentHelper type check", () => - { - expect(helper).toBeInstanceOf(PaymentHelper); - }); - - it("isMoneyTpl() USD", () => - { - expect(helper.isMoneyTpl("5696686a4bdc2da3298b456a")).toBe(true); - }); - - it("isMoneyTpl() euro", () => - { - expect(helper.isMoneyTpl("569668774bdc2da2298b4568")).toBe(true); // euro - }); - - it("isMoneyTpl() rouble", () => - { - expect(helper.isMoneyTpl("5696686a4bdc2da3298b456a")).toBe(true); // rub - expect(helper.isMoneyTpl("")).toBe(false); - expect(helper.isMoneyTpl("faketpl")).toBe(false); - }); - - it("isMoneyTpl() empty tpl", () => - { - expect(helper.isMoneyTpl("")).toBe(false); - }); - - it("isMoneyTpl() invalid tpl", () => - { - expect(helper.isMoneyTpl("faketpl")).toBe(false); - }); - - it("getCurrency()", () => - { - expect(helper.getCurrency("EUR")).toBe("569668774bdc2da2298b4568"); - expect(helper.getCurrency("USD")).toBe("5696686a4bdc2da3298b456a"); - expect(helper.getCurrency("RUB")).toBe("5449016a4bdc2d6f028b456f"); - expect(helper.getCurrency("1234353434534")).toBe(""); - expect(helper.getCurrency("")).toBe(""); - }); -}); diff --git a/project/tests/RepairHelper.test.ts b/project/tests/RepairHelper.test.ts deleted file mode 100644 index fc4fd331..00000000 --- a/project/tests/RepairHelper.test.ts +++ /dev/null @@ -1,204 +0,0 @@ -import "reflect-metadata"; - -import { RepairHelper } from "@spt-aki/helpers/RepairHelper"; -import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; -import { ConfigServer } from "@spt-aki/servers/ConfigServer"; -import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; -import { JsonUtil } from "@spt-aki/utils/JsonUtil"; -import { RandomUtil } from "@spt-aki/utils/RandomUtil"; -import { TestHelper } from "./common/TestHelper"; - -let testHelper: TestHelper; -let logger: ILogger; -let jsonUtil: JsonUtil; -let randomUtil: RandomUtil; -let configServer: ConfigServer; -let databaseServer: DatabaseServer; -let helper: RepairHelper; - -describe("BotHelper", () => -{ - beforeAll(async () => - { - testHelper = await TestHelper.fetchTestHelper(); - logger = testHelper.getTestLogger(); - jsonUtil = testHelper.getTestJsonUtil(); - randomUtil = testHelper.getTestRandomUtil(); - configServer = testHelper.getTestConfigServer(); - databaseServer = testHelper.getTestDatabaseServer(); - }); - - beforeEach(() => - { - helper = new RepairHelper(logger, jsonUtil, randomUtil, databaseServer, configServer); - }); - - it("RepairHelper type check", () => - { - expect(helper).toBeInstanceOf(RepairHelper); - }); - - it("updateItemDurability() repairkit with slick armor with max dura degradation", () => - { - const slickTpl = "5e4abb5086f77406975c9342"; - const itemToRepair: Item = { - _id: "12345", - _tpl: slickTpl, - upd: { Repairable: { Durability: 60, MaxDurability: 80 } }, - }; - const itemToRepairDetails = databaseServer.getTables().templates?.items[slickTpl]; - const isArmor = true; - const useRepairKit = true; - const useDegridation = true; - - helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, 5, useRepairKit, 1, useDegridation); - - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(80); - }); - - it("updateItemDurability() trader with slick armor with max dura degradation - partial repair", () => - { - const slickTpl = "5e4abb5086f77406975c9342"; - const itemToRepair: Item = { - _id: "12345", - _tpl: slickTpl, - upd: { Repairable: { Durability: 60, MaxDurability: 80 } }, - }; - const itemToRepairDetails = databaseServer.getTables().templates?.items[slickTpl]; - const isArmor = true; - const useRepairKit = false; - const useDegridation = true; - - helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, 5, useRepairKit, 1.2, useDegridation); - - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(80); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( - itemToRepair.upd?.Repairable?.MaxDurability, - ); - }); - - it("updateItemDurability() trader with slick armor, no dura degradation", () => - { - const slickTpl = "5e4abb5086f77406975c9342"; - const itemToRepair: Item = { - _id: "12345", - _tpl: slickTpl, - upd: { Repairable: { Durability: 60, MaxDurability: 80 } }, - }; - const itemToRepairDetails = databaseServer.getTables().templates?.items[slickTpl]; - const isArmor = true; - const useRepairKit = false; - const useDegradation = false; - - helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, 20, useRepairKit, 1.2, useDegradation); - - expect(itemToRepair.upd?.Repairable?.Durability).toBe(80); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( - itemToRepair.upd?.Repairable?.MaxDurability, - ); - }); - - it("updateItemDurability() repairkit with g36 with max dura degradation - Full repair", () => - { - const itemCurrentDura = 68; - const itemCurrentMaxDura = 100; - const duraDifference = itemCurrentMaxDura - itemCurrentDura; - const g36Tpl = "623063e994fc3f7b302a9696"; - const itemToRepair: Item = { - _id: "12345", - _tpl: g36Tpl, - upd: { Repairable: { Durability: itemCurrentDura, MaxDurability: itemCurrentMaxDura } }, - }; - const itemToRepairDetails = databaseServer.getTables().templates?.items[g36Tpl]; - const isArmor = false; - const useRepairKit = true; - const useDegradation = true; - - helper.updateItemDurability( - itemToRepair, - itemToRepairDetails, - isArmor, - duraDifference, - useRepairKit, - 1, - useDegradation, - ); - - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(100); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( - itemToRepair.upd?.Repairable?.MaxDurability, - ); - }); - - it("updateItemDurability() trader with g36 with max dura degradation - Full repair", () => - { - const itemCurrentDura = 68; - const itemCurrentMaxDura = 100; - const duraDifference = itemCurrentMaxDura - itemCurrentDura; - const g36Tpl = "623063e994fc3f7b302a9696"; - const itemToRepair: Item = { - _id: "12345", - _tpl: g36Tpl, - upd: { Repairable: { Durability: itemCurrentDura, MaxDurability: itemCurrentMaxDura } }, - }; - const itemToRepairDetails = databaseServer.getTables().templates?.items[g36Tpl]; - const isArmor = false; - const useRepairKit = false; - const useDegradation = true; - - helper.updateItemDurability( - itemToRepair, - itemToRepairDetails, - isArmor, - duraDifference, - useRepairKit, - 1.2, - useDegradation, - ); - - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(100); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( - itemToRepair.upd?.Repairable?.MaxDurability, - ); - }); - - it("updateItemDurability() faceshield broken use repairkit with max dura degradation", () => - { - const twExfilBallisticFaceShieldTpl = "5e00cdd986f7747473332240"; - const itemToRepair: Item = { - _id: "12345", - _tpl: twExfilBallisticFaceShieldTpl, - upd: { Repairable: { Durability: 30, MaxDurability: 45 }, FaceShield: { Hits: 2 } }, - }; - - const itemToRepairDetails = databaseServer.getTables().templates - ?.items[twExfilBallisticFaceShieldTpl]; - const isArmor = true; - const useRepairKit = true; - const useDegradation = true; - - helper.updateItemDurability(itemToRepair, itemToRepairDetails, isArmor, 5, useRepairKit, 1, useDegradation); - - expect(itemToRepair.upd?.FaceShield?.Hits).toBe(0); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThan(45); - expect(itemToRepair.upd?.Repairable?.Durability).toBeLessThanOrEqual( - itemToRepair.upd?.Repairable?.MaxDurability, - ); - }); - - it("isWeaponTemplate() g36 weapon", () => - { - const result = helper.isWeaponTemplate("623063e994fc3f7b302a9696"); - - expect(result).toBe(true); - }); - - it("isWeaponTemplate() slick armor", () => - { - const result = helper.isWeaponTemplate("5e4abb5086f77406975c9342"); - - expect(result).toBe(false); - }); -}); diff --git a/project/tests/common/MockHelper.ts b/project/tests/common/MockHelper.ts deleted file mode 100644 index 092226a0..00000000 --- a/project/tests/common/MockHelper.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { QuestHelper } from "@spt-aki/helpers/QuestHelper"; -import { TraderHelper } from "@spt-aki/helpers/TraderHelper"; -import * as TypeMoq from "typemoq"; - -import { ImageRouter } from "@spt-aki/routers/ImageRouter"; -import { ItemEventRouter } from "@spt-aki/routers/ItemEventRouter"; -import { ConfigServer } from "@spt-aki/servers/ConfigServer"; -import { PaymentService } from "@spt-aki/services/PaymentService"; -import { VFS } from "@spt-aki/utils/VFS"; - -export class MockHelper -{ - public getMockImageRouter(): TypeMoq.IMock - { - return TypeMoq.Mock.ofType(ImageRouter); - } - - public getMockVFS(): TypeMoq.IMock - { - // vfsMock.setup(x => x.getFiles(TypeMoq.It.isAnyString())).returns(() => []); - return TypeMoq.Mock.ofType(VFS); - } - - public getMockConfigServer(): TypeMoq.IMock - { - return TypeMoq.Mock.ofType(TestConfigServer); - } - - public getItemEventRouter(): TypeMoq.IMock - { - return TypeMoq.Mock.ofType(ItemEventRouter); - } - - public getQuestHelper(): TypeMoq.IMock - { - return TypeMoq.Mock.ofType(QuestHelper); - } - - public getTraderHelper(): TypeMoq.IMock - { - return TypeMoq.Mock.ofType(TraderHelper); - } - - public getPaymentServiceMock(): TypeMoq.IMock - { - return TypeMoq.Mock.ofType(PaymentService); - } -} - -export class TestConfigServer extends ConfigServer -{ - public override initialize(): void - { - return; - } -} diff --git a/project/tests/common/TestHelper.ts b/project/tests/common/TestHelper.ts deleted file mode 100644 index abc28a14..00000000 --- a/project/tests/common/TestHelper.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { BotHelper } from "@spt-aki/helpers/BotHelper"; -import { HandbookHelper } from "@spt-aki/helpers/HandbookHelper"; -import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; -import { ConfigServer } from "@spt-aki/servers/ConfigServer"; -import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; -import { ItemBaseClassService } from "@spt-aki/services/ItemBaseClassService"; -import { LocaleService } from "@spt-aki/services/LocaleService"; -import { LocalisationService } from "@spt-aki/services/LocalisationService"; -import { AsyncQueue } from "@spt-aki/utils/AsyncQueue"; -import { DatabaseImporter } from "@spt-aki/utils/DatabaseImporter"; -import { EncodingUtil } from "@spt-aki/utils/EncodingUtil"; -import { HashUtil } from "@spt-aki/utils/HashUtil"; -import { ImporterUtil } from "@spt-aki/utils/ImporterUtil"; -import { JsonUtil } from "@spt-aki/utils/JsonUtil"; -import { MathUtil } from "@spt-aki/utils/MathUtil"; -import { ObjectId } from "@spt-aki/utils/ObjectId"; -import { RandomUtil } from "@spt-aki/utils/RandomUtil"; -import { TimeUtil } from "@spt-aki/utils/TimeUtil"; -import { UUidGenerator } from "@spt-aki/utils/UUidGenerator"; -import { VFS } from "@spt-aki/utils/VFS"; -import { MockHelper } from "./MockHelper"; -import WinstonLogger from "./__mocks__/WinstonLogger"; - -export class TestHelper -{ - logger: ILogger; - asyncQueue: AsyncQueue; - uuidGenerator: UUidGenerator; - timeUtil: TimeUtil; - vfs: VFS; - hashUtil: HashUtil; - jsonUtil: JsonUtil; - randomUtil: RandomUtil; - encodingUtil: EncodingUtil; - importerUtil: ImporterUtil; - configServer: ConfigServer; - objectId: ObjectId; - mathUtil: MathUtil; - databaseServer: DatabaseServer; - itemHelper: ItemHelper; - localeService: LocaleService; - localisationService: LocalisationService; - handbookHelper: HandbookHelper; - itemBaseClassService: ItemBaseClassService; - botHelper: BotHelper; - - public static async fetchTestHelper() - { - const initTestHelper = new TestHelper(); - const mockHelper = new MockHelper(); - - const dbImporter = new DatabaseImporter( - initTestHelper.logger, - initTestHelper.vfs, - initTestHelper.jsonUtil, - initTestHelper.localisationService, - initTestHelper.databaseServer, - mockHelper.getMockImageRouter().object, - initTestHelper.encodingUtil, - initTestHelper.hashUtil, - initTestHelper.importerUtil, - ); - await dbImporter.onLoad(); - return initTestHelper; - } - - constructor() - { - this.logger = new WinstonLogger(); - this.asyncQueue = new AsyncQueue(); - this.uuidGenerator = new UUidGenerator(); - this.timeUtil = new TimeUtil(); - this.vfs = new VFS(this.asyncQueue, this.uuidGenerator); - this.hashUtil = new HashUtil(this.timeUtil); - this.jsonUtil = new JsonUtil(this.vfs, this.hashUtil, this.logger); - this.randomUtil = new RandomUtil(this.jsonUtil, this.logger); - this.configServer = new ConfigServer(this.logger, this.vfs, this.jsonUtil); - this.objectId = new ObjectId(this.timeUtil); - this.mathUtil = new MathUtil(); - - this.databaseServer = new DatabaseServer(); - this.localeService = new LocaleService(this.logger, this.databaseServer, this.configServer); - this.localisationService = new LocalisationService(this.logger, this.localeService); - - this.encodingUtil = new EncodingUtil(); - this.importerUtil = new ImporterUtil(this.vfs, this.jsonUtil); - - this.handbookHelper = new HandbookHelper(this.databaseServer); - this.itemBaseClassService = new ItemBaseClassService( - this.logger, - this.localisationService, - this.databaseServer, - ); - this.itemHelper = new ItemHelper( - this.logger, - this.hashUtil, - this.jsonUtil, - this.randomUtil, - this.objectId, - this.mathUtil, - this.databaseServer, - this.handbookHelper, - this.itemBaseClassService, - this.localisationService, - this.localeService, - ); - this.botHelper = new BotHelper( - this.logger, - this.jsonUtil, - this.databaseServer, - this.randomUtil, - this.localisationService, - this.configServer, - ); - } - - public getTestLogger(): ILogger - { - return this.logger; - } - - public getTestUuidGenerator(): UUidGenerator - { - return this.uuidGenerator; - } - - public getTestVFS(): VFS - { - return this.vfs; - } - - public getTestHashUtil(): HashUtil - { - return new HashUtil(this.timeUtil); - } - - public getTestJsonUtil(): JsonUtil - { - return this.jsonUtil; - } - - public getTestRandomUtil(): RandomUtil - { - return this.randomUtil; - } - - public getTestConfigServer(): ConfigServer - { - return this.configServer; - } - - public getTestItemHelper(): ItemHelper - { - return this.itemHelper; - } - - public getTestDatabaseServer(): DatabaseServer - { - return this.databaseServer; - } - - public getTestLocalisationService(): LocalisationService - { - return this.localisationService; - } - - public getTestBotHelper(): BotHelper - { - return this.botHelper; - } - - public getTestMathUtil(): MathUtil - { - return this.mathUtil; - } -} diff --git a/project/tests/common/__mocks__/WinstonLogger.ts b/project/tests/common/__mocks__/WinstonLogger.ts deleted file mode 100644 index b47d1b13..00000000 --- a/project/tests/common/__mocks__/WinstonLogger.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Daum } from "@spt-aki/models/eft/itemEvent/IItemEventRouterRequest"; -import { LogBackgroundColor } from "@spt-aki/models/spt/logging/LogBackgroundColor"; -import { LogTextColor } from "@spt-aki/models/spt/logging/LogTextColor"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; - -export default class WinstonLogger implements ILogger -{ - writeToLogFile(data: string | Daum): void - { - console.log(`writeToLogFile ${data}`); - } - logWithColor( - data: string | Record, - textColor: LogTextColor, - backgroundColor?: LogBackgroundColor | undefined, - ): void - { - console.log(`logWithColor ${data}`); - } - error(data: string): void - { - console.log(`error ${data}`); - } - warning(data: string): void - { - console.log(`warning ${data}`); - } - success(data: string): void - { - console.log(`success ${data}`); - } - info(data: string): void - { - console.log(`info ${data}`); - } - debug(data: string | Record, onlyShowInConsole?: boolean | undefined): void - { - console.log(`debug ${data}`); - } - - log(msg: string): void - { - console.log(msg); - } -} diff --git a/project/tests/utils/HashUtil.test.ts b/project/tests/utils/HashUtil.test.ts deleted file mode 100644 index c2756070..00000000 --- a/project/tests/utils/HashUtil.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; -import { HashUtil } from "@spt-aki/utils/HashUtil"; -import { TestHelper } from "../common/TestHelper"; - -const testHelper = new TestHelper(); - -describe("test text", () => -{ - let hashUtil: HashUtil; - beforeEach(() => - { - hashUtil = testHelper.getTestHashUtil(); - }); - - it("HashUtil type check", () => - { - expect(hashUtil).toBeInstanceOf(HashUtil); - }); - - it("generate()", () => - { - expect(hashUtil.generate()).toHaveLength(24); - }); - - it("generateMd5ForData()", () => - { - expect(hashUtil.generateMd5ForData("test")).toBe("098f6bcd4621d373cade4e832627b4f6"); - expect(hashUtil.generateMd5ForData("longerString12345678910")).toBe("c3e76c3c118c14e357e61ae1dbad4cf7"); - }); -}); diff --git a/project/tests/utils/ItemHelper.test.ts b/project/tests/utils/ItemHelper.test.ts deleted file mode 100644 index bc365173..00000000 --- a/project/tests/utils/ItemHelper.test.ts +++ /dev/null @@ -1,205 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; -import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; -import { Item } from "@spt-aki/models/eft/common/tables/IItem"; -import { BaseClasses } from "@spt-aki/models/enums/BaseClasses"; -import { TestHelper } from "../common/TestHelper"; - -let testHelper: TestHelper; - -describe("test text", () => -{ - beforeAll(async () => - { - testHelper = await TestHelper.fetchTestHelper(); - }); - - let itemHelper: ItemHelper; - beforeEach(() => - { - itemHelper = testHelper.getTestItemHelper(); - }); - - it("ItemHelper type check", () => - { - expect(itemHelper).toBeInstanceOf(ItemHelper); - }); - - it("isDogtag() usec", () => - { - expect(itemHelper.isDogtag("59f32c3b86f77472a31742f0")).toBe(true); - }); - - it("isDogtag() bear", () => - { - expect(itemHelper.isDogtag("59f32bb586f774757e1e8442")).toBe(true); - }); - - it("isValidItem() valid item screwdriver", () => - { - expect(itemHelper.isValidItem("590c2d8786f774245b1f03f3")).toBe(true); // screwdriver - }); - - it("isValidItem() invalid item tool base item", () => - { - expect(itemHelper.isValidItem("57864bb7245977548b3b66c2")).toBe(false); // tool base item - }); - - it("isValidItem() invalid item tpl", () => - { - expect(itemHelper.isValidItem("fakeitem")).toBe(false); - }); - - it("isValidItem() valid item with base type in blacklist", () => - { - expect(itemHelper.isValidItem("5b3f3af486f774679e752c1f", [BaseClasses.ARMBAND])).toBe(false); - }); - - it("getItemPrice() valid screwdriver item", () => - { - expect(itemHelper.getItemPrice("590c2d8786f774245b1f03f3")).toBe(3500); // screwdriver - }); - - it("getItemPrice() invalid tpl forces return of 0 price", () => - { - expect(itemHelper.getItemPrice("fakeitem")).toBe(0); - }); - - it("fixItemStackCount() item with no upd object", () => - { - const itemWithNoUpd: Item = { _id: "test", _tpl: "123456789" }; - const result = itemHelper.fixItemStackCount(itemWithNoUpd); - expect(result.upd?.StackObjectsCount).toBe(1); - }); - - it("fixItemStackCount() item with upd object no StackObjectsCount property", () => - { - const itemWithUpdNoStack: Item = { _id: "test", _tpl: "123456789", upd: {} }; - const result = itemHelper.fixItemStackCount(itemWithUpdNoStack); - expect(result.upd?.StackObjectsCount).toBe(1); - }); - - it("fixItemStackCount() item with upd object and custom stack count", () => - { - const itemWithUpdAndStack: Item = { _id: "test", _tpl: "123456789", upd: { StackObjectsCount: 2 } }; - const result = itemHelper.fixItemStackCount(itemWithUpdAndStack); - expect(result.upd?.StackObjectsCount).toBe(2); - }); - - it("getItemStackSize() stack size of 4", () => - { - const itemWithStackSizeOf4: Item = { _id: "", _tpl: "", upd: { StackObjectsCount: 4 } }; - const result = itemHelper.getItemStackSize(itemWithStackSizeOf4); - expect(result).toBe(4); - }); - - it("getItemStackSize() upd object no stack property", () => - { - const itemWithUpdNoStack: Item = { _id: "", _tpl: "", upd: {} }; - const result = itemHelper.getItemStackSize(itemWithUpdNoStack); - expect(result).toBe(1); - }); - - it("getItemStackSize() no upd object", () => - { - const itemWithNoUpdObject: Item = { _id: "", _tpl: "" }; - const result = itemHelper.getItemStackSize(itemWithNoUpdObject); - expect(result).toBe(1); - }); - - it("getItemQualityModifier() no upd object", () => - { - const itemWithNoUpdObject: Item = { _id: "", _tpl: "" }; - const result = itemHelper.getItemQualityModifier(itemWithNoUpdObject); - expect(result).toBe(1); - }); - - it("getItemQualityModifier() grizzly medkit with full hp", () => - { - const medkitItem: Item = { _id: "", _tpl: "590c657e86f77412b013051d", upd: { MedKit: { HpResource: 1800 } } }; - const result = itemHelper.getItemQualityModifier(medkitItem); - expect(result).toBe(1); - }); - - it("getItemQualityModifier() grizzly medkit with 0 hp", () => - { - const medkitItem: Item = { _id: "", _tpl: "590c657e86f77412b013051d", upd: { MedKit: { HpResource: 0 } } }; - const result = itemHelper.getItemQualityModifier(medkitItem); - expect(result).toBe(0.01); - }); - - it("getItemQualityModifier() repairable slick with full hp", () => - { - const medkitItem: Item = { - _id: "", - _tpl: "5e4abb5086f77406975c9342", - upd: { Repairable: { Durability: 80, MaxDurability: 80 } }, - }; - const result = itemHelper.getItemQualityModifier(medkitItem); - expect(result).toBe(1); - }); - - it("getItemQualityModifier() repairable slick with 0 hp", () => - { - const medkitItem: Item = { - _id: "", - _tpl: "5e4abb5086f77406975c9342", - upd: { Repairable: { Durability: 0, MaxDurability: 80 } }, - }; - const result = itemHelper.getItemQualityModifier(medkitItem); - expect(result).toBe(0.01); - }); - - it("getRepairableItemQualityValue() repairable MDR weapon with max durability", () => - { - const mdrItem: Item = { - _id: "", - _tpl: "5c488a752e221602b412af63", - upd: { Repairable: { Durability: 100, MaxDurability: 100 } }, - }; - - const result = itemHelper.getItemQualityModifier(mdrItem); - expect(result).toBe(1); - }); - - it("hasBuyRestrictions() item with restrictions, not reached", () => - { - const item: Item = { _id: "", _tpl: "", upd: { BuyRestrictionCurrent: 0, BuyRestrictionMax: 5 } }; - - const result = itemHelper.hasBuyRestrictions(item); - expect(result).toBe(true); - }); - - it("hasBuyRestrictions() item no restrictions defined", () => - { - const item: Item = { _id: "", _tpl: "", upd: {} }; - - const result = itemHelper.hasBuyRestrictions(item); - expect(result).toBe(false); - }); - - it("doesItemOrParentsIdMatch() item doesnt exist", () => - { - const result = itemHelper.doesItemOrParentsIdMatch("fakeTpl", []); - expect(result).toBe(false); - }); - - it("isQuestItem() item is quest item", () => - { - const result = itemHelper.isQuestItem("5ae9a3f586f7740aab00e4e6"); - expect(result).toBe(true); - }); - - it("isQuestItem() item is not quest item", () => - { - const result = itemHelper.isQuestItem("590c392f86f77444754deb29"); - expect(result).toBe(false); - }); - - it("isQuestItem() invalid item tpl", () => - { - const result = itemHelper.isQuestItem("faketpl"); - expect(result).toBe(false); - }); -}); diff --git a/project/tests/utils/RandomUtil.test.ts b/project/tests/utils/RandomUtil.test.ts deleted file mode 100644 index 8dd999d9..00000000 --- a/project/tests/utils/RandomUtil.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; - -import { RandomUtil } from "@spt-aki/utils/RandomUtil"; -import { TestHelper } from "../common/TestHelper"; - -const testHelper = new TestHelper(); - -const logger = testHelper.getTestLogger(); -const jsonUtil = testHelper.getTestJsonUtil(); - -describe("test text", () => -{ - let randomUtil: RandomUtil; - beforeEach(() => - { - randomUtil = new RandomUtil(jsonUtil, logger); - }); - - it("RandomUtil type check", () => - { - expect(randomUtil).toBeInstanceOf(RandomUtil); - }); - - it("getInt()", () => - { - expect(randomUtil.getInt(1, 1)).toBe(1); - expect(randomUtil.getInt(100, 100)).toBe(100); - expect([256, 257, 258, 259, 260, 261]).toContain(randomUtil.getInt(256, 261)); - }); - - it("getIntEx()", () => - { - expect(randomUtil.getIntEx(1)).toBe(1); - expect([1, 2, 3]).toContain(randomUtil.getIntEx(5)); - expect([1, 2, 3, 4, 5, 6, 7, 8]).toContain(randomUtil.getIntEx(10)); - }); - - it("getFloat()", () => - { - const zeroToOneFloat = randomUtil.getFloat(0, 1); - expect(zeroToOneFloat).toBeGreaterThanOrEqual(0); - expect(zeroToOneFloat).toBeLessThan(1); - }); - - it("getBool()", () => - { - expect([true, false]).toContain(randomUtil.getBool()); - }); -}); diff --git a/project/tests/utils/TimeUtil.test.ts b/project/tests/utils/TimeUtil.test.ts deleted file mode 100644 index e0c1523a..00000000 --- a/project/tests/utils/TimeUtil.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; - -import { TimeUtil } from "@spt-aki/utils/TimeUtil"; - -describe("test text", () => -{ - let timeUtil: TimeUtil; - beforeEach(() => - { - timeUtil = new TimeUtil(); - }); - - it("BotHelper type check", () => - { - expect(timeUtil).toBeInstanceOf(TimeUtil); - }); - - it("formatTime()", () => - { - expect(timeUtil.formatTime(new Date(2020, 1, 1, 15, 24, 0))).toBe("15-24-00"); - }); - - it("formatDate()", () => - { - expect(timeUtil.formatDate(new Date(2020, 4, 13))).toBe("2020-05-13"); - }); - - it("getDate()", () => - { - const currentDate = timeUtil.formatDate(new Date()); - expect(timeUtil.getDate()).toBe(currentDate); - }); - - it("getTime()", () => - { - const currentTime = timeUtil.formatTime(new Date()); - expect(timeUtil.getTime()).toBe(currentTime); - }); - - it("getHoursAsSeconds() one hour", () => - { - expect(timeUtil.getHoursAsSeconds(1)).toBe(3600); - }); - - it("getHoursAsSeconds() three hours", () => - { - expect(timeUtil.getHoursAsSeconds(3)).toBe(10800); - }); - - it("getTimestamp()", () => - { - const currentTimestampSecondsFloored = Math.floor(new Date().getTime() / 1000); - expect(timeUtil.getTimestamp()).toBe(currentTimestampSecondsFloored); - }); - - it("getTimeMailFormat()", () => - { - const currentTime = new Date(); - const currentTimeMinutes = (currentTime.getMinutes()).toString().padStart(2, "0"); - const currentTimeHours = (currentTime.getHours()).toString().padStart(2, "0"); - expect(timeUtil.getTimeMailFormat()).toBe(`${currentTimeHours}:${currentTimeMinutes}`); - }); - - it("getDateMailFormat()", () => - { - const currentTime = new Date(); - const currentDay = (currentTime.getDate()).toString().padStart(2, "0"); - const currentMonth = (currentTime.getMonth() + 1).toString().padStart(2, "0"); - const currentYear = currentTime.getFullYear(); - expect(timeUtil.getDateMailFormat()).toBe(`${currentDay}.${currentMonth}.${currentYear}`); - }); -}); diff --git a/project/tests/utils/UUidGenerator.test.ts b/project/tests/utils/UUidGenerator.test.ts deleted file mode 100644 index e4a4e9a4..00000000 --- a/project/tests/utils/UUidGenerator.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import "reflect-metadata"; - -import { beforeEach, describe, expect, it } from "@jest/globals"; -import { UUidGenerator } from "@spt-aki/utils/UUidGenerator"; -import { TestHelper } from "../common/TestHelper"; - -const testHelper = new TestHelper(); - -describe("test text", () => -{ - let uuidGenerator: UUidGenerator; - beforeEach(() => - { - uuidGenerator = testHelper.getTestUuidGenerator(); - }); - - it("UUidGenerator type check", () => - { - expect(uuidGenerator).toBeInstanceOf(UUidGenerator); - }); - - it("generate()", () => - { - expect(uuidGenerator.generate()).toHaveLength(36); - expect(uuidGenerator.generate()).toContain("-"); - expect(uuidGenerator.generate()).toContain("4"); - }); -});