0
0
mirror of https://github.com/sp-tarkov/server.git synced 2025-02-13 09:50:43 -05:00

Merge branch 'master' of https://dev.sp-tarkov.com/SPT-AKI/Server into 3.8.0

# Conflicts:
#	project/assets/database/bots/types/assault.json
#	project/assets/database/bots/types/bossknight.json
#	project/assets/database/bots/types/bosszryachiy.json
#	project/assets/database/bots/types/followerzryachiy.json
This commit is contained in:
Dev 2023-10-31 19:10:23 +00:00
commit fc606ee540
55 changed files with 63126 additions and 63224 deletions

View File

@ -27,7 +27,7 @@ steps:
- cd ./project - cd ./project
- pnpm install - pnpm install
- name: Run Rome - name: Run Biome
image: registry.sp-tarkov.com/spt/pnpm:7.25.1 image: registry.sp-tarkov.com/spt/pnpm:7.25.1
commands: commands:
- cd ./project - cd ./project
@ -84,7 +84,7 @@ steps:
- cd ./project - cd ./project
- pnpm install - pnpm install
- name: Run Rome - name: Run Biome
image: registry.sp-tarkov.com/spt/pnpm:7.25.1 image: registry.sp-tarkov.com/spt/pnpm:7.25.1
commands: commands:
- cd ./project - cd ./project
@ -102,7 +102,7 @@ steps:
# - cd ./project # - cd ./project
# - pnpm run test:coverage # - pnpm run test:coverage
# depends_on: # depends_on:
# - Run Rome # - Run Biome
# when: # when:
# event: # event:
# - push # - push
@ -128,7 +128,7 @@ steps:
-Dsonar.javascript.lcov.reportPaths=./project/coverage/lcov.info -Dsonar.javascript.lcov.reportPaths=./project/coverage/lcov.info
depends_on: depends_on:
# - Jest coverage # - Jest coverage
- Run Rome - Run Biome
when: when:
event: event:
- push - push
@ -165,7 +165,7 @@ steps:
-Dsonar.projectVersion=$DRONE_TAG -Dsonar.projectVersion=$DRONE_TAG
depends_on: depends_on:
# - Jest coverage # - Jest coverage
- Run Rome - Run Biome
when: when:
event: event:
- tag - tag

View File

@ -1,6 +0,0 @@
{
"extends": "@parcel/config-default",
"transformers": {
"*.pjs": ["@parcel/transformer-js"]
}
}

View File

@ -5,7 +5,7 @@ WORKDIR /app
COPY package.json . COPY package.json .
RUN yarn RUN yarn
COPY .parcelrc tsconfig.json tsconfig.base.json ./ COPY tsconfig.json tsconfig.base.json ./
COPY src ./src COPY src ./src
RUN yarn test:comp-linux RUN yarn test:comp-linux

View File

@ -780,6 +780,7 @@
"Backpack": 35, "Backpack": 35,
"FaceCover": 5 "FaceCover": 5
}, },
"randomisedWeaponModSlots": [],
"mods": { "mods": {
"mod_barrel": 20, "mod_barrel": 20,
"mod_bipod": 10, "mod_bipod": 10,

View File

@ -747,7 +747,7 @@
"Exploration": { "Exploration": {
"maxExtracts": 10, "maxExtracts": 10,
"specificExits": { "specificExits": {
"probability": 0.5, "probability": 0.4,
"passageRequirementWhitelist": [ "passageRequirementWhitelist": [
"None", "None",
"TransferItem", "TransferItem",
@ -846,7 +846,7 @@
} }
} }
], ],
"bodyPartProb": 0.2, "bodyPartProb": 0.15,
"bodyParts": [{ "bodyParts": [{
"key": "Head", "key": "Head",
"relativeProbability": 1, "relativeProbability": 1,
@ -1052,8 +1052,8 @@
"minDist": 10, "minDist": 10,
"maxKills": 40, "maxKills": 40,
"minKills": 15, "minKills": 15,
"maxBossKills": 30, "maxBossKills": 10,
"minBossKills": 15, "minBossKills": 5,
"maxPmcKills": 15, "maxPmcKills": 15,
"minPmcKills": 10, "minPmcKills": 10,
"weaponRequirementProb": 0, "weaponRequirementProb": 0,
@ -1206,7 +1206,7 @@
} }
} }
], ],
"bodyPartProb": 0.4, "bodyPartProb": 0.25,
"bodyParts": [{ "bodyParts": [{
"key": "Head", "key": "Head",
"relativeProbability": 1, "relativeProbability": 1,
@ -1232,8 +1232,8 @@
"minDist": 10, "minDist": 10,
"maxKills": 40, "maxKills": 40,
"minKills": 20, "minKills": 20,
"maxBossKills": 20, "maxBossKills": 14,
"minBossKills": 10, "minBossKills": 7,
"maxPmcKills": 25, "maxPmcKills": 25,
"minPmcKills": 10, "minPmcKills": 10,
"weaponRequirementProb": 0, "weaponRequirementProb": 0,

View File

@ -1,20 +1,20 @@
{ {
"appearance": { "appearance": {
"body": { "body": {
"5d5e7e7586f77427997cfb7f": 1, "5d5e7e7586f77427997cfb7f": 9,
"5d5e7e8386f774393602d6fa": 1, "5d5e7e8386f774393602d6fa": 4,
"5df8a10486f77412672a1e3a": 1, "5df8a10486f77412672a1e3a": 10,
"5e4bb3ee86f77406975c934e": 1, "5e4bb3ee86f77406975c934e": 4,
"5e9da1d086f774054a667134": 1, "5e9da1d086f774054a667134": 8,
"5fd1eb3fbe3b7107d66cb645": 1 "5fd1eb3fbe3b7107d66cb645": 9
}, },
"feet": { "feet": {
"5cc2e5d014c02e15d53d9c03": 1, "5cc2e5d014c02e15d53d9c03": 8,
"5d28af7886f77429275dba25": 1, "5d28af7886f77429275dba25": 9,
"5d5e7f4986f7746956659f8a": 1, "5d5e7f4986f7746956659f8a": 8,
"5f5e410c6bdad616ad46d60b": 1, "5f5e410c6bdad616ad46d60b": 4,
"5f5e41366760b4138443b343": 1, "5f5e41366760b4138443b343": 10,
"5f5e41576760b4138443b344": 1 "5f5e41576760b4138443b344": 5
}, },
"hands": [ "hands": [
"5df8eac086f77412640e2ea7", "5df8eac086f77412640e2ea7",
@ -2040,28 +2040,46 @@
"standingForKill": 0 "standingForKill": 0
}, },
"firstName": [ "firstName": [
"Картавый",
"Сырок",
"Дальневосточный",
"Мутко",
"Базарыч",
"Кореш",
"Лобстер",
"Балкан",
"Логан",
"Подружка",
"Васек",
"Оливье",
"Хардбас",
"Шнырь",
"Ярик",
"Ден",
"Гарри",
"Кулек",
"Андрюша", "Андрюша",
"Анимешник",
"Баба Яга",
"Балкан",
"Бастурма",
"Базарыч",
"Чёткий",
"Дальневосточный",
"Дементий",
"Дэн",
"Димон",
"Друг Дамирки",
"Гамлет",
"Гарри Поттер",
"Грустный",
"Хардбас",
"Картавый",
"Кел Гоблин",
"Киллада",
"Кореш",
"Кощей",
"Космонавт",
"Кроссфитер",
"Кулёк",
"Лобстер",
"Логан",
"Михалыч",
"Мутко",
"Огород",
"Пашка",
"Оливье",
"Подружка",
"Шмыга", "Шмыга",
"Баба", "Шнур",
"Михалыч" "Сырок",
"Улётный",
"Васёк",
"Ярик",
"Кулек",
"Шнырь"
], ],
"generation": { "generation": {
"items": { "items": {
@ -2216,9 +2234,9 @@
"56dff2ced2720bb4668b4567": 1 "56dff2ced2720bb4668b4567": 1
}, },
"Caliber556x45NATO": { "Caliber556x45NATO": {
"54527a984bdc2d4e668b4567": 1, "54527a984bdc2d4e668b4567": 6,
"54527ac44bdc2d36668b4567": 1, "54527ac44bdc2d36668b4567": 5,
"59e6920f86f77411d82aa167": 1 "59e6920f86f77411d82aa167": 2
}, },
"Caliber57x28": { "Caliber57x28": {
"5cc80f38e4a949001152b560": 1 "5cc80f38e4a949001152b560": 1
@ -2230,22 +2248,22 @@
"59e0d99486f7744a32234762": 1 "59e0d99486f7744a32234762": 1
}, },
"Caliber762x51": { "Caliber762x51": {
"58dd3ad986f77403051cba8f": 1, "58dd3ad986f77403051cba8f": 2,
"5a6086ea4f39f99cd479502f": 1, "5a6086ea4f39f99cd479502f": 3,
"5a608bf24f39f98ffc77720e": 1, "5a608bf24f39f98ffc77720e": 2,
"5e023e53d4353e3302577c4c": 1 "5e023e53d4353e3302577c4c": 1
}, },
"Caliber9x18PM": { "Caliber9x18PM": {
"573719762459775a626ccbc1": 1 "573719762459775a626ccbc1": 1
}, },
"Caliber9x19PARA": { "Caliber9x19PARA": {
"56d59d3ad2720bdb418b4577": 1, "56d59d3ad2720bdb418b4577": 53,
"5c925fa22e221601da359b7b": 1, "5c925fa22e221601da359b7b": 16,
"5efb0da7a29a85116f6ea05f": 1 "5efb0da7a29a85116f6ea05f": 4
}, },
"Caliber9x21": { "Caliber9x21": {
"5a26abfac4a28232980eabff": 1, "5a26abfac4a28232980eabff": 3,
"5a26ac0ec4a28200741e1e18": 1 "5a26ac0ec4a28200741e1e18": 8
}, },
"Caliber9x39": { "Caliber9x39": {
"5c0d668f86f7747ccb7f13b2": 1 "5c0d668f86f7747ccb7f13b2": 1
@ -2254,108 +2272,108 @@
"equipment": { "equipment": {
"ArmBand": {}, "ArmBand": {},
"ArmorVest": { "ArmorVest": {
"5648a7494bdc2d9d488b4583": 1, "5648a7494bdc2d9d488b4583": 4,
"5ab8e79e86f7742d8b372e78": 1, "5ab8e79e86f7742d8b372e78": 2,
"5b44d22286f774172b0c9de8": 1, "5b44d22286f774172b0c9de8": 3,
"5c0e51be86f774598e797894": 1, "5c0e51be86f774598e797894": 4,
"5c0e53c886f7747fa54205c7": 1, "5c0e53c886f7747fa54205c7": 1,
"5c0e57ba86f7747fa141986d": 1, "5c0e57ba86f7747fa141986d": 4,
"5c0e5bab86f77461f55ed1f3": 1, "5c0e5bab86f77461f55ed1f3": 3,
"5c0e625a86f7742d77340f62": 1, "5c0e625a86f7742d77340f62": 1,
"5c0e655586f774045612eeb2": 1, "5c0e655586f774045612eeb2": 1,
"5ca2151486f774244a3b8d30": 1, "5ca2151486f774244a3b8d30": 2,
"5fd4c474dd870108a754b241": 1, "5fd4c474dd870108a754b241": 1,
"609e8540d5c319764c2bc2e9": 1, "609e8540d5c319764c2bc2e9": 2,
"63737f448b28897f2802b874": 1 "63737f448b28897f2802b874": 1
}, },
"Backpack": { "Backpack": {
"545cdae64bdc2d39198b4568": 1, "545cdae64bdc2d39198b4568": 2,
"5ca20d5986f774331e7c9602": 1, "5ca20d5986f774331e7c9602": 2,
"5f5e467b0bc58666c37e7821": 1, "5f5e467b0bc58666c37e7821": 3,
"6034d103ca006d2dca39b3f0": 1, "6034d103ca006d2dca39b3f0": 1,
"6038d614d10cbf667352dd44": 1, "6038d614d10cbf667352dd44": 4,
"60a272cc93ef783291411d8e": 1, "60a272cc93ef783291411d8e": 2,
"60a2828e8689911a226117f9": 1, "60a2828e8689911a226117f9": 7,
"618cfae774bb2d036a049e7c": 1, "618cfae774bb2d036a049e7c": 5,
"619cf0335771dd3c390269ae": 1, "619cf0335771dd3c390269ae": 3,
"62a1b7fbc30cfa1d366af586": 1 "62a1b7fbc30cfa1d366af586": 3
}, },
"Earpiece": { "Earpiece": {
"5645bcc04bdc2d363b8b4572": 1, "5645bcc04bdc2d363b8b4572": 5,
"5aa2ba71e5b5b000137b758f": 1, "5aa2ba71e5b5b000137b758f": 5,
"5b432b965acfc47a8774094e": 1, "5b432b965acfc47a8774094e": 5,
"5e4d34ca86f774264f758330": 1, "5e4d34ca86f774264f758330": 5,
"6033fa48ffd42c541047f728": 1 "6033fa48ffd42c541047f728": 7
}, },
"Eyewear": { "Eyewear": {
"557ff21e4bdc2d89578b4586": 1, "557ff21e4bdc2d89578b4586": 12,
"59e770b986f7742cbd762754": 1, "59e770b986f7742cbd762754": 13,
"5b432be65acfc433000ed01f": 1, "5b432be65acfc433000ed01f": 10,
"603409c80ca681766b6a0fb2": 1, "603409c80ca681766b6a0fb2": 4,
"61c18d83b00456371a66814b": 1 "61c18d83b00456371a66814b": 4
}, },
"FaceCover": { "FaceCover": {
"572b7fa524597762b747ce82": 1, "572b7fa524597762b747ce82": 2,
"5ab8f39486f7745cd93a1cca": 1, "5ab8f39486f7745cd93a1cca": 3,
"5ab8f4ff86f77431c60d91ba": 1, "5ab8f4ff86f77431c60d91ba": 6,
"5b432f3d5acfc4704b4a1dfb": 1, "5b432f3d5acfc4704b4a1dfb": 19,
"5fd8d28367cb5e077335170f": 1, "5fd8d28367cb5e077335170f": 2,
"60363c0c92ec1c31037959f5": 1 "60363c0c92ec1c31037959f5": 1
}, },
"FirstPrimaryWeapon": { "FirstPrimaryWeapon": {
"5447a9cd4bdc2dbd208b4567": 1, "5447a9cd4bdc2dbd208b4567": 2,
"576165642459773c7a400233": 1, "576165642459773c7a400233": 3,
"57c44b372459772d2b39b8ce": 1, "57c44b372459772d2b39b8ce": 2,
"587e02ff24597743df3deaeb": 1, "587e02ff24597743df3deaeb": 1,
"59984ab886f7743e98271174": 1, "59984ab886f7743e98271174": 1,
"5a367e5dc4a282000e49738f": 1, "5a367e5dc4a282000e49738f": 3,
"5a7828548dc32e5a9c28b516": 1, "5a7828548dc32e5a9c28b516": 1,
"5aafa857e5b5b00018480968": 1, "5aafa857e5b5b00018480968": 2,
"5ac4cd105acfc40016339859": 1, "5ac4cd105acfc40016339859": 2,
"5ac66cb05acfc40198510a10": 1, "5ac66cb05acfc40198510a10": 2,
"5ba26383d4351e00334c93d9": 1, "5ba26383d4351e00334c93d9": 1,
"5cc82d76e24e8d00134b4b83": 1, "5cc82d76e24e8d00134b4b83": 2,
"5dcbd56fdbd3d91b3e5468d5": 1, "5dcbd56fdbd3d91b3e5468d5": 2,
"5e00903ae9dc277128008b87": 1, "5e00903ae9dc277128008b87": 3,
"5f2a9575926fd9352339381f": 1, "5f2a9575926fd9352339381f": 1,
"5fbcc1d9016cce60e8341ab3": 1, "5fbcc1d9016cce60e8341ab3": 3,
"5fc3f2d5900b1d5091531e57": 1, "5fc3f2d5900b1d5091531e57": 3,
"60339954d62c9b14ed777c06": 1, "60339954d62c9b14ed777c06": 1,
"618428466ef05c2ce828f218": 1, "618428466ef05c2ce828f218": 1,
"623063e994fc3f7b302a9696": 1, "623063e994fc3f7b302a9696": 1,
"628b9c37a733087d0d7fe84b": 1, "628b9c37a733087d0d7fe84b": 2,
"62e14904c2699c0ec93adc47": 1, "62e14904c2699c0ec93adc47": 4,
"62e7c4fba689e8c9c50dfc38": 1 "62e7c4fba689e8c9c50dfc38": 1
}, },
"Headwear": { "Headwear": {
"5645bc214bdc2d363b8b4571": 1, "5645bc214bdc2d363b8b4571": 2,
"5a154d5cfcdbcb001a3b00da": 1, "5a154d5cfcdbcb001a3b00da": 1,
"5aa2b8d7e5b5b00014028f4a": 1, "5aa2b8d7e5b5b00014028f4a": 5,
"5aa2ba19e5b5b00014028f4e": 1, "5aa2ba19e5b5b00014028f4e": 6,
"5aa7d193e5b5b000171d063f": 1, "5aa7d193e5b5b000171d063f": 3,
"5aa7e4a4e5b5b000137b76f2": 1, "5aa7e4a4e5b5b000137b76f2": 2,
"5ac8d6885acfc400180ae7b0": 1, "5ac8d6885acfc400180ae7b0": 2,
"5b40e1525acfc4771e1c6611": 1, "5b40e1525acfc4771e1c6611": 3,
"5b40e2bc5acfc40016388216": 1, "5b40e2bc5acfc40016388216": 2,
"5b40e3f35acfc40016388218": 1, "5b40e3f35acfc40016388218": 3,
"5b40e4035acfc47a87740943": 1, "5b40e4035acfc47a87740943": 2,
"5b432d215acfc4771e1c6624": 1, "5b432d215acfc4771e1c6624": 2,
"5ea17ca01412a1425304d1c0": 1, "5ea17ca01412a1425304d1c0": 1,
"5f60b34a41e30a4ab12a6947": 1, "5f60b34a41e30a4ab12a6947": 2,
"60361b5a9a15b10d96792291": 1, "60361b5a9a15b10d96792291": 1,
"6040de02647ad86262233012": 1, "6040de02647ad86262233012": 1,
"61bca7cda0eae612383adf57": 1 "61bca7cda0eae612383adf57": 4
}, },
"Holster": { "Holster": {
"56d59856d2720bd8418b456a": 1, "56d59856d2720bd8418b456a": 3,
"59f98b4986f7746f546d2cef": 1, "59f98b4986f7746f546d2cef": 2,
"5a17f98cfcdbcb0980087290": 1, "5a17f98cfcdbcb0980087290": 2,
"5b1fa9b25acfc40018633c01": 1, "5b1fa9b25acfc40018633c01": 1,
"5cadc190ae921500103bb3b6": 1, "5cadc190ae921500103bb3b6": 3,
"5e81c3cbac2bb513793cdc75": 1, "5e81c3cbac2bb513793cdc75": 25,
"602a9740da11d6478d5a06dc": 1, "602a9740da11d6478d5a06dc": 2,
"6193a720f8ee7e52e42109ed": 1, "6193a720f8ee7e52e42109ed": 1,
"63088377b5cd696784087147": 1 "63088377b5cd696784087147": 5
}, },
"Pockets": { "Pockets": {
"5af99e9186f7747c447120b8": 1 "5af99e9186f7747c447120b8": 1
@ -2366,19 +2384,19 @@
"5c0a794586f77461c458f892": 1 "5c0a794586f77461c458f892": 1
}, },
"TacticalVest": { "TacticalVest": {
"544a5caa4bdc2d1a388b4568": 1, "544a5caa4bdc2d1a388b4568": 2,
"5648a69d4bdc2ded0b8b457b": 1, "5648a69d4bdc2ded0b8b457b": 1,
"5929a2a086f7744f4b234d43": 1, "5929a2a086f7744f4b234d43": 5,
"5d5d85c586f774279a21cbdb": 1, "5d5d85c586f774279a21cbdb": 5,
"5e9db13186f7742f845ee9d3": 1, "5e9db13186f7742f845ee9d3": 4,
"5f5f41f56760b4138443b352": 1, "5f5f41f56760b4138443b352": 5,
"5fd4c60f875c30179f5d04c2": 1, "5fd4c60f875c30179f5d04c2": 2,
"603648ff5a45383c122086ac": 1, "603648ff5a45383c122086ac": 1,
"6040dd4ddcf9592f401632d2": 1, "6040dd4ddcf9592f401632d2": 2,
"60a621c49c197e4e8c4455e6": 1, "60a621c49c197e4e8c4455e6": 10,
"60a6220e953894617404b00a": 1, "60a6220e953894617404b00a": 1,
"61bc85697113f767765c7fe7": 1, "61bc85697113f767765c7fe7": 2,
"61bcc89aef0f505f0c6cd0fc": 1, "61bcc89aef0f505f0c6cd0fc": 3,
"639343fce101f4caa40a4ef3": 1 "639343fce101f4caa40a4ef3": 1
} }
}, },
@ -2678,26 +2696,32 @@
"5c07dd120db834001c39092d" "5c07dd120db834001c39092d"
], ],
"Pockets": [ "Pockets": [
"63076701a987397c0816d21b",
"5e32f56fcb6d5863cc5e5ee4",
"5a17fb03fcdbcbcae668728f",
"5aaa5e60e5b5b000140293d6",
"602286df23506e50807090c6",
"5e81c4ca763d9f754677befa", "5e81c4ca763d9f754677befa",
"5e32f56fcb6d5863cc5e5ee4",
"5df8f535bb49d91fb446d6b0",
"617fd91e5539a84ec44ce155",
"5a718b548dc32e000d46d262",
"59e0d99486f7744a32234762", "59e0d99486f7744a32234762",
"59f99a7d86f7745b134aa97b", "59f99a7d86f7745b134aa97b",
"5a718da68dc32e000d46d264", "5a718da68dc32e000d46d264",
"5cadc2e0ae9215051e1c21e7", "5cadc2e0ae9215051e1c21e7",
"5df8f535bb49d91fb446d6b0", "63076701a987397c0816d21b",
"617fd91e5539a84ec44ce155", "5a17fb03fcdbcbcae668728f",
"5a718b548dc32e000d46d262", "5aaa5e60e5b5b000140293d6",
"56d59948d2720bb7418b4582", "602286df23506e50807090c6",
"5448be9a4bdc2dfd2f8b456a", "5448be9a4bdc2dfd2f8b456a",
"56d59948d2720bb7418b4582",
"5d6e6911a4b9361bd5780d52", "5d6e6911a4b9361bd5780d52",
"6193d3149fb0c665d5490e32", "6193d3149fb0c665d5490e32",
"618a431df1eb8e24b8741deb", "618a431df1eb8e24b8741deb",
"5b7bef1e5acfc43d82528402", "5b7bef1e5acfc43d82528402",
"630e1adbbd357927e4007c09" "630e1adbbd357927e4007c09",
"560d5e524bdc2d25448b4571",
"5c0d591486f7744c505b416f",
"5448c1d04bdc2dff2f8b4569",
"5d6e68c4a4b9361b93413f79",
"5d3eb5eca4b9363b1f22f8e4",
"5d6e6869a4b9361c140bcfde"
], ],
"SecuredContainer": [ "SecuredContainer": [
"56d59d3ad2720bdb418b4577", "56d59d3ad2720bdb418b4577",
@ -4032,10 +4056,7 @@
} }
} }
}, },
"lastName": [ "lastName": [],
"Поттер",
"Яга"
],
"skills": { "skills": {
"Common": { "Common": {
"BotReload": { "BotReload": {

View File

@ -1,32 +1,32 @@
{ {
"appearance": { "appearance": {
"body": { "body": {
"5cc2e59214c02e000f16684e": 1, "5cc2e59214c02e000f16684e": 697,
"5cde9f337d6c8b0474535da8": 1, "5cde9f337d6c8b0474535da8": 714,
"5d28ad6986f77429275dba22": 1, "5d28ad6986f77429275dba22": 708,
"5d28ad7286f7742926686182": 1, "5d28ad7286f7742926686182": 716,
"5df8a10486f77412672a1e3a": 1, "5df8a10486f77412672a1e3a": 756,
"5e4bb3ee86f77406975c934e": 1, "5e4bb3ee86f77406975c934e": 735,
"5e9da1d086f774054a667134": 1, "5e9da1d086f774054a667134": 728,
"5fd1eb3fbe3b7107d66cb645": 1, "5fd1eb3fbe3b7107d66cb645": 702,
"5fd22d311add82653b5a704c": 1, "5fd22d311add82653b5a704c": 711,
"618d1af10a5a59657e5f56f3": 1, "618d1af10a5a59657e5f56f3": 691,
"619238266c614e6d15792bca": 1, "619238266c614e6d15792bca": 700,
"637df28ac22da5bb8d046935": 1, "637df28ac22da5bb8d046935": 742,
"64a2edba08d26f8d62049c06": 1 "64a2edba08d26f8d62049c06": 664
}, },
"feet": { "feet": {
"5cc2e5d014c02e15d53d9c03": 1, "5cc2e5d014c02e15d53d9c03": 213,
"5cde9fb87d6c8b0474535da9": 1, "5cde9fb87d6c8b0474535da9": 201,
"5d28af3486f774292364a6e7": 1, "5d28af3486f774292364a6e7": 192,
"5df8a15186f77412640e2e6a": 1, "5df8a15186f77412640e2e6a": 213,
"5f5e410c6bdad616ad46d60b": 1, "5f5e410c6bdad616ad46d60b": 201,
"5f5e41366760b4138443b343": 1, "5f5e41366760b4138443b343": 200,
"5f5e41576760b4138443b344": 1, "5f5e41576760b4138443b344": 198,
"61922589bb2cea6f7a22d964": 1, "61922589bb2cea6f7a22d964": 195,
"6193be546e5968395b260157": 1, "6193be546e5968395b260157": 213,
"637df25a1e688345e1097bd4": 1, "637df25a1e688345e1097bd4": 197,
"64a2e970a74bb33d140e6dc5": 1 "64a2e970a74bb33d140e6dc5": 209
}, },
"hands": [ "hands": [
"5e4bb49586f77406a313ec5a", "5e4bb49586f77406a313ec5a",
@ -2532,117 +2532,117 @@
"inventory": { "inventory": {
"Ammo": { "Ammo": {
"Caliber1143x23ACP": { "Caliber1143x23ACP": {
"5e81f423763d9f754677bf2e": 1, "5e81f423763d9f754677bf2e": 119,
"5efb0d4f4bc50b58e81710f3": 1, "5efb0d4f4bc50b58e81710f3": 78,
"5efb0fc6aeb21837e749c801": 1 "5efb0fc6aeb21837e749c801": 7
}, },
"Caliber12g": { "Caliber12g": {
"560d5e524bdc2d25448b4571": 5, "560d5e524bdc2d25448b4571": 10943,
"58820d1224597753c90aeb13": 2, "58820d1224597753c90aeb13": 2684,
"5d6e6772a4b936088465b17c": 4, "5d6e6772a4b936088465b17c": 101,
"5d6e67fba4b9361bc73bc779": 4, "5d6e67fba4b9361bc73bc779": 3098,
"5d6e6806a4b936088465b17e": 3, "5d6e6806a4b936088465b17e": 2797,
"5d6e6869a4b9361c140bcfde": 1, "5d6e6869a4b9361c140bcfde": 1589,
"5d6e6891a4b9361bd473feea": 1, "5d6e6891a4b9361bd473feea": 1525,
"5d6e689ca4b9361bc8618956": 1, "5d6e689ca4b9361bc8618956": 253,
"5d6e68b3a4b9361bca7e50b5": 1, "5d6e68b3a4b9361bca7e50b5": 631,
"5d6e68d1a4b93622fe60e845": 1, "5d6e68d1a4b93622fe60e845": 90,
"5d6e68dea4b9361bcc29e659": 1, "5d6e68dea4b9361bcc29e659": 465,
"5d6e68e6a4b9361c140bcfe0": 1, "5d6e68e6a4b9361c140bcfe0": 291,
"5d6e6911a4b9361bd5780d52": 1 "5d6e6911a4b9361bd5780d52": 25
}, },
"Caliber20g": { "Caliber20g": {
"5a38ebd9c4a282000d722a5b": 1, "5a38ebd9c4a282000d722a5b": 5792,
"5d6e695fa4b936359b35d852": 1, "5d6e695fa4b936359b35d852": 1622,
"5d6e69b9a4b9361bc8618958": 1, "5d6e69b9a4b9361bc8618958": 460,
"5d6e69c7a4b9360b6c0d54e4": 1, "5d6e69c7a4b9360b6c0d54e4": 628,
"5d6e6a05a4b93618084f58d0": 1, "5d6e6a05a4b93618084f58d0": 451,
"5d6e6a42a4b9364f07165f52": 1, "5d6e6a42a4b9364f07165f52": 493,
"5d6e6a53a4b9361bd473feec": 1, "5d6e6a53a4b9361bd473feec": 1636,
"5d6e6a5fa4b93614ec501745": 1 "5d6e6a5fa4b93614ec501745": 340
}, },
"Caliber23x75": { "Caliber23x75": {
"5e85a9a6eacf8c039e4e2ac1": 1 "5e85a9a6eacf8c039e4e2ac1": 1
}, },
"Caliber366TKM": { "Caliber366TKM": {
"59e6542b86f77411dc52a77a": 44, "59e6542b86f77411dc52a77a": 4600,
"59e655cb86f77411dc52a77b": 20, "59e655cb86f77411dc52a77b": 2355,
"59e6658b86f77411d949b250": 31, "59e6658b86f77411d949b250": 1568,
"5f0596629e22f464da6bbdd9": 8 "5f0596629e22f464da6bbdd9": 101
}, },
"Caliber545x39": { "Caliber545x39": {
"56dfef82d2720bbd668b4567": 1, "56dfef82d2720bbd668b4567": 132,
"56dff061d2720bb5668b4567": 1, "56dff061d2720bb5668b4567": 30,
"56dff0bed2720bb0668b4567": 1, "56dff0bed2720bb0668b4567": 886,
"56dff216d2720bbd668b4568": 1, "56dff216d2720bbd668b4568": 1075,
"56dff2ced2720bb4668b4567": 1, "56dff2ced2720bb4668b4567": 112,
"56dff338d2720bbd668b4569": 1, "56dff338d2720bbd668b4569": 857,
"56dff3afd2720bba668b4567": 1, "56dff3afd2720bba668b4567": 3638,
"56dff421d2720b5f5a8b4567": 1, "56dff421d2720b5f5a8b4567": 1059,
"56dff4a2d2720bbd668b456a": 1, "56dff4a2d2720bbd668b456a": 895,
"56dff4ecd2720b5f5a8b4568": 1 "56dff4ecd2720b5f5a8b4568": 557
}, },
"Caliber556x45NATO": { "Caliber556x45NATO": {
"54527a984bdc2d4e668b4567": 4, "54527a984bdc2d4e668b4567": 276,
"54527ac44bdc2d36668b4567": 1, "54527ac44bdc2d36668b4567": 24,
"59e68f6f86f7746c9f75e846": 1, "59e68f6f86f7746c9f75e846": 306,
"59e6906286f7746c9f75e847": 1, "59e6906286f7746c9f75e847": 76,
"59e6918f86f7746c9f75e849": 1, "59e6918f86f7746c9f75e849": 445,
"59e6920f86f77411d82aa167": 1, "59e6920f86f77411d82aa167": 620,
"59e6927d86f77411da468256": 1, "59e6927d86f77411da468256": 405,
"5c0d5ae286f7741e46554302": 3 "5c0d5ae286f7741e46554302": 140
}, },
"Caliber762x25TT": { "Caliber762x25TT": {
"5735fdcd2459776445391d61": 1, "5735fdcd2459776445391d61": 1165,
"5735ff5c245977640e39ba7e": 1, "5735ff5c245977640e39ba7e": 610,
"573601b42459776410737435": 1, "573601b42459776410737435": 677,
"573602322459776445391df1": 1, "573602322459776445391df1": 246,
"5736026a245977644601dc61": 1, "5736026a245977644601dc61": 1698,
"573603562459776430731618": 1, "573603562459776430731618": 227,
"573603c924597764442bd9cb": 1 "573603c924597764442bd9cb": 642
}, },
"Caliber762x39": { "Caliber762x39": {
"5656d7c34bdc2d9d198b4587": 2, "5656d7c34bdc2d9d198b4587": 630,
"59e4cf5286f7741778269d8a": 2, "59e4cf5286f7741778269d8a": 991,
"59e4d3d286f774176a36250a": 1, "59e4d3d286f774176a36250a": 1362,
"64b7af5a8532cf95ee0a0dbd": 1, "64b7af5a8532cf95ee0a0dbd": 1385,
"64b7af734b75259c590fa895": 1 "64b7af734b75259c590fa895": 670
}, },
"Caliber762x51": { "Caliber762x51": {
"5e023e53d4353e3302577c4c": 15, "5e023e53d4353e3302577c4c": 1238,
"5e023e6e34d52a55c3304f71": 10, "5e023e6e34d52a55c3304f71": 961,
"5e023e88277cce2b522ff2b1": 10 "5e023e88277cce2b522ff2b1": 57
}, },
"Caliber762x54R": { "Caliber762x54R": {
"5887431f2459777e1612938f": 1, "5887431f2459777e1612938f": 21,
"5e023cf8186a883be655e54f": 1, "5e023cf8186a883be655e54f": 10,
"64b8f7968532cf95ee0a0dbf": 1, "64b8f7968532cf95ee0a0dbf": 202,
"64b8f7b5389d7ffd620ccba2": 1, "64b8f7b5389d7ffd620ccba2": 130,
"64b8f7c241772715af0f9c3d": 1 "64b8f7c241772715af0f9c3d": 139
}, },
"Caliber9x18PM": { "Caliber9x18PM": {
"573718ba2459775a75491131": 1, "573718ba2459775a75491131": 209,
"573719762459775a626ccbc1": 1, "573719762459775a626ccbc1": 1641,
"573719df2459775a626ccbc2": 1, "573719df2459775a626ccbc2": 22,
"57371aab2459775a77142f22": 1, "57371aab2459775a77142f22": 33,
"57371b192459775a9f58a5e0": 1, "57371b192459775a9f58a5e0": 261,
"57371e4124597760ff7b25f1": 1, "57371e4124597760ff7b25f1": 420,
"57371eb62459776125652ac1": 1, "57371eb62459776125652ac1": 584,
"57371f2b24597761224311f1": 1, "57371f2b24597761224311f1": 342,
"57371f8d24597761006c6a81": 1, "57371f8d24597761006c6a81": 222,
"5737201124597760fc4431f1": 1, "5737201124597760fc4431f1": 319,
"5737207f24597760ff7b25f2": 1, "5737207f24597760ff7b25f2": 168,
"573720e02459776143012541": 1, "573720e02459776143012541": 72,
"57372140245977611f70ee91": 1, "57372140245977611f70ee91": 20,
"5737218f245977612125ba51": 1 "5737218f245977612125ba51": 272
}, },
"Caliber9x19PARA": { "Caliber9x19PARA": {
"56d59d3ad2720bdb418b4577": 1, "56d59d3ad2720bdb418b4577": 2877,
"58864a4f2459770fcc257101": 1, "58864a4f2459770fcc257101": 2749,
"5c3df7d588a4501f290594e5": 1, "5c3df7d588a4501f290594e5": 898,
"5efb0da7a29a85116f6ea05f": 1, "5efb0da7a29a85116f6ea05f": 4,
"5efb0e16aeb21837e749c7ff": 1, "5efb0e16aeb21837e749c7ff": 118,
"64b7bbb74b75259c590fa897": 1 "64b7bbb74b75259c590fa897": 874
}, },
"Caliber9x21": { "Caliber9x21": {
"5a26abfac4a28232980eabff": 1 "5a26abfac4a28232980eabff": 1
@ -2651,191 +2651,191 @@
"equipment": { "equipment": {
"ArmBand": {}, "ArmBand": {},
"ArmorVest": { "ArmorVest": {
"5648a7494bdc2d9d488b4583": 3, "5648a7494bdc2d9d488b4583": 898,
"59e7635f86f7742cbf2c1095": 3, "59e7635f86f7742cbf2c1095": 2334,
"5ab8e4ed86f7742d8e50c7fa": 2, "5ab8e4ed86f7742d8e50c7fa": 731,
"5ab8e79e86f7742d8b372e78": 1, "5ab8e79e86f7742d8b372e78": 85,
"5b44d22286f774172b0c9de8": 3, "5b44d22286f774172b0c9de8": 191,
"5c0e53c886f7747fa54205c7": 2, "5c0e53c886f7747fa54205c7": 352,
"5c0e5edb86f77461f55ed1f7": 3, "5c0e5edb86f77461f55ed1f7": 795,
"5df8a2ca86f7740bfe6df777": 3, "5df8a2ca86f7740bfe6df777": 1127,
"607f20859ee58b18e41ecd90": 1, "607f20859ee58b18e41ecd90": 23,
"609e8540d5c319764c2bc2e9": 2, "609e8540d5c319764c2bc2e9": 95,
"62a09d79de7ac81993580530": 1, "62a09d79de7ac81993580530": 286,
"64be79e2bf8412471d0d9bcc": 1 "64be79e2bf8412471d0d9bcc": 279
}, },
"Backpack": { "Backpack": {
"544a5cde4bdc2d39388b456b": 9, "544a5cde4bdc2d39388b456b": 2054,
"56e335e4d2720b6c058b456d": 4, "56e335e4d2720b6c058b456d": 1208,
"56e33634d2720bd8058b456b": 10, "56e33634d2720bd8058b456b": 3015,
"56e33680d2720be2748b4576": 12, "56e33680d2720be2748b4576": 4124,
"59e763f286f7742ee57895da": 5, "59e763f286f7742ee57895da": 236,
"5ab8ee7786f7742d8f33f0b9": 5, "5ab8ee7786f7742d8f33f0b9": 673,
"5ab8f04f86f774585f4237d8": 12, "5ab8f04f86f774585f4237d8": 470,
"5f5e45cc5021ce62144be7aa": 4, "5f5e45cc5021ce62144be7aa": 1679,
"60a2828e8689911a226117f9": 5 "60a2828e8689911a226117f9": 109
}, },
"Earpiece": {}, "Earpiece": {},
"Eyewear": { "Eyewear": {
"557ff21e4bdc2d89578b4586": 3, "557ff21e4bdc2d89578b4586": 1777,
"59e770b986f7742cbd762754": 2, "59e770b986f7742cbd762754": 1469,
"5aa2b923e5b5b000137b7589": 2, "5aa2b923e5b5b000137b7589": 540,
"5aa2b986e5b5b00014028f4c": 3, "5aa2b986e5b5b00014028f4c": 1821,
"5aa2b9aee5b5b00015693121": 2, "5aa2b9aee5b5b00015693121": 1169,
"5b432be65acfc433000ed01f": 3, "5b432be65acfc433000ed01f": 747,
"5d6d2ef3a4b93618084f58bd": 2, "5d6d2ef3a4b93618084f58bd": 323,
"603409c80ca681766b6a0fb2": 1, "603409c80ca681766b6a0fb2": 179,
"61c18d83b00456371a66814b": 1, "61c18d83b00456371a66814b": 117,
"62a09e410b9d3c46de5b6e78": 1 "62a09e410b9d3c46de5b6e78": 106
}, },
"FaceCover": { "FaceCover": {
"572b7f1624597762ae139822": 10, "572b7f1624597762ae139822": 2542,
"572b7fa524597762b747ce82": 10, "572b7fa524597762b747ce82": 5011,
"59e7715586f7742ee5789605": 10, "59e7715586f7742ee5789605": 4294,
"5ab8f39486f7745cd93a1cca": 8, "5ab8f39486f7745cd93a1cca": 338,
"5ab8f4ff86f77431c60d91ba": 5, "5ab8f4ff86f77431c60d91ba": 623,
"5b4326435acfc433000ed01d": 10, "5b4326435acfc433000ed01d": 1493,
"5b432b2f5acfc4771e1c6622": 10, "5b432b2f5acfc4771e1c6622": 94,
"5b432b6c5acfc4001a599bf0": 6, "5b432b6c5acfc4001a599bf0": 206,
"5b432c305acfc40019478128": 10, "5b432c305acfc40019478128": 596,
"5b432f3d5acfc4704b4a1dfb": 10, "5b432f3d5acfc4704b4a1dfb": 537,
"5bd073a586f7747e6f135799": 7, "5bd073a586f7747e6f135799": 267,
"5e54f76986f7740366043752": 3, "5e54f76986f7740366043752": 97,
"5e54f79686f7744022011103": 1, "5e54f79686f7744022011103": 74,
"5e71f6be86f77429f2683c44": 1, "5e71f6be86f77429f2683c44": 16,
"60363c0c92ec1c31037959f5": 10, "60363c0c92ec1c31037959f5": 416,
"62a09e08de7ac81993580532": 1, "62a09e08de7ac81993580532": 66,
"62a5c2c98ec41a51b34739c0": 1, "62a5c2c98ec41a51b34739c0": 90,
"62a5c333ec21e50cad3b5dc6": 1, "62a5c333ec21e50cad3b5dc6": 144,
"62a5c41e8ec41a51b34739c3": 1 "62a5c41e8ec41a51b34739c3": 121
}, },
"FirstPrimaryWeapon": { "FirstPrimaryWeapon": {
"5447a9cd4bdc2dbd208b4567": 1, "5447a9cd4bdc2dbd208b4567": 22,
"54491c4f4bdc2db1078b4568": 61, "54491c4f4bdc2db1078b4568": 2513,
"5580223e4bdc2d1c128b457f": 4, "5580223e4bdc2d1c128b457f": 850,
"5644bd2b4bdc2d3b4c8b4572": 10, "5644bd2b4bdc2d3b4c8b4572": 208,
"56dee2bdd2720bc8328b4567": 80, "56dee2bdd2720bc8328b4567": 2569,
"574d967124597745970e7c94": 56, "574d967124597745970e7c94": 1051,
"576165642459773c7a400233": 80, "576165642459773c7a400233": 2099,
"57d14d2524597714373db789": 16, "57d14d2524597714373db789": 390,
"57dc2fa62459775949412633": 41, "57dc2fa62459775949412633": 1183,
"587e02ff24597743df3deaeb": 37, "587e02ff24597743df3deaeb": 707,
"59d6088586f774275f37482f": 22, "59d6088586f774275f37482f": 384,
"59e6152586f77473dc057aa1": 83, "59e6152586f77473dc057aa1": 2202,
"59e6687d86f77411d949b251": 61, "59e6687d86f77411d949b251": 1685,
"59f9cabd86f7743a10721f46": 49, "59f9cabd86f7743a10721f46": 1388,
"59ff346386f77477562ff5e2": 12, "59ff346386f77477562ff5e2": 254,
"5a38e6bac4a2826c6e06d79b": 78, "5a38e6bac4a2826c6e06d79b": 2983,
"5a7828548dc32e5a9c28b516": 1, "5a7828548dc32e5a9c28b516": 249,
"5ab8e9fcd8ce870019439434": 4, "5ab8e9fcd8ce870019439434": 104,
"5ac4cd105acfc40016339859": 32, "5ac4cd105acfc40016339859": 700,
"5ac66d725acfc43b321d4b60": 1, "5ac66d725acfc43b321d4b60": 64,
"5ac66d9b5acfc4001633997a": 9, "5ac66d9b5acfc4001633997a": 148,
"5ae08f0a5acfc408fb1398a1": 4, "5ae08f0a5acfc408fb1398a1": 79,
"5bf3e03b0db834001d2c4a9c": 4, "5bf3e03b0db834001d2c4a9c": 176,
"5bf3e0490db83400196199af": 7, "5bf3e0490db83400196199af": 254,
"5bfd297f0db834001a669119": 5, "5bfd297f0db834001a669119": 324,
"5c07c60e0db834002330051f": 33, "5c07c60e0db834002330051f": 695,
"5c501a4d2e221602b412b540": 27, "5c501a4d2e221602b412b540": 702,
"5d2f0d8048f0356c925bc3b0": 1, "5d2f0d8048f0356c925bc3b0": 28,
"5de652c31b7e3716273428be": 17, "5de652c31b7e3716273428be": 928,
"5e00903ae9dc277128008b87": 1, "5e00903ae9dc277128008b87": 32,
"5e848cc2988a8701445df1e8": 1, "5e848cc2988a8701445df1e8": 2,
"5e870397991fd70db46995c8": 29, "5e870397991fd70db46995c8": 829,
"5ea03f7400685063ec28bfa8": 11, "5ea03f7400685063ec28bfa8": 537,
"606dae0ab0e443224b421bb7": 57, "606dae0ab0e443224b421bb7": 1235,
"60db29ce99594040e04c4a27": 4, "60db29ce99594040e04c4a27": 866,
"61f7c9e189e6fb1a5e3ea78d": 32, "61f7c9e189e6fb1a5e3ea78d": 301,
"6259b864ebedf17603599e88": 1, "6259b864ebedf17603599e88": 51,
"643ea5b23db6f9f57107d9fd": 1 "643ea5b23db6f9f57107d9fd": 33
}, },
"Headwear": { "Headwear": {
"572b7d8524597762b472f9d1": 1, "572b7d8524597762b472f9d1": 2053,
"572b7fa124597762b472f9d2": 1, "572b7fa124597762b472f9d2": 2967,
"59e7708286f7742cbd762753": 1, "59e7708286f7742cbd762753": 2429,
"59e770f986f7742cbe3164ef": 1, "59e770f986f7742cbe3164ef": 2492,
"59e7711e86f7746cae05fbe1": 1, "59e7711e86f7746cae05fbe1": 807,
"59ef13ca86f77445fd0e2483": 1, "59ef13ca86f77445fd0e2483": 5,
"5a43943586f77416ad2f06e2": 1, "5a43943586f77416ad2f06e2": 29,
"5a43957686f7742a2c2f11b0": 1, "5a43957686f7742a2c2f11b0": 35,
"5a7c4850e899ef00150be885": 1, "5a7c4850e899ef00150be885": 634,
"5aa2a7e8e5b5b00016327c16": 1, "5aa2a7e8e5b5b00016327c16": 254,
"5aa2b87de5b5b00016327c25": 1, "5aa2b87de5b5b00016327c25": 218,
"5aa2b89be5b5b0001569311f": 1, "5aa2b89be5b5b0001569311f": 514,
"5aa2b8d7e5b5b00014028f4a": 1, "5aa2b8d7e5b5b00014028f4a": 1182,
"5aa2b9ede5b5b000137b758b": 1, "5aa2b9ede5b5b000137b758b": 450,
"5aa2ba19e5b5b00014028f4e": 1, "5aa2ba19e5b5b00014028f4e": 763,
"5aa2ba46e5b5b000137b758d": 1, "5aa2ba46e5b5b000137b758d": 269,
"5aa7cfc0e5b5b00015693143": 1, "5aa7cfc0e5b5b00015693143": 205,
"5aa7d03ae5b5b00016327db5": 1, "5aa7d03ae5b5b00016327db5": 507,
"5ab8f20c86f7745cdb629fb2": 1, "5ab8f20c86f7745cdb629fb2": 709,
"5b4329075acfc400153b78ff": 1, "5b4329075acfc400153b78ff": 475,
"5bd073c986f7747f627e796c": 1, "5bd073c986f7747f627e796c": 79,
"5c06c6a80db834001b735491": 1, "5c06c6a80db834001b735491": 934,
"5c08f87c0db8340019124324": 1, "5c08f87c0db8340019124324": 145,
"5c0d2727d174af02a012cf58": 1, "5c0d2727d174af02a012cf58": 232,
"5df8a58286f77412631087ed": 1, "5df8a58286f77412631087ed": 1366,
"5ea05cf85ad9772e6624305d": 1, "5ea05cf85ad9772e6624305d": 437,
"5f60e6403b85f6263c14558c": 1, "5f60e6403b85f6263c14558c": 105,
"5f60e7788adaa7100c3adb49": 1, "5f60e7788adaa7100c3adb49": 210,
"5f60e784f2bcbb675b00dac7": 1, "5f60e784f2bcbb675b00dac7": 264,
"603618feffd42c541047f771": 1, "603618feffd42c541047f771": 179,
"603619720ca681766b6a0fc4": 1, "603619720ca681766b6a0fc4": 430,
"60361a7497633951dc245eb4": 1, "60361a7497633951dc245eb4": 569,
"60361b0b5a45383c122086a1": 1, "60361b0b5a45383c122086a1": 394,
"60361b5a9a15b10d96792291": 1, "60361b5a9a15b10d96792291": 604,
"6040de02647ad86262233012": 1, "6040de02647ad86262233012": 300,
"60b52e5bc7d8103275739d67": 1, "60b52e5bc7d8103275739d67": 163,
"60bf74184a63fc79b60c57f6": 1, "60bf74184a63fc79b60c57f6": 76,
"61c18db6dfd64163ea78fbb4": 1 "61c18db6dfd64163ea78fbb4": 290
}, },
"Holster": { "Holster": {
"5448bd6b4bdc2dfc2f8b4569": 1, "5448bd6b4bdc2dfc2f8b4569": 526,
"56d59856d2720bd8418b456a": 1, "56d59856d2720bd8418b456a": 125,
"56e0598dd2720bb5668b45a6": 1, "56e0598dd2720bb5668b45a6": 96,
"571a12c42459771f627b58a0": 1, "571a12c42459771f627b58a0": 1027,
"576a581d2459771e7b1bc4f1": 1, "576a581d2459771e7b1bc4f1": 324,
"579204f224597773d619e051": 1, "579204f224597773d619e051": 138,
"59f98b4986f7746f546d2cef": 1, "59f98b4986f7746f546d2cef": 3,
"5a17f98cfcdbcb0980087290": 1, "5a17f98cfcdbcb0980087290": 27,
"5e81c3cbac2bb513793cdc75": 1, "5e81c3cbac2bb513793cdc75": 63,
"602a9740da11d6478d5a06dc": 1, "602a9740da11d6478d5a06dc": 4,
"624c2e8614da335f1e034d8c": 1, "624c2e8614da335f1e034d8c": 26,
"64748cb8de82c85eaf0a273a": 1 "64748cb8de82c85eaf0a273a": 2
}, },
"Pockets": { "Pockets": {
"557ffd194bdc2d28148b457f": 1 "557ffd194bdc2d28148b457f": 1
}, },
"Scabbard": { "Scabbard": {
"54491bb74bdc2d09088b4567": 5, "54491bb74bdc2d09088b4567": 897,
"57e26ea924597715ca604a09": 5, "57e26ea924597715ca604a09": 5906,
"57e26fc7245977162a14b800": 5, "57e26fc7245977162a14b800": 16315,
"5bc9c1e2d4351e00367fbcf0": 1, "5bc9c1e2d4351e00367fbcf0": 316,
"5c07df7f0db834001b73588a": 2 "5c07df7f0db834001b73588a": 303
}, },
"SecondPrimaryWeapon": {}, "SecondPrimaryWeapon": {},
"SecuredContainer": { "SecuredContainer": {
"5c0a794586f77461c458f892": 1 "5c0a794586f77461c458f892": 1
}, },
"TacticalVest": { "TacticalVest": {
"572b7adb24597762ae139821": 2, "572b7adb24597762ae139821": 7097,
"5929a2a086f7744f4b234d43": 2, "5929a2a086f7744f4b234d43": 1460,
"592c2d1a86f7746dbe2af32a": 2, "592c2d1a86f7746dbe2af32a": 103,
"59e7643b86f7742cbf2c109a": 2, "59e7643b86f7742cbf2c109a": 3576,
"5ab8dab586f77441cd04f2a2": 2, "5ab8dab586f77441cd04f2a2": 757,
"5c0e446786f7742013381639": 1, "5c0e446786f7742013381639": 909,
"5c0e6a1586f77404597b4965": 2, "5c0e6a1586f77404597b4965": 145,
"5ca20abf86f77418567a43f2": 2, "5ca20abf86f77418567a43f2": 1298,
"5d5d646386f7742797261fd9": 1, "5d5d646386f7742797261fd9": 678,
"5e4abfed86f77406a2713cf7": 2, "5e4abfed86f77406a2713cf7": 1488,
"5fd4c4fa16cac650092f6771": 2, "5fd4c4fa16cac650092f6771": 794,
"5fd4c5477a8d854fa0105061": 2, "5fd4c5477a8d854fa0105061": 6558,
"5fd4c60f875c30179f5d04c2": 2, "5fd4c60f875c30179f5d04c2": 129,
"6034cf5fffd42c541047f72e": 2, "6034cf5fffd42c541047f72e": 2147,
"6034d0230ca681766b6a0fb5": 2, "6034d0230ca681766b6a0fb5": 495,
"603648ff5a45383c122086ac": 2, "603648ff5a45383c122086ac": 1213,
"6040dd4ddcf9592f401632d2": 2, "6040dd4ddcf9592f401632d2": 415,
"64be7110bf597ba84a0a41ea": 1 "64be7110bf597ba84a0a41ea": 1924
} }
}, },
"items": { "items": {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -386,7 +386,7 @@
"DEFAULT_BEAR_BEHAVIOUR": "Attack", "DEFAULT_BEAR_BEHAVIOUR": "Attack",
"DEFAULT_ENEMY_BEAR": true, "DEFAULT_ENEMY_BEAR": true,
"DEFAULT_ENEMY_USEC": true, "DEFAULT_ENEMY_USEC": true,
"DEFAULT_SAVAGE_BEHAVIOUR": "Warn", "DEFAULT_SAVAGE_BEHAVIOUR": "Attack",
"DEFAULT_USEC_BEHAVIOUR": "Attack", "DEFAULT_USEC_BEHAVIOUR": "Attack",
"DIST_TO_ENEMY_YO_CAN_HEAL": 130, "DIST_TO_ENEMY_YO_CAN_HEAL": 130,
"DIST_TO_FOUND_SQRT": 400, "DIST_TO_FOUND_SQRT": 400,
@ -897,7 +897,7 @@
"DEFAULT_BEAR_BEHAVIOUR": "Attack", "DEFAULT_BEAR_BEHAVIOUR": "Attack",
"DEFAULT_ENEMY_BEAR": true, "DEFAULT_ENEMY_BEAR": true,
"DEFAULT_ENEMY_USEC": true, "DEFAULT_ENEMY_USEC": true,
"DEFAULT_SAVAGE_BEHAVIOUR": "Warn", "DEFAULT_SAVAGE_BEHAVIOUR": "Attack",
"DEFAULT_USEC_BEHAVIOUR": "Attack", "DEFAULT_USEC_BEHAVIOUR": "Attack",
"DIST_TO_ENEMY_YO_CAN_HEAL": 130, "DIST_TO_ENEMY_YO_CAN_HEAL": 130,
"DIST_TO_FOUND_SQRT": 400, "DIST_TO_FOUND_SQRT": 400,
@ -1408,7 +1408,7 @@
"DEFAULT_BEAR_BEHAVIOUR": "Attack", "DEFAULT_BEAR_BEHAVIOUR": "Attack",
"DEFAULT_ENEMY_BEAR": true, "DEFAULT_ENEMY_BEAR": true,
"DEFAULT_ENEMY_USEC": true, "DEFAULT_ENEMY_USEC": true,
"DEFAULT_SAVAGE_BEHAVIOUR": "Warn", "DEFAULT_SAVAGE_BEHAVIOUR": "Attack",
"DEFAULT_USEC_BEHAVIOUR": "Attack", "DEFAULT_USEC_BEHAVIOUR": "Attack",
"DIST_TO_ENEMY_YO_CAN_HEAL": 130, "DIST_TO_ENEMY_YO_CAN_HEAL": 130,
"DIST_TO_FOUND_SQRT": 400, "DIST_TO_FOUND_SQRT": 400,
@ -1919,7 +1919,7 @@
"DEFAULT_BEAR_BEHAVIOUR": "Attack", "DEFAULT_BEAR_BEHAVIOUR": "Attack",
"DEFAULT_ENEMY_BEAR": true, "DEFAULT_ENEMY_BEAR": true,
"DEFAULT_ENEMY_USEC": true, "DEFAULT_ENEMY_USEC": true,
"DEFAULT_SAVAGE_BEHAVIOUR": "Warn", "DEFAULT_SAVAGE_BEHAVIOUR": "Attack",
"DEFAULT_USEC_BEHAVIOUR": "Attack", "DEFAULT_USEC_BEHAVIOUR": "Attack",
"DIST_TO_ENEMY_YO_CAN_HEAL": 130, "DIST_TO_ENEMY_YO_CAN_HEAL": 130,
"DIST_TO_FOUND_SQRT": 400, "DIST_TO_FOUND_SQRT": 400,
@ -2253,18 +2253,18 @@
"inventory": { "inventory": {
"Ammo": { "Ammo": {
"Caliber762x39": { "Caliber762x39": {
"5656d7c34bdc2d9d198b4587": 1, "5656d7c34bdc2d9d198b4587": 410,
"59e0d99486f7744a32234762": 1, "59e0d99486f7744a32234762": 165,
"64b7af5a8532cf95ee0a0dbd": 1 "64b7af5a8532cf95ee0a0dbd": 386
}, },
"Caliber762x51": { "Caliber762x51": {
"5a6086ea4f39f99cd479502f": 1, "5a6086ea4f39f99cd479502f": 166,
"5a608bf24f39f98ffc77720e": 1, "5a608bf24f39f98ffc77720e": 211,
"5e023e53d4353e3302577c4c": 1 "5e023e53d4353e3302577c4c": 2440
}, },
"Caliber9x19PARA": { "Caliber9x19PARA": {
"56d59d3ad2720bdb418b4577": 1, "56d59d3ad2720bdb418b4577": 1891,
"64b7bbb74b75259c590fa897": 1 "64b7bbb74b75259c590fa897": 1887
} }
}, },
"equipment": { "equipment": {
@ -2274,20 +2274,20 @@
"Earpiece": {}, "Earpiece": {},
"Eyewear": {}, "Eyewear": {},
"FaceCover": { "FaceCover": {
"5c1a1e3f2e221602b66cc4c2": 1, "5c1a1e3f2e221602b66cc4c2": 2,
"62963c18dbc8ab5f0d382d0b": 1 "62963c18dbc8ab5f0d382d0b": 1887
}, },
"FirstPrimaryWeapon": { "FirstPrimaryWeapon": {
"5dcbd56fdbd3d91b3e5468d5": 1, "5dcbd56fdbd3d91b3e5468d5": 1376,
"606587252535c57a13424cfd": 1, "606587252535c57a13424cfd": 961,
"6165ac306ef05c2ce828ef74": 1 "6165ac306ef05c2ce828ef74": 1441
}, },
"Headwear": { "Headwear": {
"5a43957686f7742a2c2f11b0": 1 "5a43957686f7742a2c2f11b0": 1
}, },
"Holster": { "Holster": {
"5a7ae0c351dfba0017554310": 1, "5a7ae0c351dfba0017554310": 2369,
"5b1fa9b25acfc40018633c01": 1 "5b1fa9b25acfc40018633c01": 1409
}, },
"Pockets": { "Pockets": {
"5af99e9186f7747c447120b8": 1 "5af99e9186f7747c447120b8": 1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -305,7 +305,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -786,7 +786,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -1267,7 +1267,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -1748,7 +1748,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -2178,8 +2178,8 @@
"5fc382a9d724d907e2077dab": 1 "5fc382a9d724d907e2077dab": 1
}, },
"Caliber9x21": { "Caliber9x21": {
"5a269f97c4a282000b151807": 1, "5a269f97c4a282000b151807": 13,
"5a26abfac4a28232980eabff": 1 "5a26abfac4a28232980eabff": 968
} }
}, },
"equipment": { "equipment": {
@ -2192,8 +2192,8 @@
"63626d904aa74b8fe30ab426": 1 "63626d904aa74b8fe30ab426": 1
}, },
"FirstPrimaryWeapon": { "FirstPrimaryWeapon": {
"5c46fbd72e2216398b5a8c9c": 1, "5c46fbd72e2216398b5a8c9c": 968,
"627e14b21713922ded6f2c15": 1 "627e14b21713922ded6f2c15": 13
}, },
"Headwear": { "Headwear": {
"636270263f2495c26f00b007": 1 "636270263f2495c26f00b007": 1
@ -2206,8 +2206,8 @@
}, },
"Scabbard": {}, "Scabbard": {},
"SecondPrimaryWeapon": { "SecondPrimaryWeapon": {
"57dc2fa62459775949412633": 1, "57dc2fa62459775949412633": 968,
"5ba26383d4351e00334c93d9": 1 "5ba26383d4351e00334c93d9": 13
}, },
"SecuredContainer": { "SecuredContainer": {
"5c0a794586f77461c458f892": 1 "5c0a794586f77461c458f892": 1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
"5fb53d0b7b5d1342ee24bd64": 1 "5fb53d0b7b5d1342ee24bd64": 1
}, },
"feet": { "feet": {
"5fb535bd1c69e5198e234125": 1, "5fb535bd1c69e5198e234125": 5,
"5fb535cf1c69e5198e234126": 1 "5fb535cf1c69e5198e234126": 1
}, },
"hands": [ "hands": [
@ -315,7 +315,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -793,7 +793,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -1271,7 +1271,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -1749,7 +1749,7 @@
"DIST_LAY_CHECK": 11, "DIST_LAY_CHECK": 11,
"DIST_TO_COVER_TO_LAY": 3.5, "DIST_TO_COVER_TO_LAY": 3.5,
"DIST_TO_COVER_TO_LAY_SQRT": 12.25, "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
"IF_NO_ENEMY": true, "IF_NO_ENEMY": false,
"LAY_AIM": 0.6, "LAY_AIM": 0.6,
"LAY_CHANCE_DANGER": 40, "LAY_CHANCE_DANGER": 40,
"MAX_CAN_LAY_DIST": 200, "MAX_CAN_LAY_DIST": 200,
@ -2169,12 +2169,12 @@
"54527a984bdc2d4e668b4567": 1 "54527a984bdc2d4e668b4567": 1
}, },
"Caliber762x51": { "Caliber762x51": {
"5a6086ea4f39f99cd479502f": 1, "5a6086ea4f39f99cd479502f": 13,
"5e023e53d4353e3302577c4c": 1 "5e023e53d4353e3302577c4c": 45
}, },
"Caliber762x54R": { "Caliber762x54R": {
"560d61e84bdc2da74d8b4571": 1, "560d61e84bdc2da74d8b4571": 92,
"5887431f2459777e1612938f": 1 "5887431f2459777e1612938f": 145
}, },
"Caliber9x19PARA": { "Caliber9x19PARA": {
"56d59d3ad2720bdb418b4577": 1 "56d59d3ad2720bdb418b4577": 1
@ -2183,23 +2183,23 @@
"equipment": { "equipment": {
"ArmBand": {}, "ArmBand": {},
"ArmorVest": { "ArmorVest": {
"5e4abb5086f77406975c9342": 1, "5e4abb5086f77406975c9342": 13,
"5fd4c474dd870108a754b241": 1 "5fd4c474dd870108a754b241": 9
}, },
"Backpack": {}, "Backpack": {},
"Earpiece": {}, "Earpiece": {},
"Eyewear": {}, "Eyewear": {},
"FaceCover": { "FaceCover": {
"5ab8f4ff86f77431c60d91ba": 1, "5ab8f4ff86f77431c60d91ba": 1506,
"5b432b2f5acfc4771e1c6622": 1, "5b432b2f5acfc4771e1c6622": 1584,
"635267ab3c89e2112001f826": 1 "635267ab3c89e2112001f826": 997
}, },
"FirstPrimaryWeapon": { "FirstPrimaryWeapon": {
"55801eed4bdc2d89578b4588": 1, "55801eed4bdc2d89578b4588": 2465,
"5bfea6e90db834001b7347f3": 1, "5bfea6e90db834001b7347f3": 20,
"5c46fbd72e2216398b5a8c9c": 1, "5c46fbd72e2216398b5a8c9c": 1564,
"5df8ce05b11454561e39243b": 1, "5df8ce05b11454561e39243b": 13,
"6176aca650224f204c1da3fb": 1 "6176aca650224f204c1da3fb": 25
}, },
"Headwear": {}, "Headwear": {},
"Holster": {}, "Holster": {},
@ -2208,17 +2208,17 @@
}, },
"Scabbard": {}, "Scabbard": {},
"SecondPrimaryWeapon": { "SecondPrimaryWeapon": {
"5447a9cd4bdc2dbd208b4567": 1, "5447a9cd4bdc2dbd208b4567": 90,
"57dc2fa62459775949412633": 1, "57dc2fa62459775949412633": 1873,
"59984ab886f7743e98271174": 1 "59984ab886f7743e98271174": 1133
}, },
"SecuredContainer": { "SecuredContainer": {
"5c0a794586f77461c458f892": 1 "5c0a794586f77461c458f892": 1
}, },
"TacticalVest": { "TacticalVest": {
"544a5caa4bdc2d1a388b4568": 1, "544a5caa4bdc2d1a388b4568": 18,
"61bcc89aef0f505f0c6cd0fc": 1, "61bcc89aef0f505f0c6cd0fc": 59,
"63611865ba5b90db0c0399d1": 1 "63611865ba5b90db0c0399d1": 4010
} }
}, },
"items": { "items": {

View File

@ -1,30 +1,30 @@
{ {
"appearance": { "appearance": {
"body": { "body": {
"5cc2e59214c02e000f16684e": 1, "5cc2e59214c02e000f16684e": 44,
"5cde9f337d6c8b0474535da8": 1, "5cde9f337d6c8b0474535da8": 47,
"5d28ad6986f77429275dba22": 1, "5d28ad6986f77429275dba22": 39,
"5d28ad7286f7742926686182": 1, "5d28ad7286f7742926686182": 52,
"5df8a10486f77412672a1e3a": 1, "5df8a10486f77412672a1e3a": 40,
"5e4bb3ee86f77406975c934e": 1, "5e4bb3ee86f77406975c934e": 35,
"5e9da1d086f774054a667134": 1, "5e9da1d086f774054a667134": 61,
"5fd1eb3fbe3b7107d66cb645": 1, "5fd1eb3fbe3b7107d66cb645": 42,
"5fd22d311add82653b5a704c": 1, "5fd22d311add82653b5a704c": 42,
"618d1af10a5a59657e5f56f3": 1, "618d1af10a5a59657e5f56f3": 38,
"619238266c614e6d15792bca": 1, "619238266c614e6d15792bca": 46,
"637df28ac22da5bb8d046935": 1 "637df28ac22da5bb8d046935": 38
}, },
"feet": { "feet": {
"5cc2e5d014c02e15d53d9c03": 1, "5cc2e5d014c02e15d53d9c03": 70,
"5cde9fb87d6c8b0474535da9": 1, "5cde9fb87d6c8b0474535da9": 58,
"5d28af3486f774292364a6e7": 1, "5d28af3486f774292364a6e7": 65,
"5df8a15186f77412640e2e6a": 1, "5df8a15186f77412640e2e6a": 53,
"5f5e410c6bdad616ad46d60b": 1, "5f5e410c6bdad616ad46d60b": 73,
"5f5e41366760b4138443b343": 1, "5f5e41366760b4138443b343": 64,
"5f5e41576760b4138443b344": 1, "5f5e41576760b4138443b344": 86,
"61922589bb2cea6f7a22d964": 1, "61922589bb2cea6f7a22d964": 48,
"6193be546e5968395b260157": 1, "6193be546e5968395b260157": 83,
"637df25a1e688345e1097bd4": 1 "637df25a1e688345e1097bd4": 65
}, },
"hands": [ "hands": [
"5fd78fe9e3bfcf6cab4c9f54", "5fd78fe9e3bfcf6cab4c9f54",
@ -2179,26 +2179,26 @@
"inventory": { "inventory": {
"Ammo": { "Ammo": {
"Caliber12g": { "Caliber12g": {
"560d5e524bdc2d25448b4571": 1, "560d5e524bdc2d25448b4571": 181,
"5d6e6806a4b936088465b17e": 1, "5d6e6806a4b936088465b17e": 44,
"5d6e6891a4b9361bd473feea": 1, "5d6e6891a4b9361bd473feea": 12,
"5d6e68dea4b9361bcc29e659": 1, "5d6e68dea4b9361bcc29e659": 26,
"5d6e6911a4b9361bd5780d52": 1 "5d6e6911a4b9361bd5780d52": 19
}, },
"Caliber20g": { "Caliber20g": {
"5a38ebd9c4a282000d722a5b": 1 "5a38ebd9c4a282000d722a5b": 1
}, },
"Caliber366TKM": { "Caliber366TKM": {
"59e6542b86f77411dc52a77a": 1, "59e6542b86f77411dc52a77a": 3,
"5f0596629e22f464da6bbdd9": 1 "5f0596629e22f464da6bbdd9": 17
}, },
"Caliber545x39": { "Caliber545x39": {
"56dff3afd2720bba668b4567": 1 "56dff3afd2720bba668b4567": 1
}, },
"Caliber556x45NATO": { "Caliber556x45NATO": {
"54527a984bdc2d4e668b4567": 1, "54527a984bdc2d4e668b4567": 25,
"54527ac44bdc2d36668b4567": 1, "54527ac44bdc2d36668b4567": 7,
"5c0d5ae286f7741e46554302": 1 "5c0d5ae286f7741e46554302": 4
}, },
"Caliber762x25TT": { "Caliber762x25TT": {
"5736026a245977644601dc61": 1 "5736026a245977644601dc61": 1
@ -2207,8 +2207,8 @@
"5656d7c34bdc2d9d198b4587": 1 "5656d7c34bdc2d9d198b4587": 1
}, },
"Caliber762x51": { "Caliber762x51": {
"5e023e53d4353e3302577c4c": 1, "5e023e53d4353e3302577c4c": 29,
"5e023e6e34d52a55c3304f71": 1 "5e023e6e34d52a55c3304f71": 39
}, },
"Caliber9x18PM": { "Caliber9x18PM": {
"573719762459775a626ccbc1": 1 "573719762459775a626ccbc1": 1
@ -2220,86 +2220,86 @@
"equipment": { "equipment": {
"ArmBand": {}, "ArmBand": {},
"ArmorVest": { "ArmorVest": {
"5648a7494bdc2d9d488b4583": 1, "5648a7494bdc2d9d488b4583": 28,
"59e7635f86f7742cbf2c1095": 1, "59e7635f86f7742cbf2c1095": 37,
"5ab8e4ed86f7742d8e50c7fa": 1, "5ab8e4ed86f7742d8e50c7fa": 21,
"5ab8e79e86f7742d8b372e78": 1, "5ab8e79e86f7742d8b372e78": 23,
"5b44d22286f774172b0c9de8": 1, "5b44d22286f774172b0c9de8": 30,
"5c0e53c886f7747fa54205c7": 1, "5c0e53c886f7747fa54205c7": 22,
"5c0e5edb86f77461f55ed1f7": 1, "5c0e5edb86f77461f55ed1f7": 36,
"5df8a2ca86f7740bfe6df777": 1, "5df8a2ca86f7740bfe6df777": 43,
"609e8540d5c319764c2bc2e9": 1 "609e8540d5c319764c2bc2e9": 28
}, },
"Backpack": { "Backpack": {
"61b9e1aaef9a1b5d6a79899a": 1 "61b9e1aaef9a1b5d6a79899a": 1
}, },
"Earpiece": {}, "Earpiece": {},
"Eyewear": { "Eyewear": {
"5aa2b923e5b5b000137b7589": 1, "5aa2b923e5b5b000137b7589": 31,
"5aa2b9aee5b5b00015693121": 1, "5aa2b9aee5b5b00015693121": 35,
"5c1a1cc52e221602b3136e3d": 1, "5c1a1cc52e221602b3136e3d": 15,
"5d6d2ef3a4b93618084f58bd": 1, "5d6d2ef3a4b93618084f58bd": 22,
"603409c80ca681766b6a0fb2": 1 "603409c80ca681766b6a0fb2": 20
}, },
"FaceCover": { "FaceCover": {
"5c1a1e3f2e221602b66cc4c2": 1 "5c1a1e3f2e221602b66cc4c2": 1
}, },
"FirstPrimaryWeapon": { "FirstPrimaryWeapon": {
"54491c4f4bdc2db1078b4568": 1, "54491c4f4bdc2db1078b4568": 10,
"5644bd2b4bdc2d3b4c8b4572": 1, "5644bd2b4bdc2d3b4c8b4572": 6,
"56dee2bdd2720bc8328b4567": 1, "56dee2bdd2720bc8328b4567": 24,
"574d967124597745970e7c94": 1, "574d967124597745970e7c94": 99,
"576165642459773c7a400233": 1, "576165642459773c7a400233": 47,
"57d14d2524597714373db789": 1, "57d14d2524597714373db789": 11,
"57dc2fa62459775949412633": 1, "57dc2fa62459775949412633": 49,
"587e02ff24597743df3deaeb": 1, "587e02ff24597743df3deaeb": 97,
"59d6088586f774275f37482f": 1, "59d6088586f774275f37482f": 35,
"59e6152586f77473dc057aa1": 1, "59e6152586f77473dc057aa1": 46,
"59e6687d86f77411d949b251": 1, "59e6687d86f77411d949b251": 40,
"59f9cabd86f7743a10721f46": 1, "59f9cabd86f7743a10721f46": 39,
"59ff346386f77477562ff5e2": 1, "59ff346386f77477562ff5e2": 15,
"5a38e6bac4a2826c6e06d79b": 1, "5a38e6bac4a2826c6e06d79b": 22,
"5ac4cd105acfc40016339859": 1, "5ac4cd105acfc40016339859": 32,
"5ac66d9b5acfc4001633997a": 1, "5ac66d9b5acfc4001633997a": 14,
"5c07c60e0db834002330051f": 1, "5c07c60e0db834002330051f": 36,
"5c501a4d2e221602b412b540": 1, "5c501a4d2e221602b412b540": 17,
"606dae0ab0e443224b421bb7": 1 "606dae0ab0e443224b421bb7": 26
}, },
"Headwear": { "Headwear": {
"5a43943586f77416ad2f06e2": 1, "5a43943586f77416ad2f06e2": 337,
"5a43957686f7742a2c2f11b0": 1 "5a43957686f7742a2c2f11b0": 328
}, },
"Holster": { "Holster": {
"56d59856d2720bd8418b456a": 1, "56d59856d2720bd8418b456a": 148,
"56e0598dd2720bb5668b45a6": 1, "56e0598dd2720bb5668b45a6": 58,
"571a12c42459771f627b58a0": 1, "571a12c42459771f627b58a0": 133,
"576a581d2459771e7b1bc4f1": 1, "576a581d2459771e7b1bc4f1": 275,
"579204f224597773d619e051": 1, "579204f224597773d619e051": 10,
"5a17f98cfcdbcb0980087290": 1 "5a17f98cfcdbcb0980087290": 41
}, },
"Pockets": { "Pockets": {
"557ffd194bdc2d28148b457f": 1 "557ffd194bdc2d28148b457f": 1
}, },
"Scabbard": { "Scabbard": {
"54491bb74bdc2d09088b4567": 1, "54491bb74bdc2d09088b4567": 91,
"57e26ea924597715ca604a09": 1, "57e26ea924597715ca604a09": 215,
"57e26fc7245977162a14b800": 1, "57e26fc7245977162a14b800": 233,
"5bc9c1e2d4351e00367fbcf0": 1 "5bc9c1e2d4351e00367fbcf0": 8
}, },
"SecondPrimaryWeapon": {}, "SecondPrimaryWeapon": {},
"SecuredContainer": { "SecuredContainer": {
"5c0a794586f77461c458f892": 1 "5c0a794586f77461c458f892": 1
}, },
"TacticalVest": { "TacticalVest": {
"592c2d1a86f7746dbe2af32a": 1, "592c2d1a86f7746dbe2af32a": 11,
"59e7643b86f7742cbf2c109a": 1, "59e7643b86f7742cbf2c109a": 391,
"5ab8dab586f77441cd04f2a2": 1, "5ab8dab586f77441cd04f2a2": 25,
"5c0e446786f7742013381639": 1, "5c0e446786f7742013381639": 70,
"5c0e6a1586f77404597b4965": 1, "5c0e6a1586f77404597b4965": 18,
"5d5d646386f7742797261fd9": 1, "5d5d646386f7742797261fd9": 64,
"5e4abfed86f77406a2713cf7": 1, "5e4abfed86f77406a2713cf7": 22,
"5fd4c60f875c30179f5d04c2": 1, "5fd4c60f875c30179f5d04c2": 14,
"6040dd4ddcf9592f401632d2": 1 "6040dd4ddcf9592f401632d2": 50
} }
}, },
"items": { "items": {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +0,0 @@
module.exports = {
presets: [
[
"@babel/preset-env",
{
targets: {
node: "current"
}
}
],
"@babel/preset-typescript"
]
};

View File

@ -1,5 +1,5 @@
{ {
"$schema": "./node_modules/rome/configuration_schema.json", "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
"linter": { "linter": {
"enabled": true, "enabled": true,
"rules": { "rules": {

View File

@ -12,7 +12,7 @@
}, },
"scripts": { "scripts": {
"check:circular": "madge --circular --extensions ts ./src/", "check:circular": "madge --circular --extensions ts ./src/",
"lint": "rome ci src --formatter-enabled=false --max-diagnostics=200", "lint": "biome ci src --formatter-enabled=false --max-diagnostics=200",
"lint:fix": "eslint --fix --ext .ts src/**", "lint:fix": "eslint --fix --ext .ts src/**",
"test:run": "jest --colors --runInBand", "test:run": "jest --colors --runInBand",
"test:coverage": "jest --coverage --maxWorkers=1 --no-cache", "test:coverage": "jest --coverage --maxWorkers=1 --no-cache",
@ -42,8 +42,7 @@
"ws": "8.14.2" "ws": "8.14.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-env": "7.23.2", "@biomejs/biome": "1.3.3",
"@babel/preset-typescript": "7.23.2",
"@jest/globals": "29.7.0", "@jest/globals": "29.7.0",
"@pnpm/exe": "8.9.0", "@pnpm/exe": "8.9.0",
"@swc/cli": "0.1.62", "@swc/cli": "0.1.62",
@ -67,7 +66,6 @@
"pkg": "5.8.1", "pkg": "5.8.1",
"pkg-fetch": "3.5.2", "pkg-fetch": "3.5.2",
"resedit": "2.0.0", "resedit": "2.0.0",
"rome": "12.1.3",
"ts-jest": "29.1.1", "ts-jest": "29.1.1",
"ts-node-dev": "2.0.0", "ts-node-dev": "2.0.0",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",

View File

@ -1,5 +0,0 @@
// eslint-disable-next-line @typescript-eslint/naming-convention
export const TYPES: {[name:string]: symbol} = {
PROGRAM: Symbol.for("PROGRAM"),
APP: Symbol.for("APP")
};

View File

@ -4,6 +4,7 @@ import { HideoutController } from "@spt-aki/controllers/HideoutController";
import { OnUpdate } from "@spt-aki/di/OnUpdate"; import { OnUpdate } from "@spt-aki/di/OnUpdate";
import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData";
import { IHandleQTEEventRequestData } from "@spt-aki/models/eft/hideout/IHandleQTEEventRequestData"; import { IHandleQTEEventRequestData } from "@spt-aki/models/eft/hideout/IHandleQTEEventRequestData";
import { IHideoutCancelProductionRequestData } from "@spt-aki/models/eft/hideout/IHideoutCancelProductionRequestData";
import { IHideoutContinuousProductionStartRequestData } from "@spt-aki/models/eft/hideout/IHideoutContinuousProductionStartRequestData"; import { IHideoutContinuousProductionStartRequestData } from "@spt-aki/models/eft/hideout/IHideoutContinuousProductionStartRequestData";
import { IHideoutImproveAreaRequestData } from "@spt-aki/models/eft/hideout/IHideoutImproveAreaRequestData"; import { IHideoutImproveAreaRequestData } from "@spt-aki/models/eft/hideout/IHideoutImproveAreaRequestData";
import { IHideoutPutItemInRequestData } from "@spt-aki/models/eft/hideout/IHideoutPutItemInRequestData"; import { IHideoutPutItemInRequestData } from "@spt-aki/models/eft/hideout/IHideoutPutItemInRequestData";
@ -129,6 +130,14 @@ export class HideoutCallbacks implements OnUpdate
return this.hideoutController.improveArea(sessionId, pmcData, request); return this.hideoutController.improveArea(sessionId, pmcData, request);
} }
/**
* Handle client/game/profile/items/moving - HideoutCancelProductionCommand
*/
public cancelProduction(pmcData: IPmcData, request: IHideoutCancelProductionRequestData, sessionId: string): IItemEventRouterResponse
{
return this.hideoutController.cancelProduction(sessionId, pmcData, request);
}
public async onUpdate(timeSinceLastRun: number): Promise<boolean> public async onUpdate(timeSinceLastRun: number): Promise<boolean>
{ {
if (timeSinceLastRun > this.hideoutConfig.runIntervalSeconds) if (timeSinceLastRun > this.hideoutConfig.runIntervalSeconds)

View File

@ -12,6 +12,7 @@ import { Upd } from "@spt-aki/models/eft/common/tables/IItem";
import { HideoutUpgradeCompleteRequestData } from "@spt-aki/models/eft/hideout/HideoutUpgradeCompleteRequestData"; import { HideoutUpgradeCompleteRequestData } from "@spt-aki/models/eft/hideout/HideoutUpgradeCompleteRequestData";
import { IHandleQTEEventRequestData } from "@spt-aki/models/eft/hideout/IHandleQTEEventRequestData"; import { IHandleQTEEventRequestData } from "@spt-aki/models/eft/hideout/IHandleQTEEventRequestData";
import { IHideoutArea, Stage } from "@spt-aki/models/eft/hideout/IHideoutArea"; import { IHideoutArea, Stage } from "@spt-aki/models/eft/hideout/IHideoutArea";
import { IHideoutCancelProductionRequestData } from "@spt-aki/models/eft/hideout/IHideoutCancelProductionRequestData";
import { IHideoutContinuousProductionStartRequestData } from "@spt-aki/models/eft/hideout/IHideoutContinuousProductionStartRequestData"; import { IHideoutContinuousProductionStartRequestData } from "@spt-aki/models/eft/hideout/IHideoutContinuousProductionStartRequestData";
import { IHideoutImproveAreaRequestData } from "@spt-aki/models/eft/hideout/IHideoutImproveAreaRequestData"; import { IHideoutImproveAreaRequestData } from "@spt-aki/models/eft/hideout/IHideoutImproveAreaRequestData";
import { IHideoutProduction } from "@spt-aki/models/eft/hideout/IHideoutProduction"; import { IHideoutProduction } from "@spt-aki/models/eft/hideout/IHideoutProduction";
@ -125,7 +126,6 @@ export class HideoutController
} }
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) 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));
@ -133,7 +133,6 @@ export class HideoutController
} }
const ctime = hideoutData.stages[hideoutArea.level + 1].constructionTime; const ctime = hideoutData.stages[hideoutArea.level + 1].constructionTime;
if (ctime > 0) if (ctime > 0)
{ {
const timestamp = this.timeUtil.getTimestamp(); const timestamp = this.timeUtil.getTimestamp();
@ -734,8 +733,8 @@ export class HideoutController
area.lastRecipe = request.recipeId; area.lastRecipe = request.recipeId;
counterHoursCrafting.value = hoursCrafting; counterHoursCrafting.value = hoursCrafting;
// Delete production now it's complete // Null production data now it's complete - will be cleaned up later by update() process
delete pmcData.Hideout.Production[prodId]; pmcData.Hideout.Production[prodId] = null;
}; };
// Remove the old production from output object before its sent to client // Remove the old production from output object before its sent to client
@ -814,7 +813,9 @@ export class HideoutController
const callback = () => const callback = () =>
{ {
delete pmcData.Hideout.Production[prodId];
// Null production data now it's complete - will be cleaned up later by update() process
pmcData.Hideout.Production[prodId] = null;
}; };
return this.inventoryHelper.addItem(pmcData, newReq, output, sessionID, callback, true); return this.inventoryHelper.addItem(pmcData, newReq, output, sessionID, callback, true);
@ -832,7 +833,6 @@ export class HideoutController
return this.hideoutHelper.registerProduction(pmcData, request, sessionID); return this.hideoutHelper.registerProduction(pmcData, request, sessionID);
} }
/** /**
* Get quick time event list for hideout * Get quick time event list for hideout
* // TODO - implement this * // TODO - implement this
@ -909,8 +909,8 @@ export class HideoutController
/** /**
* Handle client/game/profile/items/moving - HideoutImproveArea * Handle client/game/profile/items/moving - HideoutImproveArea
* @param sessionId Session id * @param sessionId Session id
* @param pmcData profile to improve area in * @param pmcData Profile to improve area in
* @param request improve area request data * @param request Improve area request data
*/ */
public improveArea(sessionId: string, pmcData: IPmcData, request: IHideoutImproveAreaRequestData): IItemEventRouterResponse public improveArea(sessionId: string, pmcData: IPmcData, request: IHideoutImproveAreaRequestData): IItemEventRouterResponse
{ {
@ -980,6 +980,34 @@ export class HideoutController
return output; return output;
} }
/**
* Handle client/game/profile/items/moving HideoutCancelProductionCommand
* @param sessionId Session id
* @param pmcData Profile with craft to cancel
* @param request Cancel production request data
* @returns IItemEventRouterResponse
*/
public cancelProduction(sessionId: string, pmcData: IPmcData, request: IHideoutCancelProductionRequestData): IItemEventRouterResponse
{
const output = this.eventOutputHolder.getOutput(sessionId);
const craftToCancel = pmcData.Hideout.Production[request.recipeId];
if (!craftToCancel)
{
const errorMessage = `Unable to find craft ${request.recipeId} to cancel`;
this.logger.error(errorMessage);
return this.httpResponse.appendErrorToOutput(output, errorMessage);
}
// Null out production data so client gets informed when response send back
pmcData.Hideout.Production[request.recipeId] = null;
// TODO - handle timestamp somehow?
return output;
}
/** /**
* Function called every x seconds as part of onUpdate event * Function called every x seconds as part of onUpdate event
*/ */

View File

@ -185,7 +185,6 @@ import { RagfairServer } from "@spt-aki/servers/RagfairServer";
import { SaveServer } from "@spt-aki/servers/SaveServer"; import { SaveServer } from "@spt-aki/servers/SaveServer";
import { WebSocketServer } from "@spt-aki/servers/WebSocketServer"; import { WebSocketServer } from "@spt-aki/servers/WebSocketServer";
import { AkiHttpListener } from "@spt-aki/servers/http/AkiHttpListener"; import { AkiHttpListener } from "@spt-aki/servers/http/AkiHttpListener";
import { HttpBufferHandler } from "@spt-aki/servers/http/HttpBufferHandler";
import { BotEquipmentFilterService } from "@spt-aki/services/BotEquipmentFilterService"; import { BotEquipmentFilterService } from "@spt-aki/services/BotEquipmentFilterService";
import { BotEquipmentModPoolService } from "@spt-aki/services/BotEquipmentModPoolService"; import { BotEquipmentModPoolService } from "@spt-aki/services/BotEquipmentModPoolService";
import { BotGenerationCacheService } from "@spt-aki/services/BotGenerationCacheService"; import { BotGenerationCacheService } from "@spt-aki/services/BotGenerationCacheService";
@ -630,8 +629,6 @@ export class Container
depContainer.register<RagfairServer>("RagfairServer", RagfairServer); depContainer.register<RagfairServer>("RagfairServer", RagfairServer);
depContainer.register<SaveServer>("SaveServer", SaveServer, { lifecycle: Lifecycle.Singleton }); depContainer.register<SaveServer>("SaveServer", SaveServer, { lifecycle: Lifecycle.Singleton });
depContainer.register<ConfigServer>("ConfigServer", ConfigServer, { lifecycle: Lifecycle.Singleton }); depContainer.register<ConfigServer>("ConfigServer", ConfigServer, { lifecycle: Lifecycle.Singleton });
depContainer.register<HttpBufferHandler>("HttpBufferHandler", HttpBufferHandler, {lifecycle: Lifecycle.Singleton});
} }
private static registerControllers(depContainer: DependencyContainer): void private static registerControllers(depContainer: DependencyContainer): void

View File

@ -185,7 +185,7 @@ export class BotEquipmentModGenerator
const botWeaponSightWhitelist = this.botEquipmentFilterService.getBotWeaponSightWhitelist(botEquipmentRole); const botWeaponSightWhitelist = this.botEquipmentFilterService.getBotWeaponSightWhitelist(botEquipmentRole);
const randomisationSettings = this.botHelper.getBotRandomizationDetails(botLevel, botEquipConfig); const randomisationSettings = this.botHelper.getBotRandomizationDetails(botLevel, botEquipConfig);
// Iterate over mod pool and choose mods to add to item // Iterate over mod pool and choose mods to attach
const sortedModKeys = this.sortModKeys(Object.keys(compatibleModsPool)); const sortedModKeys = this.sortModKeys(Object.keys(compatibleModsPool));
for (const modSlot of sortedModKeys) for (const modSlot of sortedModKeys)
{ {
@ -204,7 +204,7 @@ export class BotEquipmentModGenerator
continue; continue;
} }
const isRandomisableSlot = randomisationSettings?.randomisedWeaponModSlots?.includes(modSlot); 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 // Compatible mod not found
@ -213,13 +213,12 @@ export class BotEquipmentModGenerator
continue; continue;
} }
const modToAddTemplate = modToAdd[1];
if (!this.isModValidForSlot(modToAdd, modsParentSlot, modSlot, parentTemplate)) if (!this.isModValidForSlot(modToAdd, modsParentSlot, modSlot, parentTemplate))
{ {
continue; continue;
} }
const modToAddTemplate = modToAdd[1];
// Skip adding mod to weapon if type limit reached // 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))
{ {
@ -386,13 +385,20 @@ export class BotEquipmentModGenerator
const sortedKeys: string[] = []; const sortedKeys: string[] = [];
const modRecieverKey = "mod_reciever"; const modRecieverKey = "mod_reciever";
const modMount001Key = "mod_mount_001"; const modMount001Key = "mod_mount_001";
const modGasBLockKey = "mod_gas_block"; const modGasBlockKey = "mod_gas_block";
const modPistolGrip = "mod_pistol_grip"; const modPistolGrip = "mod_pistol_grip";
const modStockKey = "mod_stock"; const modStockKey = "mod_stock";
const modBarrelKey = "mod_barrel"; const modBarrelKey = "mod_barrel";
const modHandguardKey = "mod_handguard";
const modMountKey = "mod_mount"; const modMountKey = "mod_mount";
const modScopeKey = "mod_scope"; const modScopeKey = "mod_scope";
if (unsortedKeys.includes(modHandguardKey))
{
sortedKeys.push(modHandguardKey);
unsortedKeys.splice(unsortedKeys.indexOf(modHandguardKey), 1);
}
if (unsortedKeys.includes(modBarrelKey)) if (unsortedKeys.includes(modBarrelKey))
{ {
sortedKeys.push(modBarrelKey); sortedKeys.push(modBarrelKey);
@ -417,10 +423,10 @@ export class BotEquipmentModGenerator
unsortedKeys.splice(unsortedKeys.indexOf(modPistolGrip), 1); unsortedKeys.splice(unsortedKeys.indexOf(modPistolGrip), 1);
} }
if (unsortedKeys.includes(modGasBLockKey)) if (unsortedKeys.includes(modGasBlockKey))
{ {
sortedKeys.push(modGasBLockKey); sortedKeys.push(modGasBlockKey);
unsortedKeys.splice(unsortedKeys.indexOf(modGasBLockKey), 1); unsortedKeys.splice(unsortedKeys.indexOf(modGasBlockKey), 1);
} }
if (unsortedKeys.includes(modStockKey)) if (unsortedKeys.includes(modStockKey))
@ -555,6 +561,7 @@ export class BotEquipmentModGenerator
if (!modCompatibilityResult.incompatible) if (!modCompatibilityResult.incompatible)
{ {
found = true; found = true;
break; break;
} }
} }

View File

@ -528,10 +528,11 @@ export class BotLootGenerator
// only add if no upd or stack objects exist - preserves existing stack count // only add if no upd or stack objects exist - preserves existing stack count
if (!ammoItem.upd?.StackObjectsCount) if (!ammoItem.upd?.StackObjectsCount)
{ {
const minStackSize = itemTemplate._props.StackMinRandom; const randomSize = itemTemplate._props.StackMaxSize === 1
const maxStackSize = itemTemplate._props.StackMaxSize; ? 1
: this.randomUtil.getInt(itemTemplate._props.StackMinRandom, itemTemplate._props.StackMaxRandom);
ammoItem.upd = { "StackObjectsCount": this.randomUtil.getInt(minStackSize, maxStackSize) }; ammoItem.upd = { StackObjectsCount: randomSize };
} }
} }

View File

@ -665,7 +665,11 @@ export class LocationGenerator
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]; const itemTemplate = this.itemHelper.getItem(chosenTpl)[1];
const stackCount = this.randomUtil.getInt(itemTemplate._props.StackMinRandom, itemTemplate._props.StackMaxRandom);
const stackCount = itemTemplate._props.StackMaxSize === 1
? 1
: this.randomUtil.getInt(itemTemplate._props.StackMinRandom, itemTemplate._props.StackMaxRandom);
itemWithMods.push( itemWithMods.push(
{ {
_id: this.objectId.generate(), _id: this.objectId.generate(),
@ -777,7 +781,10 @@ export class LocationGenerator
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))
{ {
const stackCount = this.randomUtil.getInt(itemTemplate._props.StackMinRandom, itemTemplate._props.StackMaxRandom); // Edge case - some ammos e.g. flares or M406 grenades shouldn't be stacked
const stackCount = itemTemplate._props.StackMaxSize === 1
? 1
: this.randomUtil.getInt(itemTemplate._props.StackMinRandom, itemTemplate._props.StackMaxRandom);
items[0].upd = { StackObjectsCount: stackCount }; items[0].upd = { StackObjectsCount: stackCount };
} }
// No spawn point, use default template // No spawn point, use default template

View File

@ -248,16 +248,17 @@ export class BotGeneratorHelper
// TODO: Can probably be optimized to cache itemTemplates as items are added to inventory // 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 itemToEquip = this.itemHelper.getItem(tplToCheck); const item = this.itemHelper.getItem(tplToCheck);
const itemToCheck = item[1];
if (!itemToEquip[0]) 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 (!itemToEquip[1]?._props) if (!itemToCheck._props)
{ {
this.logger.warning(this.localisationService.getText("bot-compatibility_check_missing_props", {id: itemToEquip[1]._id, name: itemToEquip[1]._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 // Does an equipped item have a property that blocks the desired item - check for prop "BlocksX" .e.g BlocksEarpiece / BlocksFaceCover
@ -265,7 +266,7 @@ export class BotGeneratorHelper
if (blockingItem) if (blockingItem)
{ {
//this.logger.warning(`1 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._name} - ${equipmentSlot}`); //this.logger.warning(`1 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._name} - ${equipmentSlot}`);
return { incompatible: true, reason: `${tplToCheck} ${itemToEquip[1]._name} in slot: ${equipmentSlot} blocked by: ${blockingItem._id} ${blockingItem._name}` }; 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 // Check if any of the current inventory templates have the incoming item defined as incompatible
@ -273,11 +274,11 @@ export class BotGeneratorHelper
if (blockingItem) if (blockingItem)
{ {
//this.logger.warning(`2 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._props.Name} - ${equipmentSlot}`); //this.logger.warning(`2 incompatibility found between - ${itemToEquip[1]._name} and ${blockingItem._props.Name} - ${equipmentSlot}`);
return { incompatible: true, reason: `${tplToCheck} ${itemToEquip[1]._name} in slot: ${equipmentSlot} blocked by: ${blockingItem._id} ${blockingItem._name}` }; 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 // Check if the incoming item has any inventory items defined as incompatible
const blockingInventoryItem = items.find(x => itemToEquip[1]._props[`Blocks${x.slotId}`] || itemToEquip[1]._props.ConflictingItems?.includes(x._tpl)); const blockingInventoryItem = items.find(x => itemToCheck._props.ConflictingItems?.includes(x._tpl));
if (blockingInventoryItem) if (blockingInventoryItem)
{ {
//this.logger.warning(`3 incompatibility found between - ${itemToEquip[1]._name} and ${blockingInventoryItem._tpl} - ${equipmentSlot}`) //this.logger.warning(`3 incompatibility found between - ${itemToEquip[1]._name} and ${blockingInventoryItem._tpl} - ${equipmentSlot}`)

View File

@ -227,6 +227,11 @@ export class HideoutHelper
for (const prodId in pmcData.Hideout.Production) for (const prodId in pmcData.Hideout.Production)
{ {
const craft = pmcData.Hideout.Production[prodId]; const craft = pmcData.Hideout.Production[prodId];
if (!craft)
{
// Craft value is null, get rid of it (could be from cancelling craft that needs cleaning up)
delete pmcData.Hideout.Production[prodId];
}
// Craft complete, skip processing (Don't skip continious crafts like bitcoin farm) // Craft complete, skip processing (Don't skip continious crafts like bitcoin farm)
if (craft.Progress >= craft.ProductionTime && prodId !== HideoutHelper.bitcoinFarm) if (craft.Progress >= craft.ProductionTime && prodId !== HideoutHelper.bitcoinFarm)

View File

@ -45,7 +45,7 @@ export class WeightedRandomHelper
{ {
if (items.length !== weights.length) if (items.length !== weights.length)
{ {
throw new Error("Items and weights must be of the same size"); throw new Error("Items and weight inputs must be of the same length");
} }
if (!items.length) if (!items.length)

View File

@ -383,7 +383,7 @@ export interface Productive
ProductionTime?: number ProductionTime?: number
GivenItemsInStart?: string[] GivenItemsInStart?: string[]
Interrupted?: boolean Interrupted?: boolean
/** Used in hideout prodiction.json */ /** Used in hideout production.json */
needFuelForAllProductionTime?: boolean needFuelForAllProductionTime?: boolean
/** Used when sending data to client */ /** Used when sending data to client */
NeedFuelForAllProductionTime?: boolean NeedFuelForAllProductionTime?: boolean

View File

@ -0,0 +1,6 @@
export interface IHideoutCancelProductionRequestData
{
Action: "HideoutCancelProductionCommand"
recipeId: string
timestamp: number
}

View File

@ -10,5 +10,6 @@ export enum HideoutEventActions
HIDEOUT_CONTINUOUS_PRODUCTION_START = "HideoutContinuousProductionStart", HIDEOUT_CONTINUOUS_PRODUCTION_START = "HideoutContinuousProductionStart",
HIDEOUT_TAKE_PRODUCTION = "HideoutTakeProduction", HIDEOUT_TAKE_PRODUCTION = "HideoutTakeProduction",
HIDEOUT_RECORD_SHOOTING_RANGE_POINTS = "RecordShootingRangePoints", HIDEOUT_RECORD_SHOOTING_RANGE_POINTS = "RecordShootingRangePoints",
HIDEOUT_IMPROVE_AREA = "HideoutImproveArea" HIDEOUT_IMPROVE_AREA = "HideoutImproveArea",
HIDEOUT_CANCEL_PRODUCTION_COMMAND = "HideoutCancelProductionCommand"
} }

View File

@ -153,8 +153,14 @@ export class EventOutputHolder
{ {
for (const productionKey in productions) for (const productionKey in productions)
{ {
// Skip completed
const production = productions[productionKey]; const production = productions[productionKey];
if (!production)
{
// Could be cancelled production, skip item to save processing
continue;
}
// Skip completed
if (!production.inProgress) if (!production.inProgress)
{ {
continue; continue;

View File

@ -29,7 +29,8 @@ export class HideoutItemEventRouter extends ItemEventRouterDefinition
new HandledRoute(HideoutEventActions.HIDEOUT_CONTINUOUS_PRODUCTION_START, false), new HandledRoute(HideoutEventActions.HIDEOUT_CONTINUOUS_PRODUCTION_START, false),
new HandledRoute(HideoutEventActions.HIDEOUT_TAKE_PRODUCTION, false), new HandledRoute(HideoutEventActions.HIDEOUT_TAKE_PRODUCTION, false),
new HandledRoute(HideoutEventActions.HIDEOUT_RECORD_SHOOTING_RANGE_POINTS, false), new HandledRoute(HideoutEventActions.HIDEOUT_RECORD_SHOOTING_RANGE_POINTS, false),
new HandledRoute(HideoutEventActions.HIDEOUT_IMPROVE_AREA, false) new HandledRoute(HideoutEventActions.HIDEOUT_IMPROVE_AREA, false),
new HandledRoute(HideoutEventActions.HIDEOUT_CANCEL_PRODUCTION_COMMAND, false)
]; ];
} }
@ -59,6 +60,8 @@ export class HideoutItemEventRouter extends ItemEventRouterDefinition
return this.hideoutCallbacks.recordShootingRangePoints(pmcData, body, sessionID); return this.hideoutCallbacks.recordShootingRangePoints(pmcData, body, sessionID);
case HideoutEventActions.HIDEOUT_IMPROVE_AREA: case HideoutEventActions.HIDEOUT_IMPROVE_AREA:
return this.hideoutCallbacks.improveArea(pmcData, body, sessionID); return this.hideoutCallbacks.improveArea(pmcData, body, sessionID);
case HideoutEventActions.HIDEOUT_CANCEL_PRODUCTION_COMMAND:
return this.hideoutCallbacks.cancelProduction(pmcData, body, sessionID);
} }
} }
} }

View File

@ -210,7 +210,7 @@ export class SaveServer
this.saveMd5[sessionID] = String(fmd5); this.saveMd5[sessionID] = String(fmd5);
// save profile to disk // save profile to disk
this.vfs.writeFile(filePath, jsonProfile); this.vfs.writeFile(filePath, jsonProfile);
this.logger.info(this.localisationService.getText("profile_saved", sessionID)); this.logger.debug(this.localisationService.getText("profile_saved", sessionID), true);
} }
} }

View File

@ -5,7 +5,6 @@ import { inject, injectAll, injectable } from "tsyringe";
import { Serializer } from "@spt-aki/di/Serializer"; import { Serializer } from "@spt-aki/di/Serializer";
import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { ILogger } from "@spt-aki/models/spt/utils/ILogger";
import { HttpRouter } from "@spt-aki/routers/HttpRouter"; import { HttpRouter } from "@spt-aki/routers/HttpRouter";
import { HttpBufferHandler } from "@spt-aki/servers/http/HttpBufferHandler";
import { IHttpListener } from "@spt-aki/servers/http/IHttpListener"; import { IHttpListener } from "@spt-aki/servers/http/IHttpListener";
import { LocalisationService } from "@spt-aki/services/LocalisationService"; import { LocalisationService } from "@spt-aki/services/LocalisationService";
import { HttpResponseUtil } from "@spt-aki/utils/HttpResponseUtil"; import { HttpResponseUtil } from "@spt-aki/utils/HttpResponseUtil";
@ -22,20 +21,18 @@ export class AkiHttpListener implements IHttpListener
@inject("RequestsLogger") protected requestsLogger: ILogger, @inject("RequestsLogger") protected requestsLogger: ILogger,
@inject("JsonUtil") protected jsonUtil: JsonUtil, @inject("JsonUtil") protected jsonUtil: JsonUtil,
@inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil, @inject("HttpResponseUtil") protected httpResponse: HttpResponseUtil,
@inject("LocalisationService") protected localisationService: LocalisationService, @inject("LocalisationService") protected localisationService: LocalisationService
@inject("HttpBufferHandler") protected httpBufferHandler: HttpBufferHandler
) )
{ {
} }
public canHandle(_: string, req: IncomingMessage): boolean public canHandle(_: string, req: IncomingMessage): boolean
{ {
return req.method === "GET" || req.method === "PUT" || req.method === "POST"; return ["GET", "PUT", "POST"].includes(req.method);
} }
public handle(sessionId: string, req: IncomingMessage, resp: ServerResponse): void public handle(sessionId: string, req: IncomingMessage, resp: ServerResponse): void
{ {
// TODO: cleanup into interface IVerbHandler
switch (req.method) switch (req.method)
{ {
case "GET": case "GET":
@ -44,62 +41,67 @@ export class AkiHttpListener implements IHttpListener
this.sendResponse(sessionId, req, resp, null, response); this.sendResponse(sessionId, req, resp, null, response);
break; break;
} }
// these are handled almost identically.
case "POST": case "POST":
{
req.on("data", (data: any) =>
{
const value = (req.headers["debug"] === "1") ? data.toString() : zlib.inflateSync(data);
const response = this.getResponse(sessionId, req, value);
this.sendResponse(sessionId, req, resp, value, response);
});
break;
}
case "PUT": case "PUT":
{ {
req.on("data", (data) => // Data can come in chunks. Notably, if someone saves their profile (which can be
{ // kinda big), on a slow connection. We need to re-assemble the entire http payload
// receive data // before processing it.
if ("expect" in req.headers)
{
const requestLength = parseInt(req.headers["content-length"]);
if (!this.httpBufferHandler.putInBuffer(req.headers.sessionid, data, requestLength)) const requestLength = parseInt(req.headers["content-length"]);
const buffer = Buffer.alloc(requestLength);
let written = 0;
req.on("data", (data: any) =>
{ {
resp.writeContinue(); data.copy(buffer, written, 0);
} written += data.length;
}
}); });
req.on("end", async () => req.on("end", () =>
{ {
const data = this.httpBufferHandler.getFromBuffer(sessionId); // Contrary to reasonable expectations, the content-encoding is _not_ actually used to
this.httpBufferHandler.resetBuffer(sessionId); // 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";
let value = zlib.inflateSync(data); const value = compressed ? zlib.inflateSync(buffer) : buffer;
if (!value) if (req.headers["debug"] === "1")
{ {
value = data; this.logger.debug(value.toString(), true);
} }
const response = this.getResponse(sessionId, req, value); const response = this.getResponse(sessionId, req, value);
this.sendResponse(sessionId, req, resp, value, response); this.sendResponse(sessionId, req, resp, value, response);
}); });
break; break;
} }
default: default:
{ {
this.logger.warning(`${this.localisationService.getText("unknown_request")}: ${req.method}`);
this.logger.warning(this.localisationService.getText("unknown_request"));
break; break;
} }
} }
} }
/**
* Send http response to the client
* @param sessionID Player id
* @param req Incoming request
* @param resp Outgoing response
* @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); const info = this.getBodyInfo(body);
let handled = false; let handled = false;
// Check if this is a debug request, if so just send the raw response without transformation. // 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); this.sendJson(resp, output, sessionID);

View File

@ -1,36 +0,0 @@
import { injectable } from "tsyringe";
@injectable()
export class HttpBufferHandler
{
protected buffers = {};
public resetBuffer(sessionID: string): void
{
this.buffers[sessionID] = undefined;
}
public putInBuffer(sessionID: any, data: any, bufLength: number): boolean
{
if (this.buffers[sessionID] === undefined || this.buffers[sessionID].allocated !== bufLength)
{
this.buffers[sessionID] = {
written: 0,
allocated: bufLength,
buffer: Buffer.alloc(bufLength)
};
}
const buf = this.buffers[sessionID];
data.copy(buf.buffer, buf.written, 0);
buf.written += data.length;
return buf.written === buf.allocated;
}
public getFromBuffer(sessionID: string): any
{
return this.buffers[sessionID].buffer;
}
}

View File

@ -465,7 +465,7 @@ export class FenceService
} }
/** /**
* Get stack size ofr a singular item (no mods) * Get stack size of a singular item (no mods)
* @param itemDbDetails item being added to fence * @param itemDbDetails item being added to fence
* @returns Stack size * @returns Stack size
*/ */
@ -478,11 +478,12 @@ export class FenceService
return this.randomUtil.getInt(overrideValues.min, overrideValues.max); return this.randomUtil.getInt(overrideValues.min, overrideValues.max);
} }
// Fence doesn't sell ammo by default, but handle it as players mod fence
if (this.itemHelper.isOfBaseclass(itemDbDetails._id, BaseClasses.AMMO)) if (this.itemHelper.isOfBaseclass(itemDbDetails._id, BaseClasses.AMMO))
{ {
// No override, use stack max size from item db // No override, use stack max size from item db
return this.randomUtil.getInt(1, itemDbDetails._props.StackMaxSize); return itemDbDetails._props.StackMaxSize === 1
? 1
: this.randomUtil.getInt(itemDbDetails._props.StackMinRandom, itemDbDetails._props.StackMaxRandom);
} }
return 1; return 1;