diff --git a/.gitignore b/.gitignore index db77fdb..1e39054 100644 --- a/.gitignore +++ b/.gitignore @@ -1,166 +1,167 @@ -# Created by https://www.toptal.com/developers/gitignore/api/node,visualstudiocode -# Edit at https://www.toptal.com/developers/gitignore?templates=node,visualstudiocode - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -### Node Patch ### -# Serverless Webpack directories -.webpack/ - -# Optional stylelint cache - -# SvelteKit build / generate output -.svelte-kit - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history -.ionide - -# End of https://www.toptal.com/developers/gitignore/api/node,visualstudiocode - -# User configuration -usercfg/ +# Created by https://www.toptal.com/developers/gitignore/api/node,visualstudiocode +# Edit at https://www.toptal.com/developers/gitignore?templates=node,visualstudiocode + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# End of https://www.toptal.com/developers/gitignore/api/node,visualstudiocode + +# User configuration +usercfg/ +oldbasecfg/ diff --git a/LICENSE b/LICENSE index cbc91a6..1806152 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2023 KiwifruitDev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +MIT License + +Copyright (c) 2023 KiwifruitDev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 8c0a5bc..0e80ae0 100644 --- a/README.md +++ b/README.md @@ -1,199 +1,204 @@ -# Arkham: Revived - - - -A custom authentication server for Batman: Arkham Origins Online. - -Supports user authentication, saving of player data, linkage to Steam and Discord accounts, and Discord game invite generation. - -Join the [Discord](https://discord.gg/6Sab2tbauC) for support, updates, and matchmaking. - -## Usage - -Follow these steps in order to play on Arkham: Revived. - -1. Open the game directory for Batman: Arkham Origins through Steam. -2. Navigate through `Online/BmGame/Config/DefaultWBIDVars.ini` and open it in a text editor. -3. Find the following values: - - ```ini - [GDHttp] - BaseUrl="https://ozzypc-wbid.live.ws.fireteam.net/" - EchoBaseURL="http://in.echo.fireteam.net/" - WBIDTicketURL="https://tokenservice.psn.turbine.com/TokenService" - WBIDAMSURL="https://cls.turbine.com/CLS" - ClientId="0938aa7a-6682-4b90-a97d-90becbddb9ce" - ClientIdSP="6ca97b4e-d278-48a4-8b66-80468447a513" - ClientSecret="GXnNQaRSuxaxlm6uR35HVk39u" - ClientSecretSP="AzyEBlZdY87HO3HINj7rqoBo7" - EchoUsername="8b8f1d8554d5437b8cdf689082311680" - EchoPassword="b3014aee79ba4968886003ecb271f764" - Environment="Live" - ``` - -4. Replace them with these values: - - ```ini - [GDHttp] - BaseUrl="https://arkham.kiwifruitdev.page/" - EchoBaseURL="http://in.echo.fireteam.net/" - WBIDTicketURL="https://tokenservice.psn.turbine.com/TokenService" - WBIDAMSURL="https://arkham.kiwifruitdev.page/CLS" - ClientId="0938aa7a-6682-4b90-a97d-90becbddb9ce" - ClientIdSP="6ca97b4e-d278-48a4-8b66-80468447a513" - ClientSecret="GXnNQaRSuxaxlm6uR35HVk39u" - ClientSecretSP="AzyEBlZdY87HO3HINj7rqoBo7" - EchoUsername="8b8f1d8554d5437b8cdf689082311680" - EchoPassword="b3014aee79ba4968886003ecb271f764" - Environment="Live" - ``` - - - Note: The `BaseUrl` and `WBIDAMSURL` values are the only ones that need to be changed. - -5. Save the file and close it. This will allow the game to connect to Arkham: Revived. -6. Launch the game and make sure you've reached the main menu. -7. Close the game and re-launch it. This will ensure your account is linked to Steam. -8. Launch the game and click on **Store** in the main menu. -9. If your account was linked successfully, your display name will be shown as a store item. -10. You're now ready to play! - -### Migration - -Migrating progress from official servers is possible, follow these steps to start the process. - -1. Follow the above steps and launch the game if you haven't already. -2. Take note of the price of the "Migrations" store option. This is the total number of migrations performed. -3. Click on "Store" in the main menu and click on "Migrate from official servers". -4. When asked to purchase, click yes. You will not be charged. -5. If an item you've earned says "Account migration process started", close the game and wait up to 5 minutes. -6. Launch the game and click on "Store" in the main menu. -7. If the "Migrations" store option's price increased by 1, your account has been migrated. -8. You're now ready to play with your existing ranks and XP! - -## Setup - -Setting up your own Arkham: Revived instance requires quite a bit of setup within the command line and external services. - -There is no need to create your own instance, as an instance is already hosted at `arkham.kiwifruitdev.page` for public use. - -### Requirements - -- [Node.js](https://nodejs.org/en/) -- [Steam API Key](https://steamcommunity.com/dev/apikey) -- [Discord Application](https://discord.com/developers/applications) - -### Installation - -Use the following commands to install and run the server. - -```bash -git clone https://github.com/KiwifruitDev/arkham-revived.git -cd arkham-revived -npm install -``` - -Then create a `.env` file and set the following variables. - -```env -ARKHAM_UUID_KEY=[UUID key] -STEAM_API_KEY=[Steam API key] -DISCORD_CLIENT_ID=[Discord Application OAuth2 Client ID] -DISCORD_CLIENT_SECRET=[Discord Application OAuth2 Client Secret] -DISCORD_BOT_TOKEN=[Discord Application Bot Token] -``` - -Use a [UUID generator](https://www.uuidgenerator.net/) to generate a UUID key, this is the server's private authentication key. - -Generate a [Steam API key](https://steamcommunity.com/dev/apikey) in order to save player data. - -Create a [Discord Application](https://discord.com/developers/applications) and create a bot. - -Now, start the server. - -```bash -node . -``` - -### Message Of The Day - -![MOTD in-game](https://i.imgur.com/HUGcQkr.png) - -On first run, `motd.json` will be generated in the root directory. - -This file contains an array (max 10) of messages that will be displayed on the client-side. - -### Public Files - -Files in `./public/` will be available through the `/files/` endpoint on default port `7070` as base64-encoded strings in a JSON object. - -This feature is exclusively used for the `netvars.dat` file, which stores matchmaking information for the game and toggling of some features (such as the WBID option in menu and Hunter, Hunted mode). - -Alongside the game server, files in `./web/` will be available through the default port `8080` as a website. - -### Default Save File - -![Max level in-game](https://i.imgur.com/o2Ox5hb.png) - -The default save file, `save.json`, is used for every client that connects to the server. - -It's generated on first run, pulling from `defaultsave.json` in the root directory. - -This file handles XP, levels, prestige, videos watched, tutorials, unlocks, loadouts, and game settings. - -Players will automatically unlock Steam achievements when playing a match or prestiging, be careful. - -The default json file skips tutorials and starts players at level 1 with all redemptions. - -### Database - -The server uses a SQLite database under `database.db` to store user information. - -Users are identified by their UUID, linked IP address, and Steam ID. - -Only authenticated users are saved to the database. - -### Matchmaking - -Matchmaking is exclusively handled by Steam from observation. - -A Steam lobby hosted on the same internet connection between players was tested, and the game was able to connect to it. - -Theoretically, this server should allow Steam to connect players to each other as if this server was in a separate realm than the official server. - -This means that players will only match with other players using this server, and vice versa. - -Not much testing has been done with this feature, so it may not work as intended. - -#### OAuth - -This server does not re-implement Fireteam OAuth and its ticket system. - -Instead, it generates per-session UUIDs determined by the ticket and a master key. - -If the user's IP address is found in the database, the server will provide the linked UUID. - -Otherwise, their data will not be saved. - -### Security - -The only security measure implemented is a private key used to seed UUIDs. - -No other security measures are implemented, and the server is not intended to be used in a production environment. - -Users cannot yet delete their data from the database, but this feature will be implemented in the future. - -## Configuration - -After first run, a `config.json` file will be generated in the root directory. - -Set options in this file to configure the server and its command line output. - -When updating, it is recommended to delete this file to ensure that the latest version is used. - -## Contributing - -Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. - -## License - -This project is licensed under the [MIT License](https://choosealicense.com/licenses/mit/). +# Arkham: Revived + + + +A custom authentication server for Batman: Arkham Origins Online. + +Supports user authentication, saving of player data, linkage to Steam and Discord accounts, and Discord game invite generation. + +Join the [Discord](https://discord.gg/rrwWcy82fr) for support, updates, and matchmaking. + +## Usage + +Follow these steps in order to play on Arkham: Revived. + +1. Open the game directory for Batman: Arkham Origins through Steam. +2. Navigate through `Online/BmGame/Config/DefaultWBIDVars.ini` and open it in a text editor. +3. Find the following values: + + ```ini + [GDHttp] + BaseUrl="https://ozzypc-wbid.live.ws.fireteam.net/" + EchoBaseURL="http://in.echo.fireteam.net/" + WBIDTicketURL="https://tokenservice.psn.turbine.com/TokenService" + WBIDAMSURL="https://cls.turbine.com/CLS" + ClientId="0938aa7a-6682-4b90-a97d-90becbddb9ce" + ClientIdSP="6ca97b4e-d278-48a4-8b66-80468447a513" + ClientSecret="GXnNQaRSuxaxlm6uR35HVk39u" + ClientSecretSP="AzyEBlZdY87HO3HINj7rqoBo7" + EchoUsername="8b8f1d8554d5437b8cdf689082311680" + EchoPassword="b3014aee79ba4968886003ecb271f764" + Environment="Live" + ``` + +4. Replace them with these values: + + ```ini + [GDHttp] + BaseUrl="http://[Source IP Address]:8385/" + EchoBaseURL="http://in.echo.fireteam.net/" + WBIDTicketURL="https://tokenservice.psn.turbine.com/TokenService" + WBIDAMSURL="http://[Source IP Address]:8385/CLS" + ClientId="0938aa7a-6682-4b90-a97d-90becbddb9ce" + ClientIdSP="6ca97b4e-d278-48a4-8b66-80468447a513" + ClientSecret="GXnNQaRSuxaxlm6uR35HVk39u" + ClientSecretSP="AzyEBlZdY87HO3HINj7rqoBo7" + EchoUsername="8b8f1d8554d5437b8cdf689082311680" + EchoPassword="b3014aee79ba4968886003ecb271f764" + Environment="Live" + ``` + + - Note: The `BaseUrl` and `WBIDAMSURL` values are the only ones that need to be changed. + - You must obtain the source IP address of the server you're connecting to. This is usually found in the "Getting Started" section of the server's website. + +5. Save the file and close it. This will allow the game to connect to Arkham: Revived. +6. Locate `SHARED.SWP` in your Steam Cloud storage directory. This is usually found in `C:\Program Files (x86)\Steam\userdata\[User ID]\209000\remote`. + - You may obtain your user ID from [here](https://steamid.io/) as `steamID3`, removing the `[U:1` and `]` from the start and end of the ID respectively. + - `209000` is the appid for Batman: Arkham Origins. + - It is required to delete this file in order to unlink your WBID, as Arkham: Revived requires your game to ask for a new WBID. +7. Launch the game and make sure you've reached the main menu. +8. Close the game and re-launch it. This will ensure your account is linked to Steam. +9. Launch the game and click on **Store** in the main menu. +10. If your account was linked successfully, your display name will be shown as a store item. +11. You're now ready to play! + +### Migration + +Migrating progress from official servers is possible, follow these steps to start the process. + +1. Follow the above steps and launch the game if you haven't already. +2. Take note of the price of the "Migrations" store option. This is the total number of migrations performed. +3. Click on "Store" in the main menu and click on "Migrate from official servers". +4. When asked to purchase, click yes. You will not be charged. +5. If an item you've earned says "Account migration process started", close the game and wait up to 5 minutes. +6. Launch the game and click on "Store" in the main menu. +7. If the "Migrations" store option's price increased by 1, your account has been migrated. +8. You're now ready to play with your existing ranks and XP! + +## Setup + +Setting up your own Arkham: Revived instance requires quite a bit of setup within the command line and external services. + +There is no need to create your own instance, as an instance is already hosted at `arkham.kiwifruitdev.page` for public use. + +### Requirements + +- [Node.js](https://nodejs.org/en/) +- [Steam API Key](https://steamcommunity.com/dev/apikey) +- [Discord Application](https://discord.com/developers/applications) + +### Installation + +Use the following commands to install and run the server. + +```bash +git clone https://github.com/KiwifruitDev/arkham-revived.git +cd arkham-revived +npm install +``` + +Then create a `.env` file and set the following variables. + +```env +ARKHAM_UUID_KEY=[UUID key] +STEAM_API_KEY=[Steam API key] +DISCORD_CLIENT_ID=[Discord Application OAuth2 Client ID] +DISCORD_CLIENT_SECRET=[Discord Application OAuth2 Client Secret] +DISCORD_BOT_TOKEN=[Discord Application Bot Token] +``` + +Use a [UUID generator](https://www.uuidgenerator.net/) to generate a UUID key, this is the server's private authentication key. + +Generate a [Steam API key](https://steamcommunity.com/dev/apikey) in order to save player data. + +Create a [Discord Application](https://discord.com/developers/applications) and create a bot. + +Now, start the server. + +```bash +node . +``` + +### Message Of The Day + +![MOTD in-game](https://i.imgur.com/HUGcQkr.png) + +On first run, `motd.json` will be generated in the root directory. + +This file contains an array (max 10) of messages that will be displayed on the client-side. + +### Public Files + +Files in `./public/` will be available through the `/files/` endpoint on default port `7070` as base64-encoded strings in a JSON object. + +This feature is exclusively used for the `netvars.dat` file, which stores matchmaking information for the game and toggling of some features (such as the WBID option in menu and Hunter, Hunted mode). + +Alongside the game server, files in `./web/` will be available through the default port `8080` as a website. + +### Default Save File + +![Max level in-game](https://i.imgur.com/o2Ox5hb.png) + +The default save file, `save.json`, is used for every client that connects to the server. + +It's generated on first run, pulling from `defaultsave.json` in the root directory. + +This file handles XP, levels, prestige, videos watched, tutorials, unlocks, loadouts, and game settings. + +Players will automatically unlock Steam achievements when playing a match or prestiging, be careful. + +The default json file skips tutorials and starts players at level 1 with all redemptions. + +### Database + +The server uses a SQLite database under `database.db` to store user information. + +Users are identified by their UUID, linked IP address, and Steam ID. + +Only authenticated users are saved to the database. + +### Matchmaking + +Matchmaking is exclusively handled by Steam from observation. + +A Steam lobby hosted on the same internet connection between players was tested, and the game was able to connect to it. + +Theoretically, this server should allow Steam to connect players to each other as if this server was in a separate realm than the official server. + +This means that players will only match with other players using this server, and vice versa. + +Not much testing has been done with this feature, so it may not work as intended. + +#### OAuth + +This server does not re-implement Fireteam OAuth and its ticket system. + +Instead, it generates per-session UUIDs determined by the ticket and a master key. + +If the user's IP address is found in the database, the server will provide the linked UUID. + +Otherwise, their data will not be saved. + +### Security + +The only security measure implemented is a private key used to seed UUIDs. + +No other security measures are implemented, and the server is not intended to be used in a production environment. + +Users cannot yet delete their data from the database, but this feature will be implemented in the future. + +## Configuration + +After first run, a `config.json` file will be generated in the root directory. + +Set options in this file to configure the server and its command line output. + +When updating, it is recommended to delete this file to ensure that the latest version is used. + +## Contributing + +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. + +## License + +This project is licensed under the [MIT License](https://choosealicense.com/licenses/mit/). diff --git a/access.sh b/access.sh new file mode 100644 index 0000000..066250b --- /dev/null +++ b/access.sh @@ -0,0 +1,2 @@ +#!/bin/bash +screen -xS nodejs diff --git a/basecfg/catalog.json b/basecfg/catalog.json index 068cd39..60139ed 100644 --- a/basecfg/catalog.json +++ b/basecfg/catalog.json @@ -1,3155 +1,2870 @@ -{ - "items": { - "d2783dae-cd2a-5bf3-94bc-c1c24b2431a1": { - "category": "Unnamed", - "info": {}, - "name": "Green Boiler Suit", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "d2783dae-cd2a-5bf3-94bc-c1c24b2431a1", - "description": "Does not affect gameplay. " - }, - "39ef35d9-6858-5c52-b935-968caeaf4f41": { - "category": "Unnamed", - "info": {}, - "name": "Camo Beret", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "39ef35d9-6858-5c52-b935-968caeaf4f41", - "description": "Does not affect gameplay. " - }, - "905376cd-17ae-5d4d-9fe6-b60420d72065": { - "category": "Unnamed", - "info": {}, - "name": "Purple Trench Coat [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "905376cd-17ae-5d4d-9fe6-b60420d72065", - "description": "" - }, - "83d3df6c-5f06-5c77-a856-3edc8ba5e4d6": { - "category": "Unnamed", - "info": {}, - "name": "I-SCREAM Biker Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "83d3df6c-5f06-5c77-a856-3edc8ba5e4d6", - "description": "" - }, - "46a4e04f-e600-5342-baa1-63bbef6ab7b3": { - "category": "Unnamed", - "info": {}, - "name": "Mime Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "46a4e04f-e600-5342-baa1-63bbef6ab7b3", - "description": "" - }, - "0c825b60-661f-5971-86c0-13a3c55a9e0f": { - "category": "Unnamed", - "info": {}, - "name": "Urban Fatigue Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "0c825b60-661f-5971-86c0-13a3c55a9e0f", - "description": "" - }, - "d4a45ab8-17ac-5741-88cd-a3c1a30adb5f": { - "category": "Unnamed", - "info": {}, - "name": "Black Fatigue Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "d4a45ab8-17ac-5741-88cd-a3c1a30adb5f", - "description": "" - }, - "7f1c24c6-1ac2-5a5b-a78a-b883ebc45de4": { - "category": "Unnamed", - "info": {}, - "name": "Respawn Boost", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "7f1c24c6-1ac2-5a5b-a78a-b883ebc45de4", - "description": "Respawn wait is reduced if it is above the minimum respawn time as an Elite." - }, - "d19a2420-ce9e-5cc0-a6bb-9382d1cdfc5e": { - "category": "Unnamed", - "info": {}, - "name": "Gray Boiler Suit", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "d19a2420-ce9e-5cc0-a6bb-9382d1cdfc5e", - "description": "Does not affect gameplay. " - }, - "43149088-b9e9-524a-b447-dfdcdaaa49e3": { - "category": "Unnamed", - "info": {}, - "name": "Credit Boost", - "video_url": "", - "data": { - "gangland_sort_index": "2", - "gangland_effect_type": "12", - "gangland_effect_amount": "0.1", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "8aa835f2-d8a0-52e2-81af-d10c87fdf80d", - "type": 0, - "id": "43149088-b9e9-524a-b447-dfdcdaaa49e3", - "description": "Completed matches earn more Arkham Credits." - }, - "be4f89ab-0cde-5705-9b44-c55fbd00f80f": { - "category": "Unnamed", - "info": {}, - "name": "Stripy Work Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "be4f89ab-0cde-5705-9b44-c55fbd00f80f", - "description": "" - }, - "3553c47c-305f-5559-9af1-31fb00f3941a": { - "category": "Unnamed", - "info": {}, - "name": "Urban Face Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "3553c47c-305f-5559-9af1-31fb00f3941a", - "description": "" - }, - "89667fb4-ff92-5396-802b-d93b31103d61": { - "category": "Unnamed", - "info": {}, - "name": "Purple Biker Jacket [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "89667fb4-ff92-5396-802b-d93b31103d61", - "description": "" - }, - "db3189ea-6baa-53aa-84f5-208cc135c573": { - "category": "Unnamed", - "info": {}, - "name": "Green X Plate Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "db3189ea-6baa-53aa-84f5-208cc135c573", - "description": "" - }, - "d4c16930-2657-513d-ac0d-b340501b8d10": { - "category": "Unnamed", - "info": {}, - "name": "Skinny Grey Jeans [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "d4c16930-2657-513d-ac0d-b340501b8d10", - "description": "" - }, - "78e400a8-43e8-58b8-8910-004b2adcc377": { - "category": "Unnamed", - "info": {}, - "name": "Prison Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "78e400a8-43e8-58b8-8910-004b2adcc377", - "description": "" - }, - "ed325e9c-590a-5ee9-a471-0d0e6565a734": { - "category": "Unnamed", - "info": {}, - "name": "Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "ed325e9c-590a-5ee9-a471-0d0e6565a734", - "description": "" - }, - "242fa84e-3343-544a-9bf5-5927dfd36036": { - "category": "Unnamed", - "info": {}, - "name": "Desert Goggles [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "242fa84e-3343-544a-9bf5-5927dfd36036", - "description": "" - }, - "6e73b30e-aca4-5415-8255-b691e643139e": { - "category": "Unnamed", - "info": {}, - "name": "Green Biker Jacket [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "6e73b30e-aca4-5415-8255-b691e643139e", - "description": "" - }, - "3dd13c1f-7571-542b-8b1a-720d67a439a3": { - "category": "Unnamed", - "info": {}, - "name": "Toothy Stitched Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "3dd13c1f-7571-542b-8b1a-720d67a439a3", - "description": "Does not affect gameplay. " - }, - "80f12c0c-95d8-5535-81d3-595abadd736b": { - "category": "Unnamed", - "info": {}, - "name": "Bane Mask Balaclava [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "80f12c0c-95d8-5535-81d3-595abadd736b", - "description": "" - }, - "370f1a88-706f-5e71-9f84-2d698e81110b": { - "category": "Unnamed", - "info": {}, - "name": "Spec Ops Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "370f1a88-706f-5e71-9f84-2d698e81110b", - "description": "" - }, - "d72db4ba-fd03-5f75-a853-facfb0b7fe80": { - "category": "Unnamed", - "info": {}, - "name": "Striped Hoodie", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "d72db4ba-fd03-5f75-a853-facfb0b7fe80", - "description": "Does not affect gameplay. " - }, - "3fca6927-d0f9-55a2-82a5-84ef648740a4": { - "name": null, - "data": {}, - "items": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 100000 - }, - "flags": 0, - "icon_url": null, - "category_id": "13476e5a-6e64-5ca5-966b-b5b28e3fdb55", - "type": 1, - "id": "3fca6927-d0f9-55a2-82a5-84ef648740a4", - "description": null - }, - "fb81f0ff-6874-5f2b-a3ee-d04cad63f700": { - "category": "Unnamed", - "info": {}, - "name": "Red Trench Coat", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "fb81f0ff-6874-5f2b-a3ee-d04cad63f700", - "description": "Does not affect gameplay. " - }, - "8f90dd55-f329-5b89-a58d-b08a283b8739": { - "category": "Unnamed", - "info": {}, - "name": "Bane Mask Balaclava", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "8f90dd55-f329-5b89-a58d-b08a283b8739", - "description": "Does not affect gameplay. " - }, - "cbbb5918-921c-5ac1-b5df-32cd1ed5274d": { - "category": "Unnamed", - "info": {}, - "name": "Black Spiral Egghead Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "cbbb5918-921c-5ac1-b5df-32cd1ed5274d", - "description": "Does not affect gameplay. " - }, - "50884d5b-cae3-5d57-b2b3-3117b3ecb6f7": { - "category": "Unnamed", - "info": {}, - "name": "Desert Sharpshooter [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "50884d5b-cae3-5d57-b2b3-3117b3ecb6f7", - "description": "" - }, - "106b5372-692a-5274-b7b9-b2db0a1c8565": { - "category": "Unnamed", - "info": {}, - "name": "Wildcard Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "106b5372-692a-5274-b7b9-b2db0a1c8565", - "description": "" - }, - "4210042c-7a56-5096-8ae0-c0f951283682": { - "category": "Unnamed", - "info": {}, - "name": "Skinny Grey Jeans", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "4210042c-7a56-5096-8ae0-c0f951283682", - "description": "Does not affect gameplay. " - }, - "5a825afc-f044-500d-84b9-b6fe90fc4dd3": { - "category": "Unnamed", - "info": {}, - "name": "Olive Cargo Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "5a825afc-f044-500d-84b9-b6fe90fc4dd3", - "description": "Does not affect gameplay. " - }, - "daec50d1-1cd9-5128-9b76-03437bd3e813": { - "category": "Unnamed", - "info": {}, - "name": "Purple Hoodie [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "daec50d1-1cd9-5128-9b76-03437bd3e813", - "description": "" - }, - "1664129b-5138-5449-80bb-efbe4b9e2b2b": { - "category": "Unnamed", - "info": {}, - "name": "Green Barb Wire Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "1664129b-5138-5449-80bb-efbe4b9e2b2b", - "description": "Does not affect gameplay. " - }, - "a2bd565b-fe43-501a-b74b-0e12700809c1": { - "category": "Unnamed", - "info": {}, - "name": "Gray Prison Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "a2bd565b-fe43-501a-b74b-0e12700809c1", - "description": "" - }, - "b0c49275-1f30-54c2-8447-f7e5f853ed97": { - "category": "Unnamed", - "info": {}, - "name": "Purple Parka [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "b0c49275-1f30-54c2-8447-f7e5f853ed97", - "description": "" - }, - "2136273d-f112-527f-abaa-49338df72fc9": { - "category": "Unnamed", - "info": {}, - "name": "Psychotic Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "2136273d-f112-527f-abaa-49338df72fc9", - "description": "" - }, - "0d63ae61-3bdd-58d9-871b-3754e999384b": { - "category": "Unnamed", - "info": {}, - "name": "Urban Tech Elite [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "0d63ae61-3bdd-58d9-871b-3754e999384b", - "description": "" - }, - "1ec1d7a4-a599-5ed2-8dbc-b768d606b092": { - "category": "Unnamed", - "info": {}, - "name": "Stripy Work Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "1ec1d7a4-a599-5ed2-8dbc-b768d606b092", - "description": "Does not affect gameplay. " - }, - "6299724a-e05e-55c0-9354-47eb3eb8c8ea": { - "category": "Unnamed", - "info": {}, - "name": "Black Cargo Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "6299724a-e05e-55c0-9354-47eb3eb8c8ea", - "description": "" - }, - "8252b5b4-3155-5a39-a688-f27a0878e68f": { - "category": "Unnamed", - "info": {}, - "name": "Urban Tactical Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "8252b5b4-3155-5a39-a688-f27a0878e68f", - "description": "Does not affect gameplay. " - }, - "97d2e77c-3164-57a4-a956-168633395e3f": { - "category": "Unnamed", - "info": {}, - "name": "Red Parka", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "97d2e77c-3164-57a4-a956-168633395e3f", - "description": "Does not affect gameplay. " - }, - "5422e0d2-d9d0-5976-970e-95fc3f460f65": { - "category": "Unnamed", - "info": {}, - "name": "Urban Spec Ops Cap", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "5422e0d2-d9d0-5976-970e-95fc3f460f65", - "description": "Does not affect gameplay. " - }, - "0730309a-b639-5fc2-a208-eadfd4a9632a": { - "category": "Unnamed", - "info": {}, - "name": "Arkham Credits Envelope", - "video_url": "", - "data": {}, - "items": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 11000 - }, - "flags": 0, - "icon_url": "", - "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", - "type": 1, - "id": "0730309a-b639-5fc2-a208-eadfd4a9632a", - "description": "11,000 Arkham Credits" - }, - "cc6b5317-71e3-57ca-a41e-ac695183ec1a": { - "category": "Unnamed", - "info": {}, - "name": "GCPD Rain Coat [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "cc6b5317-71e3-57ca-a41e-ac695183ec1a", - "description": "" - }, - "965e52e3-6c3c-5ba0-8e59-7e357aebf892": { - "category": "Unnamed", - "info": {}, - "name": "Grenade Damage Boost", - "video_url": "", - "data": { - "gangland_sort_index": "7", - "gangland_effect_type": "2", - "gangland_effect_amount": "0.06", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "965e52e3-6c3c-5ba0-8e59-7e357aebf892", - "description": "Grenade damage is increased as an Elite." - }, - "5ebc15e3-d25e-5c1f-bad6-3f5c0e3048f1": { - "category": "Unnamed", - "info": {}, - "name": "Urban Spec Ops Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "5ebc15e3-d25e-5c1f-bad6-3f5c0e3048f1", - "description": "" - }, - "3ac9f771-f76f-55d2-9abc-d1be5b207a69": { - "category": "Unnamed", - "info": {}, - "name": "Desert Goggles", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "3ac9f771-f76f-55d2-9abc-d1be5b207a69", - "description": "Does not affect gameplay. " - }, - "5f5a6672-8feb-57c4-93f3-c04c58579792": { - "category": "Unnamed", - "info": {}, - "name": "Urban Tactical Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "5f5a6672-8feb-57c4-93f3-c04c58579792", - "description": "" - }, - "2b65e398-8c9b-5038-b565-5c8e9a627ee9": { - "category": "Unnamed", - "info": {}, - "name": "Red Hoodie", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "2b65e398-8c9b-5038-b565-5c8e9a627ee9", - "description": "Does not affect gameplay. " - }, - "95af4ac7-bfe1-5211-b0b1-0ff0edc7acd9": { - "category": "Unnamed", - "info": {}, - "name": "Forest Tactical Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "95af4ac7-bfe1-5211-b0b1-0ff0edc7acd9", - "description": "" - }, - "77b70c38-72af-54b7-a66f-1c58cc9240d1": { - "category": "Unnamed", - "info": {}, - "name": "Arkham Credits Billfold", - "video_url": "", - "data": {}, - "items": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 2000 - }, - "flags": 0, - "icon_url": "", - "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", - "type": 1, - "id": "77b70c38-72af-54b7-a66f-1c58cc9240d1", - "description": "2,000 Arkham Credits" - }, - "deca4f06-e3bc-51ef-8618-30d91a1e4019": { - "category": "Unnamed", - "info": {}, - "name": "Skeleton Work Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "deca4f06-e3bc-51ef-8618-30d91a1e4019", - "description": "" - }, - "b3fbc4e7-dfb3-5e51-a37d-7600663c0f7a": { - "category": "Unnamed", - "info": {}, - "name": "Mauve-Eyed Pointy Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "b3fbc4e7-dfb3-5e51-a37d-7600663c0f7a", - "description": "" - }, - "d9db5659-866a-5d86-9390-73776e45d478": { - "category": "Unnamed", - "info": {}, - "name": "Black Spec Ops Cap [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "d9db5659-866a-5d86-9390-73776e45d478", - "description": "" - }, - "998c2a58-7c92-5ac0-b6cb-1ad8ce67c36c": { - "category": "Unnamed", - "info": {}, - "name": "Bloodstripe Pointy Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "998c2a58-7c92-5ac0-b6cb-1ad8ce67c36c", - "description": "Does not affect gameplay. " - }, - "22343ef8-88cb-5286-8e6a-7f035f2e4888": { - "category": "Unnamed", - "info": {}, - "name": "Olive Jumper [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "22343ef8-88cb-5286-8e6a-7f035f2e4888", - "description": "" - }, - "0a9820c4-5f15-5e92-a756-7651e55cf468": { - "category": "Unnamed", - "info": {}, - "name": "Black Spec Ops Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "0a9820c4-5f15-5e92-a756-7651e55cf468", - "description": "" - }, - "5b0c5983-d7bd-56eb-9837-46b5e213f34b": { - "category": "Unnamed", - "info": {}, - "name": "Anti-Glare Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "5b0c5983-d7bd-56eb-9837-46b5e213f34b", - "description": "" - }, - "898f8a75-a7e2-54b3-a33d-3881439b81a6": { - "category": "Unnamed", - "info": {}, - "name": "Desert Face Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "898f8a75-a7e2-54b3-a33d-3881439b81a6", - "description": "Does not affect gameplay. " - }, - "468522fc-06f0-5bd7-9ff9-2e4fd398da4c": { - "category": "Unnamed", - "info": {}, - "name": "Desert Dreadnaught [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "468522fc-06f0-5bd7-9ff9-2e4fd398da4c", - "description": "" - }, - "04bf6050-ec9a-5d61-8557-dd0e7fbde1bb": { - "category": "Unnamed", - "info": {}, - "name": "Camo Tactical Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "04bf6050-ec9a-5d61-8557-dd0e7fbde1bb", - "description": "" - }, - "2686bf4d-bafc-50fb-9b81-0d752f034bcd": { - "category": "Unnamed", - "info": {}, - "name": "Blue-Eyed Egghead Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "2686bf4d-bafc-50fb-9b81-0d752f034bcd", - "description": "" - }, - "c1d36531-9f1e-59f3-b88c-1694961f187a": { - "category": "Unnamed", - "info": {}, - "name": "Urban Tactical Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "c1d36531-9f1e-59f3-b88c-1694961f187a", - "description": "" - }, - "230047b4-86d1-5d07-9aa6-3b9fe474ac7b": { - "category": "Unnamed", - "info": {}, - "name": "Vortex Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "230047b4-86d1-5d07-9aa6-3b9fe474ac7b", - "description": "" - }, - "e08c6ca3-a0de-5e38-8b32-3a701b5a08c4": { - "category": "Unnamed", - "info": {}, - "name": "Olive Drab Rain Coat [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "e08c6ca3-a0de-5e38-8b32-3a701b5a08c4", - "description": "" - }, - "fb2c7561-b819-5375-95ec-d6f385a48594": { - "category": "Unnamed", - "info": {}, - "name": "Camo Beret [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "fb2c7561-b819-5375-95ec-d6f385a48594", - "description": "" - }, - "42811dda-6222-5812-80f2-37b2cebc380c": { - "category": "Unnamed", - "info": {}, - "name": "Urban Cargo Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "42811dda-6222-5812-80f2-37b2cebc380c", - "description": "" - }, - "33d7d293-4e0c-5876-8244-ecb8b962e663": { - "category": "Unnamed", - "info": {}, - "name": "Camo Balaclava", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "33d7d293-4e0c-5876-8244-ecb8b962e663", - "description": "Does not affect gameplay. " - }, - "c83216ff-3935-5e09-8fca-70348f088d5e": { - "category": "Unnamed", - "info": {}, - "name": "Green Beret [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "c83216ff-3935-5e09-8fca-70348f088d5e", - "description": "" - }, - "62bad3da-25c8-5a15-87cb-2cabc892894a": { - "category": "Unnamed", - "info": {}, - "name": "Gray Prison Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "62bad3da-25c8-5a15-87cb-2cabc892894a", - "description": "Does not affect gameplay. " - }, - "5972e7af-f80f-5887-b58a-05f865b6d4f0": { - "category": "Unnamed", - "info": {}, - "name": "Bloodstripe Pointy Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "5972e7af-f80f-5887-b58a-05f865b6d4f0", - "description": "" - }, - "8b8c0557-71e1-56af-a5a6-abbd76ffbbaa": { - "category": "Unnamed", - "info": {}, - "name": "GCPD Rain Coat", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "8b8c0557-71e1-56af-a5a6-abbd76ffbbaa", - "description": "Does not affect gameplay. " - }, - "90b006b8-5e3b-57f8-bca3-f31c19d23947": { - "category": "Unnamed", - "info": {}, - "name": "Urban Face Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "90b006b8-5e3b-57f8-bca3-f31c19d23947", - "description": "Does not affect gameplay. " - }, - "32f5d5a2-8c28-5fe5-a585-b8387f2cbb9e": { - "category": "Unnamed", - "info": {}, - "name": "Chains Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "32f5d5a2-8c28-5fe5-a585-b8387f2cbb9e", - "description": "" - }, - "7571877f-6ef1-53e8-821e-247d1750bc3d": { - "category": "Unnamed", - "info": {}, - "name": "Evade Boost", - "video_url": "", - "data": { - "gangland_sort_index": "6", - "gangland_effect_type": "3", - "gangland_effect_amount": "0.07", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "7571877f-6ef1-53e8-821e-247d1750bc3d", - "description": "During evade roll incoming damage is reduced as an Elite." - }, - "2a2bf781-a732-50a7-828f-ee1f9c6d2aea": { - "category": "Unnamed", - "info": {}, - "name": "Tartan Prison Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "2a2bf781-a732-50a7-828f-ee1f9c6d2aea", - "description": "" - }, - "cc25a278-2c3a-5d55-9533-755fa31a17f9": { - "category": "Unnamed", - "info": {}, - "name": "Olive Drab Rain Coat", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "cc25a278-2c3a-5d55-9533-755fa31a17f9", - "description": "Does not affect gameplay. " - }, - "edba1c6a-a338-52e4-b7b9-f1574156a8fd": { - "category": "Unnamed", - "info": {}, - "name": "Urban Cargo Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "edba1c6a-a338-52e4-b7b9-f1574156a8fd", - "description": "Does not affect gameplay. " - }, - "9d638a55-2a0e-5c4d-bf02-e8fac413f8bb": { - "category": "Unnamed", - "info": {}, - "name": "Black Combat Webbing", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "9d638a55-2a0e-5c4d-bf02-e8fac413f8bb", - "description": "Does not affect gameplay. " - }, - "a888ff95-c79a-5f1c-baaf-ffe2e48d5f0f": { - "category": "Unnamed", - "info": {}, - "name": "Green X Plate Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "a888ff95-c79a-5f1c-baaf-ffe2e48d5f0f", - "description": "Does not affect gameplay. " - }, - "5230d5a1-eadc-5c23-99f1-56adc9ed7587": { - "category": "Unnamed", - "info": {}, - "name": "Camo Tactical Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "5230d5a1-eadc-5c23-99f1-56adc9ed7587", - "description": "Does not affect gameplay. " - }, - "0af9beae-04fa-5449-8032-6fc13e37e05e": { - "category": "Unnamed", - "info": {}, - "name": "Purple Striped Longsleeve [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "0af9beae-04fa-5449-8032-6fc13e37e05e", - "description": "" - }, - "64cef0f7-80dd-5d8c-863d-bff94f7b8a19": { - "category": "Unnamed", - "info": {}, - "name": "Skinny Blue Jeans", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "64cef0f7-80dd-5d8c-863d-bff94f7b8a19", - "description": "Does not affect gameplay. " - }, - "187b5928-5376-50ec-8458-471bdafc6158": { - "category": "Unnamed", - "info": {}, - "name": "Purple Biker Jacket", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "187b5928-5376-50ec-8458-471bdafc6158", - "description": "Does not affect gameplay. " - }, - "ad3b438d-647e-52e4-ad51-b5493f52fbae": { - "category": "Unnamed", - "info": {}, - "name": "Lunatic Biker Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "ad3b438d-647e-52e4-ad51-b5493f52fbae", - "description": "Does not affect gameplay. " - }, - "17b12b73-aea3-5616-b995-9a8c860873f0": { - "category": "Unnamed", - "info": {}, - "name": "Broken Tic Tac Toe Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "17b12b73-aea3-5616-b995-9a8c860873f0", - "description": "Does not affect gameplay. " - }, - "041b63f9-bda4-55dd-ba26-89bd59d03234": { - "category": "Unnamed", - "info": {}, - "name": "Gambler Biker Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "041b63f9-bda4-55dd-ba26-89bd59d03234", - "description": "Does not affect gameplay. " - }, - "d5d4d583-e196-510f-9593-eb6d0e3d48d2": { - "category": "Unnamed", - "info": {}, - "name": "Gambler Biker Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "d5d4d583-e196-510f-9593-eb6d0e3d48d2", - "description": "" - }, - "f168b7db-f686-5a22-ac33-550445ccecd7": { - "category": "Unnamed", - "info": {}, - "name": "Broken Rosey Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "f168b7db-f686-5a22-ac33-550445ccecd7", - "description": "" - }, - "e974982c-83e2-52b5-b0c6-224d5f555792": { - "category": "Unnamed", - "info": {}, - "name": "Tactical Stripe Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "e974982c-83e2-52b5-b0c6-224d5f555792", - "description": "" - }, - "07c5e196-a2a3-58c1-abc8-002625201502": { - "category": "Unnamed", - "info": {}, - "name": "Urban Dreadnaught [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "07c5e196-a2a3-58c1-abc8-002625201502", - "description": "" - }, - "8df2d526-a5c4-5328-9c83-33d8cd2b4375": { - "category": "Unnamed", - "info": {}, - "name": "Cobblepot Crate", - "video_url": "", - "data": { - "icon": "store_crate" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "8df2d526-a5c4-5328-9c83-33d8cd2b4375", - "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- 2 Universal Consumables\r\n- 2 Elite Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." - }, - "b6e50173-3fd7-553b-8685-6d55140f3235": { - "category": "Unnamed", - "info": {}, - "name": "Desert Spec Ops Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "b6e50173-3fd7-553b-8685-6d55140f3235", - "description": "" - }, - "17bccb09-d281-5709-95aa-f00d9a3fff22": { - "category": "Unnamed", - "info": {}, - "name": "Cobblepot Premium Container", - "video_url": "", - "data": { - "icon": "store_container" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "17bccb09-d281-5709-95aa-f00d9a3fff22", - "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- 3 Gear+ Items\r\n- 2 Universal Consumables\r\n- 2 Elite Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." - }, - "63958458-a057-5790-97e0-0a02a04109b1": { - "category": "Unnamed", - "info": {}, - "name": "Urban Dreadnaught Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "63958458-a057-5790-97e0-0a02a04109b1", - "description": "Does not affect gameplay. " - }, - "3b8aec9e-da1e-57ef-ac06-783602c43bd2": { - "category": "Unnamed", - "info": {}, - "name": "Desert Tech Elite", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "3b8aec9e-da1e-57ef-ac06-783602c43bd2", - "description": "Does not affect gameplay. " - }, - "6d4b585e-3df5-589d-9934-f452b96a05b7": { - "category": "Unnamed", - "info": {}, - "name": "Ability Boost", - "video_url": "", - "data": { - "gangland_sort_index": "3", - "gangland_effect_type": "4", - "gangland_effect_amount": "0.05", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "6d4b585e-3df5-589d-9934-f452b96a05b7", - "description": "Abilities cool down faster as an Elite." - }, - "b176b377-58b2-5dfd-afd2-c68bfebacd34": { - "category": "Unnamed", - "info": {}, - "name": "Olive Skull Helmet", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "b176b377-58b2-5dfd-afd2-c68bfebacd34", - "description": "Does not affect gameplay. " - }, - "29d176da-4cbd-5c4f-ac25-1ac7623ca786": { - "category": "Unnamed", - "info": {}, - "name": "Dash Recovery Boost", - "video_url": "", - "data": { - "gangland_sort_index": "4", - "gangland_effect_type": "9", - "gangland_effect_amount": "0.1", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "29d176da-4cbd-5c4f-ac25-1ac7623ca786", - "description": "Dash recovery rate is increased as an Elite." - }, - "de53f670-20a3-55be-bc3b-1357035b37a4": { - "category": "Unnamed", - "info": {}, - "name": "Weapon Skill Boost", - "video_url": "", - "data": { - "gangland_sort_index": "1", - "gangland_effect_type": "11", - "gangland_effect_amount": "0.1", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "8aa835f2-d8a0-52e2-81af-d10c87fdf80d", - "type": 0, - "id": "de53f670-20a3-55be-bc3b-1357035b37a4", - "description": "Completed matches earn more weapon skill." - }, - "da656c84-ae19-5c5a-8969-783183569674": { - "category": "Unnamed", - "info": {}, - "name": "Olive Cargo Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "da656c84-ae19-5c5a-8969-783183569674", - "description": "" - }, - "584a0b03-d188-524d-a6b3-0e48c5f4a37a": { - "category": "Unnamed", - "info": {}, - "name": "Urban Tactical Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "584a0b03-d188-524d-a6b3-0e48c5f4a37a", - "description": "Does not affect gameplay. " - }, - "1be2a1f1-974b-59aa-8409-8a89b2708980": { - "category": "Unnamed", - "info": {}, - "name": "Red Trench Coat [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "1be2a1f1-974b-59aa-8409-8a89b2708980", - "description": "" - }, - "d89169f3-8c30-5568-b19c-a72765928f1d": { - "category": "Unnamed", - "info": {}, - "name": "Red Parka [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "d89169f3-8c30-5568-b19c-a72765928f1d", - "description": "" - }, - "0d4155f6-3408-5bab-aaab-94d9978ef2c3": { - "category": "Unnamed", - "info": {}, - "name": "Desert Fatigue Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "0d4155f6-3408-5bab-aaab-94d9978ef2c3", - "description": "" - }, - "d4d32198-d667-5225-8759-0f0db5d5f53a": { - "category": "Unnamed", - "info": {}, - "name": "Desert Face Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "d4d32198-d667-5225-8759-0f0db5d5f53a", - "description": "" - }, - "592863e8-e033-5756-b09d-8b5765f96462": { - "category": "Unnamed", - "info": {}, - "name": "Black Spiral Egghead Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "592863e8-e033-5756-b09d-8b5765f96462", - "description": "" - }, - "dd7e8e6c-05f1-5870-9b4b-c23b70d93229": { - "category": "Unnamed", - "info": {}, - "name": "Psycho Biker Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "dd7e8e6c-05f1-5870-9b4b-c23b70d93229", - "description": "" - }, - "37236f9a-2a8d-566a-9efe-d40cb7d83c32": { - "category": "Unnamed", - "info": {}, - "name": "Sad Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "37236f9a-2a8d-566a-9efe-d40cb7d83c32", - "description": "" - }, - "5275d629-59a8-5bf4-b8c2-bad7cf1c9880": { - "category": "Unnamed", - "info": {}, - "name": "Green Parka [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "5275d629-59a8-5bf4-b8c2-bad7cf1c9880", - "description": "" - }, - "42f30419-caad-5b4a-b589-1d5b8ccbb20e": { - "category": "Unnamed", - "info": {}, - "name": "Muted Spec Ops Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "42f30419-caad-5b4a-b589-1d5b8ccbb20e", - "description": "" - }, - "eb0b64b4-3b21-50ff-b69c-4556545c15db": { - "category": "Unnamed", - "info": {}, - "name": "Digital Combat Webbing [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "eb0b64b4-3b21-50ff-b69c-4556545c15db", - "description": "" - }, - "22d5dd7f-80cb-5699-bfa0-555729e58a14": { - "category": "Unnamed", - "info": {}, - "name": "Cobblepot Case", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "22d5dd7f-80cb-5699-bfa0-555729e58a14", - "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- 2 Universal Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." - }, - "92b94f0c-b423-5636-8529-1a8952a06fa9": { - "category": "Unnamed", - "info": {}, - "name": "Grenade Protection Boost", - "video_url": "", - "data": { - "gangland_sort_index": "8", - "gangland_effect_type": "1", - "gangland_effect_amount": "0.06", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "92b94f0c-b423-5636-8529-1a8952a06fa9", - "description": "Take less damage from grenades as an Elite." - }, - "0ccb20fe-d396-5461-b809-dc5684588f23": { - "category": "Unnamed", - "info": {}, - "name": "Elemental Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "0ccb20fe-d396-5461-b809-dc5684588f23", - "description": "" - }, - "6ece8ea9-398e-5735-9193-a3517cfc7644": { - "category": "Unnamed", - "info": {}, - "name": "Desert Spec Ops Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "6ece8ea9-398e-5735-9193-a3517cfc7644", - "description": "Does not affect gameplay. " - }, - "48f970ea-ea39-5d8d-8d54-297a686b4cae": { - "category": "Unnamed", - "info": {}, - "name": "Full Body Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "48f970ea-ea39-5d8d-8d54-297a686b4cae", - "description": "" - }, - "0ada9d81-8aba-5713-b317-bfaea5b94c05": { - "category": "Unnamed", - "info": {}, - "name": "Red Spiral Pug Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "0ada9d81-8aba-5713-b317-bfaea5b94c05", - "description": "" - }, - "57acc6c7-d1d9-5a8d-a567-64174dd194f2": { - "category": "Unnamed", - "info": {}, - "name": "Olive Skull Helmet [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "57acc6c7-d1d9-5a8d-a567-64174dd194f2", - "description": "" - }, - "0a93b502-e83a-57ba-b380-440cd493394e": { - "category": "Unnamed", - "info": {}, - "name": "X-Mouth Pug Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "0a93b502-e83a-57ba-b380-440cd493394e", - "description": "" - }, - "8fe88422-f999-587f-ac1a-7bc8b53037f5": { - "category": "Unnamed", - "info": {}, - "name": "Bullseye Plate Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "8fe88422-f999-587f-ac1a-7bc8b53037f5", - "description": "" - }, - "c18ab043-4ca2-5094-aedd-2aa3901e531a": { - "category": "Unnamed", - "info": {}, - "name": "Warrior Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "c18ab043-4ca2-5094-aedd-2aa3901e531a", - "description": "" - }, - "2f6ffc36-88a4-5384-8507-2ffdff781b51": { - "category": "Unnamed", - "info": {}, - "name": "Urban Goggles", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "2f6ffc36-88a4-5384-8507-2ffdff781b51", - "description": "Does not affect gameplay. " - }, - "44fc57fd-4cc1-58f4-b5d9-ce280616f398": { - "category": "Unnamed", - "info": {}, - "name": "Urban Padded Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "44fc57fd-4cc1-58f4-b5d9-ce280616f398", - "description": "" - }, - "f10ff1e2-6f0d-5c11-92e8-061981a339ea": { - "category": "Unnamed", - "info": {}, - "name": "Joker Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "f10ff1e2-6f0d-5c11-92e8-061981a339ea", - "description": "" - }, - "849066c4-ab47-570b-8037-cf11eb98b320": { - "category": "Unnamed", - "info": {}, - "name": "Toothy Stitched Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "849066c4-ab47-570b-8037-cf11eb98b320", - "description": "" - }, - "793452ac-ab1a-52f4-b31c-54671b798dfe": { - "category": "Unnamed", - "info": {}, - "name": "Outlaw Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "793452ac-ab1a-52f4-b31c-54671b798dfe", - "description": "" - }, - "9e0ef26f-aa1d-5c0c-922c-0149df5240de": { - "category": "Unnamed", - "info": {}, - "name": "Desert Skull Helmet", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "9e0ef26f-aa1d-5c0c-922c-0149df5240de", - "description": "Does not affect gameplay. " - }, - "1d952f2a-beaa-5aa2-9ea8-be8beea7f716": { - "category": "Unnamed", - "info": {}, - "name": "Dead Eye Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "1d952f2a-beaa-5aa2-9ea8-be8beea7f716", - "description": "" - }, - "b371db3f-4c2f-57a8-a5f3-d331d2ed598c": { - "category": "Unnamed", - "info": {}, - "name": "X-Mouth Pug Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "b371db3f-4c2f-57a8-a5f3-d331d2ed598c", - "description": "Does not affect gameplay. " - }, - "a803cc5f-894a-5c0c-9f23-cab384e0eabc": { - "category": "Unnamed", - "info": {}, - "name": "Red Prison Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "a803cc5f-894a-5c0c-9f23-cab384e0eabc", - "description": "" - }, - "43c9eaca-d143-5672-bd2e-a2dcc6ee162d": { - "category": "Unnamed", - "info": {}, - "name": "Broken Tic Tac Toe Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "43c9eaca-d143-5672-bd2e-a2dcc6ee162d", - "description": "" - }, - "30cf37cd-195a-50c7-af77-3b5a1f35d5f1": { - "category": "Unnamed", - "info": {}, - "name": "Desert Dreadnaught Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "30cf37cd-195a-50c7-af77-3b5a1f35d5f1", - "description": "" - }, - "2102dfed-59ae-546e-a97c-4145f3a90492": { - "category": "Unnamed", - "info": {}, - "name": "Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "2102dfed-59ae-546e-a97c-4145f3a90492", - "description": "" - }, - "163c54a2-7471-501b-8499-d07c2388e175": { - "category": "Unnamed", - "info": {}, - "name": "Clown Stitched Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "163c54a2-7471-501b-8499-d07c2388e175", - "description": "" - }, - "8e1da17d-1b23-5027-b8c8-7369dbac5d88": { - "category": "Unnamed", - "info": {}, - "name": "Bearded Pointy Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "8e1da17d-1b23-5027-b8c8-7369dbac5d88", - "description": "Does not affect gameplay. " - }, - "a27481c7-25a9-5142-9dbb-ca4c1a7aff6f": { - "category": "Unnamed", - "info": {}, - "name": "Green Parka", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "a27481c7-25a9-5142-9dbb-ca4c1a7aff6f", - "description": "Does not affect gameplay. " - }, - "f613474c-025f-5395-89ce-589c534cdd1f": { - "category": "Unnamed", - "info": {}, - "name": "Urban Fatigue Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "f613474c-025f-5395-89ce-589c534cdd1f", - "description": "Does not affect gameplay. " - }, - "fa2a4836-e7fe-5c9e-8954-990fdf2b2040": { - "category": "Unnamed", - "info": {}, - "name": "Desert Dreadnaught Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "fa2a4836-e7fe-5c9e-8954-990fdf2b2040", - "description": "Does not affect gameplay. " - }, - "20d61ef2-b29b-5052-8627-23f1c5b4b925": { - "category": "Unnamed", - "info": {}, - "name": "Skinny Blue Jeans [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "20d61ef2-b29b-5052-8627-23f1c5b4b925", - "description": "" - }, - "6f17054f-33bb-5f5f-8da0-092ba48c5521": { - "category": "Unnamed", - "info": {}, - "name": "Urban Padded Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "6f17054f-33bb-5f5f-8da0-092ba48c5521", - "description": "Does not affect gameplay. " - }, - "30b4b018-7857-5f6f-8d10-be9c184f1587": { - "category": "Unnamed", - "info": {}, - "name": "Desert Tech Elite [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "30b4b018-7857-5f6f-8d10-be9c184f1587", - "description": "" - }, - "73a1b767-ad4c-5408-ba38-5b3e6b89686f": { - "category": "Unnamed", - "info": {}, - "name": "Desert Dreadnaught", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "73a1b767-ad4c-5408-ba38-5b3e6b89686f", - "description": "Does not affect gameplay. " - }, - "0ac1a6d3-bb30-5a21-953a-39468e778498": { - "category": "Unnamed", - "info": {}, - "name": "Urban Spec Ops Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "0ac1a6d3-bb30-5a21-953a-39468e778498", - "description": "Does not affect gameplay. " - }, - "f6099561-b5ce-5e5f-8d2b-84cdbdc6a28a": { - "category": "Unnamed", - "info": {}, - "name": "Crimson Barb Wire Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "f6099561-b5ce-5e5f-8d2b-84cdbdc6a28a", - "description": "" - }, - "5a3f570b-2b8d-5764-b064-57c937ec201e": { - "category": "Unnamed", - "info": {}, - "name": "Sad Face T-Shirt [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "5a3f570b-2b8d-5764-b064-57c937ec201e", - "description": "" - }, - "ea3ce6d9-e936-575d-baf2-8de418d0be6f": { - "category": "Unnamed", - "info": {}, - "name": "Black Beret [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "ea3ce6d9-e936-575d-baf2-8de418d0be6f", - "description": "" - }, - "29635386-c7a8-5ef3-b521-e7495cfe688d": { - "category": "Unnamed", - "info": {}, - "name": "Desert Fatigue Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "29635386-c7a8-5ef3-b521-e7495cfe688d", - "description": "Does not affect gameplay. " - }, - "e25ee521-4fa0-5aa3-a4e4-6b12da2d911a": { - "category": "Unnamed", - "info": {}, - "name": "Psycho Biker Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "e25ee521-4fa0-5aa3-a4e4-6b12da2d911a", - "description": "Does not affect gameplay. " - }, - "2b622baf-286a-59be-91a9-b2733b9af0da": { - "category": "Unnamed", - "info": {}, - "name": "Urban Dreadnaught Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "2b622baf-286a-59be-91a9-b2733b9af0da", - "description": "" - }, - "a9fed9d5-dd9b-5be1-828a-d1776ea765f9": { - "category": "Unnamed", - "info": {}, - "name": "Urban Tech Elite", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "a9fed9d5-dd9b-5be1-828a-d1776ea765f9", - "description": "Does not affect gameplay. " - }, - "ad46b2e6-9c19-59d5-b15e-1fbca2f4c363": { - "category": "Unnamed", - "info": {}, - "name": "Black Dreadnaught Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "ad46b2e6-9c19-59d5-b15e-1fbca2f4c363", - "description": "" - }, - "3c5fe307-265c-52c4-86f4-140e21c08c37": { - "category": "Unnamed", - "info": {}, - "name": "Black Padded Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "3c5fe307-265c-52c4-86f4-140e21c08c37", - "description": "" - }, - "d796ab1e-8834-5f90-940e-d060181e4db2": { - "category": "Unnamed", - "info": {}, - "name": "Arkham Credits Attaché Case", - "video_url": "", - "data": {}, - "items": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 23000 - }, - "flags": 0, - "icon_url": "", - "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", - "type": 1, - "id": "d796ab1e-8834-5f90-940e-d060181e4db2", - "description": "23,000 Arkham Credits" - }, - "bad56cad-513f-5d0d-af22-fee2ec070369": { - "category": "Unnamed", - "info": {}, - "name": "Digital Combat Webbing", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "bad56cad-513f-5d0d-af22-fee2ec070369", - "description": "Does not affect gameplay. " - }, - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": { - "name": null, - "data": {}, - "flags": 2, - "icon_url": null, - "category_id": "c1b3a961-82af-570a-ae05-0d5037e1dd3c", - "type": 0, - "id": "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48", - "description": null - }, - "9d3df626-d393-5009-9f32-16a1cff0b267": { - "category": "Unnamed", - "info": {}, - "name": "Bullseye Plate Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "9d3df626-d393-5009-9f32-16a1cff0b267", - "description": "Does not affect gameplay. " - }, - "96ba0b3c-e980-5ffd-85b3-41053fc11f9c": { - "category": "Unnamed", - "info": {}, - "name": "Enhanced Vision Dampener", - "video_url": "", - "data": { - "gangland_sort_index": "5", - "gangland_effect_type": "6", - "gangland_effect_amount": "0.9", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "96ba0b3c-e980-5ffd-85b3-41053fc11f9c", - "description": "Further decreases visibility in the enemy's Enhanced Vision when you're in cover as an Elite." - }, - "92634890-8e4a-59d8-8254-76b7a03f0296": { - "category": "Unnamed", - "info": {}, - "name": "Urban Goggles [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "92634890-8e4a-59d8-8254-76b7a03f0296", - "description": "" - }, - "be9a6919-8258-5865-90fe-808e4f4d498e": { - "category": "Unnamed", - "info": {}, - "name": "Desert Spec Ops Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "be9a6919-8258-5865-90fe-808e4f4d498e", - "description": "" - }, - "b8e699d2-56ae-5116-882e-b16be7ddc4e3": { - "category": "Unnamed", - "info": {}, - "name": "Camo Balaclava [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "b8e699d2-56ae-5116-882e-b16be7ddc4e3", - "description": "" - }, - "ced6ae47-08b4-5733-89f3-8d83046f8d36": { - "category": "Unnamed", - "info": {}, - "name": "Broken Splotch Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "ced6ae47-08b4-5733-89f3-8d83046f8d36", - "description": "Does not affect gameplay. " - }, - "0cdd8987-6277-594d-bffa-1f92c9aa8d8b": { - "category": "Unnamed", - "info": {}, - "name": "Black Eye Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "0cdd8987-6277-594d-bffa-1f92c9aa8d8b", - "description": "" - }, - "9e01ddcc-4f86-5885-a23d-d2951392d452": { - "category": "Unnamed", - "info": {}, - "name": "Purple Trench Coat", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "9e01ddcc-4f86-5885-a23d-d2951392d452", - "description": "Does not affect gameplay. " - }, - "0db3f3e8-cef1-50d3-af75-818dcefb35cf": { - "category": "Unnamed", - "info": {}, - "name": "Arkham Credits Vault", - "video_url": "", - "data": {}, - "items": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 48000 - }, - "flags": 0, - "icon_url": "", - "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", - "type": 1, - "id": "0db3f3e8-cef1-50d3-af75-818dcefb35cf", - "description": "48,000 Arkham Credits" - }, - "17d3ff47-0f74-5340-959c-d594ff8fc70e": { - "category": "Unnamed", - "info": {}, - "name": "Smiley Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "17d3ff47-0f74-5340-959c-d594ff8fc70e", - "description": "" - }, - "61a29180-3b3f-516c-94d0-a2a3f921bb1a": { - "category": "Unnamed", - "info": {}, - "name": "Purple T-Shirt [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "61a29180-3b3f-516c-94d0-a2a3f921bb1a", - "description": "" - }, - "e5f42b33-2231-50b6-9cef-171b219305f9": { - "category": "Unnamed", - "info": {}, - "name": "Melee Strength Boost", - "video_url": "", - "data": { - "gangland_sort_index": "11", - "gangland_effect_type": "5", - "gangland_effect_amount": "0.1", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "e5f42b33-2231-50b6-9cef-171b219305f9", - "description": "Melee strength increased as an Elite." - }, - "ae0dee2f-4667-5911-bbbf-dd92d0e394da": { - "category": "Unnamed", - "info": {}, - "name": "Blue-Eyed Egghead Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "ae0dee2f-4667-5911-bbbf-dd92d0e394da", - "description": "Does not affect gameplay. " - }, - "2375517d-779c-5cb2-a649-9fedcbbeed8f": { - "category": "Unnamed", - "info": {}, - "name": "Gray Boiler Suit [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "2375517d-779c-5cb2-a649-9fedcbbeed8f", - "description": "" - }, - "155f1451-3402-51d4-a6ce-4a931d90e329": { - "category": "Unnamed", - "info": {}, - "name": "Crimson Barb Wire Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "155f1451-3402-51d4-a6ce-4a931d90e329", - "description": "Does not affect gameplay. " - }, - "2dea863b-958d-5e49-9599-b9c6bbdea9e2": { - "category": "Unnamed", - "info": {}, - "name": "Urban Dreadnaught", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "2dea863b-958d-5e49-9599-b9c6bbdea9e2", - "description": "Does not affect gameplay. " - }, - "7eea9626-a613-5f62-9abb-58caccef11df": { - "category": "Unnamed", - "info": {}, - "name": "Black Spec Ops Cap", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "7eea9626-a613-5f62-9abb-58caccef11df", - "description": "Does not affect gameplay. " - }, - "10641885-ac66-51b8-bd3b-629aa0c5626c": { - "category": "Unnamed", - "info": {}, - "name": "Red Spiral Pug Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "10641885-ac66-51b8-bd3b-629aa0c5626c", - "description": "Does not affect gameplay. " - }, - "5d7f72ef-26d6-5e32-a9fd-65596c901d83": { - "category": "Unnamed", - "info": {}, - "name": "Forest Padded Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "5d7f72ef-26d6-5e32-a9fd-65596c901d83", - "description": "Does not affect gameplay. " - }, - "298ff904-0621-5c6f-bd8c-fba9b85330c5": { - "category": "Unnamed", - "info": {}, - "name": "Joker Face Biker Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "298ff904-0621-5c6f-bd8c-fba9b85330c5", - "description": "" - }, - "e13c5037-6070-5c30-bb9e-f6b66150df87": { - "category": "Unnamed", - "info": {}, - "name": "Urban Sharpshooter [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "e13c5037-6070-5c30-bb9e-f6b66150df87", - "description": "" - }, - "e20f67fb-c695-58ad-a4bb-ae32b582da47": { - "category": "Unnamed", - "info": {}, - "name": "Bane Symbol Face Paint [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", - "type": 0, - "id": "e20f67fb-c695-58ad-a4bb-ae32b582da47", - "description": "" - }, - "58fd4343-7ff5-506e-854c-4c88f8ef3aa7": { - "category": "Unnamed", - "info": {}, - "name": "Black Combat Webbing [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "58fd4343-7ff5-506e-854c-4c88f8ef3aa7", - "description": "" - }, - "cd73aa76-7cad-5452-9062-ef7c98f97048": { - "category": "Unnamed", - "info": {}, - "name": "Urban Spec Ops Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "cd73aa76-7cad-5452-9062-ef7c98f97048", - "description": "" - }, - "bd8806db-35e3-5119-8ea5-72566b4b99c9": { - "category": "Unnamed", - "info": {}, - "name": "Cobblepot Satchel", - "video_url": "", - "data": { - "icon": "store_satchel" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "bd8806db-35e3-5119-8ea5-72566b4b99c9", - "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- No Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." - }, - "eab0edf8-1f75-5884-b626-277945112734": { - "category": "Unnamed", - "info": {}, - "name": "Headshot Protection Boost", - "video_url": "", - "data": { - "gangland_sort_index": "9", - "gangland_effect_type": "0", - "gangland_effect_amount": "0.08", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "eab0edf8-1f75-5884-b626-277945112734", - "description": "Take less damage from headshots as an Elite." - }, - "29091256-d940-5267-8848-37300953126d": { - "category": "Unnamed", - "info": {}, - "name": "Joker Face Biker Vest", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "29091256-d940-5267-8848-37300953126d", - "description": "Does not affect gameplay. " - }, - "7cad85bf-3f6e-5c41-bdcb-ac0a40e80a08": { - "category": "Unnamed", - "info": {}, - "name": "Desert Spec Ops Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "7cad85bf-3f6e-5c41-bdcb-ac0a40e80a08", - "description": "Does not affect gameplay. " - }, - "53f20659-b66b-58b0-b4c8-15f2ec92dba0": { - "category": "Unnamed", - "info": {}, - "name": "Desert Skull Helmet [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "53f20659-b66b-58b0-b4c8-15f2ec92dba0", - "description": "" - }, - "19536151-1bb1-5468-8f12-40faa062770c": { - "category": "Unnamed", - "info": {}, - "name": "Harley Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "19536151-1bb1-5468-8f12-40faa062770c", - "description": "" - }, - "30094b66-8a7b-5439-8d7f-a420959d3b14": { - "category": "Unnamed", - "info": {}, - "name": "Skeleton Work Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "30094b66-8a7b-5439-8d7f-a420959d3b14", - "description": "Does not affect gameplay. " - }, - "303e0bb9-6884-5d08-95b7-dc9a953e3e2e": { - "category": "Unnamed", - "info": {}, - "name": "Tribal Tattoo [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", - "type": 0, - "id": "303e0bb9-6884-5d08-95b7-dc9a953e3e2e", - "description": "" - }, - "90bcf491-756a-5771-9d49-b290f3e86ea6": { - "category": "Unnamed", - "info": {}, - "name": "Desert Sharpshooter", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "90bcf491-756a-5771-9d49-b290f3e86ea6", - "description": "Does not affect gameplay. " - }, - "c363c0de-6b2c-5036-8a38-755638c20af7": { - "category": "Unnamed", - "info": {}, - "name": "Broken Splotch Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "c363c0de-6b2c-5036-8a38-755638c20af7", - "description": "" - }, - "a82f2b24-f8ca-5b68-880e-3becec1fcf76": { - "category": "Unnamed", - "info": {}, - "name": "Bearded Pointy Mask [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "a82f2b24-f8ca-5b68-880e-3becec1fcf76", - "description": "" - }, - "2a64ee0b-9e0e-5e7a-a430-5b1922ba687d": { - "category": "Unnamed", - "info": {}, - "name": "Olive Spec Ops Cap [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "2a64ee0b-9e0e-5e7a-a430-5b1922ba687d", - "description": "" - }, - "4980150b-85ee-5591-be5c-1010d91860d1": { - "category": "Unnamed", - "info": {}, - "name": "Blue Work Pants [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "4980150b-85ee-5591-be5c-1010d91860d1", - "description": "" - }, - "6b6dcbb0-7f9d-564e-926a-f2ec53e91ebd": { - "category": "Unnamed", - "info": {}, - "name": "Green Beret", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "6b6dcbb0-7f9d-564e-926a-f2ec53e91ebd", - "description": "Does not affect gameplay. " - }, - "06665c23-862a-5470-81da-1e83edb1cfd9": { - "category": "Unnamed", - "info": {}, - "name": "Red Hoodie [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "06665c23-862a-5470-81da-1e83edb1cfd9", - "description": "" - }, - "832bbb47-3a84-594e-8baa-8d3fec47a61b": { - "category": "Unnamed", - "info": {}, - "name": "T-Shirt [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "832bbb47-3a84-594e-8baa-8d3fec47a61b", - "description": "" - }, - "39b67c98-58c5-5dbe-8d43-5980f2c0dafe": { - "category": "Unnamed", - "info": {}, - "name": "Green Biker Jacket", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "39b67c98-58c5-5dbe-8d43-5980f2c0dafe", - "description": "Does not affect gameplay. " - }, - "c2f0911c-837e-5867-898b-9a2e678ff55f": { - "category": "Unnamed", - "info": {}, - "name": "XP Boost", - "video_url": "", - "data": { - "gangland_sort_index": "0", - "gangland_effect_type": "10", - "gangland_effect_amount": "0.1", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "8aa835f2-d8a0-52e2-81af-d10c87fdf80d", - "type": 0, - "id": "c2f0911c-837e-5867-898b-9a2e678ff55f", - "description": "Completed matches earn more XP overall." - }, - "eef0b77b-92e4-54f5-9ff8-f6eb449be87d": { - "category": "Unnamed", - "info": {}, - "name": "Health Regeneration Boost", - "video_url": "", - "data": { - "gangland_sort_index": "10", - "gangland_effect_type": "7", - "gangland_effect_amount": "0.06", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "eef0b77b-92e4-54f5-9ff8-f6eb449be87d", - "description": "Health regeneration delay is reduced as an Elite." - }, - "4df702f1-31c2-54ad-accb-a46602c7e7c4": { - "category": "Unnamed", - "info": {}, - "name": "Urban Sharpshooter", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "4df702f1-31c2-54ad-accb-a46602c7e7c4", - "description": "Does not affect gameplay. " - }, - "c89233dc-d60f-5e04-97de-6a254bbc24eb": { - "category": "Unnamed", - "info": {}, - "name": "Striped Hoodie [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "c89233dc-d60f-5e04-97de-6a254bbc24eb", - "description": "" - }, - "55dc08e8-7bd8-57f4-aa50-df4a12fc9f78": { - "category": "Unnamed", - "info": {}, - "name": "Urban Spec Ops Cap [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "55dc08e8-7bd8-57f4-aa50-df4a12fc9f78", - "description": "" - }, - "e9d29b33-5186-5abd-b377-71849795a9ba": { - "category": "Unnamed", - "info": {}, - "name": "Tartan Prison Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "e9d29b33-5186-5abd-b377-71849795a9ba", - "description": "Does not affect gameplay. " - }, - "098bcb39-486b-559a-bc7e-8cac8fbed123": { - "category": "Unnamed", - "info": {}, - "name": "Black Jumper [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "098bcb39-486b-559a-bc7e-8cac8fbed123", - "description": "" - }, - "25bd3605-4988-589f-b65a-4ecd60b90e90": { - "category": "Unnamed", - "info": {}, - "name": "Forest Tactical Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "25bd3605-4988-589f-b65a-4ecd60b90e90", - "description": "Does not affect gameplay. " - }, - "f8f8230a-9ad7-55bd-a03f-cfe0e923f1eb": { - "category": "Unnamed", - "info": {}, - "name": "Urban Spec Ops Pants", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "f8f8230a-9ad7-55bd-a03f-cfe0e923f1eb", - "description": "Does not affect gameplay. " - }, - "485f598f-e875-5e24-b184-3b3800eaec29": { - "category": "Unnamed", - "info": {}, - "name": "CobblepotTier0", - "video_url": "", - "data": { - "icon": "store_tier0" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "485f598f-e875-5e24-b184-3b3800eaec29", - "description": "" - }, - "a037be91-f119-56e0-bab7-bcf0e1d0a880": { - "category": "Unnamed", - "info": {}, - "name": "Clown Stitched Mask", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", - "type": 0, - "id": "a037be91-f119-56e0-bab7-bcf0e1d0a880", - "description": "Does not affect gameplay. " - }, - "85bc6f3c-2e82-59fc-8dcc-a0288400f5ec": { - "category": "Unnamed", - "info": {}, - "name": "Green Barb Wire Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "85bc6f3c-2e82-59fc-8dcc-a0288400f5ec", - "description": "" - }, - "15cec100-69f4-5985-8f6e-8c4bd21f8223": { - "category": "Unnamed", - "info": {}, - "name": "Forest Padded Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "15cec100-69f4-5985-8f6e-8c4bd21f8223", - "description": "" - }, - "a0fd3e26-b2ab-5230-b34a-3427dca4652f": { - "category": "Unnamed", - "info": {}, - "name": "Lunatic Biker Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "a0fd3e26-b2ab-5230-b34a-3427dca4652f", - "description": "" - }, - "efd4446d-36c4-52bc-a91c-d01d0fe8ae76": { - "category": "Unnamed", - "info": {}, - "name": "Muscle Vest [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", - "type": 0, - "id": "efd4446d-36c4-52bc-a91c-d01d0fe8ae76", - "description": "" - }, - "b46071b9-5a2f-5bc1-a43b-ea833cd14032": { - "category": "Unnamed", - "info": {}, - "name": "Green Boiler Suit [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", - "type": 0, - "id": "b46071b9-5a2f-5bc1-a43b-ea833cd14032", - "description": "" - }, - "42275279-8193-5f8a-8360-68632accabdc": { - "category": "Unnamed", - "info": {}, - "name": "Skinny Black Jeans [+]", - "video_url": "", - "data": {}, - "flags": 1, - "icon_url": "", - "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", - "type": 0, - "id": "42275279-8193-5f8a-8360-68632accabdc", - "description": "" - }, - "e425b047-ee98-4fb8-83c8-6f099a0f9ea4": { - "category": "Unnamed", - "info": {}, - "name": "== STORE ==", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "e425b047-ee98-4fb8-83c8-6f099a0f9ea4", - "description": "Get items, on the house." - }, - "a9b961f6-88d1-4e5e-89cb-bb014cd2fbf0": { - "category": "Unnamed", - "info": {}, - "name": "Assortment of Consumables", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "a9b961f6-88d1-4e5e-89cb-bb014cd2fbf0", - "description": "Contains:\r\n\r\n- 5 Universal Consumables\r\n\r\nThanks for playing Arkham: Revived!" - }, - "f2b44d03-33ba-4ebe-93a9-033693189422": { - "category": "Unnamed", - "info": {}, - "name": "== ARKHAM: REVIVED ==", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "f2b44d03-33ba-4ebe-93a9-033693189422", - "description": "Arkham: Revived is a custom authentication server for Batman: Arkham Origins Online.\r\n\r\nThe in-game store serves as an options menu." - }, - "63598daa-6c2b-4895-a15f-5af4a435ccf8": { - "category": "Unnamed", - "info": {}, - "name": "Migrate from official servers", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "63598daa-6c2b-4895-a15f-5af4a435ccf8", - "description": "Start migration from official servers to Arkham: Revived.\r\n\r\nAll current progress will be replaced if successful." - }, - "774c23b3-8a63-46a7-b90d-e719b441a72b": { - "category": "Unnamed", - "info": {}, - "name": "Delete my saved progress", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "774c23b3-8a63-46a7-b90d-e719b441a72b", - "description": "Request to delete your saved progress.\r\n\r\nThis action may be cancelled within 2 minutes." - }, - "24d120f9-8b68-47c9-8f17-28e1022c6007": { - "category": "Unnamed", - "info": {}, - "name": "== %STEAM_NAME% ==", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "24d120f9-8b68-47c9-8f17-28e1022c6007", - "description": "%STEAM_ID%\r\n%DISCORD_ID%" - }, - "1f6de0b2-f4d2-42cf-ac0e-39f4c2139116": { - "category": "Unnamed", - "info": {}, - "name": "Migrations:", - "video_url": "", - "data": { - "icon": "store_case" - }, - "flags": 0, - "icon_url": "", - "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", - "type": 2, - "id": "1f6de0b2-f4d2-42cf-ac0e-39f4c2139116", - "description": "Total amount of migrations performed." - }, - "955830ec-f0d8-40bf-b0dd-1d002d386a51": { - "category": "Unnamed", - "info": {}, - "name": "== == == ==", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "955830ec-f0d8-40bf-b0dd-1d002d386a51", - "description": "These \"items\" are used to display store output.\r\n\r\nThey are not real items and cannot be used." - }, - "4a410e7a-c007-4aaf-8237-07d2ffe949c6": { - "category": "Unnamed", - "info": {}, - "name": "Status code:", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "4a410e7a-c007-4aaf-8237-07d2ffe949c6", - "description": "The server received your request.\r\n\r\nThis is the status code returned by the server, if it's not 1, then something went wrong." - }, - "1985b4d7-d02d-4bb9-999d-69948588f0c3": { - "category": "Unnamed", - "info": {}, - "name": "Account migration process started", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "1985b4d7-d02d-4bb9-999d-69948588f0c3", - "description": "Your request was successfully received." - }, - "7a08ec4f-9f80-4199-925b-aa6f58759c73": { - "category": "Unnamed", - "info": {}, - "name": "Please close your game and wait", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "7a08ec4f-9f80-4199-925b-aa6f58759c73", - "description": "You must close your game and wait 5 minutes for your request to be processed." - }, - "71879d11-5a23-4177-a107-8a54c4a5463d": { - "category": "Unnamed", - "info": {}, - "name": "An unknown error occurred", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "71879d11-5a23-4177-a107-8a54c4a5463d", - "description": "Please check the status code returned by the server and try again." - }, - "27afc195-9c1a-4d2d-8f56-67e4b3475b07": { - "category": "Unnamed", - "info": {}, - "name": "Account deletion process started", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "27afc195-9c1a-4d2d-8f56-67e4b3475b07", - "description": "To cancel, access this menu option again within 2 minutes." - }, - "94d7b7a1-9a5b-4c58-81a4-ba40cd096da1": { - "category": "Unnamed", - "info": {}, - "name": "Invalid option selected", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "94d7b7a1-9a5b-4c58-81a4-ba40cd096da1", - "description": "The option you selected is invalid." - }, - "fa477238-31e0-4052-9a4e-acf98df14cd5": { - "category": "Unnamed", - "info": {}, - "name": "Action no longer available", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "fa477238-31e0-4052-9a4e-acf98df14cd5", - "description": "The requested action can no longer be performed." - }, - "21399935-ba00-4bbe-bfdb-bb544fd02048": { - "category": "Unnamed", - "info": {}, - "name": "Action cancelled", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "21399935-ba00-4bbe-bfdb-bb544fd02048", - "description": "The action was cancelled." - }, - "fba9a9bd-0b5a-4e41-a74b-c25ead882bf5": { - "category": "Unnamed", - "info": {}, - "name": "Action not permitted", - "video_url": "", - "data": { - "gangland_sort_index": "12", - "gangland_effect_type": "8", - "gangland_effect_amount": "0.12", - "gangland_is_consumable": "1" - }, - "flags": 2, - "icon_url": "", - "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", - "type": 0, - "id": "fba9a9bd-0b5a-4e41-a74b-c25ead882bf5", - "description": "The server declined to perform the requested action." - } - } +{ + "items": { + "d2783dae-cd2a-5bf3-94bc-c1c24b2431a1": { + "category": "Unnamed", + "info": {}, + "name": "Green Boiler Suit", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "d2783dae-cd2a-5bf3-94bc-c1c24b2431a1", + "description": "Does not affect gameplay. " + }, + "39ef35d9-6858-5c52-b935-968caeaf4f41": { + "category": "Unnamed", + "info": {}, + "name": "Camo Beret", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "39ef35d9-6858-5c52-b935-968caeaf4f41", + "description": "Does not affect gameplay. " + }, + "905376cd-17ae-5d4d-9fe6-b60420d72065": { + "category": "Unnamed", + "info": {}, + "name": "Purple Trench Coat [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "905376cd-17ae-5d4d-9fe6-b60420d72065", + "description": "" + }, + "83d3df6c-5f06-5c77-a856-3edc8ba5e4d6": { + "category": "Unnamed", + "info": {}, + "name": "I-SCREAM Biker Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "83d3df6c-5f06-5c77-a856-3edc8ba5e4d6", + "description": "" + }, + "46a4e04f-e600-5342-baa1-63bbef6ab7b3": { + "category": "Unnamed", + "info": {}, + "name": "Mime Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "46a4e04f-e600-5342-baa1-63bbef6ab7b3", + "description": "" + }, + "0c825b60-661f-5971-86c0-13a3c55a9e0f": { + "category": "Unnamed", + "info": {}, + "name": "Urban Fatigue Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "0c825b60-661f-5971-86c0-13a3c55a9e0f", + "description": "" + }, + "d4a45ab8-17ac-5741-88cd-a3c1a30adb5f": { + "category": "Unnamed", + "info": {}, + "name": "Black Fatigue Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "d4a45ab8-17ac-5741-88cd-a3c1a30adb5f", + "description": "" + }, + "7f1c24c6-1ac2-5a5b-a78a-b883ebc45de4": { + "category": "Unnamed", + "info": {}, + "name": "Respawn Boost", + "video_url": "", + "data": { + "gangland_sort_index": "12", + "gangland_effect_type": "8", + "gangland_effect_amount": "0.12", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "7f1c24c6-1ac2-5a5b-a78a-b883ebc45de4", + "description": "Respawn wait is reduced if it is above the minimum respawn time as an Elite." + }, + "d19a2420-ce9e-5cc0-a6bb-9382d1cdfc5e": { + "category": "Unnamed", + "info": {}, + "name": "Gray Boiler Suit", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "d19a2420-ce9e-5cc0-a6bb-9382d1cdfc5e", + "description": "Does not affect gameplay. " + }, + "43149088-b9e9-524a-b447-dfdcdaaa49e3": { + "category": "Unnamed", + "info": {}, + "name": "Credit Boost", + "video_url": "", + "data": { + "gangland_sort_index": "2", + "gangland_effect_type": "12", + "gangland_effect_amount": "0.1", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "8aa835f2-d8a0-52e2-81af-d10c87fdf80d", + "type": 0, + "id": "43149088-b9e9-524a-b447-dfdcdaaa49e3", + "description": "Completed matches earn more Arkham Credits." + }, + "be4f89ab-0cde-5705-9b44-c55fbd00f80f": { + "category": "Unnamed", + "info": {}, + "name": "Stripy Work Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "be4f89ab-0cde-5705-9b44-c55fbd00f80f", + "description": "" + }, + "3553c47c-305f-5559-9af1-31fb00f3941a": { + "category": "Unnamed", + "info": {}, + "name": "Urban Face Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "3553c47c-305f-5559-9af1-31fb00f3941a", + "description": "" + }, + "89667fb4-ff92-5396-802b-d93b31103d61": { + "category": "Unnamed", + "info": {}, + "name": "Purple Biker Jacket [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "89667fb4-ff92-5396-802b-d93b31103d61", + "description": "" + }, + "db3189ea-6baa-53aa-84f5-208cc135c573": { + "category": "Unnamed", + "info": {}, + "name": "Green X Plate Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "db3189ea-6baa-53aa-84f5-208cc135c573", + "description": "" + }, + "d4c16930-2657-513d-ac0d-b340501b8d10": { + "category": "Unnamed", + "info": {}, + "name": "Skinny Grey Jeans [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "d4c16930-2657-513d-ac0d-b340501b8d10", + "description": "" + }, + "78e400a8-43e8-58b8-8910-004b2adcc377": { + "category": "Unnamed", + "info": {}, + "name": "Prison Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "78e400a8-43e8-58b8-8910-004b2adcc377", + "description": "" + }, + "ed325e9c-590a-5ee9-a471-0d0e6565a734": { + "category": "Unnamed", + "info": {}, + "name": "Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "ed325e9c-590a-5ee9-a471-0d0e6565a734", + "description": "" + }, + "242fa84e-3343-544a-9bf5-5927dfd36036": { + "category": "Unnamed", + "info": {}, + "name": "Desert Goggles [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "242fa84e-3343-544a-9bf5-5927dfd36036", + "description": "" + }, + "6e73b30e-aca4-5415-8255-b691e643139e": { + "category": "Unnamed", + "info": {}, + "name": "Green Biker Jacket [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "6e73b30e-aca4-5415-8255-b691e643139e", + "description": "" + }, + "3dd13c1f-7571-542b-8b1a-720d67a439a3": { + "category": "Unnamed", + "info": {}, + "name": "Toothy Stitched Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "3dd13c1f-7571-542b-8b1a-720d67a439a3", + "description": "Does not affect gameplay. " + }, + "80f12c0c-95d8-5535-81d3-595abadd736b": { + "category": "Unnamed", + "info": {}, + "name": "Bane Mask Balaclava [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "80f12c0c-95d8-5535-81d3-595abadd736b", + "description": "" + }, + "370f1a88-706f-5e71-9f84-2d698e81110b": { + "category": "Unnamed", + "info": {}, + "name": "Spec Ops Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "370f1a88-706f-5e71-9f84-2d698e81110b", + "description": "" + }, + "d72db4ba-fd03-5f75-a853-facfb0b7fe80": { + "category": "Unnamed", + "info": {}, + "name": "Striped Hoodie", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "d72db4ba-fd03-5f75-a853-facfb0b7fe80", + "description": "Does not affect gameplay. " + }, + "3fca6927-d0f9-55a2-82a5-84ef648740a4": { + "name": null, + "data": {}, + "items": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 100000 + }, + "flags": 0, + "icon_url": null, + "category_id": "13476e5a-6e64-5ca5-966b-b5b28e3fdb55", + "type": 1, + "id": "3fca6927-d0f9-55a2-82a5-84ef648740a4", + "description": null + }, + "fb81f0ff-6874-5f2b-a3ee-d04cad63f700": { + "category": "Unnamed", + "info": {}, + "name": "Red Trench Coat", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "fb81f0ff-6874-5f2b-a3ee-d04cad63f700", + "description": "Does not affect gameplay. " + }, + "8f90dd55-f329-5b89-a58d-b08a283b8739": { + "category": "Unnamed", + "info": {}, + "name": "Bane Mask Balaclava", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "8f90dd55-f329-5b89-a58d-b08a283b8739", + "description": "Does not affect gameplay. " + }, + "cbbb5918-921c-5ac1-b5df-32cd1ed5274d": { + "category": "Unnamed", + "info": {}, + "name": "Black Spiral Egghead Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "cbbb5918-921c-5ac1-b5df-32cd1ed5274d", + "description": "Does not affect gameplay. " + }, + "50884d5b-cae3-5d57-b2b3-3117b3ecb6f7": { + "category": "Unnamed", + "info": {}, + "name": "Desert Sharpshooter [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "50884d5b-cae3-5d57-b2b3-3117b3ecb6f7", + "description": "" + }, + "106b5372-692a-5274-b7b9-b2db0a1c8565": { + "category": "Unnamed", + "info": {}, + "name": "Wildcard Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "106b5372-692a-5274-b7b9-b2db0a1c8565", + "description": "" + }, + "4210042c-7a56-5096-8ae0-c0f951283682": { + "category": "Unnamed", + "info": {}, + "name": "Skinny Grey Jeans", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "4210042c-7a56-5096-8ae0-c0f951283682", + "description": "Does not affect gameplay. " + }, + "5a825afc-f044-500d-84b9-b6fe90fc4dd3": { + "category": "Unnamed", + "info": {}, + "name": "Olive Cargo Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "5a825afc-f044-500d-84b9-b6fe90fc4dd3", + "description": "Does not affect gameplay. " + }, + "daec50d1-1cd9-5128-9b76-03437bd3e813": { + "category": "Unnamed", + "info": {}, + "name": "Purple Hoodie [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "daec50d1-1cd9-5128-9b76-03437bd3e813", + "description": "" + }, + "1664129b-5138-5449-80bb-efbe4b9e2b2b": { + "category": "Unnamed", + "info": {}, + "name": "Green Barb Wire Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "1664129b-5138-5449-80bb-efbe4b9e2b2b", + "description": "Does not affect gameplay. " + }, + "a2bd565b-fe43-501a-b74b-0e12700809c1": { + "category": "Unnamed", + "info": {}, + "name": "Gray Prison Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "a2bd565b-fe43-501a-b74b-0e12700809c1", + "description": "" + }, + "b0c49275-1f30-54c2-8447-f7e5f853ed97": { + "category": "Unnamed", + "info": {}, + "name": "Purple Parka [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "b0c49275-1f30-54c2-8447-f7e5f853ed97", + "description": "" + }, + "2136273d-f112-527f-abaa-49338df72fc9": { + "category": "Unnamed", + "info": {}, + "name": "Psychotic Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "2136273d-f112-527f-abaa-49338df72fc9", + "description": "" + }, + "0d63ae61-3bdd-58d9-871b-3754e999384b": { + "category": "Unnamed", + "info": {}, + "name": "Urban Tech Elite [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "0d63ae61-3bdd-58d9-871b-3754e999384b", + "description": "" + }, + "1ec1d7a4-a599-5ed2-8dbc-b768d606b092": { + "category": "Unnamed", + "info": {}, + "name": "Stripy Work Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "1ec1d7a4-a599-5ed2-8dbc-b768d606b092", + "description": "Does not affect gameplay. " + }, + "6299724a-e05e-55c0-9354-47eb3eb8c8ea": { + "category": "Unnamed", + "info": {}, + "name": "Black Cargo Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "6299724a-e05e-55c0-9354-47eb3eb8c8ea", + "description": "" + }, + "8252b5b4-3155-5a39-a688-f27a0878e68f": { + "category": "Unnamed", + "info": {}, + "name": "Urban Tactical Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "8252b5b4-3155-5a39-a688-f27a0878e68f", + "description": "Does not affect gameplay. " + }, + "97d2e77c-3164-57a4-a956-168633395e3f": { + "category": "Unnamed", + "info": {}, + "name": "Red Parka", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "97d2e77c-3164-57a4-a956-168633395e3f", + "description": "Does not affect gameplay. " + }, + "5422e0d2-d9d0-5976-970e-95fc3f460f65": { + "category": "Unnamed", + "info": {}, + "name": "Urban Spec Ops Cap", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "5422e0d2-d9d0-5976-970e-95fc3f460f65", + "description": "Does not affect gameplay. " + }, + "0730309a-b639-5fc2-a208-eadfd4a9632a": { + "category": "Unnamed", + "info": {}, + "name": "Arkham Credits Envelope", + "video_url": "", + "data": {}, + "items": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 11000 + }, + "flags": 0, + "icon_url": "", + "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", + "type": 1, + "id": "0730309a-b639-5fc2-a208-eadfd4a9632a", + "description": "11,000 Arkham Credits" + }, + "cc6b5317-71e3-57ca-a41e-ac695183ec1a": { + "category": "Unnamed", + "info": {}, + "name": "GCPD Rain Coat [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "cc6b5317-71e3-57ca-a41e-ac695183ec1a", + "description": "" + }, + "965e52e3-6c3c-5ba0-8e59-7e357aebf892": { + "category": "Unnamed", + "info": {}, + "name": "Grenade Damage Boost", + "video_url": "", + "data": { + "gangland_sort_index": "7", + "gangland_effect_type": "2", + "gangland_effect_amount": "0.06", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "965e52e3-6c3c-5ba0-8e59-7e357aebf892", + "description": "Grenade damage is increased as an Elite." + }, + "5ebc15e3-d25e-5c1f-bad6-3f5c0e3048f1": { + "category": "Unnamed", + "info": {}, + "name": "Urban Spec Ops Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "5ebc15e3-d25e-5c1f-bad6-3f5c0e3048f1", + "description": "" + }, + "3ac9f771-f76f-55d2-9abc-d1be5b207a69": { + "category": "Unnamed", + "info": {}, + "name": "Desert Goggles", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "3ac9f771-f76f-55d2-9abc-d1be5b207a69", + "description": "Does not affect gameplay. " + }, + "5f5a6672-8feb-57c4-93f3-c04c58579792": { + "category": "Unnamed", + "info": {}, + "name": "Urban Tactical Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "5f5a6672-8feb-57c4-93f3-c04c58579792", + "description": "" + }, + "2b65e398-8c9b-5038-b565-5c8e9a627ee9": { + "category": "Unnamed", + "info": {}, + "name": "Red Hoodie", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "2b65e398-8c9b-5038-b565-5c8e9a627ee9", + "description": "Does not affect gameplay. " + }, + "95af4ac7-bfe1-5211-b0b1-0ff0edc7acd9": { + "category": "Unnamed", + "info": {}, + "name": "Forest Tactical Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "95af4ac7-bfe1-5211-b0b1-0ff0edc7acd9", + "description": "" + }, + "77b70c38-72af-54b7-a66f-1c58cc9240d1": { + "category": "Unnamed", + "info": {}, + "name": "Arkham Credits Billfold", + "video_url": "", + "data": {}, + "items": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 2000 + }, + "flags": 0, + "icon_url": "", + "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", + "type": 1, + "id": "77b70c38-72af-54b7-a66f-1c58cc9240d1", + "description": "2,000 Arkham Credits" + }, + "deca4f06-e3bc-51ef-8618-30d91a1e4019": { + "category": "Unnamed", + "info": {}, + "name": "Skeleton Work Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "deca4f06-e3bc-51ef-8618-30d91a1e4019", + "description": "" + }, + "b3fbc4e7-dfb3-5e51-a37d-7600663c0f7a": { + "category": "Unnamed", + "info": {}, + "name": "Mauve-Eyed Pointy Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "b3fbc4e7-dfb3-5e51-a37d-7600663c0f7a", + "description": "" + }, + "d9db5659-866a-5d86-9390-73776e45d478": { + "category": "Unnamed", + "info": {}, + "name": "Black Spec Ops Cap [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "d9db5659-866a-5d86-9390-73776e45d478", + "description": "" + }, + "998c2a58-7c92-5ac0-b6cb-1ad8ce67c36c": { + "category": "Unnamed", + "info": {}, + "name": "Bloodstripe Pointy Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "998c2a58-7c92-5ac0-b6cb-1ad8ce67c36c", + "description": "Does not affect gameplay. " + }, + "22343ef8-88cb-5286-8e6a-7f035f2e4888": { + "category": "Unnamed", + "info": {}, + "name": "Olive Jumper [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "22343ef8-88cb-5286-8e6a-7f035f2e4888", + "description": "" + }, + "0a9820c4-5f15-5e92-a756-7651e55cf468": { + "category": "Unnamed", + "info": {}, + "name": "Black Spec Ops Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "0a9820c4-5f15-5e92-a756-7651e55cf468", + "description": "" + }, + "5b0c5983-d7bd-56eb-9837-46b5e213f34b": { + "category": "Unnamed", + "info": {}, + "name": "Anti-Glare Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "5b0c5983-d7bd-56eb-9837-46b5e213f34b", + "description": "" + }, + "898f8a75-a7e2-54b3-a33d-3881439b81a6": { + "category": "Unnamed", + "info": {}, + "name": "Desert Face Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "898f8a75-a7e2-54b3-a33d-3881439b81a6", + "description": "Does not affect gameplay. " + }, + "468522fc-06f0-5bd7-9ff9-2e4fd398da4c": { + "category": "Unnamed", + "info": {}, + "name": "Desert Dreadnaught [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "468522fc-06f0-5bd7-9ff9-2e4fd398da4c", + "description": "" + }, + "04bf6050-ec9a-5d61-8557-dd0e7fbde1bb": { + "category": "Unnamed", + "info": {}, + "name": "Camo Tactical Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "04bf6050-ec9a-5d61-8557-dd0e7fbde1bb", + "description": "" + }, + "2686bf4d-bafc-50fb-9b81-0d752f034bcd": { + "category": "Unnamed", + "info": {}, + "name": "Blue-Eyed Egghead Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "2686bf4d-bafc-50fb-9b81-0d752f034bcd", + "description": "" + }, + "c1d36531-9f1e-59f3-b88c-1694961f187a": { + "category": "Unnamed", + "info": {}, + "name": "Urban Tactical Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "c1d36531-9f1e-59f3-b88c-1694961f187a", + "description": "" + }, + "230047b4-86d1-5d07-9aa6-3b9fe474ac7b": { + "category": "Unnamed", + "info": {}, + "name": "Vortex Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "230047b4-86d1-5d07-9aa6-3b9fe474ac7b", + "description": "" + }, + "e08c6ca3-a0de-5e38-8b32-3a701b5a08c4": { + "category": "Unnamed", + "info": {}, + "name": "Olive Drab Rain Coat [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "e08c6ca3-a0de-5e38-8b32-3a701b5a08c4", + "description": "" + }, + "fb2c7561-b819-5375-95ec-d6f385a48594": { + "category": "Unnamed", + "info": {}, + "name": "Camo Beret [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "fb2c7561-b819-5375-95ec-d6f385a48594", + "description": "" + }, + "42811dda-6222-5812-80f2-37b2cebc380c": { + "category": "Unnamed", + "info": {}, + "name": "Urban Cargo Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "42811dda-6222-5812-80f2-37b2cebc380c", + "description": "" + }, + "33d7d293-4e0c-5876-8244-ecb8b962e663": { + "category": "Unnamed", + "info": {}, + "name": "Camo Balaclava", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "33d7d293-4e0c-5876-8244-ecb8b962e663", + "description": "Does not affect gameplay. " + }, + "c83216ff-3935-5e09-8fca-70348f088d5e": { + "category": "Unnamed", + "info": {}, + "name": "Green Beret [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "c83216ff-3935-5e09-8fca-70348f088d5e", + "description": "" + }, + "62bad3da-25c8-5a15-87cb-2cabc892894a": { + "category": "Unnamed", + "info": {}, + "name": "Gray Prison Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "62bad3da-25c8-5a15-87cb-2cabc892894a", + "description": "Does not affect gameplay. " + }, + "5972e7af-f80f-5887-b58a-05f865b6d4f0": { + "category": "Unnamed", + "info": {}, + "name": "Bloodstripe Pointy Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "5972e7af-f80f-5887-b58a-05f865b6d4f0", + "description": "" + }, + "8b8c0557-71e1-56af-a5a6-abbd76ffbbaa": { + "category": "Unnamed", + "info": {}, + "name": "GCPD Rain Coat", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "8b8c0557-71e1-56af-a5a6-abbd76ffbbaa", + "description": "Does not affect gameplay. " + }, + "90b006b8-5e3b-57f8-bca3-f31c19d23947": { + "category": "Unnamed", + "info": {}, + "name": "Urban Face Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "90b006b8-5e3b-57f8-bca3-f31c19d23947", + "description": "Does not affect gameplay. " + }, + "32f5d5a2-8c28-5fe5-a585-b8387f2cbb9e": { + "category": "Unnamed", + "info": {}, + "name": "Chains Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "32f5d5a2-8c28-5fe5-a585-b8387f2cbb9e", + "description": "" + }, + "7571877f-6ef1-53e8-821e-247d1750bc3d": { + "category": "Unnamed", + "info": {}, + "name": "Evade Boost", + "video_url": "", + "data": { + "gangland_sort_index": "6", + "gangland_effect_type": "3", + "gangland_effect_amount": "0.07", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "7571877f-6ef1-53e8-821e-247d1750bc3d", + "description": "During evade roll incoming damage is reduced as an Elite." + }, + "2a2bf781-a732-50a7-828f-ee1f9c6d2aea": { + "category": "Unnamed", + "info": {}, + "name": "Tartan Prison Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "2a2bf781-a732-50a7-828f-ee1f9c6d2aea", + "description": "" + }, + "cc25a278-2c3a-5d55-9533-755fa31a17f9": { + "category": "Unnamed", + "info": {}, + "name": "Olive Drab Rain Coat", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "cc25a278-2c3a-5d55-9533-755fa31a17f9", + "description": "Does not affect gameplay. " + }, + "edba1c6a-a338-52e4-b7b9-f1574156a8fd": { + "category": "Unnamed", + "info": {}, + "name": "Urban Cargo Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "edba1c6a-a338-52e4-b7b9-f1574156a8fd", + "description": "Does not affect gameplay. " + }, + "9d638a55-2a0e-5c4d-bf02-e8fac413f8bb": { + "category": "Unnamed", + "info": {}, + "name": "Black Combat Webbing", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "9d638a55-2a0e-5c4d-bf02-e8fac413f8bb", + "description": "Does not affect gameplay. " + }, + "a888ff95-c79a-5f1c-baaf-ffe2e48d5f0f": { + "category": "Unnamed", + "info": {}, + "name": "Green X Plate Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "a888ff95-c79a-5f1c-baaf-ffe2e48d5f0f", + "description": "Does not affect gameplay. " + }, + "5230d5a1-eadc-5c23-99f1-56adc9ed7587": { + "category": "Unnamed", + "info": {}, + "name": "Camo Tactical Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "5230d5a1-eadc-5c23-99f1-56adc9ed7587", + "description": "Does not affect gameplay. " + }, + "0af9beae-04fa-5449-8032-6fc13e37e05e": { + "category": "Unnamed", + "info": {}, + "name": "Purple Striped Longsleeve [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "0af9beae-04fa-5449-8032-6fc13e37e05e", + "description": "" + }, + "64cef0f7-80dd-5d8c-863d-bff94f7b8a19": { + "category": "Unnamed", + "info": {}, + "name": "Skinny Blue Jeans", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "64cef0f7-80dd-5d8c-863d-bff94f7b8a19", + "description": "Does not affect gameplay. " + }, + "187b5928-5376-50ec-8458-471bdafc6158": { + "category": "Unnamed", + "info": {}, + "name": "Purple Biker Jacket", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "187b5928-5376-50ec-8458-471bdafc6158", + "description": "Does not affect gameplay. " + }, + "ad3b438d-647e-52e4-ad51-b5493f52fbae": { + "category": "Unnamed", + "info": {}, + "name": "Lunatic Biker Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "ad3b438d-647e-52e4-ad51-b5493f52fbae", + "description": "Does not affect gameplay. " + }, + "17b12b73-aea3-5616-b995-9a8c860873f0": { + "category": "Unnamed", + "info": {}, + "name": "Broken Tic Tac Toe Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "17b12b73-aea3-5616-b995-9a8c860873f0", + "description": "Does not affect gameplay. " + }, + "041b63f9-bda4-55dd-ba26-89bd59d03234": { + "category": "Unnamed", + "info": {}, + "name": "Gambler Biker Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "041b63f9-bda4-55dd-ba26-89bd59d03234", + "description": "Does not affect gameplay. " + }, + "d5d4d583-e196-510f-9593-eb6d0e3d48d2": { + "category": "Unnamed", + "info": {}, + "name": "Gambler Biker Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "d5d4d583-e196-510f-9593-eb6d0e3d48d2", + "description": "" + }, + "f168b7db-f686-5a22-ac33-550445ccecd7": { + "category": "Unnamed", + "info": {}, + "name": "Broken Rosey Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "f168b7db-f686-5a22-ac33-550445ccecd7", + "description": "" + }, + "e974982c-83e2-52b5-b0c6-224d5f555792": { + "category": "Unnamed", + "info": {}, + "name": "Tactical Stripe Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "e974982c-83e2-52b5-b0c6-224d5f555792", + "description": "" + }, + "07c5e196-a2a3-58c1-abc8-002625201502": { + "category": "Unnamed", + "info": {}, + "name": "Urban Dreadnaught [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "07c5e196-a2a3-58c1-abc8-002625201502", + "description": "" + }, + "8df2d526-a5c4-5328-9c83-33d8cd2b4375": { + "category": "Unnamed", + "info": {}, + "name": "Cobblepot Crate", + "video_url": "", + "data": { + "icon": "store_crate" + }, + "flags": 0, + "icon_url": "", + "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", + "type": 2, + "id": "8df2d526-a5c4-5328-9c83-33d8cd2b4375", + "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- 2 Universal Consumables\r\n- 2 Elite Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." + }, + "b6e50173-3fd7-553b-8685-6d55140f3235": { + "category": "Unnamed", + "info": {}, + "name": "Desert Spec Ops Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "b6e50173-3fd7-553b-8685-6d55140f3235", + "description": "" + }, + "17bccb09-d281-5709-95aa-f00d9a3fff22": { + "category": "Unnamed", + "info": {}, + "name": "Cobblepot Premium Container", + "video_url": "", + "data": { + "icon": "store_container" + }, + "flags": 0, + "icon_url": "", + "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", + "type": 2, + "id": "17bccb09-d281-5709-95aa-f00d9a3fff22", + "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- 3 Gear+ Items\r\n- 2 Universal Consumables\r\n- 2 Elite Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." + }, + "63958458-a057-5790-97e0-0a02a04109b1": { + "category": "Unnamed", + "info": {}, + "name": "Urban Dreadnaught Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "63958458-a057-5790-97e0-0a02a04109b1", + "description": "Does not affect gameplay. " + }, + "3b8aec9e-da1e-57ef-ac06-783602c43bd2": { + "category": "Unnamed", + "info": {}, + "name": "Desert Tech Elite", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "3b8aec9e-da1e-57ef-ac06-783602c43bd2", + "description": "Does not affect gameplay. " + }, + "6d4b585e-3df5-589d-9934-f452b96a05b7": { + "category": "Unnamed", + "info": {}, + "name": "Ability Boost", + "video_url": "", + "data": { + "gangland_sort_index": "3", + "gangland_effect_type": "4", + "gangland_effect_amount": "0.05", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "6d4b585e-3df5-589d-9934-f452b96a05b7", + "description": "Abilities cool down faster as an Elite." + }, + "b176b377-58b2-5dfd-afd2-c68bfebacd34": { + "category": "Unnamed", + "info": {}, + "name": "Olive Skull Helmet", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "b176b377-58b2-5dfd-afd2-c68bfebacd34", + "description": "Does not affect gameplay. " + }, + "29d176da-4cbd-5c4f-ac25-1ac7623ca786": { + "category": "Unnamed", + "info": {}, + "name": "Dash Recovery Boost", + "video_url": "", + "data": { + "gangland_sort_index": "4", + "gangland_effect_type": "9", + "gangland_effect_amount": "0.1", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "29d176da-4cbd-5c4f-ac25-1ac7623ca786", + "description": "Dash recovery rate is increased as an Elite." + }, + "de53f670-20a3-55be-bc3b-1357035b37a4": { + "category": "Unnamed", + "info": {}, + "name": "Weapon Skill Boost", + "video_url": "", + "data": { + "gangland_sort_index": "1", + "gangland_effect_type": "11", + "gangland_effect_amount": "0.1", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "8aa835f2-d8a0-52e2-81af-d10c87fdf80d", + "type": 0, + "id": "de53f670-20a3-55be-bc3b-1357035b37a4", + "description": "Completed matches earn more weapon skill." + }, + "da656c84-ae19-5c5a-8969-783183569674": { + "category": "Unnamed", + "info": {}, + "name": "Olive Cargo Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "da656c84-ae19-5c5a-8969-783183569674", + "description": "" + }, + "584a0b03-d188-524d-a6b3-0e48c5f4a37a": { + "category": "Unnamed", + "info": {}, + "name": "Urban Tactical Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "584a0b03-d188-524d-a6b3-0e48c5f4a37a", + "description": "Does not affect gameplay. " + }, + "1be2a1f1-974b-59aa-8409-8a89b2708980": { + "category": "Unnamed", + "info": {}, + "name": "Red Trench Coat [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "1be2a1f1-974b-59aa-8409-8a89b2708980", + "description": "" + }, + "d89169f3-8c30-5568-b19c-a72765928f1d": { + "category": "Unnamed", + "info": {}, + "name": "Red Parka [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "d89169f3-8c30-5568-b19c-a72765928f1d", + "description": "" + }, + "0d4155f6-3408-5bab-aaab-94d9978ef2c3": { + "category": "Unnamed", + "info": {}, + "name": "Desert Fatigue Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "0d4155f6-3408-5bab-aaab-94d9978ef2c3", + "description": "" + }, + "d4d32198-d667-5225-8759-0f0db5d5f53a": { + "category": "Unnamed", + "info": {}, + "name": "Desert Face Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "d4d32198-d667-5225-8759-0f0db5d5f53a", + "description": "" + }, + "592863e8-e033-5756-b09d-8b5765f96462": { + "category": "Unnamed", + "info": {}, + "name": "Black Spiral Egghead Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "592863e8-e033-5756-b09d-8b5765f96462", + "description": "" + }, + "dd7e8e6c-05f1-5870-9b4b-c23b70d93229": { + "category": "Unnamed", + "info": {}, + "name": "Psycho Biker Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "dd7e8e6c-05f1-5870-9b4b-c23b70d93229", + "description": "" + }, + "37236f9a-2a8d-566a-9efe-d40cb7d83c32": { + "category": "Unnamed", + "info": {}, + "name": "Sad Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "37236f9a-2a8d-566a-9efe-d40cb7d83c32", + "description": "" + }, + "5275d629-59a8-5bf4-b8c2-bad7cf1c9880": { + "category": "Unnamed", + "info": {}, + "name": "Green Parka [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "5275d629-59a8-5bf4-b8c2-bad7cf1c9880", + "description": "" + }, + "42f30419-caad-5b4a-b589-1d5b8ccbb20e": { + "category": "Unnamed", + "info": {}, + "name": "Muted Spec Ops Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "42f30419-caad-5b4a-b589-1d5b8ccbb20e", + "description": "" + }, + "eb0b64b4-3b21-50ff-b69c-4556545c15db": { + "category": "Unnamed", + "info": {}, + "name": "Digital Combat Webbing [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "eb0b64b4-3b21-50ff-b69c-4556545c15db", + "description": "" + }, + "22d5dd7f-80cb-5699-bfa0-555729e58a14": { + "category": "Unnamed", + "info": {}, + "name": "Cobblepot Case", + "video_url": "", + "data": { + "icon": "store_case" + }, + "flags": 0, + "icon_url": "", + "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", + "type": 2, + "id": "22d5dd7f-80cb-5699-bfa0-555729e58a14", + "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- 2 Universal Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." + }, + "92b94f0c-b423-5636-8529-1a8952a06fa9": { + "category": "Unnamed", + "info": {}, + "name": "Grenade Protection Boost", + "video_url": "", + "data": { + "gangland_sort_index": "8", + "gangland_effect_type": "1", + "gangland_effect_amount": "0.06", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "92b94f0c-b423-5636-8529-1a8952a06fa9", + "description": "Take less damage from grenades as an Elite." + }, + "0ccb20fe-d396-5461-b809-dc5684588f23": { + "category": "Unnamed", + "info": {}, + "name": "Elemental Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "0ccb20fe-d396-5461-b809-dc5684588f23", + "description": "" + }, + "6ece8ea9-398e-5735-9193-a3517cfc7644": { + "category": "Unnamed", + "info": {}, + "name": "Desert Spec Ops Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "6ece8ea9-398e-5735-9193-a3517cfc7644", + "description": "Does not affect gameplay. " + }, + "48f970ea-ea39-5d8d-8d54-297a686b4cae": { + "category": "Unnamed", + "info": {}, + "name": "Full Body Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "48f970ea-ea39-5d8d-8d54-297a686b4cae", + "description": "" + }, + "0ada9d81-8aba-5713-b317-bfaea5b94c05": { + "category": "Unnamed", + "info": {}, + "name": "Red Spiral Pug Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "0ada9d81-8aba-5713-b317-bfaea5b94c05", + "description": "" + }, + "57acc6c7-d1d9-5a8d-a567-64174dd194f2": { + "category": "Unnamed", + "info": {}, + "name": "Olive Skull Helmet [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "57acc6c7-d1d9-5a8d-a567-64174dd194f2", + "description": "" + }, + "0a93b502-e83a-57ba-b380-440cd493394e": { + "category": "Unnamed", + "info": {}, + "name": "X-Mouth Pug Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "0a93b502-e83a-57ba-b380-440cd493394e", + "description": "" + }, + "8fe88422-f999-587f-ac1a-7bc8b53037f5": { + "category": "Unnamed", + "info": {}, + "name": "Bullseye Plate Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "8fe88422-f999-587f-ac1a-7bc8b53037f5", + "description": "" + }, + "c18ab043-4ca2-5094-aedd-2aa3901e531a": { + "category": "Unnamed", + "info": {}, + "name": "Warrior Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "c18ab043-4ca2-5094-aedd-2aa3901e531a", + "description": "" + }, + "2f6ffc36-88a4-5384-8507-2ffdff781b51": { + "category": "Unnamed", + "info": {}, + "name": "Urban Goggles", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "2f6ffc36-88a4-5384-8507-2ffdff781b51", + "description": "Does not affect gameplay. " + }, + "44fc57fd-4cc1-58f4-b5d9-ce280616f398": { + "category": "Unnamed", + "info": {}, + "name": "Urban Padded Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "44fc57fd-4cc1-58f4-b5d9-ce280616f398", + "description": "" + }, + "f10ff1e2-6f0d-5c11-92e8-061981a339ea": { + "category": "Unnamed", + "info": {}, + "name": "Joker Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "f10ff1e2-6f0d-5c11-92e8-061981a339ea", + "description": "" + }, + "849066c4-ab47-570b-8037-cf11eb98b320": { + "category": "Unnamed", + "info": {}, + "name": "Toothy Stitched Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "849066c4-ab47-570b-8037-cf11eb98b320", + "description": "" + }, + "793452ac-ab1a-52f4-b31c-54671b798dfe": { + "category": "Unnamed", + "info": {}, + "name": "Outlaw Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "793452ac-ab1a-52f4-b31c-54671b798dfe", + "description": "" + }, + "9e0ef26f-aa1d-5c0c-922c-0149df5240de": { + "category": "Unnamed", + "info": {}, + "name": "Desert Skull Helmet", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "9e0ef26f-aa1d-5c0c-922c-0149df5240de", + "description": "Does not affect gameplay. " + }, + "1d952f2a-beaa-5aa2-9ea8-be8beea7f716": { + "category": "Unnamed", + "info": {}, + "name": "Dead Eye Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "1d952f2a-beaa-5aa2-9ea8-be8beea7f716", + "description": "" + }, + "b371db3f-4c2f-57a8-a5f3-d331d2ed598c": { + "category": "Unnamed", + "info": {}, + "name": "X-Mouth Pug Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "b371db3f-4c2f-57a8-a5f3-d331d2ed598c", + "description": "Does not affect gameplay. " + }, + "a803cc5f-894a-5c0c-9f23-cab384e0eabc": { + "category": "Unnamed", + "info": {}, + "name": "Red Prison Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "a803cc5f-894a-5c0c-9f23-cab384e0eabc", + "description": "" + }, + "43c9eaca-d143-5672-bd2e-a2dcc6ee162d": { + "category": "Unnamed", + "info": {}, + "name": "Broken Tic Tac Toe Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "43c9eaca-d143-5672-bd2e-a2dcc6ee162d", + "description": "" + }, + "30cf37cd-195a-50c7-af77-3b5a1f35d5f1": { + "category": "Unnamed", + "info": {}, + "name": "Desert Dreadnaught Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "30cf37cd-195a-50c7-af77-3b5a1f35d5f1", + "description": "" + }, + "2102dfed-59ae-546e-a97c-4145f3a90492": { + "category": "Unnamed", + "info": {}, + "name": "Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "2102dfed-59ae-546e-a97c-4145f3a90492", + "description": "" + }, + "163c54a2-7471-501b-8499-d07c2388e175": { + "category": "Unnamed", + "info": {}, + "name": "Clown Stitched Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "163c54a2-7471-501b-8499-d07c2388e175", + "description": "" + }, + "8e1da17d-1b23-5027-b8c8-7369dbac5d88": { + "category": "Unnamed", + "info": {}, + "name": "Bearded Pointy Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "8e1da17d-1b23-5027-b8c8-7369dbac5d88", + "description": "Does not affect gameplay. " + }, + "a27481c7-25a9-5142-9dbb-ca4c1a7aff6f": { + "category": "Unnamed", + "info": {}, + "name": "Green Parka", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "a27481c7-25a9-5142-9dbb-ca4c1a7aff6f", + "description": "Does not affect gameplay. " + }, + "f613474c-025f-5395-89ce-589c534cdd1f": { + "category": "Unnamed", + "info": {}, + "name": "Urban Fatigue Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "f613474c-025f-5395-89ce-589c534cdd1f", + "description": "Does not affect gameplay. " + }, + "fa2a4836-e7fe-5c9e-8954-990fdf2b2040": { + "category": "Unnamed", + "info": {}, + "name": "Desert Dreadnaught Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "fa2a4836-e7fe-5c9e-8954-990fdf2b2040", + "description": "Does not affect gameplay. " + }, + "20d61ef2-b29b-5052-8627-23f1c5b4b925": { + "category": "Unnamed", + "info": {}, + "name": "Skinny Blue Jeans [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "20d61ef2-b29b-5052-8627-23f1c5b4b925", + "description": "" + }, + "6f17054f-33bb-5f5f-8da0-092ba48c5521": { + "category": "Unnamed", + "info": {}, + "name": "Urban Padded Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "6f17054f-33bb-5f5f-8da0-092ba48c5521", + "description": "Does not affect gameplay. " + }, + "30b4b018-7857-5f6f-8d10-be9c184f1587": { + "category": "Unnamed", + "info": {}, + "name": "Desert Tech Elite [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "30b4b018-7857-5f6f-8d10-be9c184f1587", + "description": "" + }, + "73a1b767-ad4c-5408-ba38-5b3e6b89686f": { + "category": "Unnamed", + "info": {}, + "name": "Desert Dreadnaught", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "73a1b767-ad4c-5408-ba38-5b3e6b89686f", + "description": "Does not affect gameplay. " + }, + "0ac1a6d3-bb30-5a21-953a-39468e778498": { + "category": "Unnamed", + "info": {}, + "name": "Urban Spec Ops Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "0ac1a6d3-bb30-5a21-953a-39468e778498", + "description": "Does not affect gameplay. " + }, + "f6099561-b5ce-5e5f-8d2b-84cdbdc6a28a": { + "category": "Unnamed", + "info": {}, + "name": "Crimson Barb Wire Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "f6099561-b5ce-5e5f-8d2b-84cdbdc6a28a", + "description": "" + }, + "5a3f570b-2b8d-5764-b064-57c937ec201e": { + "category": "Unnamed", + "info": {}, + "name": "Sad Face T-Shirt [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "5a3f570b-2b8d-5764-b064-57c937ec201e", + "description": "" + }, + "ea3ce6d9-e936-575d-baf2-8de418d0be6f": { + "category": "Unnamed", + "info": {}, + "name": "Black Beret [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "ea3ce6d9-e936-575d-baf2-8de418d0be6f", + "description": "" + }, + "29635386-c7a8-5ef3-b521-e7495cfe688d": { + "category": "Unnamed", + "info": {}, + "name": "Desert Fatigue Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "29635386-c7a8-5ef3-b521-e7495cfe688d", + "description": "Does not affect gameplay. " + }, + "e25ee521-4fa0-5aa3-a4e4-6b12da2d911a": { + "category": "Unnamed", + "info": {}, + "name": "Psycho Biker Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "e25ee521-4fa0-5aa3-a4e4-6b12da2d911a", + "description": "Does not affect gameplay. " + }, + "2b622baf-286a-59be-91a9-b2733b9af0da": { + "category": "Unnamed", + "info": {}, + "name": "Urban Dreadnaught Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "2b622baf-286a-59be-91a9-b2733b9af0da", + "description": "" + }, + "a9fed9d5-dd9b-5be1-828a-d1776ea765f9": { + "category": "Unnamed", + "info": {}, + "name": "Urban Tech Elite", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "a9fed9d5-dd9b-5be1-828a-d1776ea765f9", + "description": "Does not affect gameplay. " + }, + "ad46b2e6-9c19-59d5-b15e-1fbca2f4c363": { + "category": "Unnamed", + "info": {}, + "name": "Black Dreadnaught Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "ad46b2e6-9c19-59d5-b15e-1fbca2f4c363", + "description": "" + }, + "3c5fe307-265c-52c4-86f4-140e21c08c37": { + "category": "Unnamed", + "info": {}, + "name": "Black Padded Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "3c5fe307-265c-52c4-86f4-140e21c08c37", + "description": "" + }, + "d796ab1e-8834-5f90-940e-d060181e4db2": { + "category": "Unnamed", + "info": {}, + "name": "Arkham Credits Attaché Case", + "video_url": "", + "data": {}, + "items": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 23000 + }, + "flags": 0, + "icon_url": "", + "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", + "type": 1, + "id": "d796ab1e-8834-5f90-940e-d060181e4db2", + "description": "23,000 Arkham Credits" + }, + "bad56cad-513f-5d0d-af22-fee2ec070369": { + "category": "Unnamed", + "info": {}, + "name": "Digital Combat Webbing", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "bad56cad-513f-5d0d-af22-fee2ec070369", + "description": "Does not affect gameplay. " + }, + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": { + "name": null, + "data": {}, + "flags": 2, + "icon_url": null, + "category_id": "c1b3a961-82af-570a-ae05-0d5037e1dd3c", + "type": 0, + "id": "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48", + "description": null + }, + "9d3df626-d393-5009-9f32-16a1cff0b267": { + "category": "Unnamed", + "info": {}, + "name": "Bullseye Plate Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "9d3df626-d393-5009-9f32-16a1cff0b267", + "description": "Does not affect gameplay. " + }, + "96ba0b3c-e980-5ffd-85b3-41053fc11f9c": { + "category": "Unnamed", + "info": {}, + "name": "Enhanced Vision Dampener", + "video_url": "", + "data": { + "gangland_sort_index": "5", + "gangland_effect_type": "6", + "gangland_effect_amount": "0.9", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "96ba0b3c-e980-5ffd-85b3-41053fc11f9c", + "description": "Further decreases visibility in the enemy's Enhanced Vision when you're in cover as an Elite." + }, + "92634890-8e4a-59d8-8254-76b7a03f0296": { + "category": "Unnamed", + "info": {}, + "name": "Urban Goggles [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "92634890-8e4a-59d8-8254-76b7a03f0296", + "description": "" + }, + "be9a6919-8258-5865-90fe-808e4f4d498e": { + "category": "Unnamed", + "info": {}, + "name": "Desert Spec Ops Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "be9a6919-8258-5865-90fe-808e4f4d498e", + "description": "" + }, + "b8e699d2-56ae-5116-882e-b16be7ddc4e3": { + "category": "Unnamed", + "info": {}, + "name": "Camo Balaclava [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "b8e699d2-56ae-5116-882e-b16be7ddc4e3", + "description": "" + }, + "ced6ae47-08b4-5733-89f3-8d83046f8d36": { + "category": "Unnamed", + "info": {}, + "name": "Broken Splotch Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "ced6ae47-08b4-5733-89f3-8d83046f8d36", + "description": "Does not affect gameplay. " + }, + "0cdd8987-6277-594d-bffa-1f92c9aa8d8b": { + "category": "Unnamed", + "info": {}, + "name": "Black Eye Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "0cdd8987-6277-594d-bffa-1f92c9aa8d8b", + "description": "" + }, + "9e01ddcc-4f86-5885-a23d-d2951392d452": { + "category": "Unnamed", + "info": {}, + "name": "Purple Trench Coat", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "9e01ddcc-4f86-5885-a23d-d2951392d452", + "description": "Does not affect gameplay. " + }, + "0db3f3e8-cef1-50d3-af75-818dcefb35cf": { + "category": "Unnamed", + "info": {}, + "name": "Arkham Credits Vault", + "video_url": "", + "data": {}, + "items": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 48000 + }, + "flags": 0, + "icon_url": "", + "category_id": "8a424bf2-3216-5cc3-a523-07f8feebafff", + "type": 1, + "id": "0db3f3e8-cef1-50d3-af75-818dcefb35cf", + "description": "48,000 Arkham Credits" + }, + "17d3ff47-0f74-5340-959c-d594ff8fc70e": { + "category": "Unnamed", + "info": {}, + "name": "Smiley Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "17d3ff47-0f74-5340-959c-d594ff8fc70e", + "description": "" + }, + "61a29180-3b3f-516c-94d0-a2a3f921bb1a": { + "category": "Unnamed", + "info": {}, + "name": "Purple T-Shirt [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "61a29180-3b3f-516c-94d0-a2a3f921bb1a", + "description": "" + }, + "e5f42b33-2231-50b6-9cef-171b219305f9": { + "category": "Unnamed", + "info": {}, + "name": "Melee Strength Boost", + "video_url": "", + "data": { + "gangland_sort_index": "11", + "gangland_effect_type": "5", + "gangland_effect_amount": "0.1", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "e5f42b33-2231-50b6-9cef-171b219305f9", + "description": "Melee strength increased as an Elite." + }, + "ae0dee2f-4667-5911-bbbf-dd92d0e394da": { + "category": "Unnamed", + "info": {}, + "name": "Blue-Eyed Egghead Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "ae0dee2f-4667-5911-bbbf-dd92d0e394da", + "description": "Does not affect gameplay. " + }, + "2375517d-779c-5cb2-a649-9fedcbbeed8f": { + "category": "Unnamed", + "info": {}, + "name": "Gray Boiler Suit [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "2375517d-779c-5cb2-a649-9fedcbbeed8f", + "description": "" + }, + "155f1451-3402-51d4-a6ce-4a931d90e329": { + "category": "Unnamed", + "info": {}, + "name": "Crimson Barb Wire Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "155f1451-3402-51d4-a6ce-4a931d90e329", + "description": "Does not affect gameplay. " + }, + "2dea863b-958d-5e49-9599-b9c6bbdea9e2": { + "category": "Unnamed", + "info": {}, + "name": "Urban Dreadnaught", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "2dea863b-958d-5e49-9599-b9c6bbdea9e2", + "description": "Does not affect gameplay. " + }, + "7eea9626-a613-5f62-9abb-58caccef11df": { + "category": "Unnamed", + "info": {}, + "name": "Black Spec Ops Cap", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "7eea9626-a613-5f62-9abb-58caccef11df", + "description": "Does not affect gameplay. " + }, + "10641885-ac66-51b8-bd3b-629aa0c5626c": { + "category": "Unnamed", + "info": {}, + "name": "Red Spiral Pug Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "10641885-ac66-51b8-bd3b-629aa0c5626c", + "description": "Does not affect gameplay. " + }, + "5d7f72ef-26d6-5e32-a9fd-65596c901d83": { + "category": "Unnamed", + "info": {}, + "name": "Forest Padded Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "5d7f72ef-26d6-5e32-a9fd-65596c901d83", + "description": "Does not affect gameplay. " + }, + "298ff904-0621-5c6f-bd8c-fba9b85330c5": { + "category": "Unnamed", + "info": {}, + "name": "Joker Face Biker Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "298ff904-0621-5c6f-bd8c-fba9b85330c5", + "description": "" + }, + "e13c5037-6070-5c30-bb9e-f6b66150df87": { + "category": "Unnamed", + "info": {}, + "name": "Urban Sharpshooter [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "e13c5037-6070-5c30-bb9e-f6b66150df87", + "description": "" + }, + "e20f67fb-c695-58ad-a4bb-ae32b582da47": { + "category": "Unnamed", + "info": {}, + "name": "Bane Symbol Face Paint [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "77be9ecc-e0f6-5412-9f70-0dc90282c8d3", + "type": 0, + "id": "e20f67fb-c695-58ad-a4bb-ae32b582da47", + "description": "" + }, + "58fd4343-7ff5-506e-854c-4c88f8ef3aa7": { + "category": "Unnamed", + "info": {}, + "name": "Black Combat Webbing [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "58fd4343-7ff5-506e-854c-4c88f8ef3aa7", + "description": "" + }, + "cd73aa76-7cad-5452-9062-ef7c98f97048": { + "category": "Unnamed", + "info": {}, + "name": "Urban Spec Ops Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "cd73aa76-7cad-5452-9062-ef7c98f97048", + "description": "" + }, + "bd8806db-35e3-5119-8ea5-72566b4b99c9": { + "category": "Unnamed", + "info": {}, + "name": "Cobblepot Satchel", + "video_url": "", + "data": { + "icon": "store_satchel" + }, + "flags": 0, + "icon_url": "", + "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", + "type": 2, + "id": "bd8806db-35e3-5119-8ea5-72566b4b99c9", + "description": "Contains:\r\n\r\n- 3 Gear Items\r\n- No Consumables\r\n\r\nIf all Gear and Gear+ Items have been unlocked, Consumables will be provided instead." + }, + "eab0edf8-1f75-5884-b626-277945112734": { + "category": "Unnamed", + "info": {}, + "name": "Headshot Protection Boost", + "video_url": "", + "data": { + "gangland_sort_index": "9", + "gangland_effect_type": "0", + "gangland_effect_amount": "0.08", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "eab0edf8-1f75-5884-b626-277945112734", + "description": "Take less damage from headshots as an Elite." + }, + "29091256-d940-5267-8848-37300953126d": { + "category": "Unnamed", + "info": {}, + "name": "Joker Face Biker Vest", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "29091256-d940-5267-8848-37300953126d", + "description": "Does not affect gameplay. " + }, + "7cad85bf-3f6e-5c41-bdcb-ac0a40e80a08": { + "category": "Unnamed", + "info": {}, + "name": "Desert Spec Ops Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "7cad85bf-3f6e-5c41-bdcb-ac0a40e80a08", + "description": "Does not affect gameplay. " + }, + "53f20659-b66b-58b0-b4c8-15f2ec92dba0": { + "category": "Unnamed", + "info": {}, + "name": "Desert Skull Helmet [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "53f20659-b66b-58b0-b4c8-15f2ec92dba0", + "description": "" + }, + "19536151-1bb1-5468-8f12-40faa062770c": { + "category": "Unnamed", + "info": {}, + "name": "Harley Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "19536151-1bb1-5468-8f12-40faa062770c", + "description": "" + }, + "30094b66-8a7b-5439-8d7f-a420959d3b14": { + "category": "Unnamed", + "info": {}, + "name": "Skeleton Work Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "30094b66-8a7b-5439-8d7f-a420959d3b14", + "description": "Does not affect gameplay. " + }, + "303e0bb9-6884-5d08-95b7-dc9a953e3e2e": { + "category": "Unnamed", + "info": {}, + "name": "Tribal Tattoo [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "4181d300-f5ac-5d2f-905e-11a309d5a0f9", + "type": 0, + "id": "303e0bb9-6884-5d08-95b7-dc9a953e3e2e", + "description": "" + }, + "90bcf491-756a-5771-9d49-b290f3e86ea6": { + "category": "Unnamed", + "info": {}, + "name": "Desert Sharpshooter", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "90bcf491-756a-5771-9d49-b290f3e86ea6", + "description": "Does not affect gameplay. " + }, + "c363c0de-6b2c-5036-8a38-755638c20af7": { + "category": "Unnamed", + "info": {}, + "name": "Broken Splotch Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "c363c0de-6b2c-5036-8a38-755638c20af7", + "description": "" + }, + "a82f2b24-f8ca-5b68-880e-3becec1fcf76": { + "category": "Unnamed", + "info": {}, + "name": "Bearded Pointy Mask [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "a82f2b24-f8ca-5b68-880e-3becec1fcf76", + "description": "" + }, + "2a64ee0b-9e0e-5e7a-a430-5b1922ba687d": { + "category": "Unnamed", + "info": {}, + "name": "Olive Spec Ops Cap [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "2a64ee0b-9e0e-5e7a-a430-5b1922ba687d", + "description": "" + }, + "4980150b-85ee-5591-be5c-1010d91860d1": { + "category": "Unnamed", + "info": {}, + "name": "Blue Work Pants [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "4980150b-85ee-5591-be5c-1010d91860d1", + "description": "" + }, + "6b6dcbb0-7f9d-564e-926a-f2ec53e91ebd": { + "category": "Unnamed", + "info": {}, + "name": "Green Beret", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "6b6dcbb0-7f9d-564e-926a-f2ec53e91ebd", + "description": "Does not affect gameplay. " + }, + "06665c23-862a-5470-81da-1e83edb1cfd9": { + "category": "Unnamed", + "info": {}, + "name": "Red Hoodie [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "06665c23-862a-5470-81da-1e83edb1cfd9", + "description": "" + }, + "832bbb47-3a84-594e-8baa-8d3fec47a61b": { + "category": "Unnamed", + "info": {}, + "name": "T-Shirt [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "832bbb47-3a84-594e-8baa-8d3fec47a61b", + "description": "" + }, + "39b67c98-58c5-5dbe-8d43-5980f2c0dafe": { + "category": "Unnamed", + "info": {}, + "name": "Green Biker Jacket", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "39b67c98-58c5-5dbe-8d43-5980f2c0dafe", + "description": "Does not affect gameplay. " + }, + "c2f0911c-837e-5867-898b-9a2e678ff55f": { + "category": "Unnamed", + "info": {}, + "name": "XP Boost", + "video_url": "", + "data": { + "gangland_sort_index": "0", + "gangland_effect_type": "10", + "gangland_effect_amount": "0.1", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "8aa835f2-d8a0-52e2-81af-d10c87fdf80d", + "type": 0, + "id": "c2f0911c-837e-5867-898b-9a2e678ff55f", + "description": "Completed matches earn more XP overall." + }, + "eef0b77b-92e4-54f5-9ff8-f6eb449be87d": { + "category": "Unnamed", + "info": {}, + "name": "Health Regeneration Boost", + "video_url": "", + "data": { + "gangland_sort_index": "10", + "gangland_effect_type": "7", + "gangland_effect_amount": "0.06", + "gangland_is_consumable": "1" + }, + "flags": 2, + "icon_url": "", + "category_id": "86ca8986-94a4-57f0-9287-40b7ac4bebc1", + "type": 0, + "id": "eef0b77b-92e4-54f5-9ff8-f6eb449be87d", + "description": "Health regeneration delay is reduced as an Elite." + }, + "4df702f1-31c2-54ad-accb-a46602c7e7c4": { + "category": "Unnamed", + "info": {}, + "name": "Urban Sharpshooter", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "4df702f1-31c2-54ad-accb-a46602c7e7c4", + "description": "Does not affect gameplay. " + }, + "c89233dc-d60f-5e04-97de-6a254bbc24eb": { + "category": "Unnamed", + "info": {}, + "name": "Striped Hoodie [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "c89233dc-d60f-5e04-97de-6a254bbc24eb", + "description": "" + }, + "55dc08e8-7bd8-57f4-aa50-df4a12fc9f78": { + "category": "Unnamed", + "info": {}, + "name": "Urban Spec Ops Cap [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "55dc08e8-7bd8-57f4-aa50-df4a12fc9f78", + "description": "" + }, + "e9d29b33-5186-5abd-b377-71849795a9ba": { + "category": "Unnamed", + "info": {}, + "name": "Tartan Prison Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "e9d29b33-5186-5abd-b377-71849795a9ba", + "description": "Does not affect gameplay. " + }, + "098bcb39-486b-559a-bc7e-8cac8fbed123": { + "category": "Unnamed", + "info": {}, + "name": "Black Jumper [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "098bcb39-486b-559a-bc7e-8cac8fbed123", + "description": "" + }, + "25bd3605-4988-589f-b65a-4ecd60b90e90": { + "category": "Unnamed", + "info": {}, + "name": "Forest Tactical Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "25bd3605-4988-589f-b65a-4ecd60b90e90", + "description": "Does not affect gameplay. " + }, + "f8f8230a-9ad7-55bd-a03f-cfe0e923f1eb": { + "category": "Unnamed", + "info": {}, + "name": "Urban Spec Ops Pants", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "f8f8230a-9ad7-55bd-a03f-cfe0e923f1eb", + "description": "Does not affect gameplay. " + }, + "485f598f-e875-5e24-b184-3b3800eaec29": { + "category": "Unnamed", + "info": {}, + "name": "CobblepotTier0", + "video_url": "", + "data": { + "icon": "store_tier0" + }, + "flags": 0, + "icon_url": "", + "category_id": "2a6e32a9-e907-5393-81a4-172e35e8039f", + "type": 2, + "id": "485f598f-e875-5e24-b184-3b3800eaec29", + "description": "" + }, + "a037be91-f119-56e0-bab7-bcf0e1d0a880": { + "category": "Unnamed", + "info": {}, + "name": "Clown Stitched Mask", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "da0223c3-741f-52b9-afb7-f0796892279b", + "type": 0, + "id": "a037be91-f119-56e0-bab7-bcf0e1d0a880", + "description": "Does not affect gameplay. " + }, + "85bc6f3c-2e82-59fc-8dcc-a0288400f5ec": { + "category": "Unnamed", + "info": {}, + "name": "Green Barb Wire Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "85bc6f3c-2e82-59fc-8dcc-a0288400f5ec", + "description": "" + }, + "15cec100-69f4-5985-8f6e-8c4bd21f8223": { + "category": "Unnamed", + "info": {}, + "name": "Forest Padded Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "15cec100-69f4-5985-8f6e-8c4bd21f8223", + "description": "" + }, + "a0fd3e26-b2ab-5230-b34a-3427dca4652f": { + "category": "Unnamed", + "info": {}, + "name": "Lunatic Biker Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "a0fd3e26-b2ab-5230-b34a-3427dca4652f", + "description": "" + }, + "efd4446d-36c4-52bc-a91c-d01d0fe8ae76": { + "category": "Unnamed", + "info": {}, + "name": "Muscle Vest [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "6ce6144c-3865-5c34-a08f-b0dc74e88440", + "type": 0, + "id": "efd4446d-36c4-52bc-a91c-d01d0fe8ae76", + "description": "" + }, + "b46071b9-5a2f-5bc1-a43b-ea833cd14032": { + "category": "Unnamed", + "info": {}, + "name": "Green Boiler Suit [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "60321164-05df-523e-82fa-48839fd4e9b1", + "type": 0, + "id": "b46071b9-5a2f-5bc1-a43b-ea833cd14032", + "description": "" + }, + "42275279-8193-5f8a-8360-68632accabdc": { + "category": "Unnamed", + "info": {}, + "name": "Skinny Black Jeans [+]", + "video_url": "", + "data": {}, + "flags": 1, + "icon_url": "", + "category_id": "b9d06d06-a0f6-545f-a214-628e8be9be13", + "type": 0, + "id": "42275279-8193-5f8a-8360-68632accabdc", + "description": "" + } + } } \ No newline at end of file diff --git a/basecfg/config.json b/basecfg/config.json index 4bd4bbe..978d07a 100644 --- a/basecfg/config.json +++ b/basecfg/config.json @@ -1,51 +1,17 @@ { "host": { - "public": "./web/", - "domain": "example.com", "http_port": 80, "https_port": 443, - "https_enabled": true, + "https_enabled": false, "localhost_passthrough_port": 8080, - "localhost_passthrough_enabled": false, + "localhost_passthrough_enabled": true, "https_key": "./ssl/privkey.pem", - "https_cert": "./ssl/cert.pem", - "keepalive_timeout": 5, - "show_port": false + "https_cert": "./ssl/fullchain.pem", + "keepalive_timeout": 5 }, "database": { "path": "./database.db", "wipe_on_start": false }, - "localhost": "0.0.0.0", - "debug": true, - "discord_bot": { - "enabled": true, - "commands_md5": "", - "status": "online", - "activity_type": "playing", - "activity": "Arkham Origins Online", - "maps": { - "any": { - "name": "Any Map", - "thumbnail": "https://i.imgur.com/vjI4tjw.png" - }, - "mp_wcp": { - "name": "Wayne Chemical Plant", - "thumbnail": "https://i.imgur.com/f1Yqnq2.png" - }, - "mp_prison": { - "name": "Blackgate Prison", - "thumbnail": "https://i.imgur.com/lLfK8D2.png" - }, - "mp_funhouse": { - "name": "Joker's Funhouse", - "thumbnail": "https://i.imgur.com/cuYmkn8.png" - }, - "mp_robotfactory": { - "name": "Wonder City Robot Factory", - "thumbnail": "https://i.imgur.com/PI0Ssj0.png" - } - } - }, - "appid": "209000" + "debug": true } \ No newline at end of file diff --git a/basecfg/credits.json b/basecfg/credits.json index 36f4066..bacec56 100644 --- a/basecfg/credits.json +++ b/basecfg/credits.json @@ -1,7 +1,7 @@ -{ - "total_count": 0, - "next_page": 0, - "items": [], - "page": 0, - "pages": 0 +{ + "total_count": 0, + "next_page": 0, + "items": [], + "page": 0, + "pages": 0 } \ No newline at end of file diff --git a/basecfg/inventory.json b/basecfg/inventory.json index e73811b..eb50b8b 100644 --- a/basecfg/inventory.json +++ b/basecfg/inventory.json @@ -1,218 +1,218 @@ -{ - "inventory": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 0, - "33d7d293-4e0c-5876-8244-ecb8b962e663": 1, - "daec50d1-1cd9-5128-9b76-03437bd3e813": 1, - "d4a45ab8-17ac-5741-88cd-a3c1a30adb5f": 1, - "4980150b-85ee-5591-be5c-1010d91860d1": 1, - "d2783dae-cd2a-5bf3-94bc-c1c24b2431a1": 1, - "39ef35d9-6858-5c52-b935-968caeaf4f41": 1, - "905376cd-17ae-5d4d-9fe6-b60420d72065": 1, - "83d3df6c-5f06-5c77-a856-3edc8ba5e4d6": 1, - "46a4e04f-e600-5342-baa1-63bbef6ab7b3": 1, - "0c825b60-661f-5971-86c0-13a3c55a9e0f": 1, - "7f1c24c6-1ac2-5a5b-a78a-b883ebc45de4": 1, - "d19a2420-ce9e-5cc0-a6bb-9382d1cdfc5e": 1, - "43149088-b9e9-524a-b447-dfdcdaaa49e3": 1, - "be4f89ab-0cde-5705-9b44-c55fbd00f80f": 1, - "3553c47c-305f-5559-9af1-31fb00f3941a": 1, - "89667fb4-ff92-5396-802b-d93b31103d61": 1, - "db3189ea-6baa-53aa-84f5-208cc135c573": 1, - "d4c16930-2657-513d-ac0d-b340501b8d10": 1, - "78e400a8-43e8-58b8-8910-004b2adcc377": 1, - "ed325e9c-590a-5ee9-a471-0d0e6565a734": 1, - "242fa84e-3343-544a-9bf5-5927dfd36036": 1, - "6e73b30e-aca4-5415-8255-b691e643139e": 1, - "3dd13c1f-7571-542b-8b1a-720d67a439a3": 1, - "80f12c0c-95d8-5535-81d3-595abadd736b": 1, - "370f1a88-706f-5e71-9f84-2d698e81110b": 1, - "d72db4ba-fd03-5f75-a853-facfb0b7fe80": 1, - "3fca6927-d0f9-55a2-82a5-84ef648740a4": 1, - "fb81f0ff-6874-5f2b-a3ee-d04cad63f700": 1, - "8f90dd55-f329-5b89-a58d-b08a283b8739": 1, - "cbbb5918-921c-5ac1-b5df-32cd1ed5274d": 1, - "50884d5b-cae3-5d57-b2b3-3117b3ecb6f7": 1, - "106b5372-692a-5274-b7b9-b2db0a1c8565": 1, - "4210042c-7a56-5096-8ae0-c0f951283682": 1, - "5a825afc-f044-500d-84b9-b6fe90fc4dd3": 1, - "1664129b-5138-5449-80bb-efbe4b9e2b2b": 1, - "a2bd565b-fe43-501a-b74b-0e12700809c1": 1, - "b0c49275-1f30-54c2-8447-f7e5f853ed97": 1, - "2136273d-f112-527f-abaa-49338df72fc9": 1, - "0d63ae61-3bdd-58d9-871b-3754e999384b": 1, - "1ec1d7a4-a599-5ed2-8dbc-b768d606b092": 1, - "6299724a-e05e-55c0-9354-47eb3eb8c8ea": 1, - "8252b5b4-3155-5a39-a688-f27a0878e68f": 1, - "97d2e77c-3164-57a4-a956-168633395e3f": 1, - "5422e0d2-d9d0-5976-970e-95fc3f460f65": 1, - "0730309a-b639-5fc2-a208-eadfd4a9632a": 1, - "cc6b5317-71e3-57ca-a41e-ac695183ec1a": 1, - "965e52e3-6c3c-5ba0-8e59-7e357aebf892": 1, - "5ebc15e3-d25e-5c1f-bad6-3f5c0e3048f1": 1, - "3ac9f771-f76f-55d2-9abc-d1be5b207a69": 1, - "5f5a6672-8feb-57c4-93f3-c04c58579792": 1, - "2b65e398-8c9b-5038-b565-5c8e9a627ee9": 1, - "95af4ac7-bfe1-5211-b0b1-0ff0edc7acd9": 1, - "77b70c38-72af-54b7-a66f-1c58cc9240d1": 1, - "deca4f06-e3bc-51ef-8618-30d91a1e4019": 1, - "b3fbc4e7-dfb3-5e51-a37d-7600663c0f7a": 1, - "d9db5659-866a-5d86-9390-73776e45d478": 1, - "998c2a58-7c92-5ac0-b6cb-1ad8ce67c36c": 1, - "22343ef8-88cb-5286-8e6a-7f035f2e4888": 1, - "0a9820c4-5f15-5e92-a756-7651e55cf468": 1, - "5b0c5983-d7bd-56eb-9837-46b5e213f34b": 1, - "898f8a75-a7e2-54b3-a33d-3881439b81a6": 1, - "468522fc-06f0-5bd7-9ff9-2e4fd398da4c": 1, - "04bf6050-ec9a-5d61-8557-dd0e7fbde1bb": 1, - "2686bf4d-bafc-50fb-9b81-0d752f034bcd": 1, - "c1d36531-9f1e-59f3-b88c-1694961f187a": 1, - "230047b4-86d1-5d07-9aa6-3b9fe474ac7b": 1, - "e08c6ca3-a0de-5e38-8b32-3a701b5a08c4": 1, - "fb2c7561-b819-5375-95ec-d6f385a48594": 1, - "42811dda-6222-5812-80f2-37b2cebc380c": 1, - "c83216ff-3935-5e09-8fca-70348f088d5e": 1, - "62bad3da-25c8-5a15-87cb-2cabc892894a": 1, - "5972e7af-f80f-5887-b58a-05f865b6d4f0": 1, - "8b8c0557-71e1-56af-a5a6-abbd76ffbbaa": 1, - "90b006b8-5e3b-57f8-bca3-f31c19d23947": 1, - "32f5d5a2-8c28-5fe5-a585-b8387f2cbb9e": 1, - "7571877f-6ef1-53e8-821e-247d1750bc3d": 1, - "2a2bf781-a732-50a7-828f-ee1f9c6d2aea": 1, - "cc25a278-2c3a-5d55-9533-755fa31a17f9": 1, - "edba1c6a-a338-52e4-b7b9-f1574156a8fd": 1, - "9d638a55-2a0e-5c4d-bf02-e8fac413f8bb": 1, - "a888ff95-c79a-5f1c-baaf-ffe2e48d5f0f": 1, - "5230d5a1-eadc-5c23-99f1-56adc9ed7587": 1, - "0af9beae-04fa-5449-8032-6fc13e37e05e": 1, - "64cef0f7-80dd-5d8c-863d-bff94f7b8a19": 1, - "187b5928-5376-50ec-8458-471bdafc6158": 1, - "ad3b438d-647e-52e4-ad51-b5493f52fbae": 1, - "17b12b73-aea3-5616-b995-9a8c860873f0": 1, - "041b63f9-bda4-55dd-ba26-89bd59d03234": 1, - "d5d4d583-e196-510f-9593-eb6d0e3d48d2": 1, - "f168b7db-f686-5a22-ac33-550445ccecd7": 1, - "e974982c-83e2-52b5-b0c6-224d5f555792": 1, - "07c5e196-a2a3-58c1-abc8-002625201502": 1, - "8df2d526-a5c4-5328-9c83-33d8cd2b4375": 1, - "b6e50173-3fd7-553b-8685-6d55140f3235": 1, - "17bccb09-d281-5709-95aa-f00d9a3fff22": 1, - "63958458-a057-5790-97e0-0a02a04109b1": 1, - "3b8aec9e-da1e-57ef-ac06-783602c43bd2": 1, - "6d4b585e-3df5-589d-9934-f452b96a05b7": 1, - "b176b377-58b2-5dfd-afd2-c68bfebacd34": 1, - "29d176da-4cbd-5c4f-ac25-1ac7623ca786": 1, - "de53f670-20a3-55be-bc3b-1357035b37a4": 1, - "da656c84-ae19-5c5a-8969-783183569674": 1, - "584a0b03-d188-524d-a6b3-0e48c5f4a37a": 1, - "1be2a1f1-974b-59aa-8409-8a89b2708980": 1, - "d89169f3-8c30-5568-b19c-a72765928f1d": 1, - "0d4155f6-3408-5bab-aaab-94d9978ef2c3": 1, - "d4d32198-d667-5225-8759-0f0db5d5f53a": 1, - "592863e8-e033-5756-b09d-8b5765f96462": 1, - "dd7e8e6c-05f1-5870-9b4b-c23b70d93229": 1, - "37236f9a-2a8d-566a-9efe-d40cb7d83c32": 1, - "5275d629-59a8-5bf4-b8c2-bad7cf1c9880": 1, - "42f30419-caad-5b4a-b589-1d5b8ccbb20e": 1, - "eb0b64b4-3b21-50ff-b69c-4556545c15db": 1, - "22d5dd7f-80cb-5699-bfa0-555729e58a14": 1, - "92b94f0c-b423-5636-8529-1a8952a06fa9": 1, - "0ccb20fe-d396-5461-b809-dc5684588f23": 1, - "6ece8ea9-398e-5735-9193-a3517cfc7644": 1, - "48f970ea-ea39-5d8d-8d54-297a686b4cae": 1, - "0ada9d81-8aba-5713-b317-bfaea5b94c05": 1, - "57acc6c7-d1d9-5a8d-a567-64174dd194f2": 1, - "0a93b502-e83a-57ba-b380-440cd493394e": 1, - "8fe88422-f999-587f-ac1a-7bc8b53037f5": 1, - "c18ab043-4ca2-5094-aedd-2aa3901e531a": 1, - "2f6ffc36-88a4-5384-8507-2ffdff781b51": 1, - "44fc57fd-4cc1-58f4-b5d9-ce280616f398": 1, - "f10ff1e2-6f0d-5c11-92e8-061981a339ea": 1, - "849066c4-ab47-570b-8037-cf11eb98b320": 1, - "793452ac-ab1a-52f4-b31c-54671b798dfe": 1, - "9e0ef26f-aa1d-5c0c-922c-0149df5240de": 1, - "1d952f2a-beaa-5aa2-9ea8-be8beea7f716": 1, - "b371db3f-4c2f-57a8-a5f3-d331d2ed598c": 1, - "a803cc5f-894a-5c0c-9f23-cab384e0eabc": 1, - "43c9eaca-d143-5672-bd2e-a2dcc6ee162d": 1, - "30cf37cd-195a-50c7-af77-3b5a1f35d5f1": 1, - "2102dfed-59ae-546e-a97c-4145f3a90492": 1, - "163c54a2-7471-501b-8499-d07c2388e175": 1, - "8e1da17d-1b23-5027-b8c8-7369dbac5d88": 1, - "a27481c7-25a9-5142-9dbb-ca4c1a7aff6f": 1, - "f613474c-025f-5395-89ce-589c534cdd1f": 1, - "fa2a4836-e7fe-5c9e-8954-990fdf2b2040": 1, - "20d61ef2-b29b-5052-8627-23f1c5b4b925": 1, - "6f17054f-33bb-5f5f-8da0-092ba48c5521": 1, - "30b4b018-7857-5f6f-8d10-be9c184f1587": 1, - "73a1b767-ad4c-5408-ba38-5b3e6b89686f": 1, - "0ac1a6d3-bb30-5a21-953a-39468e778498": 1, - "f6099561-b5ce-5e5f-8d2b-84cdbdc6a28a": 1, - "5a3f570b-2b8d-5764-b064-57c937ec201e": 1, - "ea3ce6d9-e936-575d-baf2-8de418d0be6f": 1, - "29635386-c7a8-5ef3-b521-e7495cfe688d": 1, - "e25ee521-4fa0-5aa3-a4e4-6b12da2d911a": 1, - "2b622baf-286a-59be-91a9-b2733b9af0da": 1, - "a9fed9d5-dd9b-5be1-828a-d1776ea765f9": 1, - "ad46b2e6-9c19-59d5-b15e-1fbca2f4c363": 1, - "3c5fe307-265c-52c4-86f4-140e21c08c37": 1, - "d796ab1e-8834-5f90-940e-d060181e4db2": 1, - "bad56cad-513f-5d0d-af22-fee2ec070369": 1, - "9d3df626-d393-5009-9f32-16a1cff0b267": 1, - "96ba0b3c-e980-5ffd-85b3-41053fc11f9c": 1, - "92634890-8e4a-59d8-8254-76b7a03f0296": 1, - "be9a6919-8258-5865-90fe-808e4f4d498e": 1, - "b8e699d2-56ae-5116-882e-b16be7ddc4e3": 1, - "ced6ae47-08b4-5733-89f3-8d83046f8d36": 1, - "0cdd8987-6277-594d-bffa-1f92c9aa8d8b": 1, - "9e01ddcc-4f86-5885-a23d-d2951392d452": 1, - "0db3f3e8-cef1-50d3-af75-818dcefb35cf": 1, - "17d3ff47-0f74-5340-959c-d594ff8fc70e": 1, - "61a29180-3b3f-516c-94d0-a2a3f921bb1a": 1, - "e5f42b33-2231-50b6-9cef-171b219305f9": 1, - "ae0dee2f-4667-5911-bbbf-dd92d0e394da": 1, - "2375517d-779c-5cb2-a649-9fedcbbeed8f": 1, - "155f1451-3402-51d4-a6ce-4a931d90e329": 1, - "2dea863b-958d-5e49-9599-b9c6bbdea9e2": 1, - "7eea9626-a613-5f62-9abb-58caccef11df": 1, - "10641885-ac66-51b8-bd3b-629aa0c5626c": 1, - "5d7f72ef-26d6-5e32-a9fd-65596c901d83": 1, - "298ff904-0621-5c6f-bd8c-fba9b85330c5": 1, - "e13c5037-6070-5c30-bb9e-f6b66150df87": 1, - "e20f67fb-c695-58ad-a4bb-ae32b582da47": 1, - "58fd4343-7ff5-506e-854c-4c88f8ef3aa7": 1, - "cd73aa76-7cad-5452-9062-ef7c98f97048": 1, - "bd8806db-35e3-5119-8ea5-72566b4b99c9": 1, - "eab0edf8-1f75-5884-b626-277945112734": 1, - "29091256-d940-5267-8848-37300953126d": 1, - "7cad85bf-3f6e-5c41-bdcb-ac0a40e80a08": 1, - "53f20659-b66b-58b0-b4c8-15f2ec92dba0": 1, - "19536151-1bb1-5468-8f12-40faa062770c": 1, - "30094b66-8a7b-5439-8d7f-a420959d3b14": 1, - "303e0bb9-6884-5d08-95b7-dc9a953e3e2e": 1, - "90bcf491-756a-5771-9d49-b290f3e86ea6": 1, - "c363c0de-6b2c-5036-8a38-755638c20af7": 1, - "a82f2b24-f8ca-5b68-880e-3becec1fcf76": 1, - "2a64ee0b-9e0e-5e7a-a430-5b1922ba687d": 1, - "6b6dcbb0-7f9d-564e-926a-f2ec53e91ebd": 1, - "06665c23-862a-5470-81da-1e83edb1cfd9": 1, - "832bbb47-3a84-594e-8baa-8d3fec47a61b": 1, - "39b67c98-58c5-5dbe-8d43-5980f2c0dafe": 1, - "c2f0911c-837e-5867-898b-9a2e678ff55f": 1, - "eef0b77b-92e4-54f5-9ff8-f6eb449be87d": 1, - "4df702f1-31c2-54ad-accb-a46602c7e7c4": 1, - "c89233dc-d60f-5e04-97de-6a254bbc24eb": 1, - "55dc08e8-7bd8-57f4-aa50-df4a12fc9f78": 1, - "e9d29b33-5186-5abd-b377-71849795a9ba": 1, - "098bcb39-486b-559a-bc7e-8cac8fbed123": 1, - "25bd3605-4988-589f-b65a-4ecd60b90e90": 1, - "f8f8230a-9ad7-55bd-a03f-cfe0e923f1eb": 1, - "485f598f-e875-5e24-b184-3b3800eaec29": 1, - "a037be91-f119-56e0-bab7-bcf0e1d0a880": 1, - "85bc6f3c-2e82-59fc-8dcc-a0288400f5ec": 1, - "15cec100-69f4-5985-8f6e-8c4bd21f8223": 1, - "a0fd3e26-b2ab-5230-b34a-3427dca4652f": 1, - "efd4446d-36c4-52bc-a91c-d01d0fe8ae76": 1, - "b46071b9-5a2f-5bc1-a43b-ea833cd14032": 1, - "42275279-8193-5f8a-8360-68632accabdc": 1 - } +{ + "inventory": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 0, + "33d7d293-4e0c-5876-8244-ecb8b962e663": 1, + "daec50d1-1cd9-5128-9b76-03437bd3e813": 1, + "d4a45ab8-17ac-5741-88cd-a3c1a30adb5f": 1, + "4980150b-85ee-5591-be5c-1010d91860d1": 1, + "d2783dae-cd2a-5bf3-94bc-c1c24b2431a1": 1, + "39ef35d9-6858-5c52-b935-968caeaf4f41": 1, + "905376cd-17ae-5d4d-9fe6-b60420d72065": 1, + "83d3df6c-5f06-5c77-a856-3edc8ba5e4d6": 1, + "46a4e04f-e600-5342-baa1-63bbef6ab7b3": 1, + "0c825b60-661f-5971-86c0-13a3c55a9e0f": 1, + "7f1c24c6-1ac2-5a5b-a78a-b883ebc45de4": 1, + "d19a2420-ce9e-5cc0-a6bb-9382d1cdfc5e": 1, + "43149088-b9e9-524a-b447-dfdcdaaa49e3": 1, + "be4f89ab-0cde-5705-9b44-c55fbd00f80f": 1, + "3553c47c-305f-5559-9af1-31fb00f3941a": 1, + "89667fb4-ff92-5396-802b-d93b31103d61": 1, + "db3189ea-6baa-53aa-84f5-208cc135c573": 1, + "d4c16930-2657-513d-ac0d-b340501b8d10": 1, + "78e400a8-43e8-58b8-8910-004b2adcc377": 1, + "ed325e9c-590a-5ee9-a471-0d0e6565a734": 1, + "242fa84e-3343-544a-9bf5-5927dfd36036": 1, + "6e73b30e-aca4-5415-8255-b691e643139e": 1, + "3dd13c1f-7571-542b-8b1a-720d67a439a3": 1, + "80f12c0c-95d8-5535-81d3-595abadd736b": 1, + "370f1a88-706f-5e71-9f84-2d698e81110b": 1, + "d72db4ba-fd03-5f75-a853-facfb0b7fe80": 1, + "3fca6927-d0f9-55a2-82a5-84ef648740a4": 1, + "fb81f0ff-6874-5f2b-a3ee-d04cad63f700": 1, + "8f90dd55-f329-5b89-a58d-b08a283b8739": 1, + "cbbb5918-921c-5ac1-b5df-32cd1ed5274d": 1, + "50884d5b-cae3-5d57-b2b3-3117b3ecb6f7": 1, + "106b5372-692a-5274-b7b9-b2db0a1c8565": 1, + "4210042c-7a56-5096-8ae0-c0f951283682": 1, + "5a825afc-f044-500d-84b9-b6fe90fc4dd3": 1, + "1664129b-5138-5449-80bb-efbe4b9e2b2b": 1, + "a2bd565b-fe43-501a-b74b-0e12700809c1": 1, + "b0c49275-1f30-54c2-8447-f7e5f853ed97": 1, + "2136273d-f112-527f-abaa-49338df72fc9": 1, + "0d63ae61-3bdd-58d9-871b-3754e999384b": 1, + "1ec1d7a4-a599-5ed2-8dbc-b768d606b092": 1, + "6299724a-e05e-55c0-9354-47eb3eb8c8ea": 1, + "8252b5b4-3155-5a39-a688-f27a0878e68f": 1, + "97d2e77c-3164-57a4-a956-168633395e3f": 1, + "5422e0d2-d9d0-5976-970e-95fc3f460f65": 1, + "0730309a-b639-5fc2-a208-eadfd4a9632a": 1, + "cc6b5317-71e3-57ca-a41e-ac695183ec1a": 1, + "965e52e3-6c3c-5ba0-8e59-7e357aebf892": 1, + "5ebc15e3-d25e-5c1f-bad6-3f5c0e3048f1": 1, + "3ac9f771-f76f-55d2-9abc-d1be5b207a69": 1, + "5f5a6672-8feb-57c4-93f3-c04c58579792": 1, + "2b65e398-8c9b-5038-b565-5c8e9a627ee9": 1, + "95af4ac7-bfe1-5211-b0b1-0ff0edc7acd9": 1, + "77b70c38-72af-54b7-a66f-1c58cc9240d1": 1, + "deca4f06-e3bc-51ef-8618-30d91a1e4019": 1, + "b3fbc4e7-dfb3-5e51-a37d-7600663c0f7a": 1, + "d9db5659-866a-5d86-9390-73776e45d478": 1, + "998c2a58-7c92-5ac0-b6cb-1ad8ce67c36c": 1, + "22343ef8-88cb-5286-8e6a-7f035f2e4888": 1, + "0a9820c4-5f15-5e92-a756-7651e55cf468": 1, + "5b0c5983-d7bd-56eb-9837-46b5e213f34b": 1, + "898f8a75-a7e2-54b3-a33d-3881439b81a6": 1, + "468522fc-06f0-5bd7-9ff9-2e4fd398da4c": 1, + "04bf6050-ec9a-5d61-8557-dd0e7fbde1bb": 1, + "2686bf4d-bafc-50fb-9b81-0d752f034bcd": 1, + "c1d36531-9f1e-59f3-b88c-1694961f187a": 1, + "230047b4-86d1-5d07-9aa6-3b9fe474ac7b": 1, + "e08c6ca3-a0de-5e38-8b32-3a701b5a08c4": 1, + "fb2c7561-b819-5375-95ec-d6f385a48594": 1, + "42811dda-6222-5812-80f2-37b2cebc380c": 1, + "c83216ff-3935-5e09-8fca-70348f088d5e": 1, + "62bad3da-25c8-5a15-87cb-2cabc892894a": 1, + "5972e7af-f80f-5887-b58a-05f865b6d4f0": 1, + "8b8c0557-71e1-56af-a5a6-abbd76ffbbaa": 1, + "90b006b8-5e3b-57f8-bca3-f31c19d23947": 1, + "32f5d5a2-8c28-5fe5-a585-b8387f2cbb9e": 1, + "7571877f-6ef1-53e8-821e-247d1750bc3d": 1, + "2a2bf781-a732-50a7-828f-ee1f9c6d2aea": 1, + "cc25a278-2c3a-5d55-9533-755fa31a17f9": 1, + "edba1c6a-a338-52e4-b7b9-f1574156a8fd": 1, + "9d638a55-2a0e-5c4d-bf02-e8fac413f8bb": 1, + "a888ff95-c79a-5f1c-baaf-ffe2e48d5f0f": 1, + "5230d5a1-eadc-5c23-99f1-56adc9ed7587": 1, + "0af9beae-04fa-5449-8032-6fc13e37e05e": 1, + "64cef0f7-80dd-5d8c-863d-bff94f7b8a19": 1, + "187b5928-5376-50ec-8458-471bdafc6158": 1, + "ad3b438d-647e-52e4-ad51-b5493f52fbae": 1, + "17b12b73-aea3-5616-b995-9a8c860873f0": 1, + "041b63f9-bda4-55dd-ba26-89bd59d03234": 1, + "d5d4d583-e196-510f-9593-eb6d0e3d48d2": 1, + "f168b7db-f686-5a22-ac33-550445ccecd7": 1, + "e974982c-83e2-52b5-b0c6-224d5f555792": 1, + "07c5e196-a2a3-58c1-abc8-002625201502": 1, + "8df2d526-a5c4-5328-9c83-33d8cd2b4375": 1, + "b6e50173-3fd7-553b-8685-6d55140f3235": 1, + "17bccb09-d281-5709-95aa-f00d9a3fff22": 1, + "63958458-a057-5790-97e0-0a02a04109b1": 1, + "3b8aec9e-da1e-57ef-ac06-783602c43bd2": 1, + "6d4b585e-3df5-589d-9934-f452b96a05b7": 1, + "b176b377-58b2-5dfd-afd2-c68bfebacd34": 1, + "29d176da-4cbd-5c4f-ac25-1ac7623ca786": 1, + "de53f670-20a3-55be-bc3b-1357035b37a4": 1, + "da656c84-ae19-5c5a-8969-783183569674": 1, + "584a0b03-d188-524d-a6b3-0e48c5f4a37a": 1, + "1be2a1f1-974b-59aa-8409-8a89b2708980": 1, + "d89169f3-8c30-5568-b19c-a72765928f1d": 1, + "0d4155f6-3408-5bab-aaab-94d9978ef2c3": 1, + "d4d32198-d667-5225-8759-0f0db5d5f53a": 1, + "592863e8-e033-5756-b09d-8b5765f96462": 1, + "dd7e8e6c-05f1-5870-9b4b-c23b70d93229": 1, + "37236f9a-2a8d-566a-9efe-d40cb7d83c32": 1, + "5275d629-59a8-5bf4-b8c2-bad7cf1c9880": 1, + "42f30419-caad-5b4a-b589-1d5b8ccbb20e": 1, + "eb0b64b4-3b21-50ff-b69c-4556545c15db": 1, + "22d5dd7f-80cb-5699-bfa0-555729e58a14": 1, + "92b94f0c-b423-5636-8529-1a8952a06fa9": 1, + "0ccb20fe-d396-5461-b809-dc5684588f23": 1, + "6ece8ea9-398e-5735-9193-a3517cfc7644": 1, + "48f970ea-ea39-5d8d-8d54-297a686b4cae": 1, + "0ada9d81-8aba-5713-b317-bfaea5b94c05": 1, + "57acc6c7-d1d9-5a8d-a567-64174dd194f2": 1, + "0a93b502-e83a-57ba-b380-440cd493394e": 1, + "8fe88422-f999-587f-ac1a-7bc8b53037f5": 1, + "c18ab043-4ca2-5094-aedd-2aa3901e531a": 1, + "2f6ffc36-88a4-5384-8507-2ffdff781b51": 1, + "44fc57fd-4cc1-58f4-b5d9-ce280616f398": 1, + "f10ff1e2-6f0d-5c11-92e8-061981a339ea": 1, + "849066c4-ab47-570b-8037-cf11eb98b320": 1, + "793452ac-ab1a-52f4-b31c-54671b798dfe": 1, + "9e0ef26f-aa1d-5c0c-922c-0149df5240de": 1, + "1d952f2a-beaa-5aa2-9ea8-be8beea7f716": 1, + "b371db3f-4c2f-57a8-a5f3-d331d2ed598c": 1, + "a803cc5f-894a-5c0c-9f23-cab384e0eabc": 1, + "43c9eaca-d143-5672-bd2e-a2dcc6ee162d": 1, + "30cf37cd-195a-50c7-af77-3b5a1f35d5f1": 1, + "2102dfed-59ae-546e-a97c-4145f3a90492": 1, + "163c54a2-7471-501b-8499-d07c2388e175": 1, + "8e1da17d-1b23-5027-b8c8-7369dbac5d88": 1, + "a27481c7-25a9-5142-9dbb-ca4c1a7aff6f": 1, + "f613474c-025f-5395-89ce-589c534cdd1f": 1, + "fa2a4836-e7fe-5c9e-8954-990fdf2b2040": 1, + "20d61ef2-b29b-5052-8627-23f1c5b4b925": 1, + "6f17054f-33bb-5f5f-8da0-092ba48c5521": 1, + "30b4b018-7857-5f6f-8d10-be9c184f1587": 1, + "73a1b767-ad4c-5408-ba38-5b3e6b89686f": 1, + "0ac1a6d3-bb30-5a21-953a-39468e778498": 1, + "f6099561-b5ce-5e5f-8d2b-84cdbdc6a28a": 1, + "5a3f570b-2b8d-5764-b064-57c937ec201e": 1, + "ea3ce6d9-e936-575d-baf2-8de418d0be6f": 1, + "29635386-c7a8-5ef3-b521-e7495cfe688d": 1, + "e25ee521-4fa0-5aa3-a4e4-6b12da2d911a": 1, + "2b622baf-286a-59be-91a9-b2733b9af0da": 1, + "a9fed9d5-dd9b-5be1-828a-d1776ea765f9": 1, + "ad46b2e6-9c19-59d5-b15e-1fbca2f4c363": 1, + "3c5fe307-265c-52c4-86f4-140e21c08c37": 1, + "d796ab1e-8834-5f90-940e-d060181e4db2": 1, + "bad56cad-513f-5d0d-af22-fee2ec070369": 1, + "9d3df626-d393-5009-9f32-16a1cff0b267": 1, + "96ba0b3c-e980-5ffd-85b3-41053fc11f9c": 1, + "92634890-8e4a-59d8-8254-76b7a03f0296": 1, + "be9a6919-8258-5865-90fe-808e4f4d498e": 1, + "b8e699d2-56ae-5116-882e-b16be7ddc4e3": 1, + "ced6ae47-08b4-5733-89f3-8d83046f8d36": 1, + "0cdd8987-6277-594d-bffa-1f92c9aa8d8b": 1, + "9e01ddcc-4f86-5885-a23d-d2951392d452": 1, + "0db3f3e8-cef1-50d3-af75-818dcefb35cf": 1, + "17d3ff47-0f74-5340-959c-d594ff8fc70e": 1, + "61a29180-3b3f-516c-94d0-a2a3f921bb1a": 1, + "e5f42b33-2231-50b6-9cef-171b219305f9": 1, + "ae0dee2f-4667-5911-bbbf-dd92d0e394da": 1, + "2375517d-779c-5cb2-a649-9fedcbbeed8f": 1, + "155f1451-3402-51d4-a6ce-4a931d90e329": 1, + "2dea863b-958d-5e49-9599-b9c6bbdea9e2": 1, + "7eea9626-a613-5f62-9abb-58caccef11df": 1, + "10641885-ac66-51b8-bd3b-629aa0c5626c": 1, + "5d7f72ef-26d6-5e32-a9fd-65596c901d83": 1, + "298ff904-0621-5c6f-bd8c-fba9b85330c5": 1, + "e13c5037-6070-5c30-bb9e-f6b66150df87": 1, + "e20f67fb-c695-58ad-a4bb-ae32b582da47": 1, + "58fd4343-7ff5-506e-854c-4c88f8ef3aa7": 1, + "cd73aa76-7cad-5452-9062-ef7c98f97048": 1, + "bd8806db-35e3-5119-8ea5-72566b4b99c9": 1, + "eab0edf8-1f75-5884-b626-277945112734": 1, + "29091256-d940-5267-8848-37300953126d": 1, + "7cad85bf-3f6e-5c41-bdcb-ac0a40e80a08": 1, + "53f20659-b66b-58b0-b4c8-15f2ec92dba0": 1, + "19536151-1bb1-5468-8f12-40faa062770c": 1, + "30094b66-8a7b-5439-8d7f-a420959d3b14": 1, + "303e0bb9-6884-5d08-95b7-dc9a953e3e2e": 1, + "90bcf491-756a-5771-9d49-b290f3e86ea6": 1, + "c363c0de-6b2c-5036-8a38-755638c20af7": 1, + "a82f2b24-f8ca-5b68-880e-3becec1fcf76": 1, + "2a64ee0b-9e0e-5e7a-a430-5b1922ba687d": 1, + "6b6dcbb0-7f9d-564e-926a-f2ec53e91ebd": 1, + "06665c23-862a-5470-81da-1e83edb1cfd9": 1, + "832bbb47-3a84-594e-8baa-8d3fec47a61b": 1, + "39b67c98-58c5-5dbe-8d43-5980f2c0dafe": 1, + "c2f0911c-837e-5867-898b-9a2e678ff55f": 1, + "eef0b77b-92e4-54f5-9ff8-f6eb449be87d": 1, + "4df702f1-31c2-54ad-accb-a46602c7e7c4": 1, + "c89233dc-d60f-5e04-97de-6a254bbc24eb": 1, + "55dc08e8-7bd8-57f4-aa50-df4a12fc9f78": 1, + "e9d29b33-5186-5abd-b377-71849795a9ba": 1, + "098bcb39-486b-559a-bc7e-8cac8fbed123": 1, + "25bd3605-4988-589f-b65a-4ecd60b90e90": 1, + "f8f8230a-9ad7-55bd-a03f-cfe0e923f1eb": 1, + "485f598f-e875-5e24-b184-3b3800eaec29": 1, + "a037be91-f119-56e0-bab7-bcf0e1d0a880": 1, + "85bc6f3c-2e82-59fc-8dcc-a0288400f5ec": 1, + "15cec100-69f4-5985-8f6e-8c4bd21f8223": 1, + "a0fd3e26-b2ab-5230-b34a-3427dca4652f": 1, + "efd4446d-36c4-52bc-a91c-d01d0fe8ae76": 1, + "b46071b9-5a2f-5bc1-a43b-ea833cd14032": 1, + "42275279-8193-5f8a-8360-68632accabdc": 1 + } } \ No newline at end of file diff --git a/basecfg/motd.json b/basecfg/motd.json index 63f53b4..5185b0f 100644 --- a/basecfg/motd.json +++ b/basecfg/motd.json @@ -1,66 +1,18 @@ { - "total_count": 10, + "total_count": 2, "next_page": 2, "items": [ { "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" + "title": "Make sure you restart your game if you're on level 1 or are having any issues! ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" }, { "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" - }, - { - "published_at": "Sun, 18 Jun 2023 02:02:23 GMT", - "_id": "adb3fd5e-9c37-49db-a13c-a62ad4c090d9", - "contents": null, - "title": "Welcome to the Arkham: Revived custom auth server! Join the Discord: 6Sab2tbauC ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" + "title": "Welcome to Arkham: Revived! Please report issues to @KiwifruitDev on Discord. ALWAYS LEAVE AND REJOIN IF YOU HAD THE START BUTTON LAST GAME!" } ], "page": 1, diff --git a/basecfg/netvars.dat b/basecfg/netvars.dat index 0b95be4..8e06099 100644 --- a/basecfg/netvars.dat +++ b/basecfg/netvars.dat @@ -1,130 +1,130 @@ -[Default__RInventoryGadget RInventoryGadget] -TestNetVarValue=1 - -[SideArm_01_UPG_00 GDSideArmGadget] -TestNetVarValue=2 - -[GameplayStats.Echo] -Enabled=true - -[Default__RGFxMovieUI_MainMenu RGFxMovieUI_MainMenu] -bEnableWBID=false - -[Default__GDProfileSystemMatchmakingData GDProfileSystemMatchmakingData] -Cfg_INT_MaxHistoricalMatches=100 -Cfg_FLOAT_CurveStartedModifier=20.0 -Cfg_FLOAT_CurveWonModifier=10.0 -Cfg_FLOAT_NumberOfSkills=100.0 -Cfg_FLOAT_MinValidSkill=1.0 -Cfg_FLOAT_NumMatchesUsingRandomSpread=20.0 -Cfg_FLOAT_InitialRandomSkillSpread=40.0 -Cfg_FLOAT_MinMatchesForFinishRatioCheck=10 -Cfg_FLOAT_MinFinishRatio=-1.0 -Cfg_FLOAT_MatchmakingSkillCalcCurveDelta=0.2 -Cfg_FLOAT_MatchmakingSearchSkillIncreaseSpeed=1.0 -Cfg_FLOAT_MatchmakingSearchSkillIncreaseSpeedMax=5.0 -Cfg_FLOAT_MatchmakingSearchSkillIncreaseAccel=0.1 -Cfg_INT_MatchmakingSearchNumTriesSameSkill=5 -Cfg_FLOAT_MatchmakingSearchTimeoutSearch=5.f -Cfg_FLOAT_MatchmakingSearchTimeoutJoin=30.f -Cfg_FLOAT_MatchmakingSearchRequestThrottleTime=1.f - -[Default__GDProfileSystemMatchmakingHistoricalData GDProfileSystemMatchmakingHistoricalData] -MaxHistoricalBandwidthValues=10 - -[Default__GDArbitrationSystem GDArbitrationSystem] -XPToCreditsConversionRate=0.125 - -[GDArbitrationSystem_0 GDArbitrationSystem] -XPToCreditsConversionRate=0.125 - -[Default__RExperienceSystem RExperienceSystem] -XPToWeaponPointsConversionRate=0.2 - -[Default__GDWorldInfo GDWorldInfo] -bHunterHuntedEnabled=true - -[Default__GDLobbyHostBeacon GDLobbyHostBeacon] -EchoStatsCaptureProbability=0.05 - -[Default__OnlineSubsystem OnlineSubsystem] -MinRequiredPingForQuickMatchSearchResult=10000 -MinTimeBetweenMatchmakingServerBandwidthQuery=1800 - -[Default__SDLobbySystem SDLobbySystem] -MinQuickMatchSearchResultsDesired=5 -MinQuickSearchTime=4 -MaxQuickSearchTime=5 -GoodConnectionUpSpeed = 5000000 -BadConnectionUpSpeed = 500000 - -[Default__GDGFxMovieUI_LobbyBase GDGFxMovieUI_LobbyBase] -GameStartTimerValue=5.0 -LobbyCountdownTime=15.0 - -[Default__GDGFxMovieUI_LobbyMenu GDGFxMovieUI_LobbyMenu] -GameStartTimerValue=5.0 -LobbyCountdownTime=15.0 - -[GDGFxMovieUI_LobbyMenu GDGFxMovieUI_LobbyMenu] -GameStartTimerValue=5.0 -LobbyCountdownTime=15.0 - -[Default__OnlineGameSearch OnlineGameSearch] -PingBucketSize=100 - -[OnlineGameSearch OnlineGameSearch] -PingBucketSize=100 - -[Default__SDLocalQuery SDLocalQuery] -PingBucketSize=100 - -[SDLocalQuery_0 SDLocalQuery] -PingBucketSize=100 - -[SDLocalQuery SDLocalQuery] -PingBucketSize=100 - -[CCA_Joker_Facepaint_08 GDCharCustomAsset_FacePaint] -bUseGameplayEffector=true - -[CCA_Bane_Pants_03 GDCharCustomAsset_Lower] -GearPlusUUID= - -[CCA_Bane_Goggles_01 GDCharCustomAsset_FaceGear] -bUseGameplayEffector=true - -[ThugHelicopter_V1 GDThugRCHelicopter] -InterThrowRechargeTime=54.f - -[ThugHelicopter_V2 GDThugRCHelicopter] -InterThrowRechargeTime=72.f - -[ThugHelicopter_V3 GDThugRCHelicopter] -InterThrowRechargeTime=72.f - -[ThugHelicopter_V4 GDThugRCHelicopter] -InterThrowRechargeTime=72.f - -[ThugHelicopter_V5 GDThugRCHelicopter] -InterThrowRechargeTime=72.f - -[Shotgun_01_UPG_00 GDShotgunGadget] -SpreadGenerators[0]=4595 -SpreadGenerators[1]=6116 -SpreadGenerators[2]=3669 - -[Shotgun_01_UPG_01 GDShotgunGadget] -SpreadGenerators[0]=4595 -SpreadGenerators[1]=6116 -SpreadGenerators[2]=3669 - -[Shotgun_01_UPG_02 GDShotgunGadget] -SpreadGenerators[0]=4595 -SpreadGenerators[1]=6116 -SpreadGenerators[2]=3669 - -[Shotgun_01_UPG_03 GDShotgunGadget] -SpreadGenerators[0]=4595 -SpreadGenerators[1]=6116 +[Default__RInventoryGadget RInventoryGadget] +TestNetVarValue=1 + +[SideArm_01_UPG_00 GDSideArmGadget] +TestNetVarValue=2 + +[GameplayStats.Echo] +Enabled=true + +[Default__RGFxMovieUI_MainMenu RGFxMovieUI_MainMenu] +bEnableWBID=true + +[Default__GDProfileSystemMatchmakingData GDProfileSystemMatchmakingData] +Cfg_INT_MaxHistoricalMatches=100 +Cfg_FLOAT_CurveStartedModifier=20.0 +Cfg_FLOAT_CurveWonModifier=10.0 +Cfg_FLOAT_NumberOfSkills=100.0 +Cfg_FLOAT_MinValidSkill=1.0 +Cfg_FLOAT_NumMatchesUsingRandomSpread=20.0 +Cfg_FLOAT_InitialRandomSkillSpread=40.0 +Cfg_FLOAT_MinMatchesForFinishRatioCheck=10 +Cfg_FLOAT_MinFinishRatio=-1.0 +Cfg_FLOAT_MatchmakingSkillCalcCurveDelta=0.2 +Cfg_FLOAT_MatchmakingSearchSkillIncreaseSpeed=1.0 +Cfg_FLOAT_MatchmakingSearchSkillIncreaseSpeedMax=5.0 +Cfg_FLOAT_MatchmakingSearchSkillIncreaseAccel=0.1 +Cfg_INT_MatchmakingSearchNumTriesSameSkill=5 +Cfg_FLOAT_MatchmakingSearchTimeoutSearch=5.f +Cfg_FLOAT_MatchmakingSearchTimeoutJoin=30.f +Cfg_FLOAT_MatchmakingSearchRequestThrottleTime=1.f + +[Default__GDProfileSystemMatchmakingHistoricalData GDProfileSystemMatchmakingHistoricalData] +MaxHistoricalBandwidthValues=10 + +[Default__GDArbitrationSystem GDArbitrationSystem] +XPToCreditsConversionRate=0.125 + +[GDArbitrationSystem_0 GDArbitrationSystem] +XPToCreditsConversionRate=0.125 + +[Default__RExperienceSystem RExperienceSystem] +XPToWeaponPointsConversionRate=0.2 + +[Default__GDWorldInfo GDWorldInfo] +bHunterHuntedEnabled=true + +[Default__GDLobbyHostBeacon GDLobbyHostBeacon] +EchoStatsCaptureProbability=0.05 + +[Default__OnlineSubsystem OnlineSubsystem] +MinRequiredPingForQuickMatchSearchResult=10000 +MinTimeBetweenMatchmakingServerBandwidthQuery=1800 + +[Default__SDLobbySystem SDLobbySystem] +MinQuickMatchSearchResultsDesired=5 +MinQuickSearchTime=4 +MaxQuickSearchTime=5 +GoodConnectionUpSpeed = 5000000 +BadConnectionUpSpeed = 500000 + +[Default__GDGFxMovieUI_LobbyBase GDGFxMovieUI_LobbyBase] +GameStartTimerValue=5.0 +LobbyCountdownTime=15.0 + +[Default__GDGFxMovieUI_LobbyMenu GDGFxMovieUI_LobbyMenu] +GameStartTimerValue=5.0 +LobbyCountdownTime=15.0 + +[GDGFxMovieUI_LobbyMenu GDGFxMovieUI_LobbyMenu] +GameStartTimerValue=5.0 +LobbyCountdownTime=15.0 + +[Default__OnlineGameSearch OnlineGameSearch] +PingBucketSize=100 + +[OnlineGameSearch OnlineGameSearch] +PingBucketSize=100 + +[Default__SDLocalQuery SDLocalQuery] +PingBucketSize=100 + +[SDLocalQuery_0 SDLocalQuery] +PingBucketSize=100 + +[SDLocalQuery SDLocalQuery] +PingBucketSize=100 + +[CCA_Joker_Facepaint_08 GDCharCustomAsset_FacePaint] +bUseGameplayEffector=true + +[CCA_Bane_Pants_03 GDCharCustomAsset_Lower] +GearPlusUUID= + +[CCA_Bane_Goggles_01 GDCharCustomAsset_FaceGear] +bUseGameplayEffector=true + +[ThugHelicopter_V1 GDThugRCHelicopter] +InterThrowRechargeTime=54.f + +[ThugHelicopter_V2 GDThugRCHelicopter] +InterThrowRechargeTime=72.f + +[ThugHelicopter_V3 GDThugRCHelicopter] +InterThrowRechargeTime=72.f + +[ThugHelicopter_V4 GDThugRCHelicopter] +InterThrowRechargeTime=72.f + +[ThugHelicopter_V5 GDThugRCHelicopter] +InterThrowRechargeTime=72.f + +[Shotgun_01_UPG_00 GDShotgunGadget] +SpreadGenerators[0]=4595 +SpreadGenerators[1]=6116 +SpreadGenerators[2]=3669 + +[Shotgun_01_UPG_01 GDShotgunGadget] +SpreadGenerators[0]=4595 +SpreadGenerators[1]=6116 +SpreadGenerators[2]=3669 + +[Shotgun_01_UPG_02 GDShotgunGadget] +SpreadGenerators[0]=4595 +SpreadGenerators[1]=6116 +SpreadGenerators[2]=3669 + +[Shotgun_01_UPG_03 GDShotgunGadget] +SpreadGenerators[0]=4595 +SpreadGenerators[1]=6116 SpreadGenerators[2]=3669 \ No newline at end of file diff --git a/basecfg/persistentmigrationsave.json b/basecfg/persistentmigrationsave.json deleted file mode 100644 index bd05b49..0000000 --- a/basecfg/persistentmigrationsave.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "data": { - "FirstBoot": false, - "IPOTutorialVideo_Watched": true, - "HHTutorialVideo_Watched": true, - "RecentUnlocks": { - "WatchedVideoList": [ - "GLModeBasic.usm", - "HunterHunted.usm", - "HeroBasics.usm", - "EliteBasics.usm", - "BMGadgets.usm", - "JokerAdvanced.usm", - "RBGadgets.usm", - "BaneAdvanced.usm", - "SVillains.usm", - "GLModeAdv.usm", - "HeroAdv.usm" - ], - "NumVideos": 10 - }, - "JokerIndoc1Video_Watched": true, - "JokerIndoc2Video_Watched": true, - "BaneIndoc1Video_Watched": true, - "BaneIndoc2Video_Watched": true, - "SkippedWBIDPrompt": false, - "SPSkin_New52Graphic": true, - "SPSkin_Noel": true, - "SPSkin_DarkKnight": true, - "GotWBIDBonus": true, - "SkipWBIDLinkage": false, - "SPSkin_RedSon": true, - "MPSkin_BlackestNight": true, - "WeaponCache_Satchel1_Redeemed": true, - "WeaponCache_Case1_Redeemed": true, - "WeaponCache_Case2_Redeemed": true, - "WeaponCache_Crate1_Redeemed": true, - "WeaponCache_Crate2_Redeemed": true, - "WeaponCache_Container1_Redeemed": true, - "SPTrophyRobin": true, - "MobileUnlock_Tier_0_1": true, - "MobileUnlock_Tier_0_1_Redeemed": true, - "MobileUnlock_Tier_0_2": true, - "MobileUnlock_Tier_0_2_Redeemed": true, - "MobileUnlock_Tier_0_3": true, - "MobileUnlock_Tier_0_3_Redeemed": true, - "MobileUnlock_Tier_0_4": true, - "MobileUnlock_Tier_0_4_Redeemed": true, - "MobileUnlock_Tier_0_5": true, - "MobileUnlock_Tier_0_5_Redeemed": true, - "MobileUnlock_Tier_0_6": true, - "MobileUnlock_Tier_0_6_Redeemed": true, - "MobileUnlock_Tier_0_7": true, - "MobileUnlock_Tier_0_7_Redeemed": true, - "MobileUnlock_Tier_1_1": true, - "MobileUnlock_Tier_1_1_Redeemed": true, - "MobileUnlock_Tier_1_2": true, - "MobileUnlock_Tier_1_2_Redeemed": true, - "MobileUnlock_Tier_1_3": true, - "MobileUnlock_Tier_1_3_Redeemed": true, - "MobileUnlock_Tier_2_1": true, - "MobileUnlock_Tier_2_1_Redeemed": true, - "MobileUnlock_Tier_2_2": true, - "MobileUnlock_Tier_2_2_Redeemed": true, - "MobileUnlock_Tier_2_3": true, - "MobileUnlock_Tier_2_3_Redeemed": true, - "MobileUnlock_Tier_3_1": true, - "MobileUnlock_Tier_3_1_Redeemed": true, - "MobileUnlock_Tier_4_1": true, - "MobileUnlock_Tier_4_1_Redeemed": true, - "MobileUnlock_Earth2DarkKnightAlt": true - } -} \ No newline at end of file diff --git a/basecfg/save.json b/basecfg/save.json index 9a1e8f3..9fc2452 100644 --- a/basecfg/save.json +++ b/basecfg/save.json @@ -1,1052 +1,632 @@ { - "data": { - "ControllerSensitivity": 60, - "GameDifficulty": "Normal", - "AutoAim": false, - "AutoCenter": false, - "MovementControl": "Left Thumbstick", - "YInversion": false, - "Subtitles": true, - "Tutorial": false, - "Hints": true, - "Gamma": 50, - "VolumeSFX": 100, - "VolumeMusic": 100, - "VolumeDialogue": 100, - "InvertRotation": false, - "InvertGlide": true, - "InvertBatarang": false, - "ControllerVibration": true, - "CameraAssist": true, - "AccountXP": 0, - "AccountXPForPrevUpgrade": 0, - "AccountXPForNextUpgrade": 0, - "AccountXPLevel": 0, - "EquippedWeapon1": "Shotgun_01", - "EquippedWeapon2": "AssaultRifle_01", - "ForceEquipGoldenShotgun": true, - "ForceEquipRifle": true, - "jokerXP": 0, - "jokerXPForPrevUpgrade": 0, - "jokerXPForNextUpgrade": 0, - "jokerXPLevel": 0, - "baneXP": 0, - "baneXPForPrevUpgrade": 0, - "baneXPForNextUpgrade": 0, - "baneXPLevel": 0, - "CustomizationProfileData": { - "CustomProfileVersion": 1, - "CustomConfigBanks": [ - { - "m_CustomSelection": [ - { - "ArchetypeID": "Archetype_Ratface_Joker", - "LowerID": "Joker_Pants_01", - "UpperID": "Joker_Upper_07", - "FaceGearID": "None", - "HairID": "Joker_Hair_01", - "FacialHairID": "None", - "FacePaintID": "Joker_FacePaint_01", - "TattooID": "None", - "UndershirtID": "Joker_Tshirt_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "FacialHairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_Ratface_Joker", - "LowerID": "Joker_Pants_01", - "UpperID": "Joker_Upper_07", - "FaceGearID": "None", - "HairID": "Joker_Hair_01", - "FacialHairID": "None", - "FacePaintID": "Joker_FacePaint_01", - "TattooID": "None", - "UndershirtID": "Joker_Tshirt_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "FacialHairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_Ratface_Joker", - "LowerID": "Joker_Pants_01", - "UpperID": "Joker_Upper_07", - "FaceGearID": "None", - "HairID": "Joker_Hair_01", - "FacialHairID": "None", - "FacePaintID": "Joker_FacePaint_01", - "TattooID": "None", - "UndershirtID": "Joker_Tshirt_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "FacialHairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_Ratface_Joker", - "LowerID": "Joker_Pants_01", - "UpperID": "Joker_Upper_07", - "FaceGearID": "None", - "HairID": "Joker_Hair_01", - "FacialHairID": "None", - "FacePaintID": "Joker_FacePaint_01", - "TattooID": "None", - "UndershirtID": "Joker_Tshirt_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "FacialHairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_Ratface_Joker", - "LowerID": "Joker_Pants_01", - "UpperID": "Joker_Upper_07", - "FaceGearID": "None", - "HairID": "Joker_Hair_01", - "FacialHairID": "None", - "FacePaintID": "Joker_FacePaint_01", - "TattooID": "None", - "UndershirtID": "Joker_Tshirt_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "FacialHairColor": { - "B": 54, - "G": 163, - "R": 111, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - } - ] - }, - { - "m_CustomSelection": [ - { - "ArchetypeID": "Archetype_NewBeef_Bane", - "LowerID": "Bane_Pants_01", - "UpperID": "None", - "FaceGearID": "None", - "HairID": "Bane_Hair_02", - "FacialHairID": "FacialHair_07", - "FacePaintID": "None", - "TattooID": "None", - "UndershirtID": "Bane_Jumper_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "FacialHairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_NewBeef_Bane", - "LowerID": "Bane_Pants_01", - "UpperID": "None", - "FaceGearID": "None", - "HairID": "Bane_Hair_02", - "FacialHairID": "FacialHair_07", - "FacePaintID": "None", - "TattooID": "None", - "UndershirtID": "Bane_Jumper_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "FacialHairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_NewBeef_Bane", - "LowerID": "Bane_Pants_01", - "UpperID": "None", - "FaceGearID": "None", - "HairID": "Bane_Hair_02", - "FacialHairID": "FacialHair_07", - "FacePaintID": "None", - "TattooID": "None", - "UndershirtID": "Bane_Jumper_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "FacialHairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_NewBeef_Bane", - "LowerID": "Bane_Pants_01", - "UpperID": "None", - "FaceGearID": "None", - "HairID": "Bane_Hair_02", - "FacialHairID": "FacialHair_07", - "FacePaintID": "None", - "TattooID": "None", - "UndershirtID": "Bane_Jumper_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "FacialHairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - }, - { - "ArchetypeID": "Archetype_NewBeef_Bane", - "LowerID": "Bane_Pants_01", - "UpperID": "None", - "FaceGearID": "None", - "HairID": "Bane_Hair_02", - "FacialHairID": "FacialHair_07", - "FacePaintID": "None", - "TattooID": "None", - "UndershirtID": "Bane_Jumper_01", - "LowerSkinIdx": -1, - "UpperSkinIdx": -1, - "FaceGearSkinIdx": -1, - "HairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "FacialHairColor": { - "B": 35, - "G": 39, - "R": 39, - "A": 255 - }, - "bArchetypeIsGearPlus": false, - "bFaceGearIsGearPlus": false, - "bFacePaintIsGearPlus": false, - "bFacialHairIsGearPlus": false, - "bHairIsGearPlus": false, - "bLowerIsGearPlus": false, - "bTattooIsGearPlus": false, - "bUndershirtIsGearPlus": false, - "bUpperIsGearPlus": false - } - ] - } - ], - "CurrentSelectedCustomizationBank": [ + "data": { + "ControllerSensitivity": 60, + "GameDifficulty": "Normal", + "AutoAim": false, + "AutoCenter": false, + "MovementControl": "Left Thumbstick", + "YInversion": false, + "Subtitles": true, + "Tutorial": false, + "Hints": true, + "Gamma": 50, + "VolumeSFX": 100, + "VolumeMusic": 100, + "VolumeDialogue": 100, + "InvertRotation": false, + "InvertGlide": true, + "InvertBatarang": false, + "ControllerVibration": true, + "CameraAssist": true, + "AccountXP": 0, + "AccountXPForPrevUpgrade": 0, + "AccountXPForNextUpgrade": 1000, + "AccountXPLevel": 24, + "EquippedWeapon1": "Shotgun_01", + "EquippedWeapon2": "AssaultRifle_01", + "ForceEquipGoldenShotgun": true, + "ForceEquipRifle": true, + "jokerXP": 0, + "jokerXPForPrevUpgrade": 0, + "jokerXPForNextUpgrade": 1000, + "jokerXPLevel": 24, + "baneXP": 0, + "baneXPForPrevUpgrade": 0, + "baneXPForNextUpgrade": 1000, + "baneXPLevel": 24, + "CustomizationProfileData": { + "CustomProfileVersion": 1, + "CustomConfigBanks": [ + { + "m_CustomSelection": [ + { + "ArchetypeID": "Archetype_Ratface_Joker", + "LowerID": "Joker_Pants_01", + "UpperID": "Joker_Upper_07", + "FaceGearID": "None", + "HairID": "Joker_Hair_01", + "FacialHairID": "None", + "FacePaintID": "Joker_FacePaint_01", + "TattooID": "None", + "UndershirtID": "Joker_Tshirt_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "FacialHairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": true, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_Ratface_Joker", + "LowerID": "Joker_Pants_01", + "UpperID": "Joker_Upper_07", + "FaceGearID": "None", + "HairID": "Joker_Hair_01", + "FacialHairID": "None", + "FacePaintID": "Joker_FacePaint_01", + "TattooID": "None", + "UndershirtID": "Joker_Tshirt_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "FacialHairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": true, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_Ratface_Joker", + "LowerID": "Joker_Pants_01", + "UpperID": "Joker_Upper_07", + "FaceGearID": "None", + "HairID": "Joker_Hair_01", + "FacialHairID": "None", + "FacePaintID": "Joker_FacePaint_01", + "TattooID": "None", + "UndershirtID": "Joker_Tshirt_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "FacialHairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": true, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_Ratface_Joker", + "LowerID": "Joker_Pants_01", + "UpperID": "Joker_Upper_07", + "FaceGearID": "None", + "HairID": "Joker_Hair_01", + "FacialHairID": "None", + "FacePaintID": "Joker_FacePaint_01", + "TattooID": "None", + "UndershirtID": "Joker_Tshirt_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "FacialHairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": true, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_Ratface_Joker", + "LowerID": "Joker_Pants_01", + "UpperID": "Joker_Upper_07", + "FaceGearID": "None", + "HairID": "Joker_Hair_01", + "FacialHairID": "None", + "FacePaintID": "Joker_FacePaint_01", + "TattooID": "None", + "UndershirtID": "Joker_Tshirt_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "FacialHairColor": { + "B": 54, + "G": 163, + "R": 111, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": true, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + } + ] + }, + { + "m_CustomSelection": [ + { + "ArchetypeID": "Archetype_NewBeef_Bane", + "LowerID": "Bane_Pants_01", + "UpperID": "None", + "FaceGearID": "None", + "HairID": "Bane_Hair_02", + "FacialHairID": "FacialHair_07", + "FacePaintID": "None", + "TattooID": "None", + "UndershirtID": "Bane_Jumper_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "FacialHairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": false, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_NewBeef_Bane", + "LowerID": "Bane_Pants_01", + "UpperID": "None", + "FaceGearID": "None", + "HairID": "Bane_Hair_02", + "FacialHairID": "FacialHair_07", + "FacePaintID": "None", + "TattooID": "None", + "UndershirtID": "Bane_Jumper_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "FacialHairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": false, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_NewBeef_Bane", + "LowerID": "Bane_Pants_01", + "UpperID": "None", + "FaceGearID": "None", + "HairID": "Bane_Hair_02", + "FacialHairID": "FacialHair_07", + "FacePaintID": "None", + "TattooID": "None", + "UndershirtID": "Bane_Jumper_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "FacialHairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": false, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_NewBeef_Bane", + "LowerID": "Bane_Pants_01", + "UpperID": "None", + "FaceGearID": "None", + "HairID": "Bane_Hair_02", + "FacialHairID": "FacialHair_07", + "FacePaintID": "None", + "TattooID": "None", + "UndershirtID": "Bane_Jumper_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "FacialHairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": false, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + }, + { + "ArchetypeID": "Archetype_NewBeef_Bane", + "LowerID": "Bane_Pants_01", + "UpperID": "None", + "FaceGearID": "None", + "HairID": "Bane_Hair_02", + "FacialHairID": "FacialHair_07", + "FacePaintID": "None", + "TattooID": "None", + "UndershirtID": "Bane_Jumper_01", + "LowerSkinIdx": -1, + "UpperSkinIdx": -1, + "FaceGearSkinIdx": -1, + "HairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "FacialHairColor": { + "B": 35, + "G": 39, + "R": 39, + "A": 255 + }, + "bArchetypeIsGearPlus": false, + "bFaceGearIsGearPlus": false, + "bFacePaintIsGearPlus": false, + "bFacialHairIsGearPlus": false, + "bHairIsGearPlus": false, + "bLowerIsGearPlus": true, + "bTattooIsGearPlus": false, + "bUndershirtIsGearPlus": true, + "bUpperIsGearPlus": false + } + ] + } + ], + "CurrentSelectedCustomizationBank": [ + 0, + 0 + ], + "LocalCharAltMeshIndex": [ + 4, + 4 + ] + }, + "PrestigeLevel": 0, + "PrestigeWeapon": 0, + "L0Team": 2, + "L0Weap": 0, + "L0PadL": 24, + "L0PadR": 24, + "L0char": 0, + "L1Team": 1, + "L1Weap": 0, + "L1PadL": 24, + "L1PadR": 24, + "L1char": 0, + "PreferredFaction": 0, + "WeaponAutoSwitch": true, + "LoadoutData": { + "TeamData": [ + { + "Bank": [ + { + "RelevantTeam": 1, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 16, + 2, + 25, + 25, + 18, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0, 0 - ], - "LocalCharAltMeshIndex": [ - 4, - 4 - ] - }, - "PrestigeLevel": 0, - "PrestigeWeapon": 0, - "L0Team": 2, - "L0Weap": 0, - "L0PadL": 24, - "L0PadR": 24, - "L0char": 0, - "L1Team": 1, - "L1Weap": 0, - "L1PadL": 24, - "L1PadR": 24, - "L1char": 0, - "PreferredFaction": 0, - "WeaponAutoSwitch": true, - "LoadoutData": { - "TeamData": [ - { - "Bank": [ - { - "RelevantTeam": 1, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 16, - 2, - 25, - 25, - 18, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 1, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 16, - 2, - 25, - 25, - 18, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 1, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 16, - 2, - 25, - 25, - 18, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 1, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 16, - 2, - 25, - 25, - 18, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 1, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 16, - 2, - 25, - 25, - 18, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - ] - }, - { - "Bank": [ - { - "RelevantTeam": 2, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 17, - 2, - 25, - 25, - 22, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 2, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 17, - 2, - 25, - 25, - 22, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 2, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 17, - 2, - 25, - 25, - 22, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 2, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 17, - 2, - 25, - 25, - 22, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "RelevantTeam": 2, - "EquippedWeapon": 7, - "WeaponSkinIdx": 0, - "UnboundGadgets": [ - 14, - 19, - 13 - ], - "DpadGadgets": [ - 9, - 25, - 17, - 2, - 25, - 25, - 22, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 25 - ], - "QuickGadgets": [ - 25, - 25, - 25, - 25, - 25, - 25, - 12 - ], - "DpadGadgetsUpgradeIdx": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - ] - } - ], - "CurrentTeamBank": [ + ] + }, + { + "RelevantTeam": 1, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 16, + 2, + 25, + 25, + 18, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0, 0 - ] - }, - "LoadoutDataVersion": 4, - "ControlType": 0, - "LeftyFlip": false, - "TriggerFlip": false, - "ThugXAxisSens": 0.5, - "ThugYAxisSens": 0.5, - "RoundsSinceHero": -1, - "HeroOptOut": false, - "MapRoundWin_Chemplant_Bane": false, - "MapRoundWin_Chemplant_Joker": false, - "MapRoundWin_Chemplant_Hero": false, - "MapRoundWin_Blackgate_Bane": false, - "MapRoundWin_Blackgate_Joker": false, - "MapRoundWin_Blackgate_Hero": false, - "MapRoundWin_Funhouse_Bane": false, - "MapRoundWin_Funhouse_Joker": false, - "MapRoundWin_Funhouse_Hero": false, - "MapRoundWin_RobotFactory_Bane": false, - "MapRoundWin_RobotFactory_Joker": false, - "MapRoundWin_RobotFactory_Hero": false, - "HeroKillsOnElites": 0, - "EliteKillsOnHeroes": 0, - "FirstBoot": false, - "IPOTutorialVideo_Watched": true, - "HHTutorialVideo_Watched": true, - "LastModified": "2023.06.17-21.12.44", - "UseSixaxisControls": false, - "RecentUnlocks": { - "BaneTeamRecentUnlocks": { - "AppearanceRecentUnlocks": {} + ] }, - "JokerTeamRecentUnlocks": { - "AppearanceRecentUnlocks": {} + { + "RelevantTeam": 1, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 16, + 2, + 25, + 25, + 18, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] }, - "WatchedVideoList": [ - "GLModeBasic.usm", - "HunterHunted.usm", - "HeroBasics.usm", - "EliteBasics.usm", - "BMGadgets.usm", - "JokerAdvanced.usm", - "RBGadgets.usm", - "BaneAdvanced.usm", - "SVillains.usm", - "GLModeAdv.usm", - "HeroAdv.usm" - ], - "NumVideos": 10 - }, - "JokerIndoc1Video_Watched": true, - "JokerIndoc2Video_Watched": true, - "BaneIndoc1Video_Watched": true, - "BaneIndoc2Video_Watched": true, - "MatchmakingDataVersion": 5, - "MatchmakingData": { - "m_MaxHistoricalMatches": 100, - "m_RandomInitialValue": 1, - "MaxHistoricalBandwidthValues": 10 - }, - "SkippedWBIDPrompt": false, - "WeaponScores": { - "WeaponScore": [ + { + "RelevantTeam": 1, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 16, + 2, + 25, + 25, + 18, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, 0, 0, 0, @@ -1061,8 +641,47 @@ 0, 0, 0 - ], - "MaxLifetimeWeaponScore": [ + ] + }, + { + "RelevantTeam": 1, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 16, + 2, + 25, + 25, + 18, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, 0, 0, 0, @@ -1077,65 +696,446 @@ 0, 0, 0 - ] + ] + } + ] }, - "WeaponCache_Satchel1": true, - "WeaponCache_Case1": true, - "WeaponCache_Case2": true, - "WeaponCache_Crate1": true, - "WeaponCache_Crate2": true, - "WeaponCache_Container1": true, - "SPSkin_New52Graphic": true, - "SPSkin_Noel": true, - "SPSkin_DarkKnight": true, - "GotWBIDBonus": true, - "SkipWBIDLinkage": false, - "WBIDPrivacyGuid1": 0, - "SPSkin_RedSon": true, - "MPSkin_BlackestNight": true, - "WBIDPrivacyGuid2": 0, - "WBIDPrivacyGuid3": 0, - "WBIDPrivacyGuid4": 0, - "WeaponCache_Satchel1_Redeemed": true, - "WeaponCache_Case1_Redeemed": true, - "WeaponCache_Case2_Redeemed": true, - "WeaponCache_Crate1_Redeemed": true, - "WeaponCache_Crate2_Redeemed": true, - "WeaponCache_Container1_Redeemed": true, - "SPTrophyRobin": true, - "MobileUnlock_Tier_0_1": true, - "MobileUnlock_Tier_0_1_Redeemed": true, - "MobileUnlock_Tier_0_2": true, - "MobileUnlock_Tier_0_2_Redeemed": true, - "MobileUnlock_Tier_0_3": true, - "MobileUnlock_Tier_0_3_Redeemed": true, - "MobileUnlock_Tier_0_4": true, - "MobileUnlock_Tier_0_4_Redeemed": true, - "MobileUnlock_Tier_0_5": true, - "MobileUnlock_Tier_0_5_Redeemed": true, - "MobileUnlock_Tier_0_6": true, - "MobileUnlock_Tier_0_6_Redeemed": true, - "MobileUnlock_Tier_0_7": true, - "MobileUnlock_Tier_0_7_Redeemed": true, - "MobileUnlock_Tier_1_1": true, - "MobileUnlock_Tier_1_1_Redeemed": true, - "MobileUnlock_Tier_1_2": true, - "MobileUnlock_Tier_1_2_Redeemed": true, - "MobileUnlock_Tier_1_3": true, - "MobileUnlock_Tier_1_3_Redeemed": true, - "MobileUnlock_Tier_2_1": true, - "MobileUnlock_Tier_2_1_Redeemed": true, - "MobileUnlock_Tier_2_2": true, - "MobileUnlock_Tier_2_2_Redeemed": true, - "MobileUnlock_Tier_2_3": true, - "MobileUnlock_Tier_2_3_Redeemed": true, - "MobileUnlock_Tier_3_1": true, - "MobileUnlock_Tier_3_1_Redeemed": true, - "MobileUnlock_Tier_4_1": true, - "MobileUnlock_Tier_4_1_Redeemed": true, - "MobileUnlock_Earth2DarkKnightAlt": true, - "MouseSens": 30, - "VoiceChat": true, - "PushToTalk": true - } + { + "Bank": [ + { + "RelevantTeam": 2, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 17, + 2, + 25, + 25, + 22, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "RelevantTeam": 2, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 17, + 2, + 25, + 25, + 22, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "RelevantTeam": 2, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 17, + 2, + 25, + 25, + 22, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "RelevantTeam": 2, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 17, + 2, + 25, + 25, + 22, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + { + "RelevantTeam": 2, + "EquippedWeapon": 7, + "WeaponSkinIdx": 0, + "UnboundGadgets": [ + 14, + 19, + 13 + ], + "DpadGadgets": [ + 9, + 25, + 17, + 2, + 25, + 25, + 22, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25, + 25 + ], + "QuickGadgets": [ + 25, + 25, + 25, + 25, + 25, + 25, + 12 + ], + "DpadGadgetsUpgradeIdx": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ] + } + ], + "CurrentTeamBank": [ + 0, + 0 + ] + }, + "LoadoutDataVersion": 4, + "ControlType": 0, + "LeftyFlip": false, + "TriggerFlip": false, + "ThugXAxisSens": 0.5, + "ThugYAxisSens": 0.5, + "RoundsSinceHero": -1, + "HeroOptOut": false, + "MapRoundWin_Chemplant_Bane": false, + "MapRoundWin_Chemplant_Joker": false, + "MapRoundWin_Chemplant_Hero": false, + "MapRoundWin_Blackgate_Bane": false, + "MapRoundWin_Blackgate_Joker": false, + "MapRoundWin_Blackgate_Hero": false, + "MapRoundWin_Funhouse_Bane": false, + "MapRoundWin_Funhouse_Joker": false, + "MapRoundWin_Funhouse_Hero": false, + "MapRoundWin_RobotFactory_Bane": false, + "MapRoundWin_RobotFactory_Joker": false, + "MapRoundWin_RobotFactory_Hero": false, + "HeroKillsOnElites": 0, + "EliteKillsOnHeroes": 0, + "FirstBoot": false, + "IPOTutorialVideo_Watched": true, + "HHTutorialVideo_Watched": true, + "LastModified": "2023.08.07-20.35.13", + "UseSixaxisControls": false, + "RecentUnlocks": { + "BaneTeamRecentUnlocks": { + "AppearanceRecentUnlocks": {} + }, + "JokerTeamRecentUnlocks": { + "AppearanceRecentUnlocks": {} + }, + "WatchedVideoList": [ + "GLModeBasic.usm", + "HunterHunted.usm", + "HeroBasics.usm", + "EliteBasics.usm", + "BMGadgets.usm", + "JokerAdvanced.usm", + "RBGadgets.usm", + "BaneAdvanced.usm", + "SVillains.usm", + "GLModeAdv.usm", + "HeroAdv.usm" + ], + "NumVideos": 10 + }, + "JokerIndoc1Video_Watched": true, + "JokerIndoc2Video_Watched": true, + "BaneIndoc1Video_Watched": true, + "BaneIndoc2Video_Watched": true, + "MatchmakingDataVersion": 5, + "MatchmakingData": { + "m_MaxHistoricalMatches": 100, + "m_RandomInitialValue": 1, + "MaxHistoricalBandwidthValues": 10 + }, + "SkippedWBIDPrompt": false, + "WeaponScores": { + "WeaponScore": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "MaxLifetimeWeaponScore": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + "WeaponCache_Satchel1": true, + "WeaponCache_Case1": true, + "WeaponCache_Case2": true, + "WeaponCache_Crate1": true, + "WeaponCache_Crate2": true, + "WeaponCache_Container1": true, + "SPSkin_New52Graphic": true, + "SPSkin_Noel": true, + "SPSkin_DarkKnight": true, + "GotWBIDBonus": true, + "SkipWBIDLinkage": false, + "WBIDPrivacyGuid1": 1, + "SPSkin_RedSon": true, + "MPSkin_BlackestNight": true, + "WBIDPrivacyGuid2": 0, + "WBIDPrivacyGuid3": 0, + "WBIDPrivacyGuid4": 0, + "WeaponCache_Satchel1_Redeemed": true, + "WeaponCache_Case1_Redeemed": true, + "WeaponCache_Case2_Redeemed": true, + "WeaponCache_Crate1_Redeemed": true, + "WeaponCache_Crate2_Redeemed": true, + "WeaponCache_Container1_Redeemed": true, + "SPTrophyRobin": true, + "MobileUnlock_Tier_0_1": true, + "MobileUnlock_Tier_0_1_Redeemed": true, + "MobileUnlock_Tier_0_2": true, + "MobileUnlock_Tier_0_2_Redeemed": true, + "MobileUnlock_Tier_0_3": true, + "MobileUnlock_Tier_0_3_Redeemed": true, + "MobileUnlock_Tier_0_4": true, + "MobileUnlock_Tier_0_4_Redeemed": true, + "MobileUnlock_Tier_0_5": true, + "MobileUnlock_Tier_0_5_Redeemed": true, + "MobileUnlock_Tier_0_6": true, + "MobileUnlock_Tier_0_6_Redeemed": true, + "MobileUnlock_Tier_0_7": true, + "MobileUnlock_Tier_0_7_Redeemed": true, + "MobileUnlock_Tier_1_1": true, + "MobileUnlock_Tier_1_1_Redeemed": true, + "MobileUnlock_Tier_1_2": true, + "MobileUnlock_Tier_1_2_Redeemed": true, + "MobileUnlock_Tier_1_3": true, + "MobileUnlock_Tier_1_3_Redeemed": true, + "MobileUnlock_Tier_2_1": true, + "MobileUnlock_Tier_2_1_Redeemed": true, + "MobileUnlock_Tier_2_2": true, + "MobileUnlock_Tier_2_2_Redeemed": true, + "MobileUnlock_Tier_2_3": true, + "MobileUnlock_Tier_2_3_Redeemed": true, + "MobileUnlock_Tier_3_1": true, + "MobileUnlock_Tier_3_1_Redeemed": true, + "MobileUnlock_Tier_4_1": true, + "MobileUnlock_Tier_4_1_Redeemed": true, + "MobileUnlock_Earth2DarkKnightAlt": true, + "MouseSens": 30, + "VoiceChat": true, + "PushToTalk": true + } } \ No newline at end of file diff --git a/basecfg/store.json b/basecfg/store.json index dfeee8a..cf3fdae 100644 --- a/basecfg/store.json +++ b/basecfg/store.json @@ -1,53 +1,44 @@ -{ - "total_count": 4, - "next_page": 2, - "items": [ - { - "item_id": "f2b44d03-33ba-4ebe-93a9-033693189422", - "price": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": -4 - }, - "vendor": 0, - "id": "283047af-006e-4fe7-a3a1-4351fe94d476", - "product_id": "" - }, - { - "item_id": "63598daa-6c2b-4895-a15f-5af4a435ccf8", - "price": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": -3 - }, - "vendor": 0, - "id": "e62345be-304c-4551-8472-8bd2c367f3f3", - "product_id": "" - }, - { - "item_id": "774c23b3-8a63-46a7-b90d-e719b441a72b", - "price": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": -2 - }, - "vendor": 0, - "id": "8b611b15-b560-463d-af74-78915fa399f7", - "product_id": "" - }, - { - "item_id": "24d120f9-8b68-47c9-8f17-28e1022c6007", - "price": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": -1 - }, - "vendor": 0, - "id": "d7482553-7c71-41a0-8db1-ab272089bd89", - "product_id": "" - }, - { - "item_id": "1f6de0b2-f4d2-42cf-ac0e-39f4c2139116", - "price": { - "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 123456789 - }, - "vendor": 0, - "id": "00834010-c1ad-4197-a010-2934d5eb0d4a", - "product_id": "" - } - ], - "page": 1, - "pages": 1 +{ + "total_count": 4, + "next_page": 2, + "items": [ + { + "item_id": "17bccb09-d281-5709-95aa-f00d9a3fff22", + "price": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 6000 + }, + "vendor": 0, + "id": "60d68dd6-61f1-580d-82c8-4435bef7b833", + "product_id": "" + }, + { + "item_id": "22d5dd7f-80cb-5699-bfa0-555729e58a14", + "price": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 3000 + }, + "vendor": 0, + "id": "81db514b-872d-5638-a4c4-46eefd9d890b", + "product_id": "" + }, + { + "item_id": "8df2d526-a5c4-5328-9c83-33d8cd2b4375", + "price": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 4000 + }, + "vendor": 0, + "id": "b398c126-e1c5-5f3e-8407-444d17c37906", + "product_id": "" + }, + { + "item_id": "bd8806db-35e3-5119-8ea5-72566b4b99c9", + "price": { + "b0be7fae-1c6a-5ddf-b0de-97db7c8afa48": 2000 + }, + "vendor": 0, + "id": "09ca94a9-b5a6-5afc-a102-17917b164d4c", + "product_id": "" + } + ], + "page": 1, + "pages": 1 } \ No newline at end of file diff --git a/basecfg/web/404.html b/basecfg/web/404.html index 7ed65ca..943b78d 100644 --- a/basecfg/web/404.html +++ b/basecfg/web/404.html @@ -1,95 +1,95 @@ - - - - - - - - Arkham: Revived: 404 - - - - - - - - - - - - - - - - - - - - - - -
-
-

404

-
-
The page you are looking for does not exist.
-
-
-
- - - - - + + + + + + + + Arkham: Revived: 404 + + + + + + + + + + + + + + + + + + + + + + +
+
+

404

+
+
The page you are looking for does not exist.
+
+
+
+ + + + + \ No newline at end of file diff --git a/basecfg/web/css/style.css b/basecfg/web/css/style.css index d0e2648..f2a83e2 100644 --- a/basecfg/web/css/style.css +++ b/basecfg/web/css/style.css @@ -1,49 +1,49 @@ -/* Custom Stylesheet */ -/** - * Use this file to override Materialize files so you can update - * the core Materialize files in the future - * - * Made By MaterializeCSS.com - */ - - .icon-block { - padding: 0 15px; -} -.icon-block .material-icons { - font-size: inherit; -} - -body { /* body - or any parent wrapper */ - display: flex; - flex-direction: column; - min-height: 100vh; -} - -main { - flex: 1; -} - -.mainpage { - /* background image that gets cropped if it's too big */ - /* vignette overlay */ - background: linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)), url("/img/tempvid.gif"); - background-repeat: no-repeat; - background-size: cover; - background-position: center; -} - -.shadowtext { - text-shadow: 2px 2px 4px #000000; -} - -.fakebutton { - pointer-events: none; -} - -.blurple { - background-color: #7289DA !important; -} - -.blurple-text { - color: #7289DA !important; -} +/* Custom Stylesheet */ +/** + * Use this file to override Materialize files so you can update + * the core Materialize files in the future + * + * Made By MaterializeCSS.com + */ + + .icon-block { + padding: 0 15px; +} +.icon-block .material-icons { + font-size: inherit; +} + +body { /* body - or any parent wrapper */ + display: flex; + flex-direction: column; + min-height: 100vh; +} + +main { + flex: 1; +} + +.mainpage { + /* background image that gets cropped if it's too big */ + /* vignette overlay */ + background: linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)), url("/img/tempvid.gif"); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} + +.shadowtext { + text-shadow: 2px 2px 4px #000000; +} + +.fakebutton { + pointer-events: none; +} + +.blurple { + background-color: #7289DA !important; +} + +.blurple-text { + color: #7289DA !important; +} diff --git a/basecfg/web/deleted.html b/basecfg/web/deleted.html index 9d99eb2..032cac6 100644 --- a/basecfg/web/deleted.html +++ b/basecfg/web/deleted.html @@ -1,116 +1,116 @@ - - - - - - - - Arkham: Revived: Progress Deleted - - - - - - - - - - - - - - - - - - - - - - -
-
-

Progress Deleted

-
-
All progress linked to your Steam account has been deleted.
-
-
- -
-
-
-
- - - - - + + + + + + + + Arkham: Revived: Progress Deleted + + + + + + + + + + + + + + + + + + + + + + +
+
+

Progress Deleted

+
+
All progress linked to your Steam account has been deleted.
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/basecfg/web/discord-linked.html b/basecfg/web/discord-linked.html index bd6ba9f..1d15870 100644 --- a/basecfg/web/discord-linked.html +++ b/basecfg/web/discord-linked.html @@ -1,126 +1,127 @@ - - - - - - - - Arkham: Revived: Discord Linked - - - - - - - - - - - - - - - - - - - - - - -
-
-

Discord Linked

-
-
Your Discord account is now linked to your progress.
-
-
- -
-
What would you like to do?
-


- Get Started -
-
-
- - - - - + + + + + + + + Arkham: Revived: Discord Linked + + + + + + + + + + + + + + + + + + + + + + +
+
+

Discord Linked

+
+
Your Discord account is now linked.
+
+
+ +
+
What would you like to do?
+


+ Visit Landing Page + Get Started +
+
+
+ + + + + \ No newline at end of file diff --git a/basecfg/web/error.html b/basecfg/web/error.html index c7d8497..6eb00a0 100644 --- a/basecfg/web/error.html +++ b/basecfg/web/error.html @@ -1,118 +1,118 @@ - - - - - - - - Arkham: Revived: Error - - - - - - - - - - - - - - - - - - - - - - -
-
-

-

Error

-
-
-
-
-
-
-

-
-
- - - - - + + + + + + + + Arkham: Revived: Error + + + + + + + + + + + + + + + + + + + + + + +
+
+

+

Error

+
+
+
+
+
+
+

+
+
+ + + + + \ No newline at end of file diff --git a/basecfg/web/getting-started.html b/basecfg/web/getting-started.html index 9e7bc0d..c967eaa 100644 --- a/basecfg/web/getting-started.html +++ b/basecfg/web/getting-started.html @@ -1,178 +1,170 @@ - - - - - - - - Arkham: Revived: Getting Started - - - - - - - - - - - - - - - - - - - - - - -
-
-

Getting Started

-
-
Setting up Arkham: Revived is a simple process.
-
-
- - - -
-
Follow these steps in order to play on Arkham: Revived.
-
    -
  • 1. Open the game directory for Batman: Arkham Origins through Steam.
  • -
  • 2. Navigate through "Online/BmGame/Config/DefaultWBIDVars.ini" and open it in a text editor.
  • -
  • 3. Find the line that begins with "BaseUrl=" and replace its value with "%BASE_URL%".
  • -
  • 4. Find the line that begins with "WBIDAMSURL=" and replace its value with "%AMS_URL%".
  • -
  • 5. Save the file and close it. This will allow the game to connect to Arkham: Revived.
  • -
  • 6. Launch the game and make sure you've reached the main menu.
  • -
  • 7. Close the game and re-launch it. This will ensure your account is linked to Steam.
  • -
  • 8. Launch the game and click on "Store" in the main menu.
  • -
  • 9. If your account is linked, your display name will be shown as a store item.
  • -
  • 10. You're now ready to play!
  • -
-
-
-
Want to migrate progress?
-
    -
  • 1. Follow the above steps and launch the game if you haven't already.
  • -
  • 2. Take note of the price of the "Migrations" store option. This is the total number of migrations performed.
  • -
  • 3. Click on "Store" in the main menu and click on "Migrate from official servers".
  • -
  • 4. When asked to purchase, click yes. You will not be charged.
  • -
  • 5. If an item you've earned says "Account migration process started", close the game and wait up to 5 minutes.
  • -
  • 6. Launch the game and click on "Store" in the main menu.
  • -
  • 7. If the "Migrations" store option's price increased by 1, your account has been migrated.
  • -
  • 8. You're now ready to play with your existing ranks and XP!
  • -
-
-
-
Ready to configure?
-


- Visit Landing Page -
-
- - - - - + + + + + + + + Arkham: Revived: Getting Started + + + + + + + + + + + + + + + + + + + + + + +
+
+

Getting Started

+
+
Setting up Arkham: Revived is a simple process.
+
+
+ + + +
+

Click below and follow the instructions to get started. +
+ Source IP Address: %BASE_URL%

+ View Guide +
+
+ Go Back +
+
+ + + + + \ No newline at end of file diff --git a/basecfg/web/index.html b/basecfg/web/index.html index 4f24e0e..2927201 100644 --- a/basecfg/web/index.html +++ b/basecfg/web/index.html @@ -1,105 +1,106 @@ - - - - - - - - Arkham: Revived - - - - - - - - - - - - - - - - - - - - - - -
-
-

Arkham: Revived

-
-
A custom authentication server for Batman: Arkham Origins Online.
-
Sign in to configure your linked Steam account.
-
- - - -
-
- - - - - + + + + + + + + Arkham: Revived + + + + + + + + + + + + + + + + + + + + + + +
+
+

Arkham: Revived

+
+
A custom authentication server for Batman: Arkham Origins Online.
+
Sign in with Steam to get started.
+
+ + + +
+
+ + + + + \ No newline at end of file diff --git a/basecfg/web/js/init.js b/basecfg/web/js/init.js index 3902f46..b6a7e09 100644 --- a/basecfg/web/js/init.js +++ b/basecfg/web/js/init.js @@ -1,8 +1,8 @@ -(function($){ - $(function(){ - - $('.sidenav').sidenav(); - - }); // end of document ready - })(jQuery); // end of jQuery name space +(function($){ + $(function(){ + + $('.sidenav').sidenav(); + + }); // end of document ready + })(jQuery); // end of jQuery name space \ No newline at end of file diff --git a/basecfg/web/landing.html b/basecfg/web/landing.html index 063d39a..d17f3d8 100644 --- a/basecfg/web/landing.html +++ b/basecfg/web/landing.html @@ -1,172 +1,176 @@ - - - - - - - - Arkham: Revived: Landing Page - - - - - - - - - - - - - - - - - - - - - - -
-
-

Landing Page

-
-
Your Steam account is now logged in.
-

- If persistence is enabled, you cannot log in from a different IP address. -
- This is to ensure that your account cannot be impersonated. -
- Enable persistence mode once logged in to ensure security. -

-
-
- -
-
What would you like to do?
-

- WBID: -
- Location: -
- Persistence: -

-


- Get Started - Link to Discord -

- -
-
-
- - - - - + + + + + + + + Arkham: Revived: Landing Page + + + + + + + + + + + + + + + + + + + + + + +
+
+

Landing Page

+
+
Your Steam account is now logged in.
+

+ If persistence is enabled, you cannot log in from a different IP address. +
+ This is to ensure that your account cannot be impersonated. +
+ Enable persistence mode once logged in to ensure security. +

+
+
+ +
+
What would you like to do?
+

+ WBID: +
+ Location: +
+ Persistence: +

+


+ Get Started + Link to Discord +

+ Delete Progress +

+ +
+
+
+ + + + + \ No newline at end of file diff --git a/basecfg/web/robots.txt b/basecfg/web/robots.txt index cd200c5..4d63b35 100644 --- a/basecfg/web/robots.txt +++ b/basecfg/web/robots.txt @@ -1,4 +1,4 @@ -User-agent: * -Allow: / - +User-agent: * +Allow: / + Sitemap: https://arkham.kiwifruitdev.page/sitemap.xml \ No newline at end of file diff --git a/basecfg/web/sitemap.xml b/basecfg/web/sitemap.xml index c592835..5d11bf5 100644 --- a/basecfg/web/sitemap.xml +++ b/basecfg/web/sitemap.xml @@ -1,27 +1,27 @@ - - - - https://arkham.kiwifruitdev.page/ - 2023-06-22 - - - https://arkham.kiwifruitdev.page/favicon.ico - 2023-06-22 - - - https://arkham.kiwifruitdev.page/robots.txt - 2023-06-22 - - - https://arkham.kiwifruitdev.page/css/style.css - 2023-06-22 - - - https://arkham.kiwifruitdev.page/js/init.js - 2023-06-22 - - - https://arkham.kiwifruitdev.page/sitemap.xml - 2023-06-22 - + + + + https://arkham.kiwifruitdev.page/ + 2023-06-22 + + + https://arkham.kiwifruitdev.page/favicon.ico + 2023-06-22 + + + https://arkham.kiwifruitdev.page/robots.txt + 2023-06-22 + + + https://arkham.kiwifruitdev.page/css/style.css + 2023-06-22 + + + https://arkham.kiwifruitdev.page/js/init.js + 2023-06-22 + + + https://arkham.kiwifruitdev.page/sitemap.xml + 2023-06-22 + \ No newline at end of file diff --git a/index.js b/index.js index ca21bd7..08987c4 100644 --- a/index.js +++ b/index.js @@ -1,1606 +1,802 @@ -// arkham-revived -// Licensed under the MIT License -// Copyright (c) 2023 KiwifruitDev - -// Imports -import express from "express"; -import fse from "fs-extra"; -import crypto from "crypto"; -import Database from "better-sqlite3"; -import getUuid from "uuid-by-string"; -import dotenv from "dotenv"; -import path from "path"; -import SteamAuth from "node-steam-openid"; -import https from "https"; -import http from "http"; -import { js2xml, xml2js } from "xml-js"; -import axios from "axios"; -import qs from "qs"; -import geoip from "geoip-lite"; -import { REST, Routes, Client, GatewayIntentBits, ActivityType, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; - -// __dirname -const __dirname = path.resolve(); - -// Load .env uuid key -dotenv.config(); -let uuidkey = process.env.ARKHAM_UUID_KEY; -let steamapikey = process.env.STEAM_API_KEY; -let discordapplicationid = process.env.DISCORD_CLIENT_ID; -let discordapplicationsecret = process.env.DISCORD_CLIENT_SECRET; -let discordbottoken = process.env.DISCORD_BOT_TOKEN; - -// If either key is missing, give a stern warning and exit -if(!uuidkey || !steamapikey) { - console.log(`WARNING: Environment variables ${!uuidkey ? "ARKHAM_UUID_KEY" : ""}${!uuidkey && !steamapikey ? " and " : ""}${!steamapikey ? "STEAM_API_KEY" : ""} are missing! Create .env if it doesn't exist and add these variables.`); - console.log("Please refer to the README for more information."); - process.exit(1); -} - -// If usercfg folder doesn't exist, copy basecfg to usercfg -if(!fse.existsSync("./usercfg")) { - if(fse.existsSync("./basecfg")) { - fse.copySync("./basecfg", "./usercfg"); - } else { - // Warn user - console.log("WARNING: basecfg folder is missing! Re-install is recommended."); - process.exit(1); - } -} -// Load usercfg -const config = JSON.parse(fse.readFileSync("./usercfg/config.json")); -const motd = JSON.parse(fse.readFileSync("./usercfg/motd.json")); -const store = JSON.parse(fse.readFileSync("./usercfg/store.json")); -const credits = JSON.parse(fse.readFileSync("./usercfg/credits.json")); -const catalog = JSON.parse(fse.readFileSync("./usercfg/catalog.json")); -const save = JSON.parse(fse.readFileSync("./usercfg/save.json")); -const netvars = fse.readFileSync("./usercfg/netvars.dat").toString("base64"); -const baseinventory = JSON.parse(fse.readFileSync("./usercfg/inventory.json")); -const persistentmigrationsave = JSON.parse(fse.readFileSync("./usercfg/persistentmigrationsave.json")); - -// Database -const db = new Database("./usercfg/database.db", { verbose: config.debug ? console.log : null }); -db.pragma('journal_mode = WAL'); - -// Delete users table if wipe_on_start is true -if(config.database.wipe_on_start) - db.exec("DROP TABLE users"); - -// Create users table if it doesn't exist -db.exec("CREATE TABLE IF NOT EXISTS users (uuid TEXT PRIMARY KEY, ipaddr TEXT, inventory TEXT, data TEXT, steamid TEXT, steampersona TEXT, migrating BOOLEAN, migration_start_time INTEGER, credentials TEXT, ticket TEXT, deleting BOOLEAN, delete_start_time INTEGER, wbid TEXT, migrations INTEGER, persistent BOOLEAN, location TEXT, discordid TEXT)"); - -// Scheduled actions -let scheduled_actions = []; - -// Steam auth -const steam = new SteamAuth({ - realm: `${config.host.https_enabled ? "https" : "http"}://${config.host.domain}${config.host.show_port ? ':' + (config.host.https_enabled ? config.host.https_port : config.host.http_port) : ""}`, - returnUrl: `${config.host.https_enabled ? "https" : "http"}://${config.host.domain}${config.host.show_port ? ':' + (config.host.https_enabled ? config.host.https_port : config.host.http_port) : ""}/auth/landing`, - apiKey: steamapikey -}); - -// Steam deletion -const steamdelete = new SteamAuth({ - realm: `${config.host.https_enabled ? "https" : "http"}://${config.host.domain}${config.host.show_port ? ':' + (config.host.https_enabled ? config.host.https_port : config.host.http_port) : ""}`, - returnUrl: `${config.host.https_enabled ? "https" : "http"}://${config.host.domain}${config.host.show_port ? ':' + (config.host.https_enabled ? config.host.https_port : config.host.http_port) : ""}/auth/delete`, - apiKey: steamapikey -}); - -// Discord bot -let rest; -let discord_client; -if(config.discord_bot.enabled) { - rest = new REST({ version: '10' }).setToken(discordbottoken); - - // Build commands - const commands = new SlashCommandBuilder() - .setName('invite') - .setDescription('Create an invite link for members to join your game.') - .addStringOption(option => - option.setName('authserver') - .setDescription('The auth server you are using.') - .addChoices( - { name: 'Official', value: 'official' }, - { name: 'Arkham: Revived', value: 'revived' }, - { name: 'Unknown', value: 'unk' }, - ) - .setRequired(true) - ) - .addStringOption(option => - option.setName('lobbyname') - .setDescription('An optional name for your invite.') - ) - .addStringOption(option => - option.setName('map') - .setDescription('Which map would you like to display?') - .addChoices( - { name: 'Any Map', value: 'any' }, - { name: 'Wayne Chemical Plant', value: 'mp_wcp' }, - { name: 'Blackgate Prison', value: 'mp_prison' }, - { name: 'Joker\'s Funhouse', value: 'mp_funhouse' }, - { name: 'Wonder City Robot Factory', value: 'mp_robotfactory' }, - ) - ); - - // Generate MD5 of commands - const commands_json = commands.toJSON(); - const commands_md5 = crypto.createHash("md5").update(JSON.stringify(commands_json)).digest("hex"); - - // If commands_md5 does not match config commands_md5, reload Discord commands - if(config.discord_bot.commands_md5 != commands_md5) { - if(config.debug) - console.log("BOT: commands_md5 mismatch, reloading commands"); - // Update config commands_md5 - config.discord_bot.commands_md5 = commands_md5; - // Save config - fse.writeFileSync("./usercfg/config.json", JSON.stringify(config, null, 4)); - // Reload commands - rest.put(Routes.applicationCommands(discordapplicationid), { body: [commands.toJSON()] }) - .then(() => { - if(config.debug) - console.log('BOT: Reloaded application (/) commands') - }) - .catch(console.error); - } - - // Create Discord client - discord_client = new Client({ intents: [GatewayIntentBits.Guilds | GatewayIntentBits.GuildIntegrations] }); - - // Ready - discord_client.once('ready', () => { - if(config.debug) - console.log(`BOT: Logged in as ${discord_client.user.username}#${discord_client.user.discriminator}`); - discord_client.user.setStatus(config.discord_bot.status); - let activity_type = ActivityType.Playing; - switch(config.discord_bot.activity_type.toLowerCase()) { - case "competing": - activity_type = ActivityType.Competing; - break; - case "listening": - activity_type = ActivityType.Listening; - break; - case "streaming": - activity_type = ActivityType.Streaming; - break; - case "watching": - activity_type = ActivityType.Watching; - break; - } - discord_client.user.setActivity(config.discord_bot.activity, { type: activity_type }); - }); - - // Interaction - discord_client.on('interactionCreate', async interaction => { - if (!interaction.isChatInputCommand()) return; - switch(interaction.commandName) - { - case "ping": - await interaction.reply({ content: "Pong!" }); - break; - case "invite": - // Reply with typing - const delayed = await interaction.deferReply(); - // Get steamid by discordid - const prep = db.prepare("SELECT steamid FROM users WHERE discordid = ?"); - const data = prep.get(interaction.user.id); - if(data && data.steamid) { - const summaryurl = `http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=${steamapikey}&steamids=${data.steamid}`; - let response = await axios.get(summaryurl); - if(response.data && response.data.response && response.data.response.players && response.data.response.players[0]) { - const summary = response.data.response.players[0]; - if(summary.lobbysteamid !== undefined) { - const inviteurl = `${config.host.https_enabled ? "https" : "http"}://${config.host.domain}${config.host.show_port ? ':' + (config.host.https_enabled ? config.host.https_port : config.host.http_port) : ""}/joinlobby?lobbyid=${summary.lobbysteamid}&steamid=${data.steamid}`; - let embed = new EmbedBuilder() - .setColor('#2196F3') - .setTitle(`Join ${interaction.options.getString('lobbyname') ? "\"" + interaction.options.getString('lobbyname') + "\"" : interaction.user.globalName + '\'s Lobby'}`) - .setFooter({ - text: `Lobby ID: ${summary.lobbysteamid} • Steam ID: ${data.steamid}`, - }) - .setAuthor({ - name: `${summary.personaname}`, - iconURL: `${summary.avatarmedium}`, - url: `${summary.profileurl}` - }) - let set_thumb = false; - let description = ""; - if(interaction.options.getString('map')) { - let map = interaction.options.getString('map'); - if(config.discord_bot.maps[map]) { - embed.setThumbnail(config.discord_bot.maps[map].thumbnail); - description = config.discord_bot.maps[map].name; - set_thumb = true; - } - } - if(!set_thumb) - { - embed.setThumbnail(config.discord_bot.maps.any.thumbnail); - description = config.discord_bot.maps.any.name; - } - const authserver = interaction.options.getString('authserver'); - let prettyserver = "Unknown"; - switch(authserver) { - case "official": - prettyserver = "Official"; - break; - case "revived": - prettyserver = "Arkham: Revived"; - break; - } - embed.setDescription(`Click [here](${inviteurl}) to launch the game and join the lobby.\n*Do not attempt to join your own lobby as a host.*`); - embed.setFields([ - { - name: 'Map', - value: description, - inline: true - }, - { - name: 'Auth Server', - value: prettyserver, - inline: true - } - ]); - await delayed.edit({ content: "", embeds: [embed] }); - } else { - await delayed.edit({ content: `<@${interaction.user.id}>, you are not in a lobby. Create a lobby in-game and try again.`, ephemeral: true }); - } - } else { - await delayed.edit({ content: `<@${interaction.user.id}>, an error occurred while fetching your Steam profile.`, ephemeral: true }); - } - } else { - await delayed.edit({ content: `<@${interaction.user.id}>, you are not linked to a Steam account. You must sign in at least once in-game before linking your Discord account.`, ephemeral: true }); - } - } - }); - - // Login - discord_client.login(discordbottoken); -} -// Create app and configure -const app = express(); -app.use(express.json()); -app.use(express.urlencoded({ extended: true })); -app.use(express.text({ type: "text/xml" })); - -// Log requests -if(config.debug) { - app.use((req, res, next) => { - // Log request - console.log(`${req.method} ${req.url}`); - // Next - next(); - }); -} - -// Endpoint: /files/netvars.dat -// Game info stored in base64 -app.get("/files/netvars.dat", function(req, res) { - // Build JSON response - const response = { - "data": netvars, - }; - // Send response - res.json(response); -}); - -// Endpoint: /auth/token -// Returns a UUID specific to the user's ticket (Steam, presumably) -app.post("/auth/token", function(req, res) { - // Validate authorization header - if(!req.headers.authorization) { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get authorization header - const auth = req.headers.authorization.split(" "); - // Verify authorization header - if(auth[0] != "Basic") { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - const redirect = false; - // If redirect is true, we'll redirect to https://ozzypc-wbid.live.ws.fireteam.net/auth/token - // Untested code!!! - if(redirect) { - res.redirect("https://ozzypc-wbid.live.ws.fireteam.net/auth/token"); - return; - } - // The uuid should be based on the ticket, the private key will be used to validate it. - let uuid = getUuid(req.body.ticket); - const token = { - "token_type": "bearer", - "access_token": uuid, - "expires_in": 1000000, - "refresh_token": "", - }; - // Ask database if IP address has a UUID linked to it - let ipaddr = req.socket.remoteAddress; - let authorized = false; - if(ipaddr) { - ipaddr = ipaddr.replace("::ffff:", ""); // fix for IPv4 - ipaddr = ipaddr.replace("::1", "127.0.0.1"); // fix for localhost - ipaddr = ipaddr.replace("127.0.0.1", config.localhost); // override localhost - const prep = db.prepare("SELECT uuid FROM users WHERE ipaddr = ?"); - const data = prep.get(ipaddr); - if(data) { - uuid = data.uuid; - authorized = true; - } - } - // Check if uuid account exists - if(authorized) { - // Set ticket - db.prepare("UPDATE users SET ticket = ?, credentials = ? WHERE uuid = ?").run(req.body.ticket, auth[1], uuid); - } - // Send response - res.json(token); -}); - -// Endpoint: /motd -// Used with parameters ?channels.0=all&channels.1=all_no_wbid&channels.2=multiplayer&channels.3=multiplayer_no_wbid&country=US&page=1&per_page=10 -// We're not parsing all of that, so we'll return a static response. -app.get("/motd", function(req, res) { - // Send response - res.json(motd); -}); - -// Endpoint: /store/catalog/general -// Game catalog -app.get("/store/catalog/general", function(req, res) { - // Validate authorization header - if(!req.headers.authorization) { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get authorization header - const auth = req.headers.authorization.split(" "); - // Verify authorization header - if(auth[0] != "Bearer") { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get UUID - const ticket = auth[1]; - // Create UUID from ticket using uuidkey - let uuid = getUuid(`${uuidkey}:${ticket}`); - // Ask database if IP address has a UUID linked to it - let ipaddr = req.socket.remoteAddress; - let authorized = false; - let steamname = "Not Logged In"; - let steamid = "Please restart the game in order to log in."; - let discordid = "Discord account is not linked."; - if(ipaddr) { - ipaddr = ipaddr.replace("::ffff:", ""); // fix for IPv4 - ipaddr = ipaddr.replace("::1", "127.0.0.1"); // fix for localhost - ipaddr = ipaddr.replace("127.0.0.1", config.localhost); // override localhost - const prep = db.prepare("SELECT * FROM users WHERE ipaddr = ?"); - const data = prep.all(ipaddr); - if(data) { - if(data.length > 0) { - authorized = true; - uuid = data[0].uuid; - steamname = data[0].steampersona; - steamid = `Steam ID: ${data[0].steamid}`; - discordid = `Discord ID: ${data[0].discordid}`; - } - } - } - // Log UUID - console.log(`CATALOG: ${uuid}`); - // Build JSON response - let response = JSON.stringify(catalog); - response = response.replace(/%STEAM_NAME%/g, steamname.toUpperCase()); - response = response.replace(/%STEAM_ID%/g, steamid); - response = response.replace(/%DISCORD_ID%/g, discordid); - // Send response - res.json(JSON.parse(response)); -}); - -// Endpoint: /store/offers -// Used with parameters ?page=1&vendor=0 or ?page=1&vendor=4 -app.get("/store/offers", function(req, res) { - // Check if vendor is 0 or 4 - if(req.query.vendor == 4) { - res.json(credits); - } else { - let stores = JSON.stringify(store); - // Validate authorization header - if(!req.headers.authorization) { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get authorization header - const auth = req.headers.authorization.split(" "); - // Verify authorization header - if(auth[0] != "Bearer") { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get UUID - const ticket = auth[1]; - // Create UUID from ticket using uuidkey - let uuid = getUuid(`${uuidkey}:${ticket}`); - // Ask database if IP address has a UUID linked to it - let ipaddr = req.socket.remoteAddress; - let authorized = false; - if(ipaddr) { - ipaddr = ipaddr.replace("::ffff:", ""); // fix for IPv4 - ipaddr = ipaddr.replace("::1", "127.0.0.1"); // fix for localhost - ipaddr = ipaddr.replace("127.0.0.1", config.localhost); // override localhost - const prep = db.prepare("SELECT uuid FROM users WHERE ipaddr = ?"); - const data = prep.get(ipaddr); - if(data) { - uuid = data.uuid; - authorized = true; - } - } - // Log UUID - console.log(`STORE: ${uuid}`); - // Set migration count - const prep = db.prepare("SELECT migrations FROM users WHERE uuid = ?"); - const data = prep.get(uuid); - if(data && data.migrations) { - stores = stores.replace(/123456789/g, data.migrations); - } else { - stores = stores.replace(/123456789/g, "0"); - } - // Send response - res.json(JSON.parse(stores)); - } -}); - -// Endpoint: /store/vouchers/transactions -// POST by the game -app.post("/store/vouchers/transactions", function(req, res) { - // Free vouchers from the game - const vouchers = [ - "e8fd70ec-f3ec-519b-8b57-70518c4c4f74", - "640144eb-7862-5186-90d0-606211ec2271", - "54d80a04-cfbc-51a4-91a1-a88a5c96e7ea", - "82a9febc-5f11-57db-8464-2ed2b4df74f9", - ]; - if(!vouchers.includes(req.body.voucher_id)) { - // Send error - res.status(400).send("Invalid voucher ID"); - return; - } - // This doesn't follow API spec, but just use the offer_id as the transaction_id - const transactionid = req.body.voucher_id; - // Build JSON response - const response = { - "transaction_id": transactionid, - }; - // 201 Created - res.status(201).json(response); -}); - -// Endpoint: /store/purchases/transactions -// POST by the game -app.post("/store/purchases/transactions", function(req, res) { - // This doesn't follow API spec, but just use the offer_id as the transaction_id - const transactionid = req.body.offer_id; - // Build JSON response - const response = { - "transaction_id": transactionid, - }; - // 201 Created - res.status(201).json(response); -}); - -// Transactions -function Transaction(req, res) { - // We don't check transaction IDs, but at least ensure it's there - if(!req.params.transactionid) { - // Send error - res.status(400).send("Invalid transaction ID"); - return; - } - // Validate authorization header - if(!req.headers.authorization) { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get authorization header - const auth = req.headers.authorization.split(" "); - // Verify authorization header - if(auth[0] != "Bearer") { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get UUID - const ticket = auth[1]; - // Create UUID from ticket using uuidkey - let uuid = getUuid(`${uuidkey}:${ticket}`); - // Ask database if IP address has a UUID linked to it - let ipaddr = req.socket.remoteAddress; - let authorized = false; - if(ipaddr) { - ipaddr = ipaddr.replace("::ffff:", ""); // fix for IPv4 - ipaddr = ipaddr.replace("::1", "127.0.0.1"); // fix for localhost - ipaddr = ipaddr.replace("127.0.0.1", config.localhost); // override localhost - const prep = db.prepare("SELECT uuid FROM users WHERE ipaddr = ?"); - const data = prep.get(ipaddr); - if(data) { - uuid = data.uuid; - authorized = true; - } - } - // Log UUID - console.log(`VOUCHER: ${uuid} (${ipaddr})`); - const unlocks = { - "items": {}, - }; - let replace = true; - try { - switch(req.params.transactionid) { - case "2f93daeb-d68f-4b28-80f4-ace882587a13": - // Assortment of consumables - let consumables = []; - // Get consumables - for(let key in catalog.items) { - const item = catalog.items[key]; - if(item.data && item.data.gangland_is_consumable == "1") { - consumables.push(key); - } - } - // Pick 5 random consumables - const consumablecount = 5; - for(let i = 0; i < consumablecount; i++) { - const item = consumables[Math.floor(Math.random() * consumables.length)]; - if(unlocks.items[item]) { - unlocks.items[item] += 1; - } else { - unlocks.items[item] = 1; - } - } - replace = false; - break; - case "e62345be-304c-4551-8472-8bd2c367f3f3": - // Migrate from official servers: Set migrating flag if ticket exists - if(ticket && authorized) { - const prep = db.prepare("UPDATE users SET migrating = ?, migration_start_time = ? WHERE uuid = ?"); - const result = prep.run(1, Date.now(), uuid); - let exists = false; - let deleting = false; - for(let i = 0; i < scheduled_actions.length; i++) { - if(scheduled_actions[i].uuid == uuid) { - if(scheduled_actions[i].action == "migrate") - exists = true; - if(scheduled_actions[i].action == "delete") - deleting = true; - break; - } - } - // If successful, add items - if(!exists && !deleting) { - // Status code - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 1; - // Account migration process started - unlocks.items["1985b4d7-d02d-4bb9-999d-69948588f0c3"] = 1; - // Ask to close game and wait 5 minutes - unlocks.items["7a08ec4f-9f80-4199-925b-aa6f58759c73"] = 1; - // Push scheduled action - scheduled_actions.push({ - "uuid": uuid, - "action": "migrate", - "time": Date.now() + 60 * 2000, // 2 minutes - }); - console.log(`SCHEDULED: ${uuid} (migrate)`); - } else { - // What went wrong? Check if migration is already in progress - const prep = db.prepare("SELECT migration_start_time FROM users WHERE uuid = ?"); - const data = prep.get(uuid); - if(data && data.migration_start_time) { - // Migration is already in progress - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 2; - unlocks.items["fba9a9bd-0b5a-4e41-a74b-c25ead882bf5"] = 2; - } else if(deleting) { - // Decline - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 5; - unlocks.items["fba9a9bd-0b5a-4e41-a74b-c25ead882bf5"] = 5; - } else { - // Unknown error occured - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 5; - unlocks.items["71879d11-5a23-4177-a107-8a54c4a5463d"] = 3; - } - } - } - break; - case "8b611b15-b560-463d-af74-78915fa399f7": - // Request account deletion - if(authorized) { - // If migrating, don't allow deletion - let prep = db.prepare("SELECT migrating FROM users WHERE uuid = ?"); - let data = prep.get(uuid); - if(data && data.migrating == "true") { - // Status code - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 5; - // Decline - unlocks.items["fba9a9bd-0b5a-4e41-a74b-c25ead882bf5"] = 5; - break; - } - // Set deletion flag - prep = db.prepare("UPDATE users SET deleting = ?, delete_start_time = ? WHERE uuid = ?"); - const result = prep.run(1, Date.now(), uuid); - let exists = false; - for(let i = 0; i < scheduled_actions.length; i++) { - if(scheduled_actions[i].uuid == uuid && scheduled_actions[i].action == "delete") { - exists = true; - break; - } - } - // If successful, add items - if(!exists) { - // Status code - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 1; - // Account deletion process started - unlocks.items["27afc195-9c1a-4d2d-8f56-67e4b3475b07"] = 1; - // Ask to close game and wait 5 minutes - unlocks.items["7a08ec4f-9f80-4199-925b-aa6f58759c73"] = 1; - // Push scheduled action - scheduled_actions.push({ - "uuid": uuid, - "action": "delete", - "time": Date.now() + 60 * 5000, // 5 minutes - }); - console.log(`SCHEDULED: ${uuid} (delete)`); - } else { - // What went wrong? Check if deletion is already in progress - const prep = db.prepare("SELECT delete_start_time FROM users WHERE uuid = ?"); - const data = prep.get(uuid); - if(data && data.delete_start_time) { - // Status code - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 1; - // 2 minutes up? - if(data.delete_start_time + 2 * 60 * 1000 < Date.now()) { - // Action no longer available - unlocks.items["fa477238-31e0-4052-9a4e-acf98df14cd5"] = 1; - // Wait 5 minutes - unlocks.items["7a08ec4f-9f80-4199-925b-aa6f58759c73"] = 1; - } else { - // Action cancelled - unlocks.items["21399935-ba00-4bbe-bfdb-bb544fd02048"] = 1; - // Delete scheduled action - for(let i = 0; i < scheduled_actions.length; i++) { - if(scheduled_actions[i].uuid == uuid && scheduled_actions[i].action == "delete") { - scheduled_actions.splice(i, 1); - break; - } - } - // Remove deletion flag - const prep = db.prepare("UPDATE users SET deleting = ?, delete_start_time = ? WHERE uuid = ?"); - prep.run(0, null, uuid); - } - } else { - // Status code - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 4; - // Unknown error occured - unlocks.items["71879d11-5a23-4177-a107-8a54c4a5463d"] = 4; - } - } - } - break; - default: - // Status code - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 10; - // Invalid option - unlocks.items["94d7b7a1-9a5b-4c58-81a4-ba40cd096da1"] = 10; - break; - } - } catch (e) { - console.log(e); - // Status code - unlocks.items["4a410e7a-c007-4aaf-8237-07d2ffe949c6"] = 9; - // Invalid option - unlocks.items["71879d11-5a23-4177-a107-8a54c4a5463d"] = 9; - } - // Add to inventory if authorized - if(authorized) { - const inventoryprep = db.prepare("SELECT inventory FROM users WHERE uuid = ?"); - const inventorylist = inventoryprep.get(uuid); - let inventoryobj = baseinventory; - // Check if inventory exists - if(inventorylist && inventorylist.inventory) { - inventoryobj = JSON.parse(inventorylist.inventory); - } - // Add items to inventory - for(let itemid in unlocks.items) { - // Add item to inventory item count (or create it) - if(inventoryobj.inventory[itemid]) { - inventoryobj.inventory[itemid] += unlocks.items[itemid]; - } else { - inventoryobj.inventory[itemid] = unlocks.items[itemid]; - } - } - // Update inventory - const inventory = JSON.stringify(inventoryobj); - const inventoryupdate = db.prepare("UPDATE users SET inventory = ? WHERE uuid = ?"); - inventoryupdate.run(inventory, uuid); - } - // 201 Created - res.status(201).json(unlocks); -} - -// Endpoint: /store/vouchers/:transactionid -// PUT by the game -app.put("/store/vouchers/:transactionid", Transaction); - -// Endpoint: /store/purchases/:transactionid -// PUT by the game -app.put("/store/purchases/:transactionid", Transaction); - -// Endpoint: /users/[uuid]/[sub1]/[sub2] -// This is where settings and other user data is stored. -// The game may also PUT to this endpoint. -// We're going to save the data to a file, maybe in the future we'll use a database. -app.get("/users/:uuid/:subpage?/:subpage2?", function(req, res) { - const urluuid = req.url.split("/")[2]; // req.query doesn't work here - const subpage = req.url.split("/")[3]; - const subpage2 = req.url.split("/")[4]; - // Validate authorization header - if(!req.headers.authorization) { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get authorization header - const auth = req.headers.authorization.split(" "); - // Verify authorization header - if(auth[0] != "Bearer") { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get UUID - const ticket = auth[1]; - // Create UUID from ticket using uuidkey - let uuid = getUuid(`${uuidkey}:${ticket}`); - // Ask database if IP address has a UUID linked to it - let ipaddr = req.socket.remoteAddress; - let authorized = false; - if(ipaddr) { - ipaddr = ipaddr.replace("::ffff:", ""); // fix for IPv4 - ipaddr = ipaddr.replace("::1", "127.0.0.1"); // fix for localhost - ipaddr = ipaddr.replace("127.0.0.1", config.localhost); // override localhost - const prep = db.prepare("SELECT uuid FROM users WHERE ipaddr = ?"); - const data = prep.get(ipaddr); - if(data) { - uuid = data.uuid; - authorized = true; - } - } - // Log UUID - console.log(`AUTH: ${uuid} (${ipaddr})`); - if(urluuid === "me") { - if(!subpage) { - // Build JSON response with UUID - const user = { - "user_id": uuid, - }; - // Send response - res.json(user); - } else if(subpage == "inventory") { - let inventoryobj = baseinventory; - let reset = false; - if(authorized) { - // Query database for inventory - const inventoryprep = db.prepare("SELECT inventory FROM users WHERE uuid = ?"); - const inventorylist = inventoryprep.get(uuid); - // If inventory doesn't exist, create it - if(!inventorylist || !inventorylist.inventory) { - // Insert inventory into existing row - const inventoryinsert = db.prepare("UPDATE users SET inventory = ? WHERE uuid = ?"); - inventoryinsert.run(JSON.stringify(inventoryobj), uuid); - } else { - // Inventory is a JSON object - inventoryobj = JSON.parse(inventorylist.inventory); - reset = true; - } - } - // Send response - res.json(inventoryobj); - } - } else if(subpage === "profile") { - if(subpage2 === "private") { - // Check if UUID matches the one in the URL - if(uuid != urluuid) { - // If authorized, user is likely migrating UUIDs - // Otherwise, don't allow access - if(!authorized) { - // Send error - res.status(400).send("Invalid UUID"); - return; - } - } - // Pull from database - const dataprep = db.prepare("SELECT data FROM users WHERE uuid = ?"); - const data = dataprep.get(uuid); - let json = save; - // Check if data exists - if(!data || !data.data) { - // Insert save into existing row - const insert = db.prepare("UPDATE users SET data = ? WHERE uuid = ?"); - insert.run(JSON.stringify(json), uuid); - } else { - // Save is a JSON object - json = JSON.parse(data.data); - } - // Send response - res.json(json); - } else { - // unimplemented, return empty object - console.log(`Unimplemented endpoint: ${req.url}`); - res.json({}); - } - } else if(subpage === "wbnet") { - // unimplemented, return empty object - console.log(`Unimplemented endpoint: ${req.url}`); - res.json({ - message: "No WBNet user linked", - code: 2600, - }); - } else { - // unimplemented, return empty object - console.log(`Unimplemented endpoint: ${req.url}`); - res.json({}); - } -}); - -app.put("/users/:uuid/:subpage?/:subpage2?", function(req, res) { - const urluuid = req.url.split("/")[2]; // req.query doesn't work here - const subpage = req.url.split("/")[3]; - const subpage2 = req.url.split("/")[4]; - // Validate authorization header - if(!req.headers.authorization) { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Get authorization header - const auth = req.headers.authorization.split(" "); - // Get UUID - const ticket = auth[1]; - // Create UUID from ticket using uuidkey - let uuid = getUuid(`${uuidkey}:${ticket}`); - // Ask database if IP address has a UUID linked to it - let ipaddr = req.socket.remoteAddress; - let authorized = false; - if(ipaddr) { - ipaddr = ipaddr.replace("::ffff:", ""); - ipaddr = ipaddr.replace("::1", "127.0.0.1"); - ipaddr = ipaddr.replace("127.0.0.1", config.localhost); // override localhost - const prep = db.prepare("SELECT uuid FROM users WHERE ipaddr = ?"); - const data = prep.get(ipaddr); - if(data && data.uuid) { - uuid = data.uuid; - authorized = true; - } - } - // Check if UUID matches the one in the URL - if(uuid != urluuid) { - // If authorized, user is likely migrating UUIDs - // Otherwise, don't allow access - if(!authorized) { - // Send error - res.status(400).send("Invalid UUID"); - return; - } - } - if(urluuid === "me") { - // unimplemented, print out - console.log(`Unimplemented endpoint: ${req.url}`); - } else if(subpage === "profile") { - if(subpage2 === "private") { - // Verify authorization header - if(auth[0] != "Bearer") { - // Send error - res.status(400).send("Invalid authorization header"); - return; - } - // Update database - const updateprep = db.prepare("UPDATE users SET data = ? WHERE uuid = ?"); - updateprep.run(JSON.stringify(req.body), uuid); - } else { - // unimplemented, print out - console.log(`Unimplemented endpoint: ${req.url}`); - } - } else { - // unimplemented, print out - console.log(`Unimplemented endpoint: ${req.url}`); - } - // Send response - res.status(204).send(); -}); - -// Endpoint: /actions/:action -// Unknown... - -// Account creation -app.get("/auth/landing", async (req, res) => { - try { - const user = await steam.authenticate(req); - const steamid = user.steamid; - const steampersona = user.username; - // Get existing uuid for steamid - let loggedin = false; - let lastwbid = ""; - let lastlocation = "Unknown"; - let persistent = false; - let prep = db.prepare("SELECT * FROM users WHERE steamid = ?"); - let data = prep.get(steamid); - if(data && data.uuid) { - loggedin = true; - // Get last WBID connected to this account and its IP address - lastwbid = `&wbid=${data.wbid}`; - persistent = data.persistent; - lastlocation = data.location; - } - res.redirect(`/landing.html?avatar=${user.avatar.large}&persona=${user.username}&steamid=${user.steamid}&loggedin=${loggedin}${lastwbid}&lastlocation=${lastlocation}&persistent=${persistent}`); - } catch (error) { - console.error(error); - const message = "Steam authentication failed."; - res.redirect(`/error.html?error=${message}&realerror=${error}`); - } -}); - -// Account deletion -app.get("/auth/delete", async (req, res) => { - let message; - try { - const user = await steamdelete.authenticate(req); - const steamid = user.steamid; - // Get existing uuid for steamid - const prep = db.prepare("SELECT uuid FROM users WHERE steamid = ?"); - const data = prep.get(steamid); - if(data && data.uuid) { - // Delete user - const deleteprep = db.prepare("DELETE FROM users WHERE uuid = ?"); - deleteprep.run(data.uuid); - console.log(`USER: ${user.steamid} - DELETED`); - res.redirect(`/deleted.html?avatar=${user.avatar.large}`); - } else { - // User doesn't exist - console.log(`USER: ${user.steamid} - NOT FOUND`); - message = "User not found."; - res.redirect(`/error.html?error=${message}`); - } - } catch (error) { - console.error(error); - message = "Steam authentication failed."; - res.redirect(`/error.html?error=${message}&realerror=${error}`); - } -}); - -// Discord account linkage -app.get("/auth/discord", async (req, res) => { - // Redirect to Discord - res.redirect(`https://discord.com/api/oauth2/authorize?client_id=${discordapplicationid}&redirect_uri=${config.host.https_enabled ? "https" : "http"}://${config.host.domain}${config.host.show_port ? ':' + (config.host.https_enabled ? config.host.https_port : config.host.http_port) : ""}/auth/discord/callback&response_type=code&scope=identify connections`); -}); - -// Discord account linkage callback -app.get("/auth/discord/callback", async (req, res) => { - if(req.query.code !== undefined) { - // Get URL param code - const code = req.query.code; - // Axios: Get access token - // application/x-www-form-urlencoded - let params = new URLSearchParams(); - params.append("client_id", discordapplicationid); - params.append("client_secret", discordapplicationsecret); - params.append("grant_type", "authorization_code"); - params.append("code", code); - params.append("redirect_uri", `${config.host.https_enabled ? "https" : "http"}://${config.host.domain}${config.host.show_port ? ':' + (config.host.https_enabled ? config.host.https_port : config.host.http_port) : ""}/auth/discord/callback`); - params.append("scope", "identify connections"); - axios.post("https://discord.com/api/oauth2/token", params, { - headers: { - "Content-Type": "application/x-www-form-urlencoded", - }, - }).then((response) => { - // Axios: Get user ID and name - const token = response.data.access_token; - axios.get("https://discord.com/api/users/@me", { - headers: { - Authorization: `Bearer ${token}`, - }, - }).then((response) => { - // Axios: Get connections - const userid = response.data.id; - const username = response.data.username; - const avatar = response.data.avatar; - axios.get("https://discord.com/api/users/@me/connections", { - headers: { - Authorization: `Bearer ${token}`, - }, - }).then((response) => { - // Get steam connection - response.data.forEach((connection) => { - if(connection.type != "steam") return; - // Get existing uuid for steamid - const prep = db.prepare("SELECT uuid FROM users WHERE steamid = ?"); - const data = prep.get(connection.id); - if(data && data.uuid) { - // Update discordid - const updateprep = db.prepare("UPDATE users SET discordid = ? WHERE uuid = ?"); - updateprep.run(userid, data.uuid); - console.log(`USER: ${connection.id} - DISCORD LINKED TO ${userid}`); - res.redirect(`/discord-linked.html?avatar=${avatar}&persona=${username}&discordid=${userid}&steamid=${connection.id}`); - } else { - // User doesn't exist - console.log(`USER: ${connection.id} - NOT FOUND`); - const message = "User not found."; - const realerror = "Please log in with the game at least once."; - res.redirect(`/error.html?error=${message}&realerror=${realerror}`); - } - }) - }).catch((error) => { - console.error(error); - const message = "Discord authentication failed. Is your Steam account connected inside Discord?"; - res.redirect(`/error.html?error=${message}&realerror=${error}`); - }); - }); - }).catch((error) => { - console.error(error); - const message = "Discord authentication failed. Is your Steam account connected inside Discord?"; - res.redirect(`/error.html?error=${message}&realerror=${error}`); - }); - } -}); - -// Request persistence -app.get("/persistence", async (req, res) => { - // Get URL params steamid and persistent - const steamid = req.query.steamid; - const persistent = req.query.persistent; - // Get current url - let url = req.url; - // Replace /persistence with /landing.html - url = url.replace("/persistence", "/landing.html"); - let persistencelevel = !persistent; - // Get existing uuid for steamid - if(steamid && persistent != undefined) { - const prep = db.prepare("SELECT uuid FROM users WHERE steamid = ?"); - const data = prep.get(steamid); - if(data && data.uuid) { - // Update persistence - const updateprep = db.prepare("UPDATE users SET persistent = ? WHERE uuid = ?"); - updateprep.run(persistent, data.uuid); - console.log(`USER: ${steamid} - PERSISTENCE: ${persistent}`); - persistencelevel = persistent; - } - } - // Replace persistent= value - url = url.replace(/persistent=[^&]+/, `persistent=${persistencelevel}`); - // Redirect - res.redirect(`${url}&accessed=true`); -}); - -// Steam OpenID -app.get("/auth", async (req, res) => { - const redirectUrl = await steam.getRedirectUrl(); - res.redirect(redirectUrl); -}); - -// Request deletion -app.get("/delete", async (req, res) => { - let redirectUrl = await steamdelete.getRedirectUrl(); - res.redirect(redirectUrl); -}); - -// Join lobby redirect -app.get("/joinlobby", async (req, res) => { - // Get URL params lobbyid and steamid - const lobbyid = req.query.lobbyid; - const steamid = req.query.steamid; - // Redirect to steam://joinlobby/... - res.redirect(`steam://joinlobby/${config.appid}/${lobbyid}/${steamid}`); -}); - -// Path handler -app.get(/^(.+)$/, function(req, res) { - // Root: /index.html - if(req.params[0] === "/") - req.params[0] = "/index.html"; - // Send response - const url = path.join(__dirname, "usercfg", "web", req.params[0]); - if(fse.existsSync(url)) { - res.sendFile(url); - } else { - // Pass if /CLS is in the URL - if(!req.params[0].includes("/CLS")) { - // 404.html - res.status(404).sendFile(path.join(__dirname, "usercfg", "web", "404.html")); - } - } -}); - -// SOAP functions -function DummyFunc(name, args) { - console.log(name); - console.log(args); -} - -const wbmanagement = { - LookupWbid: function(args, callback) { - DummyFunc("LookupWbid", args); - const ipaddr = args.ipaddr; - // Verify realm - if(args.realm == "STEAM" && args.title == "OZZY" && args.uniqueId) { - const wbid = args.uniqueId; - let steamid = args.consoleId; - // Pull name from steam API - const summaryurl = `http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=${steamapikey}&steamids=${steamid}`; - function cb(response) { - if(response.data && response.data.response && response.data.response.players && response.data.response.players[0]) { - const user = response.data.response.players[0]; - const name = user.personaname; - steamid = user.steamid; - // Check if the user exists - let prep = db.prepare("SELECT * FROM users WHERE steamid = ?"); - const data = prep.get(steamid); - // Pull location from IP - const geo = geoip.lookup(ipaddr); - let lastlocation = "Unknown"; - if(geo) - lastlocation = `${geo.city}, ${geo.region}, ${geo.country}`; - if(!data) { - // Create a new user - const uuid = crypto.randomUUID(); - prep = db.prepare("INSERT INTO users (uuid, ipaddr, steampersona, steamid, wbid, location) VALUES (?, ?, ?, ?, ?, ?)"); - prep.run(uuid, ipaddr, name, steamid, wbid, lastlocation); - } else { - // Update existing user - prep = db.prepare("UPDATE users SET steampersona = ?, steamid = ?, wbid = ?, ipaddr = ?, location = ? WHERE uuid = ?"); - prep.run(name, steamid, wbid, ipaddr, lastlocation, data.uuid); - } - } - } - // Check if the user exists - let dontdoit = false; - const prep = db.prepare("SELECT * FROM users WHERE steamid = ?"); - const data = prep.get(steamid); - if(data) { - // Players can choose to lock their account info to prevent unauthorized use - console.log(`USER: ${steamid} - PERSISTENCE: ${data.persistent}`); - if(data.persistent == "true") // encoded as string - { - dontdoit = true; - console.log(`USER: ${steamid} - WILL NOT UPDATE`); - } - } - if(!dontdoit) - axios.get(summaryurl).then(response => cb(response)).catch(error => console.error(error)); - } - // Don't ever log into a WBID - return {}; - }, - AssociateWbid: function(args, callback) { - DummyFunc("AssociateWbid", args); - return {}; - }, - DisassociateWbid: function(args, callback) { - DummyFunc("DisassociateWbid", args); - return {}; - }, - CreateAccount: function(args, callback) { - DummyFunc("CreateAccount", args); - return {}; - }, - CreateAccountAndAssociate: function(args, callback) { - DummyFunc("CreateAccountAndAssociate", args); - return {}; - }, - ResetPassword: function(args, callback) { - DummyFunc("ResetPassword", args); - return {}; - }, - StartWBPasswordReset: function(args, callback) { - DummyFunc("StartWBPasswordReset", args); - return {}; - }, - StartWBPasswordResetFromConsole: function(args, callback) { - DummyFunc("StartWBPasswordResetFromConsole", args); - return {}; - }, - FinishWBPasswordReset: function(args, callback) { - DummyFunc("FinishWBPasswordReset", args); - return {}; - }, - GetSubscriptionInformation: function(args, callback) { - DummyFunc("GetSubscriptionInformation", args); - return { - GetSubscriptionInformationResult: { - WbidAccountId: crypto.randomUUID(), - SubscriptionId: crypto.randomUUID(), - AccountId: crypto.randomUUID(), - Entitlements: [] // ??? I couldn't source a dump of this, may be used for DLC - } - }; - } -}; - -// Pretty much half-implemented SOAP server -// No WDSL because the soap package does not immediately support the official one. -// The game doesn't call it, so it's not needed. -function SOAPPost(req, res) { - // Get XML as JSON - const xml = xml2js(req.body); - let soapreq = { - name: "", - args: {} - }; - for(let i = 0; i < xml.elements.length; i++) { - for(let j = 0; j < xml.elements[i].elements.length; j++) { - soapreq.name = xml.elements[i].elements[j].elements[0].name; - for(let k = 0; k < xml.elements[i].elements[j].elements[0].elements.length; k++) { - if(xml.elements[i].elements[j].elements[0].elements[k].elements != undefined) { - for(let l = 0; l < xml.elements[i].elements[j].elements[0].elements[k].elements.length; l++) { - soapreq.args[xml.elements[i].elements[j].elements[0].elements[k].name] = xml.elements[i].elements[j].elements[0].elements[k].elements[l].text; - } - } else { - soapreq.args[xml.elements[i].elements[j].elements[0].elements[k].name] = xml.elements[i].elements[j].elements[0].elements[k].text; - } - } - } - } - let xmlres = { - declaration: { - attributes: { - version: "1.0", - encoding: "utf-8" - } - }, - elements: [{ - type: "element", - name: "soap:Envelope", - attributes: { - "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", - "xmlns:soap": "http://schemas.xmlsoap.org/soap/envelope/" - }, - elements: [{ - type: "element", - name: "soap:Body", - elements: [] - }] - }] - }; - let soapres = { - name: "", - args: {} - }; - // Content type - res.set("Content-Type", "text/xml"); - let fault = false; - // Call SOAP function - if(wbmanagement[soapreq.name]) { - soapres.name = soapreq.name + "Response"; - // Add IP address to args - let args = soapreq.args; - args.ipaddr = req.socket.remoteAddress; - args.ipaddr = args.ipaddr.replace("::ffff:", ""); - args.ipaddr = args.ipaddr.replace("::1", "127.0.0.1"); - args.ipaddr = args.ipaddr.replace("127.0.0.1", config.localhost); - soapres.args = wbmanagement[soapreq.name](args); - // Build XML response - xmlres.elements[0].elements[0].elements.push({ - type: "element", - name: soapres.name, - elements: [] - }); - for(let key in soapres.args) { - xmlres.elements[0].elements[0].elements[0].elements.push({ - type: "element", - name: key, - elements: [{ - type: "text", - text: soapres.args[key] - }] - }); - } - } else { - fault = true; - res.status(500); - } - if(fault) { - // Build XML fault - xmlres.elements[0].elements[0].elements.push({ - type: "element", - name: "soap:Fault", - elements: [ - { - type: "element", - name: "soap:Code", - elements: [{ - type: "text", - text: "soap:Receiver" - }] - }, - { - type: "element", - name: "soap:Reason", - elements: [{ - type: "text", - text: "Unhandled exception ---> The provided SteamTicketInformation ticket has expired." - }] - }, - { - type: "element", - name: "soap:Node", - elements: [{ - type: "text", - text: "Turbine.Ams.Steam.SteamAuthenticationProvider.ValidateExternalTicket_worker" - }] - }, - { - type: "element", - name: "detail", - elements: [ - { - type: "element", - name: "exceptiontype", - elements: [{ - type: "text", - text: "Turbine.Security.TicketExpiredException" - }] - }, - { - type: "element", - name: "errorcode", - elements: [{ - type: "text", - text: "0xA01B000C" - }] - } - ] - } - ] - }); - } - // Send response - res.send(js2xml(xmlres)); -} - -app.post("/CLS/WbAccountManagement.asmx", SOAPPost); -app.post("/CLS/WbSubscriptionManagement.asmx", SOAPPost); - -// Start servers -function done() { - if(config.debug) { - console.log(`WEB: Listening on port ${config.host.https_enabled ? config.host.https_port : config.host.http_port}`); - } -} -let server; -let server_passthrough; -if(!config.host.https_enabled) { - server = app.listen(config.host.http_port, () => { - done(); - }); -} else { - server = https.createServer({ - key: fse.readFileSync(`./usercfg/${config.host.https_key}`), - cert: fse.readFileSync(`./usercfg/${config.host.https_cert}`) - }, app).listen(config.host.https_port, () => { - done(); - }); -} -if(config.host.localhost_passthrough_enabled) { - // Passthrough server - server_passthrough = http.createServer(app).listen(config.host.localhost_passthrough_port, () => { - if(config.debug) { - console.log(`WEB: Passthrough on port ${config.host.localhost_passthrough_port}`); - } - }); -} - -// Connection storage -let connections = []; -server.on('connection', connection => { - connections.push(connection); - connection.on('close', () => { - connections = connections.filter(curr => curr !== connection); - }); -}); -if(config.host.localhost_passthrough_enabled) { - server_passthrough.on('connection', connection => { - connections.push(connection); - connection.on('close', () => { - connections = connections.filter(curr => curr !== connection); - }); - }); -} - -// Combine data -function CombineSaveData(data, newdata) { - for(let key in newdata) { - if(data[key] == undefined) { - data[key] = newdata[key]; - } else { - if(typeof data[key] == "object") { - data[key] = CombineSaveData(data[key], newdata[key]); - } else { - data[key] = newdata[key]; - } - } - } - return data; -} - -// Scheduled actions handler -const scheduled_actions_interval = setInterval(() => { - for(let i = 0; i < scheduled_actions.length; i++) { - if(scheduled_actions[i].time <= Date.now()) { - console.log(`ACTION: ${scheduled_actions[i].uuid} - ${scheduled_actions[i].action}`); - let prep; - let data; - switch(scheduled_actions[i].action) { - case "migrate": - // Check user for ticket - prep = db.prepare("SELECT credentials, ticket FROM users WHERE uuid = ?"); - data = prep.get(scheduled_actions[i].uuid); - if(data.credentials == null || data.ticket == null) { - // No ticket, remove migration flag - prep = db.prepare("UPDATE users SET migrating = 0, migration_start_time = null WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`MIGRATE FAIL: ${scheduled_actions[i].uuid} - No ticket`); - // Delete action - scheduled_actions.splice(i, 1); - break; - } - // Migrate account - const migrateurl = "http://ozzypc-wbid.live.ws.fireteam.net"; - // AXIOS: post /auth/token with Authorization:Basic [credentials] and HTML form (urlencoded) - axios.post(`${migrateurl}/auth/token`, qs.stringify({ - grant_type: "http://ns.fireteam.net/oauth2/grant-type/steam/encrypted_app_ticket", - ticket: data.ticket - }), { - headers: { - "Authorization": `Basic ${data.credentials}` - } - }).then((res) => { - // If not 200, cancel migration - if(res.status != 200) { - prep = db.prepare("UPDATE users SET migrating = 0, migration_start_time = null WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`MIGRATE FAIL: ${scheduled_actions[i].uuid} - ${res.status} - ${res.statusText}`); - // Delete action - scheduled_actions.splice(i, 1); - return; - } - const access_token = res.data.access_token; - // Response is a JSON object with access_token, get /users/me - axios.get(`${migrateurl}/users/me`, { - headers: { - "Authorization": `Bearer ${access_token}` - } - }).then((res) => { - // If not 200, cancel migration - if(res.status != 200) { - prep = db.prepare("UPDATE users SET migrating = 0, migration_start_time = null WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`MIGRATE FAIL: ${scheduled_actions[i].uuid} - ${res.status} - ${res.statusText}`); - // Delete action - scheduled_actions.splice(i, 1); - return; - } - // Response is a JSON object with user_id, get /users/[user_id]/profile/private - axios.get(`${migrateurl}/users/${res.data.user_id}/profile/private`, { - headers: { - "Authorization": `Bearer ${access_token}` - } - }).then((res) => { - // If not 200, cancel migration - if(res.status != 200) { - prep = db.prepare("UPDATE users SET migrating = 0, migration_start_time = null WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`MIGRATE FAIL: ${scheduled_actions[i].uuid} - ${res.status} - ${res.statusText}`); - // Delete action - scheduled_actions.splice(i, 1); - return; - } - // Response is a JSON object with user save data, combine with persistent migration save - let usersave = CombineSaveData(res.data, persistentmigrationsave); - // Get migration count - prep = db.prepare("SELECT migrations FROM users WHERE uuid = ?"); - data = prep.get(scheduled_actions[i].uuid); - let migration_count = 1; - // Increment migration count - if(data.migrations != null) { - migration_count = data.migrations + 1; - } - // Update user - prep = db.prepare("UPDATE users SET credentials = null, ticket = null, migrating = 0, migration_start_time = null, data = ?, migrations = ? WHERE uuid = ?"); - data = prep.run(JSON.stringify(usersave), migration_count, scheduled_actions[i].uuid); - // Log - console.log(`MIGRATE: ${scheduled_actions[i].uuid}`); - // Delete action - scheduled_actions.splice(i, 1); - }).catch((err) => { - // Cancel migration - prep = db.prepare("UPDATE users SET migrating = 0, migration_start_time = null WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`MIGRATE FAIL: ${scheduled_actions[i].uuid}`); - console.log(err); - // Delete action - scheduled_actions.splice(i, 1); - }); - }).catch((err) => { - // Cancel migration - prep = db.prepare("UPDATE users SET migrating = 0, migration_start_time = null WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`MIGRATE FAIL: ${scheduled_actions[i].uuid}`); - console.log(err); - // Delete action - scheduled_actions.splice(i, 1); - }); - }).catch((err) => { - // Cancel migration - prep = db.prepare("UPDATE users SET migrating = 0, migration_start_time = null WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`MIGRATE FAIL: ${scheduled_actions[i].uuid}`); - console.log(err); - // Delete action - scheduled_actions.splice(i, 1); - }); - break; - case "delete": - // Delete account - prep = db.prepare("DELETE FROM users WHERE uuid = ?"); - data = prep.run(scheduled_actions[i].uuid); - console.log(`DELETE: ${scheduled_actions[i].uuid}`); - // Delete action - scheduled_actions.splice(i, 1); - break; - default: - // Unknown action - console.log(`ACTION FAIL: ${scheduled_actions[i].uuid} - Unknown action`); - // Delete action - scheduled_actions.splice(i, 1); - break; - } - } else { - // Check next action - continue; - } - } - -}, 30000); // Check every 30 seconds - -// Closing -function Close(param) { - if(param instanceof Error) - console.error(param); - // Log - if(config.debug) - console.log("Shutting down..."); - // Close database - db.close(); - // Close scheduled actions - clearInterval(scheduled_actions_interval); - // Close connections - connections.forEach((connection) => { - connection.destroy(); - }); - // Close server - server.close(); - if(config.localhost_passthrough_enabled) - server_passthrough.close(); - // Discord bot (if enabled) - if(config.discord_bot.enabled) - discord_client.destroy(); - // Exit - process.exit(); -} - -process.on("SIGINT", Close); -process.on("SIGTERM", Close); -process.on("SIGUSR1", Close); -process.on("SIGUSR2", Close); -process.on("uncaughtException", Close); -process.on("unhandledRejection", Close); +// arkham-revived +// Licensed under the MIT License +// Copyright (c) 2023 KiwifruitDev + +// Imports +const express = require("express"); +const fse = require("fs-extra"); +const Database = require("better-sqlite3"); +const getUuid = require("uuid-by-string"); +const https = require("https"); +const http = require("http"); +const xmljs = require("xml-js"); +const js2xml = xmljs.js2xml; +const xml2js = xmljs.xml2js; + +// If usercfg folder doesn't exist, copy basecfg to usercfg +if(!fse.existsSync("./usercfg")) { + if(fse.existsSync("./basecfg")) { + fse.copySync("./basecfg", "./usercfg"); + } else { + // Warn user + console.log("WARNING: basecfg folder is missing! Re-install is recommended."); + process.exit(1); + } +} +// Load usercfg +const config = JSON.parse(fse.readFileSync("./usercfg/config.json")); +const motd = JSON.parse(fse.readFileSync("./usercfg/motd.json")); +const store = JSON.parse(fse.readFileSync("./usercfg/store.json")); +const credits = JSON.parse(fse.readFileSync("./usercfg/credits.json")); +const catalog = JSON.parse(fse.readFileSync("./usercfg/catalog.json")); +const save = JSON.parse(fse.readFileSync("./usercfg/save.json")); +const netvars = fse.readFileSync("./usercfg/netvars.dat").toString("base64"); +const baseinventory = JSON.parse(fse.readFileSync("./usercfg/inventory.json")); + +// Database +const db = new Database("./usercfg/database.db", { verbose: config.debug ? console.log : null }); +db.pragma('journal_mode = WAL'); + +// Delete users table if wipe_on_start is true +if(config.database.wipe_on_start) +{ + db.exec("DROP TABLE users"); +} + +// Create users table if it doesn't exist +db.exec("CREATE TABLE IF NOT EXISTS users (uuid TEXT PRIMARY KEY, inventory TEXT, data TEXT, consoleid TEXT, consoleticket TEXT, ip TEXT)"); + +// Create app and configure +const app = express(); +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); +app.use(express.text({ type: "text/xml" })); + +// Log requests +if(config.debug) { + app.use((req, res, next) => { + // Log request + console.log(`${req.method} ${req.url}`); + // Next + next(); + }); +} + +// Endpoint: /files/netvars.dat +// Game info stored in base64 +app.get("/files/netvars.dat", function(req, res) { + // Build JSON response + const response = { + "data": netvars, + }; + // Send response + res.json(response); +}); + +// Endpoint: /auth/token +// Returns a UUID specific to the user's ticket (Steam, presumably) +app.post("/auth/token", function(req, res) { + // Validate authorization header + if(!req.headers.authorization) { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Get authorization header + const auth = req.headers.authorization.split(" "); + // Verify authorization header + if(auth[0] != "Basic") { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Find UUID by ticket header + const ticketHeader = req.body.ticket.replace("_", "").replace("-", ""); + const uuidDb = db.prepare("SELECT uuid FROM users WHERE consoleticket = ?").get(ticketHeader); + let uuid; + if(!uuidDb) { + // Try looking by ip + const ipDb = db.prepare("SELECT uuid FROM users WHERE ip = ?").get(req.ip); + if(ipDb) { + // Use this uuid + uuid = ipDb.uuid; + } else { + // Create new UUID + uuid = getUuid(ticketHeader); + } + } else { + // Get UUID from database + uuid = uuidDb.uuid; + } + const token = { + "token_type": "bearer", + "access_token": uuid, + "expires_in": 1000000, + "refresh_token": "", + }; + // Send response + res.json(token); +}); + +// Endpoint: /motd +// Used with parameters ?channels.0=all&channels.1=all_no_wbid&channels.2=multiplayer&channels.3=multiplayer_no_wbid&country=US&page=1&per_page=10 +// We're not parsing all of that, so we'll return a static response. +app.get("/motd", function(req, res) { + // Send response + res.json(motd); +}); + +// Endpoint: /store/catalog/general +// Game catalog +app.get("/store/catalog/general", function(req, res) { + // Send response + res.json(catalog); +}); + +// Endpoint: /store/offers +// Used with parameters ?page=1&vendor=0 or ?page=1&vendor=4 +app.get("/store/offers", function(req, res) { + // Check if vendor is 0 or 4 + if(req.query.vendor == 4) { + res.json(credits); + } else { + res.json(store); + } +}); + +// Endpoint: /store/vouchers/transactions +// POST by the game +app.post("/store/vouchers/transactions", function(req, res) { + // Free vouchers from the game + const vouchers = [ + "e8fd70ec-f3ec-519b-8b57-70518c4c4f74", + "640144eb-7862-5186-90d0-606211ec2271", + "54d80a04-cfbc-51a4-91a1-a88a5c96e7ea", + "82a9febc-5f11-57db-8464-2ed2b4df74f9", + ]; + if(!vouchers.includes(req.body.voucher_id)) { + // Send error + res.status(400).send("Invalid voucher ID"); + return; + } + // This doesn't follow API spec, but just use the offer_id as the transaction_id + const transactionid = req.body.voucher_id; + // Build JSON response + const response = { + "transaction_id": transactionid, + }; + // 201 Created + res.status(201).json(response); +}); + +// Endpoint: /store/purchases/transactions +// POST by the game +app.post("/store/purchases/transactions", function(req, res) { + // This doesn't follow API spec, but just use the offer_id as the transaction_id + const transactionid = req.body.offer_id; + // Build JSON response + const response = { + "transaction_id": transactionid, + }; + // 201 Created + res.status(201).json(response); +}); + +// Transactions +function Transaction(req, res) { + // We don't check transaction IDs, but at least ensure it's there + if(!req.params.transactionid) { + // Send error + res.status(400).send("Invalid transaction ID"); + return; + } + // Validate authorization header + if(!req.headers.authorization) { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Get authorization header + const auth = req.headers.authorization.split(" "); + // Verify authorization header + if(auth[0] != "Bearer") { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Get UUID + const ticket = auth[1]; + // Create UUID from ticket + let uuid = ticket; + // Check if UUID is in database + const uuidDb = db.prepare("SELECT uuid FROM users WHERE uuid = ?").get(uuid); + if(!uuidDb) { + // Report a server error + console.log(`ERROR: UUID ${uuid} not found in database!`); + res.status(500).send("Internal server error"); + return; + } + // Log UUID + console.log(`VOUCHER: ${req.params.transactionid} (${uuid}`); + const unlocks = { + "items": {}, + }; + let replace = true; + try { + switch(req.params.transactionid) { + case "2f93daeb-d68f-4b28-80f4-ace882587a13": + // Assortment of consumables + let consumables = []; + // Get consumables + for(let key in catalog.items) { + const item = catalog.items[key]; + if(item.data && item.data.gangland_is_consumable == "1") { + consumables.push(key); + } + } + // Pick 5 random consumables + const consumablecount = 5; + for(let i = 0; i < consumablecount; i++) { + const item = consumables[Math.floor(Math.random() * consumables.length)]; + if(unlocks.items[item]) { + unlocks.items[item] += 1; + } else { + unlocks.items[item] = 1; + } + } + replace = false; + break; + } + } catch (e) { + console.log(e); + } + const inventoryprep = db.prepare("SELECT inventory FROM users WHERE uuid = ?"); + const inventorylist = inventoryprep.get(uuid); + let inventoryobj = baseinventory; + // Check if inventory exists + if(inventorylist && inventorylist.inventory) { + inventoryobj = JSON.parse(inventorylist.inventory); + } + // Add items to inventory + for(let itemid in unlocks.items) { + // Add item to inventory item count (or create it) + if(inventoryobj.inventory[itemid]) { + inventoryobj.inventory[itemid] += unlocks.items[itemid]; + } else { + inventoryobj.inventory[itemid] = unlocks.items[itemid]; + } + } + // Update inventory + const inventory = JSON.stringify(inventoryobj); + const inventoryupdate = db.prepare("UPDATE users SET inventory = ? WHERE uuid = ?"); + inventoryupdate.run(inventory, uuid); + // 201 Created + res.status(201).json(unlocks); +} + +// Endpoint: /store/vouchers/:transactionid +// PUT by the game +app.put("/store/vouchers/:transactionid", Transaction); + +// Endpoint: /store/purchases/:transactionid +// PUT by the game +app.put("/store/purchases/:transactionid", Transaction); + +// Endpoint: /users/[uuid]/[sub1]/[sub2] +// This is where settings and other user data is stored. +// The game may also PUT to this endpoint. +// We're going to save the data to a file, maybe in the future we'll use a database. +app.get("/users/:uuid/:subpage?/:subpage2?", function(req, res) { + const urluuid = req.url.split("/")[2]; // req.query doesn't work here + const subpage = req.url.split("/")[3]; + const subpage2 = req.url.split("/")[4]; + // Validate authorization header + if(!req.headers.authorization) { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Get authorization header + const auth = req.headers.authorization.split(" "); + // Verify authorization header + if(auth[0] != "Bearer") { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Get UUID + const ticket = auth[1]; + // Create UUID from ticket + let uuid = ticket; + // Log UUID + console.log(`AUTH: ${uuid}`); + if(urluuid === "me") { + if(!subpage) { + // Build JSON response with UUID + const user = { + "user_id": uuid, + }; + // Send response + res.json(user); + } else if(subpage == "inventory") { + // Check if UUID is in database + const uuidDb = db.prepare("SELECT uuid FROM users WHERE uuid = ?").get(uuid); + if(!uuidDb) { + // Report a server error + console.log(`ERROR: UUID ${uuid} not found in database!`); + res.status(500).send("Internal server error"); + return; + } + let inventoryobj = baseinventory; + let reset = false; + // Query database for inventory + const inventoryprep = db.prepare("SELECT inventory FROM users WHERE uuid = ?"); + const inventorylist = inventoryprep.get(uuid); + // If inventory doesn't exist, create it + if(!inventorylist || !inventorylist.inventory) { + // Insert inventory into existing row + const inventoryinsert = db.prepare("UPDATE users SET inventory = ? WHERE uuid = ?"); + inventoryinsert.run(JSON.stringify(inventoryobj), uuid); + } else { + // Inventory is a JSON object + inventoryobj = JSON.parse(inventorylist.inventory); + reset = true; + } + // Send response + res.json(inventoryobj); + } + } else if(subpage === "profile") { + // Check if UUID is in database + const uuidDb = db.prepare("SELECT uuid FROM users WHERE uuid = ?").get(uuid); + if(!uuidDb) { + // Report a server error + console.log(`ERROR: UUID ${uuid} not found in database!`); + res.status(500).send("Internal server error"); + return; + } + if(subpage2 === "private") { + // Check if UUID matches the one in the URL + if(uuid != urluuid) { + // Send error + res.status(400).send("Invalid UUID"); + return; + } + // Pull from database + const dataprep = db.prepare("SELECT data FROM users WHERE uuid = ?"); + const data = dataprep.get(uuid); + let json = save; + // Check if data exists + if(!data || !data.data) { + // Insert save into existing row + const insert = db.prepare("UPDATE users SET data = ? WHERE uuid = ?"); + insert.run(JSON.stringify(json), uuid); + } else { + // Save is a JSON object + json = JSON.parse(data.data); + } + // Send response + res.json(json); + } else { + // unimplemented, return empty object + console.log(`Unimplemented endpoint: ${req.url}`); + res.json({}); + } + } else { + // unimplemented, return empty object + console.log(`Unimplemented endpoint: ${req.url}`); + res.json({}); + } +}); + +app.put("/users/:uuid/:subpage?/:subpage2?", function(req, res) { + const urluuid = req.url.split("/")[2]; // req.query doesn't work here + const subpage = req.url.split("/")[3]; + const subpage2 = req.url.split("/")[4]; + // Validate authorization header + if(!req.headers.authorization) { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Get authorization header + const auth = req.headers.authorization.split(" "); + // Get UUID + const ticket = auth[1]; + // Create UUID from ticket + let uuid = ticket; + if(urluuid === "me") { + if(subpage === "wbnet") { + // log whatever's in the body + console.log(req.body); + res.json({ + message: "No WBNet user linked", + code: 2600, + }); + return; + } else { + // unimplemented, print out + console.log(`Unimplemented endpoint: ${req.url}`); + } + } else if(subpage === "profile") { + // Check if UUID is in database + const uuidDb = db.prepare("SELECT uuid FROM users WHERE uuid = ?").get(uuid); + if(!uuidDb) { + // Report a server error + console.log(`ERROR: UUID ${uuid} not found in database!`); + res.status(500).send("Internal server error"); + return; + } + // Check if UUID matches the one in the URL + if(uuid != urluuid) { + // Send error + res.status(400).send("Invalid UUID"); + return; + } + if(subpage2 === "private") { + // Verify authorization header + if(auth[0] != "Bearer") { + // Send error + res.status(400).send("Invalid authorization header"); + return; + } + // Check body JSON to ensure .data.AccountXPLevel >= 24 + if(!req.body.data || !req.body.data.AccountXPLevel || req.body.data.AccountXPLevel < 24) { + // Send error + res.status(400).send("Invalid body"); + return; + } + // Check AccountXPLevel + if(req.body.data && req.body.data.AccountXPLevel < 24) { + // Just set it + req.body.data.AccountXPLevel = 24; + // Log to console + console.log("Account XP level set"); + } + if(req.body.data && req.body.data.baneXPLevel < 24) { + // Just set it + req.body.data.baneXPLevel = 24; + // Log to console + console.log("Bane XP level set"); + } + // Check jokerXPLevel + if(req.body.data && req.body.data.jokerXPLevel < 24) { + // Just set it + req.body.data.jokerXPLevel = 24; + // Log to console + console.log("Joker XP level set"); + } + // Update database + const updateprep = db.prepare("UPDATE users SET data = ? WHERE uuid = ?"); + updateprep.run(JSON.stringify(req.body), uuid); + } else { + // unimplemented, print out + console.log(`Unimplemented endpoint: ${req.url}`); + } + } else { + // unimplemented, print out + console.log(`Unimplemented endpoint: ${req.url}`); + } + // Send response + res.status(204).send(); +}); + +// Endpoint: /actions/:action +// Unknown... + +// SOAP functions +function DummyFunc(name, args) { + console.log(name); + console.log(args); +} + +const wbmanagement = { + LookupWbid: function(args, callback) { + DummyFunc("LookupWbid", args); + // Verify realm + //args.realm == "STEAM" && + if(args.title == "OZZY" && args.uniqueId) { + // Create or set UUID in database using characters before / in consoleTicket + const ticketHeader = args.consoleTicket.replace("/", "").replace("+", ""); + const uuid = getUuid(ticketHeader); + // Create entry if it doesn't exist + const user = db.prepare("SELECT * FROM users WHERE consoleid = ?").get(args.consoleId); + if(!user) { + // Create entry + const prep = db.prepare("INSERT INTO users (uuid, inventory, data, consoleid, consoleticket, ip) VALUES (?, ?, ?, ?, ?, ?)"); + prep.run(uuid, JSON.stringify(baseinventory), JSON.stringify(save), args.consoleId, ticketHeader, args.ip); + } else { + // Update console ID and ticket + const prep = db.prepare("UPDATE users SET consoleticket = ?, uuid = ?, ip = ? WHERE consoleid = ?"); + prep.run(ticketHeader, uuid, args.ip, args.consoleId); + } + /* + return { + LookupWbidResult: args.realm + "_" + args.consoleId + "@" + "example.com" + }; + */ + } + return {}; + }, + AssociateWbid: function(args, callback) { + DummyFunc("AssociateWbid", args); + return {}; + }, + DisassociateWbid: function(args, callback) { + DummyFunc("DisassociateWbid", args); + return {}; + }, + CreateAccount: function(args, callback) { + DummyFunc("CreateAccount", args); + return {}; + }, + CreateAccountAndAssociate: function(args, callback) { + DummyFunc("CreateAccountAndAssociate", args); + return {}; + }, + ResetPassword: function(args, callback) { + DummyFunc("ResetPassword", args); + return {}; + }, + StartWBPasswordReset: function(args, callback) { + DummyFunc("StartWBPasswordReset", args); + return {}; + }, + StartWBPasswordResetFromConsole: function(args, callback) { + DummyFunc("StartWBPasswordResetFromConsole", args); + return {}; + }, + FinishWBPasswordReset: function(args, callback) { + DummyFunc("FinishWBPasswordReset", args); + return {}; + }, + GetSubscriptionInformation: function(args, callback) { + DummyFunc("GetSubscriptionInformation", args); + return { + GetSubscriptionInformationResult: { + WbidAccountId: getUuid(args.consoleId + ":accountid"), + SubscriptionId: getUuid(args.consoleId + ":subscriptionid"), + AccountId: getUuid(args.consoleId + ":accountid"), + Entitlements: [] // ??? I couldn't source a dump of this, may be used for DLC + } + }; + } +}; + +// Pretty much half-implemented SOAP server +// No WDSL because the soap package does not immediately support the official one. +// The game doesn't call it, so it's not needed. +function SOAPPost(req, res) { + // Get XML as JSON + const xml = xml2js(req.body); + let soapreq = { + name: "", + args: {} + }; + for(let i = 0; i < xml.elements.length; i++) { + for(let j = 0; j < xml.elements[i].elements.length; j++) { + soapreq.name = xml.elements[i].elements[j].elements[0].name; + for(let k = 0; k < xml.elements[i].elements[j].elements[0].elements.length; k++) { + if(xml.elements[i].elements[j].elements[0].elements[k].elements != undefined) { + for(let l = 0; l < xml.elements[i].elements[j].elements[0].elements[k].elements.length; l++) { + soapreq.args[xml.elements[i].elements[j].elements[0].elements[k].name] = xml.elements[i].elements[j].elements[0].elements[k].elements[l].text; + } + } else { + soapreq.args[xml.elements[i].elements[j].elements[0].elements[k].name] = xml.elements[i].elements[j].elements[0].elements[k].text; + } + } + } + } + let xmlres = { + declaration: { + attributes: { + version: "1.0", + encoding: "utf-8" + } + }, + elements: [{ + type: "element", + name: "soap:Envelope", + attributes: { + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:soap": "http://schemas.xmlsoap.org/soap/envelope/" + }, + elements: [{ + type: "element", + name: "soap:Body", + elements: [] + }] + }] + }; + let soapres = { + name: "", + args: {} + }; + // Content type + res.set("Content-Type", "text/xml"); + let fault = false; + // Call SOAP function + if(wbmanagement[soapreq.name]) { + soapres.name = soapreq.name + "Response"; + // Add IP address to args + let args = soapreq.args; + args.ip = req.ip; + soapres.args = wbmanagement[soapreq.name](args); + // Empty check + if(Object.keys(soapres.args).length === 0) { + fault = true; + res.status(500); + } else { + // Build XML response + xmlres.elements[0].elements[0].elements.push({ + type: "element", + name: soapres.name, + elements: [] + }); + for(let key in soapres.args) { + xmlres.elements[0].elements[0].elements[0].elements.push({ + type: "element", + name: key, + elements: [{ + type: "text", + text: soapres.args[key] + }] + }); + } + } + } else { + fault = true; + res.status(500); + } + if(fault) { + // Build XML fault + xmlres.elements[0].elements[0].elements.push({ + type: "element", + name: "soap:Fault", + elements: [ + { + type: "element", + name: "soap:Code", + elements: [{ + type: "text", + text: "soap:Receiver" + }] + }, + { + type: "element", + name: "soap:Reason", + elements: [{ + type: "text", + text: "Unhandled exception ---> The provided SteamTicketInformation ticket has expired." + }] + }, + { + type: "element", + name: "soap:Node", + elements: [{ + type: "text", + text: "Turbine.Ams.Steam.SteamAuthenticationProvider.ValidateExternalTicket_worker" + }] + }, + { + type: "element", + name: "detail", + elements: [ + { + type: "element", + name: "exceptiontype", + elements: [{ + type: "text", + text: "Turbine.Security.TicketExpiredException" + }] + }, + { + type: "element", + name: "errorcode", + elements: [{ + type: "text", + text: "0xA01B000C" + }] + } + ] + } + ] + }); + } + // Send response + res.send(js2xml(xmlres)); +} + +app.post("/CLS/WbAccountManagement.asmx", SOAPPost); +app.post("/CLS/WbSubscriptionManagement.asmx", SOAPPost); + +// Start servers +function done() { + if(config.debug) { + console.log(`WEB: Listening on port ${config.host.https_enabled ? config.host.https_port : config.host.http_port}`); + } +} +let server; +let server_passthrough; +if(!config.host.https_enabled) { + server = app.listen(config.host.http_port, () => { + done(); + }); +} else { + server = https.createServer({ + key: fse.readFileSync(`./usercfg/${config.host.https_key}`), + cert: fse.readFileSync(`./usercfg/${config.host.https_cert}`), + }, app).listen(config.host.https_port, () => { + done(); + }); + server.on("tlsClientError", err => { + if(config.debug) { + console.error(err); + } + }); + server.on("connection", socket => { + socket.on("error", err => { + if(config.debug) { + console.error(err); + } + }); + socket.on("data", data => { + if(config.debug) { + console.log(`WEB: TLS read ${data.length} bytes`); + } + }); + }); +} +if(config.host.localhost_passthrough_enabled) { + // Passthrough server + server_passthrough = http.createServer(app).listen(config.host.localhost_passthrough_port, () => { + if(config.debug) { + console.log(`WEB: Passthrough on port ${config.host.localhost_passthrough_port}`); + } + }); +} + +// Connection storage +let connections = []; +server.on('connection', connection => { + connections.push(connection); + connection.on('close', () => { + connections = connections.filter(curr => curr !== connection); + }); +}); +if(config.host.localhost_passthrough_enabled) { + server_passthrough.on('connection', connection => { + connections.push(connection); + connection.on('close', () => { + connections = connections.filter(curr => curr !== connection); + }); + }); +} + +// Closing +function Close(param) { + if(param instanceof Error) + console.error(param); + // Log + if(config.debug) + console.log("Shutting down..."); + // Close database + db.close(); + // Close connections + connections.forEach((connection) => { + connection.destroy(); + }); + // Close server + server.close(); + if(config.localhost_passthrough_enabled) + server_passthrough.close(); + // Exit + process.exit(); +} + +process.on("SIGINT", Close); +process.on("SIGTERM", Close); +process.on("SIGUSR1", Close); +process.on("SIGUSR2", Close); +process.on("uncaughtException", Close); +process.on("unhandledRejection", Close); diff --git a/package.json b/package.json index ef79f4f..e68719b 100644 --- a/package.json +++ b/package.json @@ -17,17 +17,11 @@ }, "homepage": "https://github.com/KiwifruitDev/arkham-revived#readme", "dependencies": { - "axios": "^1.4.0", "better-sqlite3": "^8.4.0", - "discord.js": "^14.11.1-dev.1687479164-75d91b5.0", - "dotenv": "^16.3.0", "express": "^4.18.2", "fs-extra": "^11.1.1", "geoip-lite": "^1.4.7", - "node-steam-openid": "^1.0.3", - "qs": "^6.11.2", "uuid-by-string": "^4.0.0", "xml-js": "^1.6.11" - }, - "type": "module" + } } diff --git a/screen.sh b/screen.sh new file mode 100644 index 0000000..e6b960e --- /dev/null +++ b/screen.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# @echo off +# :loop +# node index.js +# goto loop + +while true; do + # Start the node server and log to /tmp/node.log + node index.js >> /tmp/node.log 2>&1 + sleep 1 +done diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..5038a97 --- /dev/null +++ b/start.bat @@ -0,0 +1,5 @@ +@echo off +:loop +node index.js +goto loop + diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..2e0e531 --- /dev/null +++ b/start.sh @@ -0,0 +1,3 @@ +#!/bin/bash +screen -dmS nodejs bash ./screen.sh +bash ./access.sh diff --git a/tls1.js b/tls1.js new file mode 100644 index 0000000..1cf5062 --- /dev/null +++ b/tls1.js @@ -0,0 +1,22 @@ +// A TLSv1 server, must run on nodejs v8.5.0 alongside index.js (on v20.3.1) +const fs = require("fs"); +const config = JSON.parse(fs.readFileSync("./usercfg/config.json")); +const tls = require('tls'); + +let server = tls.createServer({ + key: fs.readFileSync(`./usercfg/${config.host.https_key}`), + cert: fs.readFileSync(`./usercfg/${config.host.https_cert}`), + ciphers: "DEFAULT:@SECLEVEL=0", + requestCert: true, + rejectUnauthorized: true +}, socket => { + console.log("WEB: Client connected"); +}); +let listening = server.listen(config.host.https_port, () => { + if(config.debug) + console.log(`WEB: Listening on port ${config.host.https_port}`); +}); +listening.on("tlsClientError", err => { + if(config.debug) + console.error(err); +});