Updated Progressive Bot System

This commit is contained in:
2025-01-14 01:49:02 -05:00
parent b7a439a282
commit 7fee303436
159 changed files with 587422 additions and 172 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
[General]
gameName=spt
modid=0
version=d2025.1.8.0
version=d2025.1.14.0
newestVersion=
category="1,"
nexusFileStatus=1
@@ -1,6 +1,6 @@
{
"name": "Acids Progressive Bot System",
"version": "1.4.0",
"version": "1.4.1",
"sptVersion": "~3.10",
"loadBefore": [],
"loadAfter": [
@@ -11980,7 +11980,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -3,8 +3,10 @@
"equipment": {
"FirstPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 30,
"5bfea6e90db834001b7347f3": 20
"5c07c60e0db834002330051f": 25,
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 20,
@@ -50,8 +52,10 @@
},
"SecondPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 30,
"5bfea6e90db834001b7347f3": 20
"5c07c60e0db834002330051f": 25,
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 20,
@@ -6378,11 +6378,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5c7fc87d2e221644f31c0298",
@@ -11990,7 +11990,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -6,7 +6,9 @@
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 3,
"5b0bbe4e5acfc40dc528a72d": 1,
"5bfea6e90db834001b7347f3": 20
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 15,
@@ -59,7 +61,9 @@
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 3,
"5b0bbe4e5acfc40dc528a72d": 1,
"5bfea6e90db834001b7347f3": 20
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 15,
@@ -6607,11 +6607,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5c7fc87d2e221644f31c0298",
@@ -12002,7 +12002,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -4,10 +4,12 @@
"FirstPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 25,
"5d43021ca4b9362eab4b5e25": 20,
"5b0bbe4e5acfc40dc528a72d": 15,
"5bfea6e90db834001b7347f3": 25,
"5df8ce05b11454561e39243b": 10
"5bfea6e90db834001b7347f3": 20,
"5df8ce05b11454561e39243b": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 5,
@@ -75,10 +77,12 @@
"SecondPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 25,
"5d43021ca4b9362eab4b5e25": 20,
"5b0bbe4e5acfc40dc528a72d": 15,
"5bfea6e90db834001b7347f3": 25,
"5df8ce05b11454561e39243b": 10
"5bfea6e90db834001b7347f3": 20,
"5df8ce05b11454561e39243b": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 5,
@@ -753,6 +757,7 @@
"56e335e4d2720b6c058b456d": 20,
"5ca20d5986f774331e7c9602": 10,
"5e9dcf5986f7746c417435b3": 10,
"59e763f286f7742ee57895da": 15,
"6038d614d10cbf667352dd44": 1,
"6034d103ca006d2dca39b3f0": 1,
"656ddcf0f02d7bcea90bf395": 1,
@@ -6708,11 +6708,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5c7fc87d2e221644f31c0298",
@@ -11994,7 +11994,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7529,11 +7529,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",
@@ -11982,7 +11982,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7319,11 +7319,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",
@@ -11982,7 +11982,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7023,11 +7023,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",
@@ -12038,7 +12038,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7006,11 +7006,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",
@@ -0,0 +1,70 @@
import { inject, injectable } from "tsyringe";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseService } from "@spt/services/DatabaseService";
import { RandomUtil } from "@spt/utils/RandomUtil";
import { BotGeneratorHelper } from "@spt/helpers/BotGeneratorHelper";
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { ContextVariableType } from "@spt/context/ContextVariableType";
import { ContainerHelper } from "@spt/helpers/ContainerHelper";
import { DurabilityLimitsHelper } from "@spt/helpers/DurabilityLimitsHelper";
import { InventoryHelper } from "@spt/helpers/InventoryHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { IUpd } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IGetRaidConfigurationRequestData } from "@spt/models/eft/match/IGetRaidConfigurationRequestData";
import { BaseClasses } from "@spt/models/enums/BaseClasses";
import { LocalisationService } from "@spt/services/LocalisationService";
import { IRandomisedResourceValues } from "@spt/models/spt/config/IBotConfig";
/** Handle profile related client events */
@injectable()
export class APBSBotGeneratorHelper extends BotGeneratorHelper
{
constructor(
@inject("PrimaryLogger") protected logger: ILogger,
@inject("RandomUtil") protected randomUtil: RandomUtil,
@inject("DatabaseService") protected databaseService: DatabaseService,
@inject("DurabilityLimitsHelper") protected durabilityLimitsHelper: DurabilityLimitsHelper,
@inject("ItemHelper") protected itemHelper: ItemHelper,
@inject("InventoryHelper") protected inventoryHelper: InventoryHelper,
@inject("ContainerHelper") protected containerHelper: ContainerHelper,
@inject("ApplicationContext") protected applicationContext: ApplicationContext,
@inject("LocalisationService") protected localisationService: LocalisationService,
@inject("ConfigServer") protected configServer: ConfigServer
)
{
super(logger,
randomUtil,
databaseService,
durabilityLimitsHelper,
itemHelper,
inventoryHelper,
containerHelper,
applicationContext,
localisationService,
configServer)
}
protected override getRandomizedResourceValue(maxResource: number, randomizationValues: IRandomisedResourceValues): number
{
if (!randomizationValues)
{
return maxResource;
}
if (this.randomUtil.getChance100(randomizationValues.chanceMaxResourcePercent))
{
return maxResource;
}
const newResourceValue = this.randomUtil.getInt(
this.randomUtil.getPercentOfValue(randomizationValues.resourcePercent, maxResource, 0),
maxResource
)
return newResourceValue ? newResourceValue : 1;
}
}
@@ -75,24 +75,6 @@ export class APBSBotLevelGenerator
return result;
}
if (!botGenerationDetails.isPmc && !botGenerationDetails.isPlayerScav && ModConfig.config.enableScavCustomLevelDeltas)
{
const expTable = this.databaseService.getGlobals().config.exp.level.exp_table;
const botLevelRange = this.apbsGetRelativeBotLevelRange(botGenerationDetails, levelDetails, expTable.length);
const min = botLevelRange.min <= 0 ? 1 : botLevelRange.min;
const max = botLevelRange.max >= 79 ? 79 : botLevelRange.max;
const level = this.randomUtil.getInt(min, max);
const exp = this.profileHelper.getExperience(level);
const tier = this.apbsTierGetter.getTierByLevel(level);
bot.Info.Tier = this.chadOrChill(tier.toString());
const result: IRandomisedBotLevelResult = {
level,
exp
};
return result;
}
const expTable = this.databaseService.getGlobals().config.exp.level.exp_table;
const botLevelRange = this.apbsGetRelativeBotLevelRange(botGenerationDetails, levelDetails, expTable.length);
const min = botLevelRange.min <= 0 ? 1 : botLevelRange.min;
@@ -33,18 +33,18 @@ export class RaidInformation
},
"laboratory":
{
"LongRange": 5,
"ShortRange": 95
"LongRange": 10,
"ShortRange": 90
},
"factory4_night":
{
"LongRange": 1,
"ShortRange": 99
"LongRange": 5,
"ShortRange": 95
},
"factory4_day":
{
"LongRange": 1,
"ShortRange": 99
"LongRange": 5,
"ShortRange": 95
},
"Interchange":
{
@@ -16,6 +16,11 @@ export class BlacklistHelper
)
{}
private invalidAmmoIDs: string[] = [];
private invalidEquipmentIDs: string[] = [];
private invalidWeaponIDs: string[] = [];
private invalidAttachmentIDs: string[] = [];
public initialize(): void
{
if (ModConfig.config.tier1AmmoBlacklist.length > 0) this.removeBlacklistedAmmo(ModConfig.config.tier1AmmoBlacklist, 1);
@@ -46,6 +51,8 @@ export class BlacklistHelper
if (ModConfig.config.tier5AttachmentBlacklist.length > 0) this.removeBlacklistedAttachments(ModConfig.config.tier5AttachmentBlacklist, 5);
if (ModConfig.config.tier6AttachmentBlacklist.length > 0) this.removeBlacklistedAttachments(ModConfig.config.tier6AttachmentBlacklist, 6);
if (ModConfig.config.tier7AttachmentBlacklist.length > 0) this.removeBlacklistedAttachments(ModConfig.config.tier7AttachmentBlacklist, 7);
this.validateBlacklist();
}
private removeBlacklistedAmmo(ammoBlacklist: string[], tier: number): void
@@ -76,7 +83,7 @@ export class BlacklistHelper
}
if (itemDetails == undefined || itemDetails._parent != "5485a8684bdc2da71d8b4567")
{
this.apbsLogger.log(Logging.WARN, `"${ammoBlacklist[item]}" in Ammo Blacklist is either an invalid ammunition or item ID.`)
if (!this.invalidAmmoIDs.includes(ammoBlacklist[item])) this.invalidAmmoIDs.push(ammoBlacklist[item])
}
}
}
@@ -109,7 +116,7 @@ export class BlacklistHelper
}
if (itemDetails == undefined)
{
this.apbsLogger.log(Logging.WARN, `"${equipmentBlacklist[item]}" in Equipment Blacklist is an invalid item ID.`)
if (!this.invalidEquipmentIDs.includes(equipmentBlacklist[item])) this.invalidEquipmentIDs.push(equipmentBlacklist[item])
}
}
}
@@ -178,7 +185,7 @@ export class BlacklistHelper
}
if (itemDetails == undefined)
{
this.apbsLogger.log(Logging.WARN, `"${weaponBlacklist[item]}" in Weapon Blacklist is an invalid item ID.`)
if (!this.invalidWeaponIDs.includes(weaponBlacklist[item])) this.invalidWeaponIDs.push(weaponBlacklist[item])
}
}
}
@@ -219,7 +226,7 @@ export class BlacklistHelper
}
if (itemDetails == undefined)
{
this.apbsLogger.log(Logging.WARN, `"${attachmentBlacklist[item]}" in Attachment Blacklist is either an invalid attachment or item ID.`)
if (!this.invalidAttachmentIDs.includes(attachmentBlacklist[item])) this.invalidAttachmentIDs.push(attachmentBlacklist[item])
}
}
}
@@ -233,4 +240,36 @@ export class BlacklistHelper
return undefined;
}
private validateBlacklist(): void
{
if (this.invalidAmmoIDs.length > 0)
{
for (const item in this.invalidAmmoIDs)
{
this.apbsLogger.log(Logging.WARN, `"${this.invalidAmmoIDs[item]}" in Ammo Blacklist is an invalid item ID.`)
}
}
if (this.invalidEquipmentIDs.length > 0)
{
for (const item in this.invalidEquipmentIDs)
{
this.apbsLogger.log(Logging.WARN, `"${this.invalidEquipmentIDs[item]}" in Equipment Blacklist is an invalid item ID.`)
}
}
if (this.invalidWeaponIDs.length > 0)
{
for (const item in this.invalidWeaponIDs)
{
this.apbsLogger.log(Logging.WARN, `"${this.invalidWeaponIDs[item]}" in Weapon Blacklist is an invalid item ID.`)
}
}
if (this.invalidAttachmentIDs.length > 0)
{
for (const item in this.invalidAttachmentIDs)
{
this.apbsLogger.log(Logging.WARN, `"${this.invalidAttachmentIDs[item]}" in Attachment Blacklist is an invalid item ID.`)
}
}
}
}
@@ -100,27 +100,8 @@ export class ModdedImportHelper
"671d8b8c0959c721a50ca838"
]
this.clothingBlacklist = [
"668bc5cd834c88e06b08b645", // All of this is Artem hands, because they are being configured as Body instead...Crackboooonnneee!!
"668bc5cd834c88e06b08b64a",
"668bc5cd834c88e06b08b64d",
"668bc5cd834c88e06b08b650",
"668bc5cd834c88e06b08b652",
"668bc5cd834c88e06b08b655",
"668bc5cd834c88e06b08b658",
"668bc5cd834c88e06b08b65b",
"668bc5cd834c88e06b08b65e",
"668bc5cd834c88e06b08b662",
"668bc5cd834c88e06b08b665",
"668bc5cd834c88e06b08b668",
"668bc5cd834c88e06b08b66b",
"668bc5cd834c88e06b08b66e",
"668bc5cd834c88e06b08b671",
"668bc5cd834c88e06b08b674",
"668bc5cd834c88e06b08b677",
"668bc5cd834c88e06b08b67a",
"668bc5cd834c88e06b08b67d"
]
// This is empty now because Crackbone fixed Artem - but I'm leaving this here for future use
this.clothingBlacklist = []
}
public tiersTable = [];
@@ -142,14 +123,14 @@ export class ModdedImportHelper
this.apbsLogger.log(Logging.WARN, "Checking & importing Modded Weapons...Support not granted for this feature...")
// Build the joined list for every weapon used in APBS
const weapons: ITemplateItem = {};
const weapons = {};
vanillaItemList.equipment.LongRange.forEach(element => weapons[element] = this.getItem(element))
vanillaItemList.equipment.ShortRange.forEach(element => weapons[element] = this.getItem(element))
vanillaItemList.equipment.Holster.forEach(element => weapons[element] = this.getItem(element))
vanillaItemList.equipment.Scabbard.forEach(element => weapons[element] = this.getItem(element))
// Push this list to the function to filter and import
this.getModdedItems(weapons, BaseClasses.WEAPON, "Weapons");
this.getModdedItems(weapons as ITemplateItem, BaseClasses.WEAPON, "Weapons");
}
private buildVanillaEquipmentList(): void
@@ -157,19 +138,19 @@ export class ModdedImportHelper
this.apbsLogger.log(Logging.WARN, "Checking & importing Modded Equipment...Support not granted for this feature...")
// Build the joined list for every armour type used in APBS
const armours: ITemplateItem = {};
const armours = {};
vanillaItemList.equipment.ArmorVest.forEach(element => armours[element] = this.getItem(element))
const headwear: ITemplateItem = {};
const headwear = {};
vanillaItemList.equipment.Headwear.forEach(element => headwear[element] = this.getItem(element))
const tacticalVests: ITemplateItem = {};
const tacticalVests = {};
vanillaItemList.equipment.TacticalVest.forEach(element => tacticalVests[element] = this.getItem(element))
// Push these lists to the function to filter and import
this.getModdedItems(armours, BaseClasses.ARMOR, "Armours");
this.getModdedItems(headwear, BaseClasses.HEADWEAR, "Helmets");
this.getModdedItems(tacticalVests, BaseClasses.VEST, "Vests");
this.getModdedItems(armours as ITemplateItem, BaseClasses.ARMOR, "Armours");
this.getModdedItems(headwear as ITemplateItem, BaseClasses.HEADWEAR, "Helmets");
this.getModdedItems(tacticalVests as ITemplateItem, BaseClasses.VEST, "Vests");
}
private buildVanillaClothingList(): void
@@ -177,15 +158,15 @@ export class ModdedImportHelper
this.apbsLogger.log(Logging.WARN, "Checking & importing Modded Clothing...Support not granted for this feature...")
// Build the joined list for every body & feet type used in APBS
const body: ICustomizationItem = {};
const body = {};
vanillaClothingList.appearance.body.forEach(element => body[element] = this.getCustomization(element))
const feet: ICustomizationItem = {};
const feet = {};
vanillaClothingList.appearance.feet.forEach(element => feet[element] = this.getCustomization(element))
// Push these lists to the function to filter and import
this.getModdedClothing(body, "Body");
this.getModdedClothing(feet, "Feet");
this.getModdedClothing(body as ICustomizationItem, "Body");
this.getModdedClothing(feet as ICustomizationItem, "Feet");
}
private getModdedClothing(clothingList: ICustomizationItem, className: string): void
@@ -60,6 +60,7 @@ import { APBSMethodHolder } from "./InventoryMagGen/APBSMethodHolder";
import { APBSBarrelInventoryMagGen } from "./InventoryMagGen/APBSBarrelInventoryMagGen";
import { APBSInternalMagazineInventoryMagGen } from "./InventoryMagGen/APBSInternalMagazineInventoryMagGen";
import { APBSUbglExternalMagGen } from "./InventoryMagGen/APBSUbglExternalMagGen";
import { APBSBotGeneratorHelper } from "./ClassExtensions/APBSBotGeneratorHelper";
export class InstanceManager
{
@@ -213,6 +214,8 @@ export class InstanceManager
this.container.register("BotLootCacheService", { useToken: "APBSBotLootCacheService" });
this.container.register<APBSBotLootGenerator>("APBSBotLootGenerator", APBSBotLootGenerator);
this.container.register("BotLootGenerator", { useToken: "APBSBotLootGenerator" });
this.container.register<APBSBotGeneratorHelper>("APBSBotGeneratorHelper", APBSBotGeneratorHelper);
this.container.register("BotGeneratorHelper", { useToken: "APBSBotGeneratorHelper" });
this.container.register("BotWeaponGenerator", { useToken: "APBSBotWeaponGenerator" });
@@ -11980,7 +11980,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -3,8 +3,10 @@
"equipment": {
"FirstPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 30,
"5bfea6e90db834001b7347f3": 20
"5c07c60e0db834002330051f": 25,
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 20,
@@ -50,8 +52,10 @@
},
"SecondPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 30,
"5bfea6e90db834001b7347f3": 20
"5c07c60e0db834002330051f": 25,
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 20,
@@ -6378,11 +6378,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5c7fc87d2e221644f31c0298",
@@ -11990,7 +11990,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -6,7 +6,9 @@
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 3,
"5b0bbe4e5acfc40dc528a72d": 1,
"5bfea6e90db834001b7347f3": 20
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 15,
@@ -59,7 +61,9 @@
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 3,
"5b0bbe4e5acfc40dc528a72d": 1,
"5bfea6e90db834001b7347f3": 20
"5bfea6e90db834001b7347f3": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 15,
@@ -6607,11 +6607,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5c7fc87d2e221644f31c0298",
@@ -12002,7 +12002,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -4,10 +4,12 @@
"FirstPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 25,
"5d43021ca4b9362eab4b5e25": 20,
"5b0bbe4e5acfc40dc528a72d": 15,
"5bfea6e90db834001b7347f3": 25,
"5df8ce05b11454561e39243b": 10
"5bfea6e90db834001b7347f3": 20,
"5df8ce05b11454561e39243b": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 5,
@@ -75,10 +77,12 @@
"SecondPrimaryWeapon": {
"LongRange": {
"5c07c60e0db834002330051f": 25,
"5d43021ca4b9362eab4b5e25": 25,
"5d43021ca4b9362eab4b5e25": 20,
"5b0bbe4e5acfc40dc528a72d": 15,
"5bfea6e90db834001b7347f3": 25,
"5df8ce05b11454561e39243b": 10
"5bfea6e90db834001b7347f3": 20,
"5df8ce05b11454561e39243b": 15,
"623063e994fc3f7b302a9696": 8,
"5447a9cd4bdc2dbd208b4567": 8
},
"ShortRange": {
"5a7828548dc32e5a9c28b516": 5,
@@ -753,6 +757,7 @@
"56e335e4d2720b6c058b456d": 20,
"5ca20d5986f774331e7c9602": 10,
"5e9dcf5986f7746c417435b3": 10,
"59e763f286f7742ee57895da": 15,
"6038d614d10cbf667352dd44": 1,
"6034d103ca006d2dca39b3f0": 1,
"656ddcf0f02d7bcea90bf395": 1,
@@ -6708,11 +6708,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5c7fc87d2e221644f31c0298",
@@ -11994,7 +11994,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7529,11 +7529,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",
@@ -11982,7 +11982,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7319,11 +7319,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",
@@ -11982,7 +11982,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7023,11 +7023,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",
@@ -12038,7 +12038,7 @@
"mod_pistol_grip": 100,
"mod_pistol_grip_akms": 0,
"mod_pistolgrip": 0,
"mod_pistolgrip_000": 0,
"mod_pistolgrip_000": 100,
"mod_reciever": 100,
"mod_scope": 13,
"mod_scope_000": 0,
@@ -7006,11 +7006,7 @@
"5a789261c5856700186c65d3"
]
},
"5a787fdfc5856700142fdd9a": {
"mod_scope": [
"609b9e31506cf869cf3eaf41"
]
},
"5a787fdfc5856700142fdd9a": {},
"5a788031c585673f2b5c1c79": {
"mod_foregrip": [
"5cda9bcfd7f00c0c0b53e900",